@medplum/react 5.1.18 → 5.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +4 -4
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/cjs/index.css +1 -1
- package/dist/cjs/index.css.map +4 -4
- package/dist/cjs/index.d.ts +184 -17
- package/dist/esm/index.css +1 -1
- package/dist/esm/index.css.map +4 -4
- package/dist/esm/index.d.ts +184 -17
- package/dist/esm/index.mjs +3 -3
- package/dist/esm/index.mjs.map +4 -4
- package/package.json +8 -8
package/dist/esm/index.mjs
CHANGED
|
@@ -106,9 +106,9 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
|
|
|
106
106
|
name,
|
|
107
107
|
title,
|
|
108
108
|
}
|
|
109
|
-
}`.replaceAll(/\s+/g," ");return(await medplum.graphql(query)).data.StructureDefinitionList[0]}function shouldFetchResourceType(targetType){return targetType.type==="profile"&&!targetType?.error&&isEmpty4(targetType.resourceType)}import{Group as Group24,Stack as Stack14,Text as Text17}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useMedplum as useMedplum22}from"@medplum/react-hooks";import{useContext as useContext19,useEffect as useEffect14,useState as useState45}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group23,Stack as Stack13,Text as Text16}from"@mantine/core";import{buildElementsContext as buildElementsContext3,getPropertyDisplayName,isEmpty as isEmpty5,isPopulated as isPopulated9}from"@medplum/core";import{useContext as useContext18,useMemo as useMemo18,useState as useState44}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon4,Button as Button6}from"@mantine/core";import{jsx as jsx82}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx82(Button6,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx82(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx82(ActionIcon4,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx82(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon5}from"@mantine/core";import{jsx as jsx83}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx83(ActionIcon5,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx83(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx84,jsxs as jsxs46}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState44(props.defaultValue),sliceElements=slice.typeSchema?.elements??slice.elements,parentElementsContextValue=useContext18(ElementsContext),contextValue=useMemo18(()=>{if(isPopulated9(sliceElements))return buildElementsContext3({parentContext:parentElementsContextValue,elements:sliceElements,path:props.path,profileUrl:slice.typeSchema?.url})},[parentElementsContextValue,props.path,slice.typeSchema?.url,sliceElements]);function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}let required=slice.min>0,indentedStack=isEmpty5(slice.elements),propertyDisplayName=getPropertyDisplayName(slice.name),showEmptyMessage=props.property.readonly&&values.length===0;return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx84(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx84(Text16,{c:"dimmed",children:"(empty)"}):jsxs46(Stack13,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs46(Group23,{wrap:"nowrap",children:[jsx84("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx84(ElementDefinitionTypeInput,{elementDefinitionType:slice.type[0],name:slice.name,defaultValue:value,onChange:newValue=>{let newValues=[...values];newValues[valueIndex]=newValue,setValuesWrapper(newValues)},outcome:props.outcome,min:slice.min,max:slice.max,binding:slice.binding,path:props.path,valuePath:void 0,readOnly:props.property.readonly})}),!props.property.readonly&&values.length>slice.min&&jsx84(ArrayRemoveButton,{propertyDisplayName,testId:props.testId&&`${props.testId}-remove-${valueIndex}`,onClick:e=>{killEvent(e);let newValues=[...values];newValues.splice(valueIndex,1),setValuesWrapper(newValues)}})]},`${valueIndex}-${values.length}`)),!props.property.readonly&&values.length<slice.max&&jsx84(Group23,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx84(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx85,jsxs as jsxs47}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum22(),[loading,setLoading]=useState45(!0),[slices,setSlices]=useState45([]),[defaultValue2]=useState45(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState45(()=>[defaultValue2]),ctx=useContext19(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect14(()=>{prepareSlices({medplum,property}).then(slices2=>{setSlices(slices2);let slicedValues2=assignValuesIntoSlices(defaultValue2,slices2,property.slicing,ctx.profileUrl);addPlaceholderValues(slicedValues2,slices2),setSlicedValues(slicedValues2),setLoading(!1)}).catch(reason=>{console.error(reason),setLoading(!1)})},[medplum,property,defaultValue2,ctx.profileUrl,setSlicedValues]);function setValuesWrapper(newValues,sliceIndex){let newSlicedValues=[...slicedValues];if(newSlicedValues[sliceIndex]=newValues,setSlicedValues(newSlicedValues),props.onChange){let cleaned=newSlicedValues.flat().filter(val=>val!==void 0);props.onChange(cleaned)}}if(loading)return jsx85("div",{children:"Loading..."});let nonSliceIndex=slices.length,nonSliceValues=slicedValues[nonSliceIndex],showNonSliceValues=!(props.hideNonSliceValues??(propertyTypeCode==="Extension"&&slices.length>0)),propertyDisplayName=getPathDisplayName4(property.path),showEmptyMessage=props.property.readonly&&slices.length===0&&defaultValue2.length===0;return jsxs47(Stack14,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx85(Text17,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx85(SliceInput,{slice,path:props.path,valuePath:props.valuePath,property,defaultValue:slicedValues[sliceIndex],onChange:newValue=>{setValuesWrapper(newValue,sliceIndex)},testId:`slice-${slice.name}`},slice.name)),showNonSliceValues&&nonSliceValues.map((value,valueIndex)=>jsxs47(Group24,{wrap:"nowrap",style:{flexGrow:1},children:[jsx85("div",{style:{flexGrow:1},children:jsx85(ResourcePropertyInput,{arrayElement:!0,property:props.property,name:props.name+"."+valueIndex,path:props.path,valuePath:getValuePath(props.path,props.valuePath,valueIndex),defaultValue:value,onChange:newValue=>{let newNonSliceValues=[...nonSliceValues];newNonSliceValues[valueIndex]=newValue,setValuesWrapper(newNonSliceValues,nonSliceIndex)},defaultPropertyType:void 0,outcome:props.outcome})}),!props.property.readonly&&jsx85(ArrayRemoveButton,{propertyDisplayName,testId:`nonsliced-remove-${valueIndex}`,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.splice(valueIndex,1),setValuesWrapper(newNonSliceValues,nonSliceIndex)}})]},`${valueIndex}-${nonSliceValues.length}`)),!props.property.readonly&&showNonSliceValues&&slicedValues.flat().length<property.max&&jsx85(Group24,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx85(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.push(void 0),setValuesWrapper(newNonSliceValues,nonSliceIndex)},testId:"nonsliced-add"})})]})}function addPlaceholderValues(slicedValues,slices){for(let sliceIndex=0;sliceIndex<slices.length;sliceIndex++){let slice=slices[sliceIndex],sliceValues=slicedValues[sliceIndex];for(;sliceValues.length<slice.min;)sliceValues.push(void 0)}}import{ActionIcon as ActionIcon6,Flex as Flex11,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification4}from"@mantine/notifications";import{useRef as useRef9,useState as useState46}from"react";import{jsx as jsx86,jsxs as jsxs48}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState46(!1),clipboard=useClipboard(),ref=useRef9(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs48(Flex11,{gap:"xs",children:[jsx86(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx86(ActionIcon6,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification4({color:"green",message:"Copied"})},children:jsx86(IconCopy,{})})]})}import{Box as Box7,Button as Button7,Chip,Group as Group25,Modal as Modal2,NativeSelect as NativeSelect8,Stack as Stack15,Switch,TextInput as TextInput17}from"@mantine/core";import{formatTiming as formatTiming2}from"@medplum/core";import{useContext as useContext20,useMemo as useMemo19,useRef as useRef10,useState as useState47}from"react";import{Fragment as Fragment28,jsx as jsx87,jsxs as jsxs49}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState47(props.defaultValue),[open,setOpen]=useState47(!props.disabled&&(props.defaultModalOpen??!1));return jsxs49(Fragment28,{children:[jsxs49(Group25,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx87("span",{"data-testid":"timinginput-display",children:formatTiming2(value)||"No repeat"}),jsx87(Button7,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx87(TimingEditorDialog,{path:props.path,visible:open,defaultValue:value,onOk:newValue=>{props.onChange&&props.onChange(newValue),setValue(newValue),setOpen(!1)},onCancel:()=>setOpen(!1)})]})}var defaultValue={repeat:{period:1,periodUnit:"d"}};function TimingEditorDialog(props){let[value,setValue]=useState47(props.defaultValue||defaultValue),[timeOfDayItems,setTimeOfDayItems]=useState47(()=>(props.defaultValue?.repeat?.timeOfDay??[]).map((v,i)=>({id:i,value:v}))),nextTimeOfDayId=useRef10(timeOfDayItems.length),{getExtendedProps}=useContext20(ElementsContext),[eventProps,repeatProps,repeatPeriodProps,repeatPeriodUnitProps,repeatDayOfWeekProps,repeatTimeOfDayProps]=useMemo19(()=>["event","repeat","repeat.period","repeat.periodUnit","repeat.dayOfWeek","repeat.timeOfDay"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setStart(newStart){setValue(value2=>({...value2,event:[newStart]}))}function setRepeat(repeat){setValue(value2=>({...value2,repeat}))}function setPeriod(period){setValue(value2=>({...value2,repeat:{...value2.repeat,period}}))}function setPeriodUnit(periodUnit){setValue(value2=>({...value2,repeat:{...value2.repeat,periodUnit}}))}function setDaysOfWeek(dayOfWeek){setValue(value2=>({...value2,repeat:{...value2.repeat,dayOfWeek}}))}function setTimeOfDay(updater){setTimeOfDayItems(items=>{let newItems=updater(items),timeOfDay=newItems.map(item=>item.value);return setValue(value2=>({...value2,repeat:{...value2.repeat,timeOfDay}})),newItems})}return jsx87(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs49(Stack15,{gap:"md",children:[jsx87(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx87(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx87(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs49(Fragment28,{children:[jsx87(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs49(Group25,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx87(TextInput17,{disabled:repeatPeriodProps?.readonly,type:"number",step:1,id:"timing-dialog-period",name:"timing-dialog-period",defaultValue:value.repeat.period||1,onChange:e=>setPeriod(Number.parseInt(e.currentTarget.value,10)||1)}),jsx87(NativeSelect8,{disabled:repeatPeriodUnitProps?.readonly,id:"timing-dialog-periodUnit",name:"timing-dialog-periodUnit",defaultValue:value.repeat.periodUnit,onChange:e=>setPeriodUnit(e.currentTarget.value),data:[{label:"minute",value:"min"},{label:"hour",value:"h"},{label:"day",value:"d"},{label:"week",value:"wk"},{label:"month",value:"mo"},{label:"year",value:"a"}]})]})}),value.repeat.periodUnit==="wk"&&jsx87(FormSection,{title:"Repeat on",children:jsx87(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,value:value.repeat?.dayOfWeek,children:jsx87(Group25,{justify:"space-between",mt:"xs",gap:"xs",children:daysOfWeek.map(day=>jsx87(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,checked:(value.repeat?.dayOfWeek??[]).includes(day),children:day.charAt(0).toUpperCase()},day))})})}),jsx87(FormSection,{title:"At times",children:jsxs49(Stack15,{mt:"xs",children:[timeOfDayItems.map((item,idx)=>jsxs49(Group25,{children:[jsx87(TextInput17,{disabled:repeatTimeOfDayProps?.readonly,type:"time",id:`timing-dialog-repeat-timeOfDay[${idx}]`,name:`timing-dialog-repeat-timeOfDay[${idx}]`,"data-testid":`timing-repeat-timeOfDay-input-${idx}`,defaultValue:item.value.slice(0,5),onChange:e=>{let newValue=`${e.currentTarget.value}:00`;setTimeOfDay(items=>items.with(idx,{...item,value:newValue}))},style:{flexGrow:1}}),jsx87(ArrayRemoveButton,{testId:`timing-repeat-timeOfDay-remove-${idx}`,onClick:()=>setTimeOfDay(items=>items.toSpliced(idx,1))})]},item.id)),jsx87(Box7,{children:jsx87(ArrayAddButton,{propertyDisplayName:"Time of Day",onClick:()=>setTimeOfDay(items=>{let id=nextTimeOfDayId.current++;return items.concat({id,value:"00:00:00"})})})})]})})]}),jsx87(Group25,{justify:"flex-end",children:jsx87(Button7,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx88,jsxs as jsxs50}from"react/jsx-runtime";function ResourcePropertyInput(props){let{property,name,onChange,defaultValue:defaultValue2}=props,defaultPropertyType=props.defaultPropertyType&&props.defaultPropertyType!=="undefined"?props.defaultPropertyType:property.type[0].code,propertyTypes=property.type;if((property.isArray||property.max>1)&&!props.arrayElement){if(defaultPropertyType===PropertyType2.Attachment)return jsx88(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx88(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx88(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx88(ElementDefinitionTypeInput,{name,defaultValue:defaultValue2,onChange:newValue=>{if(props.onChange){let newPropName=props.name.replace("[x]",capitalize2(propertyTypes[0].code));props.onChange(newValue,newPropName)}},outcome:props.outcome,elementDefinitionType:propertyTypes[0],min:property.min,max:property.min,binding:property.binding,path:props.path,valuePath:props.valuePath,readOnly:property.readonly})}function ElementDefinitionInputSelector(props){let propertyTypes=props.elementDefinitionTypes,initialPropertyType;props.defaultPropertyType&&(initialPropertyType=propertyTypes.find(t=>t.code===props.defaultPropertyType)),initialPropertyType||(initialPropertyType=propertyTypes[0]);let[selectedType,setSelectedType]=useState48(initialPropertyType);return jsxs50(Group26,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx88(NativeSelect9,{disabled:props.property.readonly,style:{width:"200px"},defaultValue:selectedType.code,"data-testid":props.name&&props.name+"-selector",onChange:e=>{setSelectedType(propertyTypes.find(type=>type.code===e.currentTarget.value))},data:propertyTypes.map(type=>({value:type.code,label:type.code}))}),jsx88(ElementDefinitionTypeInput,{name:props.name,defaultValue:props.defaultValue,outcome:props.outcome,elementDefinitionType:selectedType,onChange:newValue=>{props.onChange&&props.onChange(newValue,props.name.replace("[x]",capitalize2(selectedType.code)))},min:props.property.min,max:props.property.max,binding:props.property.binding,path:props.property.path,valuePath:props.valuePath,readOnly:props.property.readonly})]})}function ElementDefinitionTypeInput(props){let{name,onChange,outcome,binding,path,valuePath,readOnly}=props,required=props.min!==void 0&&props.min>0,propertyType=props.elementDefinitionType.code,elementsContext=useContext21(ElementsContext),defaultValue2=useMemo20(()=>{if(!isComplexTypeCode(propertyType)||!isEmpty6(props.defaultValue))return props.defaultValue;let withDefaults=Object.create(null);if(elementsContext.path===props.path)applyDefaultValuesToElement(withDefaults,elementsContext.elements);else{let key=getPathDifference(elementsContext.path,props.path);if(key===void 0)return props.defaultValue;applyDefaultValuesToElement(withDefaults,elementsContext.elements,key)}return isPopulated10(withDefaults)?withDefaults:props.defaultValue},[propertyType,elementsContext.path,elementsContext.elements,props.path,props.defaultValue]);if(!propertyType)return jsx88("div",{children:"Property type not specified "});function getComplexInputProps(){return{name,defaultValue:defaultValue2,onChange,outcome,path,valuePath,disabled:readOnly}}function getPrimitiveInputProps(){let error=getErrorsForInput(props.outcome,valuePath??path);return{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,error,disabled:readOnly}}switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.string:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"||props.path==="ClientApplication.certificateTrustStore"?jsx88(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx88(TextInput18,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx88(TextInput18,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.time:return jsx88(TextInput18,{...getPrimitiveInputProps(),type:"time",step:1,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx88(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx88(TextInput18,{...getPrimitiveInputProps(),type:"number",step:propertyType===PropertyType2.decimal?"any":"1",onChange:e=>{if(onChange){let num=e.currentTarget.valueAsNumber;onChange(Number.isNaN(num)?void 0:num)}}});case PropertyType2.code:return jsx88(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx88(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:case PropertyType2.xhtml:return jsx88(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx88(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx88(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx88(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx88(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx88(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx88(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx88(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx88(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx88(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx88(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx88(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx88(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx88(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx88(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx88(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx88(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx88(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx88(BackboneElementInput,{...getComplexInputProps(),typeName:propertyType})}}var RESOURCE_TYPE_URL_PREFIXES=[`${HTTP_HL7_ORG}/fhir/StructureDefinition/`,"https://medplum.com/fhir/StructureDefinition/"];function getTargetTypes(elementDefinitionType){return elementDefinitionType?.targetProfile?.map(p=>{let resourceTypePrefix=RESOURCE_TYPE_URL_PREFIXES.find(prefix=>p.startsWith(prefix));return resourceTypePrefix?p.slice(resourceTypePrefix.length):p})}import{jsx as jsx89}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState49(props.defaultValue??{}),elementsContext=useContext22(ElementsContext),elementsToRender=useMemo21(()=>getElementsToRender(elementsContext.elements),[elementsContext.elements]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let typedValue={type:props.type,value};return jsx89(Stack16,{style:{flexGrow:1},"data-testid":props.testId,children:elementsToRender.map(([key,element])=>{let[propertyValue,propertyType]=getValueAndTypeFromElement(typedValue,key,element),required=element.min!==void 0&&element.min>0,valuePath=props.valuePath?props.valuePath+"."+key:void 0,resourcePropertyInput=jsx89(ResourcePropertyInput,{property:element,name:key,path:props.path+"."+key,valuePath,defaultValue:propertyValue,defaultPropertyType:propertyType,onChange:(newValue,propName)=>{setValueWrapper(setPropertyValue({...value},key,propName??key,element,newValue))},outcome:props.outcome},key);return props.type==="Extension"||EXTENSION_KEYS.includes(key)?resourcePropertyInput:element.type.length===1&&element.type[0].code==="boolean"?jsx89(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx89(FormSection,{title:getPathDisplayName5(key),description:element.description,withAsterisk:required,htmlFor:key,outcome:props.outcome,fhirPath:element.path,errorExpression:valuePath,readonly:element.readonly,children:resourcePropertyInput},key)})})}var BackboneElementInput_default={nested:"BackboneElementInput_nested"};import{jsx as jsx90,jsxs as jsxs51}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState50(()=>props.defaultValue??{}),parentElementsContext=useContext23(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo22(()=>tryGetDataType2(props.typeName,profileUrl),[props.typeName,profileUrl]),type=typeSchema?.type??props.typeName,contextValue=useMemo22(()=>{if(typeSchema)return buildElementsContext4({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);if(!typeSchema)return jsxs51("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx90(Box8,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:jsx90(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}import{Button as Button8,Group as Group27}from"@mantine/core";import{useMemo as useMemo23,useState as useState51}from"react";var CalendarDateInput_default={table:"CalendarDateInput_table"};function getMonthString(date){return date.toLocaleString("default",{month:"long"})+" "+date.getFullYear()}function getStartMonth(){let result=new Date;return result.setDate(1),result.setHours(0,0,0,0),result}import{jsx as jsx91,jsxs as jsxs52}from"react/jsx-runtime";function CalendarDateInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState51(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth);return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=useMemo23(()=>buildGrid(month,props.availableDates),[month,props.availableDates]);return jsxs52("div",{children:[jsxs52(Group27,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx91("p",{style:{flex:1},children:getMonthString(month)}),jsxs52(Group27,{justify:"flex-end",gap:"xs",children:[jsx91(Button8,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx91(Button8,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs52("table",{className:CalendarDateInput_default.table,children:[jsx91("thead",{children:jsxs52("tr",{children:[jsx91("th",{children:"SUN"}),jsx91("th",{children:"MON"}),jsx91("th",{children:"TUE"}),jsx91("th",{children:"WED"}),jsx91("th",{children:"THU"}),jsx91("th",{children:"FRI"}),jsx91("th",{children:"SAT"})]})}),jsx91("tbody",{children:grid.map((week,weekIndex)=>jsx91("tr",{children:week.map((day,dayIndex)=>jsx91("td",{children:day&&jsx91(Button8,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,availableDates){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d),available:isDayAvailable(d,availableDates)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,availableDates){for(let availableDate of availableDates)if(availableDate.getFullYear()===day.getFullYear()&&availableDate.getMonth()===day.getMonth()&&availableDate.getDate()===day.getDate())return!0;return!1}import{useMemo as useMemo24}from"react";import{jsx as jsx92}from"react/jsx-runtime";function CalendarInput(props){let{slots,...rest}=props,availableDates=useMemo24(()=>slots.map(slot=>new Date(slot.start)),[slots]);return jsx92(CalendarDateInput,{...rest,availableDates})}import{ActionIcon as ActionIcon7,Group as Group28,LoadingOverlay,Menu as Menu4,Paper as Paper2,Popover,ScrollArea as ScrollArea2,Skeleton,Stack as Stack18,Text as Text19,TextInput as TextInput20,Title as Title8}from"@mantine/core";import{useResizeObserver}from"@mantine/hooks";import{showNotification as showNotification5}from"@mantine/notifications";import{getDisplayString as getDisplayString4,getReferenceString as getReferenceString5,normalizeErrorString as normalizeErrorString6}from"@medplum/core";import{useCachedBinaryUrl as useCachedBinaryUrl3,useMedplum as useMedplum24,useResource as useResource2,useSubscription}from"@medplum/react-hooks";import{useCallback as useCallback11,useEffect as useEffect16,useMemo as useMemo25,useRef as useRef11,useState as useState53}from"react";var BaseChat_default={chatPaper:"BaseChat_chatPaper",chatTitle:"BaseChat_chatTitle",chatBody:"BaseChat_chatBody",chatScrollArea:"BaseChat_chatScrollArea",chatInputContainer:"BaseChat_chatInputContainer",chatPendingFile:"BaseChat_chatPendingFile",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble",chatBubbleNameRight:"BaseChat_chatBubbleNameRight",chatBubbleAttachmentWithText:"BaseChat_chatBubbleAttachmentWithText",chatBubbleAttachmentIcon:"BaseChat_chatBubbleAttachmentIcon",chatBubbleMenu:"BaseChat_chatBubbleMenu"};import{Box as Box9,Divider as Divider5,Loader as Loader4,Stack as Stack17,Text as Text18,TextInput as TextInput19,UnstyledButton as UnstyledButton3}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback2}from"@mantine/hooks";import{getReferenceString as getReferenceString4}from"@medplum/core";import{useMedplum as useMedplum23}from"@medplum/react-hooks";import{useEffect as useEffect15,useState as useState52}from"react";import{jsx as jsx93,jsxs as jsxs53}from"react/jsx-runtime";function DocumentPicker({subjectRef,onSelect,onUpload}){let medplum=useMedplum23(),[search,setSearch]=useState52(""),[docs,setDocs]=useState52([]),[loading,setLoading]=useState52(!0),subjectRefStr=subjectRef?getReferenceString4(subjectRef):void 0,fetchDocs=useDebouncedCallback2(async query=>{setLoading(!0);try{let params=new URLSearchParams;subjectRefStr&¶ms.set("subject",subjectRefStr),query.trim()&¶ms.set("description:contains",query.trim()),params.set("_sort","-date"),params.set("_count","5");let results=await medplum.searchResources("DocumentReference",params);setDocs([...results])}catch(err){console.error(err)}finally{setLoading(!1)}},300);useEffect15(()=>{fetchDocs(search)},[fetchDocs,search]);let getDocName=doc=>doc.description??doc.content?.[0]?.attachment?.title??"Untitled";return jsxs53(Stack17,{gap:0,w:280,children:[jsx93(Text18,{fw:500,fz:"sm",px:"sm",pt:"sm",pb:"xs",children:"Attachments"}),jsx93(Box9,{px:"sm",pb:"xs",children:jsx93(TextInput19,{placeholder:"Search for a Document...",size:"xs",value:search,onChange:e=>setSearch(e.currentTarget.value)})}),jsx93(Divider5,{}),loading?jsx93(Box9,{py:"sm",style:{display:"flex",justifyContent:"center"},children:jsx93(Loader4,{size:"xs"})}):jsxs53(Stack17,{gap:0,children:[docs.map(doc=>jsxs53(UnstyledButton3,{px:"sm",py:"xs",onClick:()=>onSelect(doc),style:{display:"flex",alignItems:"center",gap:8},children:[jsx93(IconFileText,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-blue-6)"}}),jsx93(Text18,{fz:"sm",truncate:!0,children:getDocName(doc)})]},doc.id)),docs.length===0&&jsx93(Text18,{fz:"xs",c:"dimmed",px:"sm",py:"xs",children:"No documents found"})]}),jsx93(Divider5,{}),jsxs53(UnstyledButton3,{px:"sm",py:"xs",onClick:onUpload,style:{display:"flex",alignItems:"center",gap:8},children:[jsx93(IconPaperclip,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-gray-6)"}}),jsx93(Text18,{fz:"sm",c:"dimmed",children:"Upload an image, pdf, etc."})]})]})}import{jsx as jsx94,jsxs as jsxs54}from"react/jsx-runtime";function toSafeUrl(url){if(url)try{let{protocol}=new URL(url);return protocol==="https:"||protocol==="http:"||protocol==="blob:"?url:void 0}catch{return}}function showError(message){showNotification5({color:"red",title:"Error",message,autoClose:!1})}function parseSentTime(communication){return new Date(communication.sent??0).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function upsertCommunications(communications,received,setCommunications){let newCommunications=[...communications],foundNew=!1;for(let comm of received){let existingIdx=newCommunications.findIndex(c=>c.id===comm.id);existingIdx!==-1?newCommunications[existingIdx]=comm:(newCommunications.push(comm),foundNew=!0)}foundNew&&newCommunications.sort((a,b)=>!a.sent&&!b.sent?0:a.sent?b.sent?a.sent.localeCompare(b.sent):1:-1),setCommunications(newCommunications)}function BaseChat(props){let{title,communications,setCommunications,query,sendMessage,onMessageReceived,onMessageUpdated,inputDisabled,onError,excludeHeader=!1,uploadEnabled=!1,attachmentSubjectRef,onViewInDocuments,...paperProps}=props,medplum=useMedplum24(),inputRef=useRef11(null),scrollAreaRef=useRef11(null),firstScrollRef=useRef11(!0),initialLoadRef=useRef11(!0),[profile,setProfile]=useState53(medplum.getProfile()),[reconnecting,setReconnecting]=useState53(!1),[loading,setLoading]=useState53(!0),[pendingFile,setPendingFile]=useState53(void 0),[pendingDocRef,setPendingDocRef]=useState53(void 0),[pickerOpen,setPickerOpen]=useState53(!1),fileInputRef=useRef11(null);loading||(initialLoadRef.current=!1);let profileRefStr=useMemo25(()=>profile?getReferenceString5(medplum.getProfile()):"",[profile,medplum]),searchMessages=useCallback11(async()=>{setLoading(!0);let searchParams=new URLSearchParams(query);searchParams.append("_sort","-sent"),searchParams.append("sent:missing","false");let searchResult=await medplum.searchResources("Communication",searchParams,{cache:"no-cache"});upsertCommunications(communicationsRef.current,searchResult,setCommunications),setLoading(!1)},[medplum,setCommunications,query]);useEffect16(()=>{searchMessages().catch(err=>showNotification5({color:"red",message:normalizeErrorString6(err)}))},[searchMessages]),useSubscription(`Communication?${query}`,bundle=>{let communication=bundle.entry?.[1]?.resource;upsertCommunications(communicationsRef.current,[communication],setCommunications),getReferenceString5(communication.sender)!==profileRefStr&&(communicationsRef.current.find(c=>c.id===communication.id)?onMessageUpdated?.(communication):onMessageReceived?.(communication))},{onWebSocketClose:useCallback11(()=>{reconnecting||setReconnecting(!0),showNotification5({color:"red",message:"Live chat disconnected. Attempting to reconnect..."})},[reconnecting]),onWebSocketOpen:useCallback11(()=>{reconnecting&&showNotification5({color:"green",message:"Live chat reconnected."})},[reconnecting]),onSubscriptionConnect:useCallback11(()=>{reconnecting&&(searchMessages().catch(err=>showNotification5({color:"red",message:normalizeErrorString6(err)})),setReconnecting(!1))},[reconnecting,searchMessages]),onError:useCallback11(err=>{onError?onError(err):showError(normalizeErrorString6(err))},[onError])});let sendMessageInternal=useCallback11(formData=>{if(inputDisabled)return;let message=formData.message?.trim()??"";!message&&!pendingFile&&!pendingDocRef||(inputRef.current&&(inputRef.current.value=""),fileInputRef.current&&(fileInputRef.current.value=""),sendMessage(message,pendingFile,pendingDocRef),setPendingFile(void 0),setPendingDocRef(void 0),scrollToBottomRef.current=!0)},[inputDisabled,sendMessage,pendingFile,pendingDocRef]);useEffect16(()=>{let latestProfile=medplum.getProfile();profile?.id!==latestProfile?.id&&(setProfile(latestProfile),setCommunications([]))});let[parentRef,parentRect]=useResizeObserver(),communicationsRef=useRef11(communications);communicationsRef.current=communications;let prevCommunicationsRef=useRef11(communications),scrollToBottomRef=useRef11(!0);useEffect16(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),useEffect16(()=>{scrollToBottomRef.current&&scrollAreaRef.current?.scrollTo&&(scrollAreaRef.current.scrollTo({top:scrollAreaRef.current.scrollHeight,...firstScrollRef.current?{duration:0}:{behavior:"smooth"}}),firstScrollRef.current=!1,scrollToBottomRef.current=!1)});let myLastDeliveredId=useMemo25(()=>{let i=communications.length;for(;i--;){let comm=communications[i];if(comm.sender?.reference===profileRefStr&&comm.received)return comm.id}return""},[communications,profileRefStr]);return profile?jsxs54(Paper2,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[!excludeHeader&&jsx94(Title8,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx94("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs54(Stack18,{align:"stretch",mt:"lg",children:[jsxs54(Group28,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(Skeleton,{height:38,circle:!0,ml:"md"}),jsx94(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs54(Group28,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx94(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs54(Group28,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(Skeleton,{height:38,circle:!0,ml:"md"}),jsx94(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs54(ScrollArea2,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx94(LoadingOverlay,{visible:loading||reconnecting,style:{width:parentRect.width,height:parentRect.height,position:"absolute",zIndex:1}}),communications.map((c,i)=>{let prevCommunication=i>0?communications[i-1]:void 0,prevCommTime=prevCommunication?parseSentTime(prevCommunication):void 0,currCommTime=parseSentTime(c),showDelivered=!!c.received&&c.id===myLastDeliveredId,payloads=c.payload??[],contentRef=payloads.find(p=>p.contentReference)?.contentReference,contentAttachment=payloads.find(p=>p.contentAttachment)?.contentAttachment,hasAttachment=!!(contentRef||contentAttachment),isSender=c.sender?.reference===profileRefStr,menu=hasAttachment?jsx94(ChatBubbleMenu,{contentRef,contentAttachment,onViewInDocuments}):null;return jsxs54(Stack18,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx94(Text19,{fz:"xs",ta:"center",children:currCommTime}),isSender?jsxs54(Group28,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94("div",{className:BaseChat_default.chatBubbleMenu,children:menu}),jsx94(ChatBubble,{alignment:"right",communication:c,showDelivered}),jsx94(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender,mb:showDelivered?void 0:"sm"})]}):jsxs54(Group28,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),jsx94(ChatBubble,{alignment:"left",communication:c}),jsx94("div",{className:BaseChat_default.chatBubbleMenu,children:menu})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsxs54("div",{className:BaseChat_default.chatInputContainer,children:[(pendingFile||pendingDocRef)&&jsxs54(Group28,{className:BaseChat_default.chatPendingFile,gap:4,align:"center",wrap:"nowrap",children:[pendingDocRef?jsx94(IconFileText,{size:"0.75rem"}):jsx94(IconPaperclip,{size:"0.75rem"}),jsx94(Text19,{fz:"xs",c:"dimmed",flex:1,truncate:!0,children:pendingDocRef?pendingDocRef.description??pendingDocRef.content?.[0]?.attachment?.title??"Document":pendingFile?.name}),jsx94(ActionIcon7,{size:"xs",variant:"subtle",color:"red",onClick:()=>{setPendingDocRef(void 0),setPendingFile(void 0),fileInputRef.current&&(fileInputRef.current.value="")},"aria-label":"Remove attachment",children:jsx94(IconX,{size:"0.75rem"})})]}),jsx94("input",{ref:fileInputRef,type:"file",style:{display:"none"},disabled:inputDisabled,onChange:e=>{let file=e.target.files?.[0];file&&(setPendingFile(file),setPendingDocRef(void 0))}}),jsx94(Form,{onSubmit:sendMessageInternal,children:jsx94(TextInput20,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",leftSectionWidth:42,rightSectionWidth:42,disabled:inputDisabled,leftSection:!inputDisabled&&uploadEnabled?jsxs54(Popover,{opened:pickerOpen,onChange:setPickerOpen,position:"top-start",withArrow:!0,shadow:"md",withinPortal:!0,children:[jsx94(Popover.Target,{children:jsx94(ActionIcon7,{onClick:()=>setPickerOpen(o=>!o),size:"1.5rem",radius:"xl",color:pendingFile||pendingDocRef?"blue":"gray",variant:pendingFile||pendingDocRef?"filled":"subtle","aria-label":"Attach file",children:jsx94(IconPaperclip,{size:"1rem",stroke:1.5})})}),jsx94(Popover.Dropdown,{p:0,children:jsx94(DocumentPicker,{subjectRef:attachmentSubjectRef,onSelect:doc=>{setPendingDocRef(doc),setPendingFile(void 0),setPickerOpen(!1)},onUpload:()=>{setPickerOpen(!1),fileInputRef.current?.click()}})})]}):void 0,rightSection:inputDisabled?void 0:jsx94(ActionIcon7,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx94(IconArrowRight,{size:"1rem",stroke:1.5})})})})]})]}):null}function ChatBubble(props){let{communication,alignment,showDelivered}=props,payloads=communication.payload??[],textContent=payloads.find(p=>p.contentString)?.contentString??"",contentRef=payloads.find(p=>p.contentReference)?.contentReference,attachment=payloads.find(p=>p.contentAttachment)?.contentAttachment,sentTime=new Date(communication.sent??-1),seenTime=new Date(communication.received??-1),senderResource=useResource2(communication.sender);return jsxs54("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsxs54(Text19,{fz:"xs",mb:"xs",fw:500,className:alignment==="right"?BaseChat_default.chatBubbleNameRight:void 0,"aria-label":"Sender name",children:[senderResource?getDisplayString4(senderResource):"[Unknown sender]","\xA0\xB7\xA0",jsx94(Text19,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),jsx94("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsxs54("div",{className:BaseChat_default.chatBubble,children:[textContent&&jsx94("span",{children:textContent}),contentRef&&jsx94(ChatBubbleDocumentReference,{reference:contentRef,hasText:!!textContent}),attachment&&jsx94(ChatBubbleAttachment,{attachment,hasText:!!textContent})]})}),showDelivered&&jsxs54("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleAttachment({attachment,hasText}){return jsx94("div",{className:hasText?BaseChat_default.chatBubbleAttachmentWithText:void 0,children:jsxs54(Group28,{gap:4,wrap:"nowrap",children:[jsx94("span",{className:BaseChat_default.chatBubbleAttachmentIcon,children:jsx94(IconPaperclip,{size:"0.75rem"})}),jsx94(Text19,{fz:"xs",truncate:!0,children:attachment.title??"File attached"})]})})}function ChatBubbleDocumentReference({reference,hasText}){let attachment=useResource2(reference)?.content?.[0]?.attachment;return attachment?jsx94(ChatBubbleAttachment,{attachment,hasText}):null}function ChatBubbleMenu({contentRef,contentAttachment,onViewInDocuments}){let docRef=useResource2(contentRef),attachment=contentRef?docRef?.content?.[0]?.attachment:contentAttachment,cachedUrl=useCachedBinaryUrl3(attachment?.url),handleDownload=()=>{let href=toSafeUrl(cachedUrl??attachment?.url);href&&window.open(href,"_blank","noopener,noreferrer")};return jsxs54(Menu4,{withinPortal:!0,position:"bottom-start",shadow:"md",children:[jsx94(Menu4.Target,{children:jsx94(ActionIcon7,{variant:"outline",color:"gray",radius:"xl",size:"sm","aria-label":"Attachment options",children:jsx94(IconDots,{size:"0.75rem"})})}),jsxs54(Menu4.Dropdown,{children:[contentRef&&onViewInDocuments&&jsx94(Menu4.Item,{leftSection:jsx94(IconFileExport,{size:"0.9rem"}),onClick:()=>onViewInDocuments(contentRef),children:"View in Documents"}),jsx94(Menu4.Item,{leftSection:jsx94(IconDownload,{size:"0.9rem"}),onClick:handleDownload,children:"Download"})]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs54("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx94("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx94("div",{style:{position:"relative"},children:jsx94(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx94("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx94("div",{className:BaseChat_default.chatBubble,children:jsx94(Skeleton,{height:14,width:parentWidth*.5,radius:"l"})})})]})}import{ActionIcon as ActionIcon8}from"@mantine/core";import{useMedplumProfile as useMedplumProfile5}from"@medplum/react-hooks";import{useEffect as useEffect17,useState as useState54}from"react";var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};import{Fragment as Fragment29,jsx as jsx95,jsxs as jsxs55}from"react/jsx-runtime";function ChatModal(props){let{open,children}=props,profile=useMedplumProfile5(),[opened,setOpened]=useState54(open??!1);return useEffect17(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?jsxs55(Fragment29,{children:[opened&&jsx95("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx95("div",{className:ChatModal_default.iconContainer,children:jsx95(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx95(IconChevronDown,{size:"1.625rem"})})}):jsx95("div",{className:ChatModal_default.iconContainer,children:jsx95(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx95(IconChevronUp,{size:"1.625rem"})})})]}):null}import{createReference as createReference3,formatCodeableConcept as formatCodeableConcept2,getReferenceString as getReferenceString6}from"@medplum/core";import{useMedplum as useMedplum25,useMedplumProfile as useMedplumProfile6,usePrevious}from"@medplum/react-hooks";import{useCallback as useCallback12,useEffect as useEffect18,useMemo as useMemo26,useState as useState55}from"react";import{jsx as jsx96}from"react/jsx-runtime";function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,excludeHeader,uploadEnabled,onError,onViewInDocuments}=props,medplum=useMedplum25(),profile=useMedplumProfile6(),prevThreadId=usePrevious(thread?.id),[communications,setCommunications]=useState55([]),profileRef=useMemo26(()=>profile?createReference3(profile):void 0,[profile]),threadRef=useMemo26(()=>createReference3(thread),[thread]);useEffect18(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=useCallback12((message,file,existingDocRef)=>{let profileRefStr=profileRef?getReferenceString6(profileRef):void 0;if(!profileRefStr)return;(async()=>{let payload=[];if(message&&payload.push({contentString:message}),existingDocRef)payload.push({contentReference:createReference3(existingDocRef)});else if(file){let docRef=await medplum.createDocumentReference({data:file,contentType:file.type||"application/octet-stream",filename:file.name,additionalFields:{...thread.subject?{subject:thread.subject}:{},description:file.name}});payload.push({contentReference:createReference3(docRef)})}let communication=await medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>getReferenceString6(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload,partOf:[threadRef],subject:thread.subject});setCommunications([...communications,communication]),onMessageSent?.(communication)})().catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent]),onMessageReceived=useMemo26(()=>thread.recipient?.length===2?message=>{message.received&&message.status==="completed"||medplum.updateResource({...message,received:message.received??new Date().toISOString(),status:"completed"}).catch(console.error)}:void 0,[medplum,thread.recipient?.length]);return profile?jsx96(BaseChat,{title:title??(thread?.topic?formatCodeableConcept2(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled,excludeHeader,uploadEnabled,onError,attachmentSubjectRef:thread.subject,onViewInDocuments}):null}import{Divider as Divider6,Stack as Stack20}from"@mantine/core";import{Fragment as Fragment30}from"react";import{Group as Group29,Stack as Stack19,Text as Text20}from"@mantine/core";import{formatDateTime as formatDateTime2,formatHumanName as formatHumanName7}from"@medplum/core";import{useResource as useResource3}from"@medplum/react-hooks";var ChatListItem_default={content:"ChatListItem_content",contentContainer:"ChatListItem_contentContainer",selected:"ChatListItem_selected"};import{jsx as jsx97,jsxs as jsxs56}from"react/jsx-runtime";var ChatListItem=props=>{let{topic,lastCommunication,isSelected,getThreadUri}=props,patientResource=useResource3(topic.subject),patientName=formatHumanName7(patientResource?.name?.[0]),lastMsg=lastCommunication?.payload?.[0]?.contentString,trimmedMsg=lastMsg?.length&&lastMsg.length>100?lastMsg.slice(0,100)+"...":lastMsg,senderName=lastCommunication?.sender?.display?`${lastCommunication?.sender?.display}: `:"",content=trimmedMsg?`${senderName} ${trimmedMsg}`:"No messages available",topicName=topic.topic?.text??content;return jsx97(MedplumLink,{to:getThreadUri(topic),underline:"never",children:jsxs56(Group29,{p:"xs",align:"center",wrap:"nowrap",className:clsx_default(ChatListItem_default.contentContainer,{[ChatListItem_default.selected]:isSelected}),children:[jsx97(ResourceAvatar,{value:topic.subject,radius:"xl",size:36}),jsxs56(Stack19,{gap:0,children:[jsx97(Text20,{size:"sm",fw:700,truncate:"end",children:patientName}),jsx97(Text20,{size:"sm",fw:400,lineClamp:2,className:ChatListItem_default.content,children:topicName}),jsx97(Text20,{size:"xs",style:{marginTop:2},children:lastCommunication?formatDateTime2(lastCommunication.sent):""})]})]})})};import{jsx as jsx98,jsxs as jsxs57}from"react/jsx-runtime";var ChatList=props=>{let{threads,selectedCommunication,getThreadUri}=props;return jsx98(Stack20,{gap:0,children:threads.map(thread=>{let topicCommunication=thread[0],lastCommunication=thread[1],_isSelected=selectedCommunication?.id===topicCommunication.id;return jsxs57(Fragment30,{children:[jsx98(ChatListItem,{topic:topicCommunication,lastCommunication,isSelected:_isSelected,getThreadUri}),jsx98(Divider6,{})]},topicCommunication.id)})})};import{Button as Button11,Modal as Modal3,Stack as Stack24,Text as Text23,TextInput as TextInput22}from"@mantine/core";import{showNotification as showNotification6}from"@mantine/notifications";import{createReference as createReference6,HTTP_HL7_ORG as HTTP_HL7_ORG4,normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useMedplum as useMedplum29,useMedplumProfile as useMedplumProfile7}from"@medplum/react-hooks";import{useMemo as useMemo28,useState as useState58}from"react";import{Divider as Divider8,Group as Group32,Stack as Stack23,Text as Text22,Title as Title10}from"@mantine/core";import{createReference as createReference5,getExtension as getExtension2,getReferenceString as getReferenceString7}from"@medplum/core";import{QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,useMedplum as useMedplum28,useQuestionnaireForm}from"@medplum/react-hooks";import{useCallback as useCallback13,useEffect as useEffect21,useLayoutEffect as useLayoutEffect3,useMemo as useMemo27,useRef as useRef13,useState as useState57}from"react";import{Button as Button9,Paper as Paper3}from"@mantine/core";import{createReference as createReference4,HTTP_HL7_ORG as HTTP_HL7_ORG2}from"@medplum/core";import{useMedplum as useMedplum26}from"@medplum/react-hooks";import{useEffect as useEffect19,useLayoutEffect as useLayoutEffect2,useRef as useRef12}from"react";var Point=class{constructor(x,y,pressure,time){__publicField(this,"x");__publicField(this,"y");__publicField(this,"pressure");__publicField(this,"time");if(isNaN(x)||isNaN(y))throw new Error(`Point is invalid: (${x}, ${y})`);this.x=+x,this.y=+y,this.pressure=pressure||0,this.time=time||Date.now()}distanceTo(start){return Math.sqrt(Math.pow(this.x-start.x,2)+Math.pow(this.y-start.y,2))}equals(other){return this.x===other.x&&this.y===other.y&&this.pressure===other.pressure&&this.time===other.time}velocityFrom(start){return this.time!==start.time?this.distanceTo(start)/(this.time-start.time):0}},Bezier=class _Bezier{constructor(startPoint,control2,control1,endPoint,startWidth,endWidth){this.startPoint=startPoint,this.control2=control2,this.control1=control1,this.endPoint=endPoint,this.startWidth=startWidth,this.endWidth=endWidth}static fromPoints(points,widths){let c2=this.calculateControlPoints(points[0],points[1],points[2]).c2,c3=this.calculateControlPoints(points[1],points[2],points[3]).c1;return new _Bezier(points[1],c2,c3,points[2],widths.start,widths.end)}static calculateControlPoints(s1,s2,s3){let dx1=s1.x-s2.x,dy1=s1.y-s2.y,dx2=s2.x-s3.x,dy2=s2.y-s3.y,m1={x:(s1.x+s2.x)/2,y:(s1.y+s2.y)/2},m2={x:(s2.x+s3.x)/2,y:(s2.y+s3.y)/2},l1=Math.sqrt(dx1*dx1+dy1*dy1),l2=Math.sqrt(dx2*dx2+dy2*dy2),dxm=m1.x-m2.x,dym=m1.y-m2.y,k=l1+l2==0?0:l2/(l1+l2),cm={x:m2.x+dxm*k,y:m2.y+dym*k},tx=s2.x-cm.x,ty=s2.y-cm.y;return{c1:new Point(m1.x+tx,m1.y+ty),c2:new Point(m2.x+tx,m2.y+ty)}}length(){let length=0,px,py;for(let i=0;i<=10;i+=1){let t=i/10,cx=this.point(t,this.startPoint.x,this.control1.x,this.control2.x,this.endPoint.x),cy=this.point(t,this.startPoint.y,this.control1.y,this.control2.y,this.endPoint.y);if(i>0){let xdiff=cx-px,ydiff=cy-py;length+=Math.sqrt(xdiff*xdiff+ydiff*ydiff)}px=cx,py=cy}return length}point(t,start,c1,c2,end){return start*(1-t)*(1-t)*(1-t)+3*c1*(1-t)*(1-t)*t+3*c2*(1-t)*t*t+end*t*t*t}},SignatureEventTarget=class{constructor(){__publicField(this,"_et");try{this._et=new EventTarget}catch{this._et=document}}addEventListener(type,listener,options){this._et.addEventListener(type,listener,options)}dispatchEvent(event){return this._et.dispatchEvent(event)}removeEventListener(type,callback,options){this._et.removeEventListener(type,callback,options)}};function throttle(fn,wait=250){let previous=0,timeout=null,result,storedContext,storedArgs,later=()=>{previous=Date.now(),timeout=null,result=fn.apply(storedContext,storedArgs),timeout||(storedContext=null,storedArgs=[])};return function(...args){let now=Date.now(),remaining=wait-(now-previous);return storedContext=this,storedArgs=args,remaining<=0||remaining>wait?(timeout&&(clearTimeout(timeout),timeout=null),previous=now,result=fn.apply(storedContext,storedArgs),timeout||(storedContext=null,storedArgs=[])):timeout||(timeout=window.setTimeout(later,remaining)),result}}var SignaturePad=class _SignaturePad extends SignatureEventTarget{constructor(canvas,options={}){super();__publicField(this,"dotSize");__publicField(this,"minWidth");__publicField(this,"maxWidth");__publicField(this,"penColor");__publicField(this,"minDistance");__publicField(this,"velocityFilterWeight");__publicField(this,"compositeOperation");__publicField(this,"backgroundColor");__publicField(this,"throttle");__publicField(this,"canvasContextOptions");__publicField(this,"_ctx");__publicField(this,"_drawingStroke",!1);__publicField(this,"_isEmpty",!0);__publicField(this,"_dataUrl");__publicField(this,"_dataUrlOptions");__publicField(this,"_lastPoints",[]);__publicField(this,"_data",[]);__publicField(this,"_lastVelocity",0);__publicField(this,"_lastWidth",0);__publicField(this,"_strokeMoveUpdate");__publicField(this,"_strokePointerId");this.canvas=canvas,this.velocityFilterWeight=options.velocityFilterWeight||.7,this.minWidth=options.minWidth||.5,this.maxWidth=options.maxWidth||2.5,this.throttle=options.throttle??16,this.minDistance=options.minDistance??5,this.dotSize=options.dotSize||0,this.penColor=options.penColor||"black",this.backgroundColor=options.backgroundColor||"rgba(0,0,0,0)",this.compositeOperation=options.compositeOperation||"source-over",this.canvasContextOptions=options.canvasContextOptions??{},this._strokeMoveUpdate=this.throttle?throttle(_SignaturePad.prototype._strokeUpdate,this.throttle):_SignaturePad.prototype._strokeUpdate,this._handleMouseDown=this._handleMouseDown.bind(this),this._handleMouseMove=this._handleMouseMove.bind(this),this._handleMouseUp=this._handleMouseUp.bind(this),this._handleTouchStart=this._handleTouchStart.bind(this),this._handleTouchMove=this._handleTouchMove.bind(this),this._handleTouchEnd=this._handleTouchEnd.bind(this),this._handlePointerDown=this._handlePointerDown.bind(this),this._handlePointerMove=this._handlePointerMove.bind(this),this._handlePointerUp=this._handlePointerUp.bind(this),this._handlePointerCancel=this._handlePointerCancel.bind(this),this._handleTouchCancel=this._handleTouchCancel.bind(this),this._ctx=canvas.getContext("2d",this.canvasContextOptions),this.clear(),this.on()}clear(){let{_ctx:ctx,canvas}=this;ctx.fillStyle=this.backgroundColor,ctx.clearRect(0,0,canvas.width,canvas.height),ctx.fillRect(0,0,canvas.width,canvas.height),this._data=[],this._reset(this._getPointGroupOptions()),this._isEmpty=!0,this._dataUrl=void 0,this._dataUrlOptions=void 0,this._strokePointerId=void 0}redraw(){let data2=this._data,dataUrl=this._dataUrl,dataUrlOptions=this._dataUrlOptions;this.clear(),dataUrl&&this.fromDataURL(dataUrl,dataUrlOptions),this.fromData(data2,{clear:!1})}fromDataURL(dataUrl,options={}){return new Promise((resolve,reject)=>{let image=new Image,ratio=options.ratio||window.devicePixelRatio||1,width=options.width||this.canvas.width/ratio,height=options.height||this.canvas.height/ratio,xOffset=options.xOffset||0,yOffset=options.yOffset||0;this._reset(this._getPointGroupOptions()),image.onload=()=>{this._ctx.drawImage(image,xOffset,yOffset,width,height),resolve()},image.onerror=error=>{reject(error)},image.crossOrigin="anonymous",image.src=dataUrl,this._isEmpty=!1,this._dataUrl=dataUrl,this._dataUrlOptions={...options}})}toDataURL(type="image/png",encoderOptions){return type==="image/svg+xml"?(typeof encoderOptions!="object"&&(encoderOptions=void 0),`data:image/svg+xml;base64,${btoa(this.toSVG(encoderOptions))}`):(typeof encoderOptions!="number"&&(encoderOptions=void 0),this.canvas.toDataURL(type,encoderOptions))}on(){this.canvas.style.touchAction="none",this.canvas.style.msTouchAction="none",this.canvas.style.userSelect="none",this.canvas.style.webkitUserSelect="none";let isIOS=/Macintosh/.test(navigator.userAgent)&&"ontouchstart"in document;window.PointerEvent&&!isIOS?this._handlePointerEvents():(this._handleMouseEvents(),"ontouchstart"in window&&this._handleTouchEvents())}off(){this.canvas.style.touchAction="auto",this.canvas.style.msTouchAction="auto",this.canvas.style.userSelect="auto",this.canvas.style.webkitUserSelect="auto",this.canvas.removeEventListener("pointerdown",this._handlePointerDown),this.canvas.removeEventListener("mousedown",this._handleMouseDown),this.canvas.removeEventListener("touchstart",this._handleTouchStart),this._removeMoveUpEventListeners()}_getListenerFunctions(){let canvasWindow=window.document===this.canvas.ownerDocument?window:this.canvas.ownerDocument.defaultView??this.canvas.ownerDocument;return{addEventListener:canvasWindow.addEventListener.bind(canvasWindow),removeEventListener:canvasWindow.removeEventListener.bind(canvasWindow)}}_removeMoveUpEventListeners(){let{removeEventListener}=this._getListenerFunctions();removeEventListener("pointermove",this._handlePointerMove),removeEventListener("pointerup",this._handlePointerUp),removeEventListener("pointercancel",this._handlePointerCancel),removeEventListener("mousemove",this._handleMouseMove),removeEventListener("mouseup",this._handleMouseUp),removeEventListener("touchmove",this._handleTouchMove),removeEventListener("touchend",this._handleTouchEnd),removeEventListener("touchcancel",this._handleTouchCancel)}isEmpty(){return this._isEmpty}fromData(pointGroups,{clear=!0}={}){clear&&this.clear(),this._fromData(pointGroups,this._drawCurve.bind(this),this._drawDot.bind(this)),this._data=this._data.concat(pointGroups)}toData(){return this._data}_isLeftButtonPressed(event,only){return only?event.buttons===1:(event.buttons&1)===1}_pointerEventToSignatureEvent(event){return{event,type:event.type,x:event.clientX,y:event.clientY,pressure:"pressure"in event?event.pressure:0}}_touchEventToSignatureEvent(event){let touch=event.changedTouches[0];return{event,type:event.type,x:touch.clientX,y:touch.clientY,pressure:touch.force}}_handleMouseDown(event){!this._isLeftButtonPressed(event,!0)||this._drawingStroke||this._strokeBegin(this._pointerEventToSignatureEvent(event))}_handleMouseMove(event){if(!this._isLeftButtonPressed(event,!0)||!this._drawingStroke){this._strokeEnd(this._pointerEventToSignatureEvent(event),!1);return}this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event))}_handleMouseUp(event){this._isLeftButtonPressed(event)||this._strokeEnd(this._pointerEventToSignatureEvent(event))}_handleTouchStart(event){event.targetTouches.length!==1||this._drawingStroke||(event.cancelable&&event.preventDefault(),this._strokeBegin(this._touchEventToSignatureEvent(event)))}_handleTouchMove(event){if(event.targetTouches.length===1){if(event.cancelable&&event.preventDefault(),!this._drawingStroke){this._strokeEnd(this._touchEventToSignatureEvent(event),!1);return}this._strokeMoveUpdate(this._touchEventToSignatureEvent(event))}}_handleTouchEnd(event){event.targetTouches.length===0&&(event.cancelable&&event.preventDefault(),this._strokeEnd(this._touchEventToSignatureEvent(event)))}_handlePointerCancel(event){this._allowPointerId(event)&&(event.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(event),!1))}_handleTouchCancel(event){event.cancelable&&event.preventDefault(),this._strokeEnd(this._touchEventToSignatureEvent(event),!1)}_getPointerId(event){return event.persistentDeviceId||event.pointerId}_allowPointerId(event,allowUndefined=!1){return typeof this._strokePointerId>"u"?allowUndefined:this._getPointerId(event)===this._strokePointerId}_handlePointerDown(event){this._drawingStroke||!this._isLeftButtonPressed(event)||!this._allowPointerId(event,!0)||(this._strokePointerId=this._getPointerId(event),event.preventDefault(),this._strokeBegin(this._pointerEventToSignatureEvent(event)))}_handlePointerMove(event){if(this._allowPointerId(event)){if(!this._isLeftButtonPressed(event,!0)||!this._drawingStroke){this._strokeEnd(this._pointerEventToSignatureEvent(event),!1);return}event.preventDefault(),this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event))}}_handlePointerUp(event){this._isLeftButtonPressed(event)||!this._allowPointerId(event)||(event.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(event)))}_getPointGroupOptions(group){return{penColor:group&&"penColor"in group?group.penColor:this.penColor,dotSize:group&&"dotSize"in group?group.dotSize:this.dotSize,minWidth:group&&"minWidth"in group?group.minWidth:this.minWidth,maxWidth:group&&"maxWidth"in group?group.maxWidth:this.maxWidth,velocityFilterWeight:group&&"velocityFilterWeight"in group?group.velocityFilterWeight:this.velocityFilterWeight,compositeOperation:group&&"compositeOperation"in group?group.compositeOperation:this.compositeOperation}}_strokeBegin(event){if(!this.dispatchEvent(new CustomEvent("beginStroke",{detail:event,cancelable:!0})))return;let{addEventListener}=this._getListenerFunctions();switch(event.event.type){case"mousedown":addEventListener("mousemove",this._handleMouseMove,{passive:!1}),addEventListener("mouseup",this._handleMouseUp,{passive:!1});break;case"touchstart":addEventListener("touchmove",this._handleTouchMove,{passive:!1}),addEventListener("touchend",this._handleTouchEnd,{passive:!1}),addEventListener("touchcancel",this._handleTouchCancel,{passive:!1});break;case"pointerdown":addEventListener("pointermove",this._handlePointerMove,{passive:!1}),addEventListener("pointerup",this._handlePointerUp,{passive:!1}),addEventListener("pointercancel",this._handlePointerCancel,{passive:!1});break;default:}this._drawingStroke=!0;let pointGroupOptions=this._getPointGroupOptions(),newPointGroup={...pointGroupOptions,points:[]};this._data.push(newPointGroup),this._reset(pointGroupOptions),this._strokeUpdate(event)}_strokeUpdate(event){if(!this._drawingStroke)return;if(this._data.length===0){this._strokeBegin(event);return}this.dispatchEvent(new CustomEvent("beforeUpdateStroke",{detail:event}));let point=this._createPoint(event.x,event.y,event.pressure),lastPointGroup=this._data[this._data.length-1],lastPoints=lastPointGroup.points,lastPoint=lastPoints.length>0&&lastPoints[lastPoints.length-1],isLastPointTooClose=lastPoint?point.distanceTo(lastPoint)<=this.minDistance:!1,pointGroupOptions=this._getPointGroupOptions(lastPointGroup);if(!lastPoint||!(lastPoint&&isLastPointTooClose)){let curve=this._addPoint(point,pointGroupOptions);lastPoint?curve&&this._drawCurve(curve,pointGroupOptions):this._drawDot(point,pointGroupOptions),lastPoints.push({time:point.time,x:point.x,y:point.y,pressure:point.pressure})}this.dispatchEvent(new CustomEvent("afterUpdateStroke",{detail:event}))}_strokeEnd(event,shouldUpdate=!0){this._removeMoveUpEventListeners(),this._drawingStroke&&(shouldUpdate&&this._strokeUpdate(event),this._drawingStroke=!1,this._strokePointerId=void 0,this.dispatchEvent(new CustomEvent("endStroke",{detail:event})))}_handlePointerEvents(){this._drawingStroke=!1,this.canvas.addEventListener("pointerdown",this._handlePointerDown,{passive:!1})}_handleMouseEvents(){this._drawingStroke=!1,this.canvas.addEventListener("mousedown",this._handleMouseDown,{passive:!1})}_handleTouchEvents(){this.canvas.addEventListener("touchstart",this._handleTouchStart,{passive:!1})}_reset(options){this._lastPoints=[],this._lastVelocity=0,this._lastWidth=(options.minWidth+options.maxWidth)/2,this._ctx.fillStyle=options.penColor,this._ctx.globalCompositeOperation=options.compositeOperation}_createPoint(x,y,pressure){let rect=this.canvas.getBoundingClientRect();return new Point(x-rect.left,y-rect.top,pressure,new Date().getTime())}_addPoint(point,options){let{_lastPoints}=this;if(_lastPoints.push(point),_lastPoints.length>2){_lastPoints.length===3&&_lastPoints.unshift(_lastPoints[0]);let widths=this._calculateCurveWidths(_lastPoints[1],_lastPoints[2],options),curve=Bezier.fromPoints(_lastPoints,widths);return _lastPoints.shift(),curve}return null}_calculateCurveWidths(startPoint,endPoint,options){let velocity=options.velocityFilterWeight*endPoint.velocityFrom(startPoint)+(1-options.velocityFilterWeight)*this._lastVelocity,newWidth=this._strokeWidth(velocity,options),widths={end:newWidth,start:this._lastWidth};return this._lastVelocity=velocity,this._lastWidth=newWidth,widths}_strokeWidth(velocity,options){return Math.max(options.maxWidth/(velocity+1),options.minWidth)}_drawCurveSegment(x,y,width){let ctx=this._ctx;ctx.moveTo(x,y),ctx.arc(x,y,width,0,2*Math.PI,!1),this._isEmpty=!1}_drawCurve(curve,options){let ctx=this._ctx,widthDelta=curve.endWidth-curve.startWidth,drawSteps=Math.ceil(curve.length())*2;ctx.beginPath(),ctx.fillStyle=options.penColor;for(let i=0;i<drawSteps;i+=1){let t=i/drawSteps,tt=t*t,ttt=tt*t,u=1-t,uu=u*u,uuu=uu*u,x=uuu*curve.startPoint.x;x+=3*uu*t*curve.control1.x,x+=3*u*tt*curve.control2.x,x+=ttt*curve.endPoint.x;let y=uuu*curve.startPoint.y;y+=3*uu*t*curve.control1.y,y+=3*u*tt*curve.control2.y,y+=ttt*curve.endPoint.y;let width=Math.min(curve.startWidth+ttt*widthDelta,options.maxWidth);this._drawCurveSegment(x,y,width)}ctx.closePath(),ctx.fill()}_drawDot(point,options){let ctx=this._ctx,width=options.dotSize>0?options.dotSize:(options.minWidth+options.maxWidth)/2;ctx.beginPath(),this._drawCurveSegment(point.x,point.y,width),ctx.closePath(),ctx.fillStyle=options.penColor,ctx.fill()}_fromData(pointGroups,drawCurve,drawDot){for(let group of pointGroups){let{points}=group,pointGroupOptions=this._getPointGroupOptions(group);if(points.length>1)for(let j=0;j<points.length;j+=1){let basicPoint=points[j],point=new Point(basicPoint.x,basicPoint.y,basicPoint.pressure,basicPoint.time);j===0&&this._reset(pointGroupOptions);let curve=this._addPoint(point,pointGroupOptions);curve&&drawCurve(curve,pointGroupOptions)}else this._reset(pointGroupOptions),drawDot(points[0],pointGroupOptions)}}toSVG({includeBackgroundColor=!1,includeDataUrl=!1}={}){let pointGroups=this._data,ratio=Math.max(window.devicePixelRatio||1,1),minX=0,minY=0,maxX=this.canvas.width/ratio,maxY=this.canvas.height/ratio,svg=document.createElementNS("http://www.w3.org/2000/svg","svg");if(svg.setAttribute("xmlns","http://www.w3.org/2000/svg"),svg.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink"),svg.setAttribute("viewBox",`${minX} ${minY} ${maxX} ${maxY}`),svg.setAttribute("width",maxX.toString()),svg.setAttribute("height",maxY.toString()),includeBackgroundColor&&this.backgroundColor){let rect=document.createElement("rect");rect.setAttribute("width","100%"),rect.setAttribute("height","100%"),rect.setAttribute("fill",this.backgroundColor),svg.appendChild(rect)}if(includeDataUrl&&this._dataUrl){let ratio2=this._dataUrlOptions?.ratio||window.devicePixelRatio||1,width=this._dataUrlOptions?.width||this.canvas.width/ratio2,height=this._dataUrlOptions?.height||this.canvas.height/ratio2,xOffset=this._dataUrlOptions?.xOffset||0,yOffset=this._dataUrlOptions?.yOffset||0,image=document.createElement("image");image.setAttribute("x",xOffset.toString()),image.setAttribute("y",yOffset.toString()),image.setAttribute("width",width.toString()),image.setAttribute("height",height.toString()),image.setAttribute("preserveAspectRatio","none"),image.setAttribute("href",this._dataUrl),svg.appendChild(image)}return this._fromData(pointGroups,(curve,{penColor})=>{let path=document.createElement("path");if(!isNaN(curve.control1.x)&&!isNaN(curve.control1.y)&&!isNaN(curve.control2.x)&&!isNaN(curve.control2.y)){let attr=`M ${curve.startPoint.x.toFixed(3)},${curve.startPoint.y.toFixed(3)} C ${curve.control1.x.toFixed(3)},${curve.control1.y.toFixed(3)} ${curve.control2.x.toFixed(3)},${curve.control2.y.toFixed(3)} ${curve.endPoint.x.toFixed(3)},${curve.endPoint.y.toFixed(3)}`;path.setAttribute("d",attr),path.setAttribute("stroke-width",(curve.endWidth*2.25).toFixed(3)),path.setAttribute("stroke",penColor),path.setAttribute("fill","none"),path.setAttribute("stroke-linecap","round"),svg.appendChild(path)}},(point,{penColor,dotSize,minWidth,maxWidth})=>{let circle=document.createElement("circle"),size=dotSize>0?dotSize:(minWidth+maxWidth)/2;circle.setAttribute("r",size.toString()),circle.setAttribute("cx",point.x.toString()),circle.setAttribute("cy",point.y.toString()),circle.setAttribute("fill",penColor),svg.appendChild(circle)}),svg.outerHTML}};import{jsx as jsx99,jsxs as jsxs58}from"react/jsx-runtime";function SignatureInput(props){let medplum=useMedplum26(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=useRef12(null),signaturePadRef=useRef12(null),onChangeRef=useRef12(onChange);return useLayoutEffect2(()=>{onChangeRef.current=onChange}),useEffect19(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:HTTP_HL7_ORG2+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??createReference4(medplum.getProfile()),data:signaturePadRef.current?.toDataURL().split(",")[1]})}if(canvasRef.current){let signaturePad=new SignaturePad(canvasRef.current);defaultValue2?.data&&signaturePad.fromDataURL(defaultValue2.data).catch(console.error),signaturePad.addEventListener("endStroke",handleEndStroke),signaturePadRef.current=signaturePad}return()=>{signaturePadRef.current&&signaturePadRef.current.removeEventListener("beginStroke",handleEndStroke)}},[medplum,defaultValue2,who]),jsxs58(Paper3,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[jsx99("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),jsx99(Button9,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:jsx99(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}import{Divider as Divider7,Stack as Stack22}from"@mantine/core";import{isQuestionEnabled,QuestionnaireItemType as QuestionnaireItemType3}from"@medplum/react-hooks";import{Fragment as Fragment33}from"react";import{Title as Title9}from"@mantine/core";import{jsx as jsx100,jsxs as jsxs59}from"react/jsx-runtime";function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return jsxs59("div",{children:[props.item.text&&jsx100(Title9,{order:4,mb:"md",children:props.item.text}),jsx100(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}import{Checkbox as Checkbox5,Group as Group30,MultiSelect,NativeSelect as NativeSelect10,Radio,Text as Text21,Textarea as Textarea3,TextInput as TextInput21}from"@mantine/core";import{capitalize as capitalize3,deepEquals,formatCoding as formatCoding2,getElementDefinition,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG3,stringify as stringify2,typedValueToString}from"@medplum/core";import{getItemAnswerOptionValue,getItemInitialValue,getNewMultiSelectValues,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,QUESTIONNAIRE_ITEM_CONTROL_URL,QuestionnaireItemType,useMedplum as useMedplum27}from"@medplum/react-hooks";import{useEffect as useEffect20,useState as useState56}from"react";import{Fragment as Fragment31,jsx as jsx101,jsxs as jsxs60}from"react/jsx-runtime";var MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS=30,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS=50;function QuestionnaireFormItem(props){let formState=props.formState,item=props.item,response=props.responseItem;function onChangeAnswer(newResponseAnswer){if(formState&&props.context)if(item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice){let updatedAnswers=[...response.answer||[]];newResponseAnswer.length===0?updatedAnswers.splice(props.index,1):updatedAnswers[props.index]=newResponseAnswer[0],formState.onChangeAnswer(props.context,props.item,updatedAnswers)}else formState.onChangeAnswer(props.context,props.item,newResponseAnswer)}let type=item.type;if(!type)return null;let name=item.linkId;if(!name)return null;let inputId=item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice?`${name}-${props.index}`:name,initial;item.initial&&item.initial.length>0?initial=item.initial[0]:item.answerOption&&item.answerOption.length>0&&(initial=item.answerOption.find(option=>option.initialSelected));let defaultValue2=getCurrentAnswer(response,props.index)??getItemInitialValue(initial),validationError=getExtension(response,`${HTTP_HL7_ORG3}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx101("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx101(CheckboxFormSection,{title:props.item.text,htmlFor:inputId,children:jsx101(Checkbox5,{id:inputId,name,required:props.required??item.required,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueBoolean:e.currentTarget.checked}])})},props.item.linkId);break;case QuestionnaireItemType.decimal:formComponent=jsx101(TextInput21,{type:"number",step:"any",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueDecimal:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.integer:formComponent=jsx101(TextInput21,{type:"number",step:1,id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueInteger:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.date:formComponent=jsx101(TextInput21,{type:"date",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueDate:e.currentTarget.value}])});break;case QuestionnaireItemType.dateTime:formComponent=jsx101(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case QuestionnaireItemType.time:formComponent=jsx101(TextInput21,{type:"time",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueTime:e.currentTarget.value}])});break;case QuestionnaireItemType.string:case QuestionnaireItemType.url:formComponent=jsx101(TextInput21,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.text:formComponent=jsx101(Textarea3,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.attachment:formComponent=jsx101(Group30,{py:4,children:jsx101(AttachmentInput,{path:"",name:inputId,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case QuestionnaireItemType.reference:formComponent=jsx101(ReferenceInput,{name:inputId,required:props.required??item.required,targetTypes:getQuestionnaireItemReferenceTargetTypes(item),searchCriteria:getQuestionnaireItemReferenceFilter(item,formState?.subject,formState?.encounter),defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueReference:newValue}])});break;case QuestionnaireItemType.quantity:formComponent=jsx101(QuantityInput,{path:"",name:inputId,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueQuantity:newValue}]),disableWheel:!0});break;case QuestionnaireItemType.choice:case QuestionnaireItemType.openChoice:{let{widget,multiselect}=resolveChoiceControl(item),sharedProps={name:inputId,item,required:props.required??item.required,initial,response,multiselect,onChangeAnswer};widget==="check-box"?formComponent=jsx101(QuestionnaireCheckboxInput,{...sharedProps}):widget==="drop-down"?formComponent=jsx101(QuestionnaireDropdownInput,{...sharedProps}):formComponent=jsx101(QuestionnaireRadioButtonInput,{...sharedProps})}break;default:return null}return jsxs60(Fragment31,{children:[formComponent,validationError?.valueString&&jsx101(Text21,{c:"red",size:"lg",mt:4,children:validationError.valueString})]})}function QuestionnaireDropdownInput(props){let{name,item,required,initial,onChangeAnswer,response,multiselect}=props;if(!item.answerOption?.length&&!item.answerValueSet)return jsx101(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||multiselect;if(item.answerValueSet)return jsx101(ValueSetAutocomplete,{name,placeholder:"Select items",binding:item.answerValueSet,maxValues:isMultiSelect?void 0:1,required,onChange:values=>{isMultiSelect?values.length===0?onChangeAnswer([{}]):onChangeAnswer(values.map(coding=>({valueCoding:coding}))):onChangeAnswer([{valueCoding:values[0]}])},defaultValue:defaultValue2?.value});if(isMultiSelect){let{propertyName,data:data2}=formatSelectData(item);return jsx101(MultiSelect,{data:data2,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[typedValueToString(initialValue)],required,onChange:selected=>{if(selected.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(selected,propertyName,item);onChangeAnswer(values)}}})}else{let data2=[""];if(item.answerOption)for(let option of item.answerOption){let optionValue=getItemAnswerOptionValue(option);data2.push(typedValueToString(optionValue))}return jsx101(NativeSelect10,{id:name,name,required,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){onChangeAnswer([{}]);return}let option=item.answerOption[index-1],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize3(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])},defaultValue:formatCoding2(defaultValue2?.value)||defaultValue2?.value,data:data2})}}function getValueSetOptions(valueSetUrl,medplum){return valueSetUrl?medplum.valueSetExpand({url:valueSetUrl,count:MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS+1}).then(valueSet=>valueSet.expansion?.contains??[]):Promise.resolve([])}function useValueSetOptions(valueSetUrl){let medplum=useMedplum27(),[valueSetOptions,setValueSetOptions]=useState56([]),[isLoading,setIsLoading]=useState56(!1);return useEffect20(()=>{async function loadValueSet(){if(valueSetUrl){setIsLoading(!0);try{let options=await getValueSetOptions(valueSetUrl,medplum);setValueSetOptions(options)}catch(err){console.error("Error loading value set:",err)}finally{setIsLoading(!1)}}}loadValueSet().catch(console.error)},[valueSetUrl,medplum]),[valueSetOptions,isLoading]}function getOptionsFromValueSet(valueSetOptions,name){return valueSetOptions.map((option,i)=>{let optionName=`${name}-valueset-${i}`,optionValue={type:"Coding",value:{system:option.system,code:option.code,display:option.display}};return[optionName,optionValue]})}function QuestionnaireRadioButtonInput(props){let{name,item,required,initial,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition("QuestionnaireItemAnswerOption","value[x]"),initialValue=getItemInitialValue(initial),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),options=[],defaultValue2;if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?(initialValue&&stringify2(optionValue)===stringify2(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return jsx101(Text21,{children:"Loading options..."});if(options.length===0)return jsx101(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs60(Fragment31,{children:[jsx101(Radio.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+capitalize3(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>jsx101(Radio,{id:optionName,value:optionName,py:4,required,label:jsx101(ResourcePropertyDisplay,{property:valueElementDefinition,propertyType:optionValue.type,value:optionValue.value})},optionName))}),(item.answerValueSet&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS||item.answerOption&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS)&&jsxs60(Text21,{size:"sm",c:"dimmed",mt:"xs",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function QuestionnaireCheckboxInput(props){let{name,item,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition("QuestionnaireItemAnswerOption","value[x]"),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),initialSelectedValues=item.answerValueSet?(response?.answer?.map(a=>a.valueCoding)||[]).filter(c=>c!==void 0):getCurrentMultiSelectAnswer(response),[selectedValues,setSelectedValues]=useState56(initialSelectedValues),options=[];if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?[optionName,optionValue]:null}).filter(option=>option!==null);options.push(...mappedOptions)}if(isLoading)return jsx101(Text21,{children:"Loading options..."});if(options.length===0)return jsx101(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS),handleCheckboxChange=(optionValue,selected)=>{if(item.answerValueSet){let currentCodings=selectedValues,newCodings;selected?newCodings=[...currentCodings,optionValue.value]:newCodings=currentCodings.filter(c=>!deepEquals(c,optionValue.value)),setSelectedValues(newCodings),newCodings.length===0?onChangeAnswer([{}]):onChangeAnswer(newCodings.map(coding=>({valueCoding:coding})))}else{let currentValues=selectedValues,optionValueStr=typedValueToString(optionValue),newValues;if(selected?newValues=[...currentValues,optionValueStr]:newValues=currentValues.filter(v=>v!==optionValueStr),setSelectedValues(newValues),newValues.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(newValues,"value"+capitalize3(optionValue.type),item);onChangeAnswer(values)}}};return jsxs60(Group30,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=typedValueToString(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>deepEquals(coding,optionValue.value)):selectedValues.includes(optionValueStr);return jsx101(Checkbox5,{id:optionName,label:jsx101(ResourcePropertyDisplay,{property:valueElementDefinition,propertyType:optionValue.type,value:optionValue.value}),checked:isChecked,onChange:event=>handleCheckboxChange(optionValue,event.currentTarget.checked)},optionName)}),(item.answerValueSet&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS||item.answerOption&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS)&&jsxs60(Text21,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx101(TextInput21,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){return getItemAnswerOptionValue(response?.answer?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response?.answer;return results?results.map(a=>getItemAnswerOptionValue(a)).map(type=>formatCoding2(type?.value)||type?.value).filter(Boolean):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals(option[1].value,defaultAnswer?.value))?.[0]}var choiceTypes=["drop-down","radio-button","check-box"];function resolveChoiceControl(item){let widget="radio-button",multiselect=!1;item.answerValueSet&&(widget="drop-down");for(let ext of item.extension??[]){if(ext.url!==QUESTIONNAIRE_ITEM_CONTROL_URL)continue;let code=ext.valueCodeableConcept?.coding?.[0]?.code;choiceTypes.includes(code)&&(widget=code),code==="multi-select"&&(multiselect=!0)}return widget==="radio-button"&&multiselect&&(widget="check-box"),{widget,multiselect}}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize3(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}import{Anchor as Anchor9}from"@mantine/core";import{Fragment as Fragment32,jsx as jsx102,jsxs as jsxs61}from"react/jsx-runtime";function QuestionnaireFormRepeatableGroup(props){return jsxs61(Fragment32,{children:[props.responseItems.map(response=>jsx102(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),jsx102(Anchor9,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}import{Anchor as Anchor10,Stack as Stack21}from"@mantine/core";import{QuestionnaireItemType as QuestionnaireItemType2}from"@medplum/react-hooks";import{jsx as jsx103,jsxs as jsxs62}from"react/jsx-runtime";function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,isChoiceType=item.type===QuestionnaireItemType2.choice||item.type===QuestionnaireItemType2.openChoice,showAddButton=!isChoiceType,answers=!isChoiceType&&responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return jsxs62(FormSection,{title:props.item.text,withAsterisk:props.item.required,children:[jsx103(Stack21,{gap:"xs",children:answers?.map((_,index)=>jsx103(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&jsx103(Anchor10,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}import{jsx as jsx104,jsxs as jsxs63}from"react/jsx-runtime";function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props,isTopLevel=context.length===0,hasRenderedSection=!1;return jsx104(Stack22,{gap:"xl",children:items.map((item,index)=>{if(!isQuestionEnabled(item,formState.questionnaireResponse))return null;let isGroup=item.type===QuestionnaireItemType3.group,showSectionDivider=isTopLevel&&isGroup&&hasRenderedSection;if(isGroup&&(hasRenderedSection=!0),item.type===QuestionnaireItemType3.display)return jsx104("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===QuestionnaireItemType3.group&&item.repeats?jsxs63(Fragment33,{children:[showSectionDivider&&jsx104(Divider7,{color:"var(--mantine-color-gray-2)"}),jsx104(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems})]},`repeating-group-${item.id}-${index}`):item.type===QuestionnaireItemType3.group?jsxs63(Fragment33,{children:[showSectionDivider&&jsx104(Divider7,{color:"var(--mantine-color-gray-2)"}),jsx104(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]})]},`group-${item.id}-${index}`):item.type===QuestionnaireItemType3.boolean?jsx104(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?jsx104(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):jsx104(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:jsx104(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}import{Button as Button10,Group as Group31,Stepper}from"@mantine/core";import{Fragment as Fragment34,jsx as jsx105,jsxs as jsxs64}from"react/jsx-runtime";function QuestionnaireFormStepper(props){let{formState,submitButtonText,excludeButtons,children}=props,pages=formState.pages,activePage=formState.activePage,showBackButton=activePage>0,showNextButton=activePage<pages.length-1,showSubmitButton=activePage===pages.length-1;return jsxs64(Fragment34,{children:[jsx105(Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>jsx105(Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&jsxs64(Group31,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx105(Button10,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&jsx105(Button10,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&jsx105(SubmitButton,{children:submitButtonText??"Submit"})]})]})}import{Fragment as Fragment35,jsx as jsx106,jsxs as jsxs65}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum28(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=useState57(!1),propsRef=useRef13(props),pendingChangeRef=useRef13(void 0);useLayoutEffect3(()=>{propsRef.current=props});let onFormChange=useCallback13(response=>{pendingChangeRef.current=response},[]),formState=useQuestionnaireForm({questionnaire:props.questionnaire,defaultValue:props.questionnaireResponse,subject:props.subject,encounter:props.encounter,source:props.source,disablePagination:props.disablePagination,onChange:onFormChange}),formStateRef=useRef13(formState);useLayoutEffect3(()=>{formStateRef.current=formState}),useEffect21(()=>{let pendingChange=pendingChangeRef.current;pendingChange&&(pendingChangeRef.current=void 0,setSignatureRequiredSubmitted(!1),propsRef.current.onChange?.(pendingChange))});let isSignatureRequired=useMemo27(()=>formState.loading?!1:!!getExtension2(formState.questionnaire,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=useMemo27(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=useCallback13(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire2=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=createReference5(profile))}onSubmit({...response,questionnaire:questionnaire2.url??getReferenceString7(questionnaire2),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:jsxs65(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&jsx106(Title10,{order:1,fz:"1.625rem",fw:700,lh:1.3,mb:"xl",children:formState.questionnaire.title}),props.afterHeader&&jsxs65(Stack23,{gap:"xl",mb:"xl",children:[props.afterHeader,jsx106(Divider8,{color:"var(--mantine-color-gray-2)"})]}),formState.pagination?jsx106(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:jsx106(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):jsxs65(Fragment35,{children:[jsx106(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&jsxs65(Stack23,{mt:"md",gap:0,children:[jsx106(Text22,{size:"sm",fw:500,children:"Signature"}),jsx106(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&jsx106(Text22,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&jsx106(Group32,{justify:"flex-end",mt:"xl",gap:"xs",children:jsx106(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}import{jsx as jsx107,jsxs as jsxs66}from"react/jsx-runtime";var NewTopicDialog=props=>{let{subject,opened,onClose,onSubmit,allowPatientSelection=!1}=props,medplum=useMedplum29(),profile=useMedplumProfile7(),profileRef=useMemo28(()=>profile?createReference6(profile):void 0,[profile]),[topic,setTopic]=useState58(""),[practitioners,setPractitioners]=useState58(profile?.resourceType==="Practitioner"?[createReference6(profile)]:[]),[patient,setPatient]=useState58(subject?createReference6(subject):void 0),initialResponse=useMemo28(()=>{if(profile?.resourceType==="Practitioner")return{resourceType:"QuestionnaireResponse",status:"in-progress",item:[{linkId:"q1",answer:[{valueReference:createReference6(profile)}]}]}},[profile]);return jsx107(Modal3,{opened,onClose,title:"New Message",size:"md",children:jsxs66(Stack24,{gap:"xl",children:[jsxs66(Stack24,{gap:0,children:[jsx107(Text23,{fw:500,children:"Patient"}),allowPatientSelection&&jsx107(Text23,{c:"dimmed",children:"Select a patient"}),jsx107(ResourceInput,{resourceType:"Patient",name:"patient",required:!0,defaultValue:patient,disabled:!allowPatientSelection&&!!patient,onChange:value=>{setPatient(value?createReference6(value):void 0)}})]}),jsxs66(Stack24,{gap:0,children:[jsx107(Text23,{fw:500,children:"Practitioner (optional)"}),jsx107(Text23,{c:"dimmed",children:"Select one or more practitioners"}),jsx107(QuestionnaireForm,{questionnaire,questionnaireResponse:initialResponse,excludeButtons:!0,onChange:value=>{let references=value.item?.[0].answer?.map(item=>item.valueReference).filter(ref=>ref!==void 0)??[];setPractitioners(references)}})]}),jsxs66(Stack24,{gap:0,children:[jsx107(Text23,{fw:500,children:"Topic (optional)"}),jsx107(Text23,{c:"dimmed",children:"Enter a topic for the message"}),jsx107(TextInput22,{placeholder:"Enter your topic",value:topic,onChange:e=>setTopic(e.target.value)})]}),jsx107(Button11,{onClick:async()=>{if(!patient){showNotification6({title:"Error",message:"Please select a patient",color:"red"});return}let communication={resourceType:"Communication",status:"in-progress",subject:patient,sender:profileRef,recipient:[patient,...practitioners.map(practitioner=>({reference:practitioner.reference}))],topic:{text:topic}};try{let createdCommunication=await medplum.createResource(communication);onSubmit?.(createdCommunication),onClose()}catch(error){showNotification6({title:"Error",message:normalizeErrorString7(error),color:"red"})}},children:"Next"})]})})},questionnaire={resourceType:"Questionnaire",status:"active",item:[{linkId:"q1",type:"reference",repeats:!0,extension:[{url:`${HTTP_HL7_ORG4}/fhir/StructureDefinition/questionnaire-referenceResource`,valueCodeableConcept:{coding:[{system:`${HTTP_HL7_ORG4}/fhir/fhir-types`,display:"Practitioner",code:"Practitioner"}]}}]}]};import{ActionIcon as ActionIcon9,Checkbox as Checkbox6,CloseButton,Group as Group33,Indicator,Popover as Popover2,Stack as Stack25,Text as Text24,TextInput as TextInput23,Tooltip as Tooltip4}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback3,useDisclosure}from"@mantine/hooks";import{showNotification as showNotification7}from"@mantine/notifications";import{createReference as createReference7,formatHumanName as formatHumanName8,getReferenceString as getReferenceString8,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useMedplum as useMedplum30,useMedplumProfile as useMedplumProfile8,useResource as useResource4}from"@medplum/react-hooks";import{useEffect as useEffect22,useMemo as useMemo29,useState as useState59}from"react";var ParticipantFilter_default={participantItem:"ParticipantFilter_participantItem"};import{jsx as jsx108,jsxs as jsxs67}from"react/jsx-runtime";function ParticipantFilter(props){let{selectedParticipants,onFilterChange}=props,[opened,{open,close}]=useDisclosure(!1),[searchQuery,setSearchQuery]=useState59(""),[searchResults,setSearchResults]=useState59([]),[isSearching,setIsSearching]=useState59(!1),medplum=useMedplum30(),profile=useMedplumProfile8(),currentUserParticipant=useMemo29(()=>{if(profile)return createReference7(profile)},[profile]),additionalParticipants=useMemo29(()=>{let currentUserRef=currentUserParticipant?.reference;return selectedParticipants.filter(p=>p.reference!==currentUserRef)},[selectedParticipants,currentUserParticipant]),debouncedSearch=useDebouncedCallback3(async query=>{if(!query.trim()){setSearchResults([]);return}setIsSearching(!0);try{let bundle=await medplum.search("Patient",{_type:"Patient,Practitioner",name:query,_count:"10"}),currentUserRef=currentUserParticipant?.reference,results=(bundle.entry??[]).map(entry=>entry.resource).filter(resource=>{if(!resource)return!1;let refString=getReferenceString8(resource);return!!refString&&refString!==currentUserRef}).map(resource=>createReference7(resource));setSearchResults(results)}catch(error){showNotification7({title:"Error",message:normalizeErrorString8(error),color:"red"}),setSearchResults([])}finally{setIsSearching(!1)}},300);useEffect22(()=>(debouncedSearch(searchQuery),debouncedSearch.cancel),[searchQuery,debouncedSearch]);let isSelected=participant=>selectedParticipants.some(p=>p.reference===participant.reference),toggleParticipant=participant=>{let newParticipants=isSelected(participant)?selectedParticipants.filter(p=>p.reference!==participant.reference):[...selectedParticipants,participant];onFilterChange(newParticipants)},removeParticipant=participant=>{let newParticipants=selectedParticipants.filter(p=>p.reference!==participant.reference);onFilterChange(newParticipants)},displayParticipants=useMemo29(()=>{let result=[];for(let p of additionalParticipants)result.some(r2=>r2.reference===p.reference)||result.push(p);if(searchQuery.trim()&&searchResults.length>0)for(let p of searchResults)currentUserParticipant?.reference!==p.reference&&(result.some(r2=>r2.reference===p.reference)||result.push(p));return result},[additionalParticipants,searchQuery,searchResults,currentUserParticipant]),hasActiveFilter=selectedParticipants.length>0;return jsxs67(Popover2,{opened,onChange:o=>!o&&close(),position:"bottom-start",width:360,shadow:"md",radius:"md",withinPortal:!0,children:[jsx108(Popover2.Target,{children:jsx108(Tooltip4,{label:"Message Participants",position:"bottom",openDelay:500,disabled:opened,children:jsx108(Indicator,{disabled:!hasActiveFilter,color:"blue",size:8,offset:4,children:jsx108(ActionIcon9,{variant:"transparent",onClick:opened?close:open,radius:"xl",size:32,className:"outline-icon-button","data-opened":opened||void 0,children:jsx108(IconUsers,{size:16})})})})}),jsx108(Popover2.Dropdown,{p:"md",children:jsxs67(Stack25,{gap:"md",children:[jsx108(Text24,{size:"xs",c:"dimmed",fw:500,children:"Message Participants"}),jsx108(TextInput23,{placeholder:"Search for a Patient or Practitioner...",value:searchQuery,autoFocus:!0,onChange:e=>setSearchQuery(e.target.value),rightSection:searchQuery?jsx108(CloseButton,{size:"sm",onClick:()=>setSearchQuery("")}):null}),jsxs67(Stack25,{gap:"xs",mah:250,style:{overflowY:"auto"},children:[currentUserParticipant&&jsx108(ParticipantItem,{participant:currentUserParticipant,isSelected:isSelected(currentUserParticipant),isCurrentUser:!0,onToggle:()=>toggleParticipant(currentUserParticipant)}),displayParticipants.map(participant=>jsx108(ParticipantItem,{participant,isSelected:isSelected(participant),isCurrentUser:!1,onToggle:()=>toggleParticipant(participant),onRemove:isSelected(participant)?()=>removeParticipant(participant):void 0},participant.reference)),isSearching&&jsx108(Text24,{size:"sm",c:"dimmed",ta:"center",children:"Searching..."}),searchQuery.trim()&&!isSearching&&searchResults.length===0&&jsx108(Text24,{size:"sm",c:"dimmed",ta:"center",children:"No results found"})]})]})})]})}function ParticipantItem(props){let{participant,isSelected,isCurrentUser,onToggle,onRemove}=props,patientResource=useResource4(participant);return patientResource?jsxs67(Group33,{justify:"space-between",wrap:"nowrap",className:ParticipantFilter_default.participantItem,children:[jsxs67(Group33,{gap:"sm",wrap:"nowrap",style:{flex:1,minWidth:0},children:[jsx108(Checkbox6,{checked:isSelected,onChange:onToggle}),jsx108(ResourceAvatar,{value:participant,radius:"xl",size:32}),jsxs67(Text24,{size:"sm",truncate:!0,style:{flex:1},children:[formatHumanName8(patientResource?.name?.[0]??{}),isCurrentUser&&jsxs67(Text24,{component:"span",c:"dimmed",size:"sm",children:[" ","(you)"]})]})]}),onRemove&&jsx108(CloseButton,{size:"sm",onClick:onRemove})]}):null}import{ActionIcon as ActionIcon12,Box as Box20,Button as Button12,Center as Center3,Divider as Divider10,Flex as Flex20,Group as Group51,Menu as Menu5,Pagination,Paper as Paper4,ScrollArea as ScrollArea3,Skeleton as Skeleton2,Stack as Stack36,Tabs,Text as Text39,ThemeIcon,Tooltip as Tooltip7}from"@mantine/core";import{useDisclosure as useDisclosure10}from"@mantine/hooks";import{showNotification as showNotification8}from"@mantine/notifications";import{getReferenceString as getReferenceString10,normalizeErrorString as normalizeErrorString10,Operator,parseSearchRequest}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate5,useThreadInbox}from"@medplum/react-hooks";import{useCallback as useCallback24,useEffect as useEffect26,useMemo as useMemo34}from"react";import{Divider as Divider9,Flex as Flex19,Group as Group50,Stack as Stack35,Text as Text38,Tooltip as Tooltip6}from"@mantine/core";import{formatHumanName as formatHumanName9,resolveId}from"@medplum/core";import{useMedplum as useMedplum39,usePatientSummaryData,useResource as useResource9}from"@medplum/react-hooks";import{useEffect as useEffect25,useMemo as useMemo33,useState as useState74}from"react";var PatientSummary_default={panel:"PatientSummary_panel",patientSummaryBadge:"PatientSummary_patientSummaryBadge",patientSummaryAddButton:"PatientSummary_patientSummaryAddButton",patientSummaryHeader:"PatientSummary_patientSummaryHeader",patientSummaryCollapseIcon:"PatientSummary_patientSummaryCollapseIcon",collapsed:"PatientSummary_collapsed"};import{Stack as Stack34}from"@mantine/core";import{calculateAgeString,formatAddress as formatAddress3}from"@medplum/core";import{Box as Box12,Flex as Flex12,Group as Group36,Modal as Modal4,Text as Text26}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{getDisplayString as getDisplayString5}from"@medplum/core";import{useMedplum as useMedplum31}from"@medplum/react-hooks";import{useCallback as useCallback15,useMemo as useMemo30,useState as useState62}from"react";import{Badge}from"@mantine/core";import{jsx as jsx109}from"react/jsx-runtime";var statusToColor={draft:"blue",active:"blue","on-hold":"yellow",revoked:"red",completed:"green","entered-in-error":"red",unknown:"gray",retired:"gray",registered:"blue",preliminary:"blue",final:"green",amended:"yellow",corrected:"yellow",cancelled:"red",requested:"blue",received:"blue",accepted:"blue",rejected:"red",ready:"blue","in-progress":"blue",failed:"red",proposed:"blue",pending:"blue",booked:"blue",arrived:"blue",fulfilled:"green",noshow:"red","checked-in":"blue",waitlist:"gray",routine:"gray",urgent:"red",asap:"red",stat:"red","not-done":"red",connected:"green",disconnected:"red",finished:"green",planned:"gray"};function StatusBadge(props){let{status,...badgeProps}=props;return jsx109(Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}import{Group as Group34,Stack as Stack26,TextInput as TextInput24}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,addProfileToResource,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback14,useState as useState60}from"react";import{jsx as jsx110,jsxs as jsxs68}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG5+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState60(allergy?.code),[clinicalStatus,setClinicalStatus]=useState60(allergy?.clinicalStatus),handleSubmit=useCallback14(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference8(patient),encounter:encounter?createReference8(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0},PATIENT_ALLERGY_PROFILE))},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx110(Form,{onSubmit:handleSubmit,children:jsxs68(Stack26,{children:[jsx110(CodeableConceptInput,{name:"allergy",label:"Code",path:"AllergyIntolerance.code","data-autofocus":!0,binding:HTTP+"cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1186.8",maxValues:1,defaultValue:allergy?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx110(TextInput24,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx110(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG5+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx110(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx110(Group34,{justify:"flex-end",gap:4,mt:"md",children:jsx110(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon10,Box as Box10,Collapse,Group as Group35,Text as Text25}from"@mantine/core";import{useState as useState61}from"react";var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title",addButton:"CollapsibleSection_addButton"};import{jsx as jsx111,jsxs as jsxs69}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState61(!1);return jsxs69(Box10,{className:CollapsibleSection_default.root,children:[jsxs69(Group35,{justify:"space-between",className:CollapsibleSection_default.header,children:[jsxs69(Group35,{gap:8,children:[jsx111(ActionIcon10,{variant:"subtle",onClick:()=>setCollapsed(c=>!c),"aria-label":collapsed?`Show ${title.toLowerCase()}`:`Hide ${title.toLowerCase()}`,className:CollapsibleSection_default.chevron,"data-collapsed":collapsed||void 0,size:"md",children:jsx111(IconChevronDown,{size:20})}),jsx111(Text25,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx111(ActionIcon10,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx111(IconPlus,{size:18})})]}),jsx111(Collapse,{in:!collapsed,children:jsx111(Box10,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}import{ActionIcon as ActionIcon11,Box as Box11}from"@mantine/core";var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};import{jsx as jsx112,jsxs as jsxs70}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs70(Box11,{className:SummaryItem_default.item,onClick,children:[children,jsx112("div",{className:SummaryItem_default.gradient}),jsx112("div",{className:SummaryItem_default.container,children:jsx112(ActionIcon11,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx112(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment36,jsx as jsx113,jsxs as jsxs71}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum31(),{patient,encounter}=props,[allergies,setAllergies]=useState62(props.allergies),[opened,{open,close}]=useDisclosure2(!1),[editAllergy,setEditAllergy]=useState62(),sortedAllergies=useMemo30(()=>[...allergies].sort((a,b)=>{let aStatus=a.clinicalStatus?.coding?.[0]?.code,bStatus=b.clinicalStatus?.coding?.[0]?.code;return aStatus==="active"&&bStatus!=="active"?-1:aStatus!=="active"&&bStatus==="active"?1:getDisplayString5(a).localeCompare(getDisplayString5(b))}),[allergies]),handleSubmit=useCallback15(async allergy=>{if(allergy.id){let updatedAllergy=await medplum.updateResource(allergy);setAllergies(allergies.map(a=>a.id===updatedAllergy.id?updatedAllergy:a))}else{let newAllergy=await medplum.createResource(allergy);setAllergies([...allergies,newAllergy])}setEditAllergy(void 0),close()},[medplum,allergies,close]);return jsxs71(Fragment36,{children:[jsx113(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx113(Box12,{children:jsx113(Flex12,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx113(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs71(Box12,{children:[jsx113(Text26,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString5(allergy)}),jsx113(Group36,{mt:2,gap:4,children:status&&jsx113(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx113(Text26,{children:"(none)"})}),jsx113(Modal4,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx113(AllergyDialog,{patient,encounter,allergy:editAllergy,onSubmit:handleSubmit})})]})}function getClinicalStatusColor(status){if(!status)return"gray";switch(status){case"active":return"red";case"inactive":return"orange";case"resolved":return"blue";default:return"gray"}}import{Box as Box13,Flex as Flex13,Group as Group37,Text as Text27}from"@mantine/core";import{formatDate}from"@medplum/core";import{useResource as useResource5}from"@medplum/react-hooks";import{jsx as jsx114,jsxs as jsxs72}from"react/jsx-runtime";function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=useResource5(coverage),organizationResource=useResource5(organization),payorName="Unknown Payor";organizationResource&&"name"in organizationResource&&typeof organizationResource.name=="string"&&(payorName=organizationResource.name);let detailsText=`ID: ${coverageResource?.subscriberId??"N/A"}${formatClassInfo(coverageResource)?` \xB7 ${formatClassInfo(coverageResource)}`:""}`;return jsx114(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs72(Box13,{children:[jsx114(Text27,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx114(Text27,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs72(Group37,{mt:2,gap:4,children:[jsx114(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs72(Text27,{size:"xs",fw:500,color:"gray.6",children:["Ends ",formatDate(coverageResource?.period?.end)]})]})]})})}function Insurance(props){let{coverages,onClickResource}=props,activeCoverages=coverages.filter(coverage=>coverage.status==="active"&&!coverage.type?.coding?.some(coding=>coding.code==="SELFPAY"));return jsx114(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx114(Flex13,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx114(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx114(Text27,{children:"(none)"})})}function capitalizeWords(str){return str.split(" ").map(word=>word.charAt(0).toUpperCase()+word.slice(1).toLowerCase()).join(" ")}function formatClassInfo(coverage){return coverage?coverage.class?.filter(cls=>cls.type?.coding?.[0]?.code!=="plan").map(cls=>{let type=cls.type?.coding?.[0]?.code??"";return`${capitalizeWords(type)}: ${cls.value}`}).join(" \xB7 ")??"":""}import{Box as Box14,Flex as Flex14,Group as Group40,Modal as Modal5,Text as Text30}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{formatDate as formatDate2,getDisplayString as getDisplayString7}from"@medplum/core";import{useState as useState65}from"react";import{Group as Group39,List,Stack as Stack28,Text as Text29,Title as Title11}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime3,formatObservationValue,isReference as isReference3}from"@medplum/core";import{useMedplum as useMedplum32,useResource as useResource7}from"@medplum/react-hooks";import{useEffect as useEffect23,useState as useState64}from"react";import{Blockquote,Stack as Stack27}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx115}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx115(Stack27,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx115(Blockquote,{classNames:{cite:NoteDisplay_default.noteCite,root:NoteDisplay_default.noteRoot},cite:note.authorReference?.display||note.authorString,icon:null,children:note.text},`note-${note.text}`))}):null}import{Group as Group38}from"@mantine/core";import{Text as Text28}from"@mantine/core";import{getDisplayString as getDisplayString6,isOk,normalizeErrorString as normalizeErrorString9}from"@medplum/core";import{useResource as useResource6}from"@medplum/react-hooks";import{useState as useState63}from"react";import{jsx as jsx116}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState63(),resource=useResource6(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString9(outcome)}]`;else if(resource)text=getDisplayString6(resource);else return null;return link?jsx116(MedplumLink,{to:value,...rest,children:text}):jsx116(Text28,{component:"span",...rest,children:text})}import{jsx as jsx117,jsxs as jsxs73}from"react/jsx-runtime";function ResourceBadge(props){return jsxs73(Group38,{gap:"xs",children:[jsx117(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx117(ResourceName,{value:props.value,link:props.link})]})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment37,jsx as jsx118,jsxs as jsxs74}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum32(),diagnosticReport=useResource7(props.value),[specimens,setSpecimens]=useState64();if(useEffect23(()=>{diagnosticReport?.specimen&&Promise.allSettled(diagnosticReport.specimen.map(ref=>medplum.readReference(ref))).then(outcomes=>outcomes.filter(outcome=>outcome.status==="fulfilled").map(outcome=>outcome.value)).then(setSpecimens).catch(console.error)},[medplum,diagnosticReport]),!diagnosticReport)return null;let specimenNotes=specimens?.flatMap(spec=>spec.note||[])||[];if(diagnosticReport.presentedForm&&diagnosticReport.presentedForm.length>0){let pf=diagnosticReport.presentedForm[0];pf.contentType?.startsWith("text/plain")&&pf.data&&specimenNotes.push({text:window.atob(pf.data)})}return jsxs74(Stack28,{children:[jsx118(Title11,{children:"Diagnostic Report"}),jsx118(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx118(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx118(NoteDisplay,{value:specimenNotes}),diagnosticReport.conclusion&&jsxs74(Stack28,{mt:"md",children:[jsx118(Text29,{fw:500,size:"sm",c:"dimmed",children:"Conclusion"}),jsx118(Text29,{children:diagnosticReport.conclusion})]})]})}function DiagnosticReportHeader({value,hideSubject=!1}){return jsxs74(Group39,{mt:"md",gap:30,children:[value.subject&&!hideSubject&&jsxs74("div",{children:[jsx118(Text29,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx118(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs74("div",{children:[jsx118(Text29,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx118(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs74("div",{children:[jsx118(Text29,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx118(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs74("div",{children:[jsx118(Text29,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx118(Text29,{children:formatDateTime3(value.issued)})]}),value.status&&jsxs74("div",{children:[jsx118(Text29,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx118(StatusBadge,{status:value.status})]})]})}function SpecimenInfo(specimens){return jsxs74(Stack28,{gap:"xs",children:[jsx118(Title11,{order:2,size:"h6",children:"Specimens"}),jsx118(List,{type:"ordered",children:specimens?.map(specimen=>jsx118(List.Item,{ml:"sm",children:jsxs74(Group39,{gap:20,children:[jsxs74(Group39,{gap:5,children:[jsx118(Text29,{fw:500,children:"Collected:"})," ",formatDateTime3(specimen.collection?.collectedDateTime)]}),jsxs74(Group39,{gap:5,children:[jsx118(Text29,{fw:500,children:"Received:"})," ",formatDateTime3(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs74("table",{className:DiagnosticReportDisplay_default.table,children:[jsx118("thead",{children:jsxs74("tr",{children:[jsx118("th",{children:"Test"}),jsx118("th",{children:"Value"}),jsx118("th",{children:"Reference Range"}),jsx118("th",{children:"Interpretation"}),jsx118("th",{children:"Category"}),jsx118("th",{children:"Performer"}),jsx118("th",{children:"Status"})]})}),jsx118("tbody",{children:jsx118(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx118(Fragment37,{children:props.value?.map(observation=>jsx118(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference3(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource7(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs74(Fragment37,{children:[jsxs74("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx118("td",{rowSpan:displayNotes?2:1,children:jsx118(MedplumLink,{to:observation,children:jsx118(CodeableConceptDisplay,{value:observation.code})})}),jsx118("td",{children:jsx118(ObservationValueDisplay,{value:observation})}),jsx118("td",{children:jsx118(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx118("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx118(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx118("td",{children:observation.category&&observation.category.length>0&&jsx118(Fragment37,{children:observation.category.map(concept=>jsx118("div",{children:jsx118(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx118("td",{children:observation.performer?.map(performer=>jsx118(ReferenceDisplay,{value:performer},performer.reference))}),jsx118("td",{children:observation.status&&jsx118(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx118(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx118("tr",{children:jsx118("td",{colSpan:6,children:jsx118(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx118(Fragment37,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx118(Fragment37,{children:range.text}):jsx118(RangeDisplay,{value:range}):null}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;return code==="AA"||code==="LL"||code==="HH"||code==="A"}import{Fragment as Fragment38,jsx as jsx119,jsxs as jsxs75}from"react/jsx-runtime";function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=useState65(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=useDisclosure3(!1),diagnosticReportsRequests=new Set,filteredDiagnosticReports=diagnosticReports.filter(report=>{let flag=isLaboratoryReport(report);return flag&&report.basedOn&&report.basedOn.forEach(basedOn=>{if(basedOn.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn.reference.split("/");diagnosticReportsRequests.add(id)}}),flag}),completedRequisitionNumbers=new Set,filteredServiceRequests=serviceRequests.filter(request=>{if(request.id&&diagnosticReportsRequests.has(request.id)||request.basedOn&&request.basedOn.find(basedOn2=>{if(basedOn2.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn2.reference.split("/");return diagnosticReportsRequests.has(id)}return!1}))return!1;let shouldFilter=shouldFilterRequest(request,completedRequisitionNumbers);return!shouldFilter&&request.requisition?.value&&completedRequisitionNumbers.add(request.requisition?.value),!shouldFilter}),handleDiagnosticReportClick=report=>{setSelectedReport(report),openReportDialog()};return jsxs75(Fragment38,{children:[jsx119(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:jsxs75(Flex14,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>jsx119(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:jsxs75(Box14,{children:[jsx119(Text30,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(serviceRequest)}),jsxs75(Group40,{mt:2,gap:4,children:[serviceRequest.status&&jsx119(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),jsx119(Text30,{size:"xs",fw:500,c:"dimmed",children:formatDate2(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>jsx119(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:jsxs75(Box14,{children:[jsx119(Text30,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(report)}),jsxs75(Group40,{mt:2,gap:4,children:[report.status&&jsx119(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),jsx119(Text30,{size:"xs",fw:500,c:"dimmed",children:formatDate2(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&jsx119(Text30,{children:"(none)"})]})}),jsx119(Modal5,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&jsx119(DiagnosticReportDisplay,{value:selectedReport,hideSubject:!0})})]})}var getStatusColor=status=>{switch(status){case"active":return"indigo";case"final":return"teal";case"cancelled":return"red";default:return"gray"}};function hasLaboratoryCategory(category){if(!category.coding||!Array.isArray(category.coding))return!1;for(let coding of category.coding)if(coding.code==="LAB")return!0;return!1}function isLaboratoryReport(report){if(!report.category||!Array.isArray(report.category))return!1;for(let category of report.category)if(hasLaboratoryCategory(category))return!0;return!1}function shouldFilterRequest(request,completedRequisitionNumbers){if(["completed","draft","entered-in-error"].includes(request.status))return!0;let requisitionNumber=request.requisition?.value;return!!(requisitionNumber&&completedRequisitionNumbers.has(requisitionNumber))}import{Box as Box15,Flex as Flex15,Group as Group42,Modal as Modal6,Text as Text31}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{getDisplayString as getDisplayString8}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback17,useState as useState67}from"react";import{Alert as Alert4,Group as Group41,Radio as Radio2,Stack as Stack29}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG6,addProfileToResource as addProfileToResource2,createReference as createReference9}from"@medplum/core";import{useMedplumProfile as useMedplumProfile9}from"@medplum/react-hooks";import{useCallback as useCallback16,useState as useState66}from"react";import{jsx as jsx120,jsxs as jsxs76}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile9(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState66(medication?.medicationCodeableConcept),handleSubmit=useCallback16(formData=>{if(!me)throw new Error("Not signed in");onSubmit(addProfileToResource2({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&createReference9(encounter)),requester:medication?.requester??createReference9(me),medicationCodeableConcept:code,subject:createReference9(patient)},HTTP_HL7_ORG6+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx120(Form,{onSubmit:handleSubmit,children:jsxs76(Stack29,{children:[jsx120(CodeableConceptInput,{name:"request",path:"MedicationRequest.medication[x]","data-autofocus":!0,binding:HTTP2+"cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1010.4",maxValues:1,defaultValue:medication?.medicationCodeableConcept,onChange:request=>setCode(request),outcome:void 0}),jsx120(Radio2.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx120(Radio2,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx120(Group41,{justify:"flex-end",gap:4,children:jsx120(SubmitButton,{children:"Save"})})]})}):jsx120(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment39,jsx as jsx121,jsxs as jsxs77}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum33(),[medicationRequests,setMedicationRequests]=useState67(props.medicationRequests),[editMedication,setEditMedication]=useState67(),[opened,{open,close}]=useDisclosure4(!1),handleSubmit=useCallback17(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m=>m.id===updatedMedication.id?updatedMedication:m))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs77(Fragment39,{children:[jsx121(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medicationRequests.length>0?jsx121(Flex15,{direction:"column",gap:8,children:medicationRequests.map(medication=>jsx121(SummaryItem,{onClick:()=>{setEditMedication(medication),open()},children:jsxs77(Box15,{children:[jsx121(Text31,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(medication)}),jsx121(Group42,{mt:2,gap:4,children:medication.status&&jsx121(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},medication.id))}):jsx121(Text31,{children:"(none)"})}),jsx121(Modal6,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx121(MedicationDialog,{patient:props.patient,encounter:props.encounter,medication:editMedication,onSubmit:handleSubmit})})]})}function getStatusColor2(status){if(!status)return"gray";switch(status){case"active":return"green";case"stopped":return"red";case"on-hold":return"yellow";case"cancelled":return"red";case"completed":return"blue";case"entered-in-error":return"red";case"draft":return"gray";default:return"gray"}}import{Box as Box16,Group as Group43,Text as Text32,Tooltip as Tooltip5}from"@mantine/core";import{jsx as jsx122,jsxs as jsxs78}from"react/jsx-runtime";var PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return jsx122(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx122(Box16,{className:PatientSummary_default.patientSummaryListItem,children:jsx122(Tooltip5,{label,position:"top-start",openDelay:650,children:jsxs78(Group43,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,jsx122(Text32,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};import{capitalize as capitalize4,getExtension as getExtension3,HTTP_HL7_ORG as HTTP_HL7_ORG7}from"@medplum/core";function getGenderIdentity(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-ethnicity`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getGeneralPractitioner(patient){return patient.generalPractitioner?.[0]?.display}function formatPatientGenderDisplay(patient){let capitalizedGender=patient.gender?capitalize4(patient.gender):"",genderIdentity=getGenderIdentity(patient),birthSex=getBirthSex(patient),parts=[];return capitalizedGender&&parts.push(capitalizedGender),genderIdentity&&parts.push(genderIdentity),birthSex&&parts.push(`Born as ${birthSex}`),parts.join(" \xB7 ")}function formatPatientRaceEthnicityDisplay(patient){let race=getRace(patient),ethnicity=getEthnicity(patient),parts=[];return race&&parts.push(race),ethnicity&&parts.push(ethnicity),parts.join(" \xB7 ")}var getPreferredLanguage=patient=>{if(!patient.communication?.length)return;let preferred=patient.communication?.find(comm=>comm.preferred===!0);return preferred?.language?.coding?.[0]?.display?preferred.language.coding[0].display:patient.communication[0]?.language?.coding?.[0]?.display};import{Box as Box17,Flex as Flex16,Group as Group44,Loader as Loader5,Modal as Modal7,Text as Text33}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{formatAddress as formatAddress2,getReferenceString as getReferenceString9,OperationOutcomeError}from"@medplum/core";import{useMedplum as useMedplum34,useResource as useResource8}from"@medplum/react-hooks";import{useCallback as useCallback18,useEffect as useEffect24,useMemo as useMemo31,useState as useState68}from"react";import{PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,addPreferredPharmacyToPatient,createPreferredPharmacyExtension,getPreferredPharmaciesFromPatient,isAddPharmacyResponse,isOrganizationArray,removePreferredPharmacyFromPatient}from"@medplum/core";import{Fragment as Fragment40,jsx as jsx123,jsxs as jsxs79}from"react/jsx-runtime";function Pharmacies(props){let{patient:patientProp,onClickResource,pharmacyDialogComponent}=props,PharmacyDialogComponent=pharmacyDialogComponent,medplum=useMedplum34(),[opened,{open,close}]=useDisclosure5(!1),[resolvedPharmacies,setResolvedPharmacies]=useState68([]),[loadState,setLoadState]=useState68("loading"),patient=useResource8(patientProp),pharmacyRefs=useMemo31(()=>patient?getPreferredPharmaciesFromPatient(patient):[],[patient]);useEffect24(()=>{let cancelled=!1;return(async()=>{if(props.pharmacies){cancelled||(setResolvedPharmacies(props.pharmacies),setLoadState("loaded"));return}if(pharmacyRefs.length===0){cancelled||(setResolvedPharmacies([]),setLoadState("loaded"));return}setLoadState("loading");try{let results=await Promise.all(pharmacyRefs.map(async pharmacyRef=>{try{return{...await medplum.readReference(pharmacyRef.organizationRef),isPrimary:pharmacyRef.isPrimary}}catch(error){return isNotFoundError(error),null}}));if(!cancelled){let validResults=results.filter(result=>result!==null);setResolvedPharmacies(validResults),setLoadState(validResults.length===0&&pharmacyRefs.length>0?"error":"loaded")}}catch{cancelled||setLoadState("error")}})().catch(()=>{}),()=>{cancelled=!0}},[medplum,pharmacyRefs,props.pharmacies]);let handleSubmit=useCallback18(async _pharmacy=>{patient?.id&&medplum.invalidateUrl(getReferenceString9(patient)),close()},[medplum,patient,close]);return patient?jsxs79(Fragment40,{children:[jsx123(CollapsibleSection,{title:"Pharmacies",onAdd:pharmacyDialogComponent?open:void 0,children:loadState==="loading"?jsx123(Loader5,{size:"sm"}):loadState==="error"?jsx123(Text33,{c:"red",size:"sm",children:"Failed to load pharmacies"}):resolvedPharmacies.length===0?jsx123(Text33,{children:"(none)"}):jsx123(Box17,{children:jsx123(Flex16,{direction:"column",gap:8,children:resolvedPharmacies.map((pharmacy,index)=>jsx123(SummaryItem,{onClick:()=>onClickResource?.(pharmacy),children:jsxs79(Box17,{children:[jsx123(Text33,{fw:500,className:SummaryItem_default.itemText,children:pharmacy.name}),jsxs79(Group44,{mt:2,gap:4,children:[pharmacy.isPrimary&&jsx123(StatusBadge,{color:"blue",variant:"light",status:"primary"}),pharmacy.address?.[0]&&jsx123(Text33,{size:"xs",c:"dimmed",children:formatAddress2(pharmacy.address[0])})]})]})},pharmacy.id||index))})})}),PharmacyDialogComponent?jsx123(Modal7,{opened,onClose:close,title:"Add Pharmacy",size:"lg",children:jsx123(PharmacyDialogComponent,{patient,onSubmit:handleSubmit,onClose:close})}):null]}):jsx123(Fragment40,{})}function isNotFoundError(error){return error instanceof OperationOutcomeError?error.outcome.issue?.some(issue=>issue.code==="not-found")??!1:!1}import{Badge as Badge2,Box as Box18,Flex as Flex17,Group as Group46,Modal as Modal8,Text as Text34,UnstyledButton as UnstyledButton4}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{formatDate as formatDate3,getDisplayString as getDisplayString9}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{useCallback as useCallback20,useMemo as useMemo32,useState as useState70}from"react";import{Group as Group45,Stack as Stack30}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG8,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference10}from"@medplum/core";import{useCallback as useCallback19,useState as useState69}from"react";import{jsx as jsx124,jsxs as jsxs80}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState69(condition?.code),[clinicalStatus,setClinicalStatus]=useState69(condition?.clinicalStatus),handleSubmit=useCallback19(formData=>{let updatedCondition=addProfileToResource3({...condition,resourceType:"Condition",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:createReference10(patient),encounter:encounter&&createReference10(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG8+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx124(Form,{onSubmit:handleSubmit,children:jsxs80(Stack30,{children:[jsx124(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG8+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx124(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG8+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx124(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx124(Group45,{justify:"flex-end",gap:4,mt:"md",children:jsx124(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment41,jsx as jsx125,jsxs as jsxs81}from"react/jsx-runtime";function getCodeKey(condition){let coding=condition.code?.coding?.[0];return coding?.system&&coding?.code?`${coding.system}|${coding.code}`:coding?.code?coding.code:condition.code?.text??condition.id}function ProblemList(props){let medplum=useMedplum35(),{patient,encounter}=props,[problems,setProblems]=useState70(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=useState70(),[opened,{open,close}]=useDisclosure6(!1),[expandedGroups,setExpandedGroups]=useState70(()=>new Set),groupedProblems=useMemo32(()=>{let groups=new Map;for(let i=0;i<problems.length;i++){let problem=problems[i],key=getCodeKey(problem)??`ungrouped-${i}`,existing=groups.get(key);existing?existing.push(problem):groups.set(key,[problem])}return Array.from(groups.entries())},[problems]),toggleGroup=useCallback20(key=>{setExpandedGroups(prev=>{let next=new Set(prev);return next.has(key)?next.delete(key):next.add(key),next})},[]),handleSubmit=useCallback20(async condition=>{if(condition.id){let updatedCondition=await medplum.updateResource(condition);setProblems(problems.map(p=>p.id===updatedCondition.id?updatedCondition:p))}else{let newCondition=await medplum.createResource(condition);setProblems([newCondition,...problems])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs81(Fragment41,{children:[jsx125(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx125(Flex17,{direction:"column",gap:8,children:groupedProblems.map(([key,group],groupIndex)=>{let isExpanded=expandedGroups.has(key),displayProblems=isExpanded?group:[group[0]],groupContentId=`problem-group-content-${groupIndex}`;return jsxs81(Box18,{children:[jsx125(Flex17,{direction:"column",gap:4,id:groupContentId,children:displayProblems.map(problem=>jsx125(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs81(Box18,{children:[jsxs81(Group46,{gap:6,wrap:"nowrap",children:[jsx125(Text34,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString9(problem)}),!isExpanded&&group.length>1&&jsxs81(Badge2,{size:"xs",color:"gray",variant:"light",style:{flexShrink:0},children:["+",group.length-1]})]}),jsxs81(Group46,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx125(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx125(Text34,{size:"xs",fw:500,c:"dimmed",children:formatDate3(problem.onsetDateTime)})]})]})},problem.id))}),group.length>1&&jsx125(UnstyledButton4,{onClick:()=>toggleGroup(key),"aria-expanded":isExpanded,"aria-controls":groupContentId,pl:4,pt:2,style:{fontSize:"var(--mantine-font-size-xs)",color:"var(--mantine-color-dimmed)"},children:isExpanded?"Show less":`Show all ${group.length} entries`})]},key)})}):jsx125(Text34,{children:"(none)"})}),jsx125(Modal8,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx125(ConditionDialog,{patient,encounter,condition:editCondition,onSubmit:handleSubmit})})]})}var getStatusColor3=status=>{if(!status)return"gray";switch(status){case"active":case"recurrence":case"relapse":return"green";case"inactive":return"orange";case"remission":return"blue";case"resolved":return"teal";default:return"gray"}};import{Box as Box19,Flex as Flex18,Group as Group47,Modal as Modal9,Radio as Radio3,Stack as Stack31,Text as Text35,UnstyledButton as UnstyledButton5}from"@mantine/core";import{useDisclosure as useDisclosure7}from"@mantine/hooks";import{createReference as createReference11,HTTP_HL7_ORG as HTTP_HL7_ORG9,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum36}from"@medplum/react-hooks";import{useCallback as useCallback21,useState as useState71}from"react";import{Fragment as Fragment42,jsx as jsx126,jsxs as jsxs82}from"react/jsx-runtime";var NULLFLAVOR=HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/v3-NullFlavor",CodesToText={38628009:"Homosexual",20430005:"Heterosexual",42035005:"Bisexual",OTH:"Other",UNK:"Unknown",ASKU:"Asked but no answer"},CodesToSystem={38628009:SNOMED,20430005:SNOMED,42035005:SNOMED,OTH:NULLFLAVOR,UNK:NULLFLAVOR,ASKU:NULLFLAVOR};function SexualOrientation(props){let{patient,encounter}=props,medplum=useMedplum36(),[sexualOrientation,setSexualOrientation]=useState71(props.sexualOrientation),[opened,{open,close}]=useDisclosure7(!1),[hoverIndex,setHoverIndex]=useState71(null),handleSubmit=useCallback21(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG9+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:createReference11(patient),encounter:encounter?createReference11(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:CodesToSystem[code],code:formData.sexualOrientation}],text:CodesToText[code]}}).then(newSexualOrientation=>{setSexualOrientation(newSexualOrientation),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs82(Fragment42,{children:[jsx126(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx126(Flex18,{direction:"column",gap:8,children:jsx126(Box19,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx126(UnstyledButton5,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx126(Box19,{pr:hoverIndex===0?24:0,children:jsx126(Text35,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx126(Text35,{children:"(none)"})}),jsx126(Modal9,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx126(Form,{onSubmit:handleSubmit,children:jsxs82(Stack31,{children:[jsx126(Radio3.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx126(Radio3,{value:code,label:text,my:"xs"},code))}),jsx126(Group47,{justify:"flex-end",gap:4,mt:"md",children:jsx126(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group48,Modal as Modal10,Radio as Radio4,Stack as Stack32,Text as Text36,UnstyledButton as UnstyledButton6}from"@mantine/core";import{useDisclosure as useDisclosure8}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG10,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference12,formatCodeableConcept as formatCodeableConcept4}from"@medplum/core";import{useMedplum as useMedplum37}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState72}from"react";import{Fragment as Fragment43,jsx as jsx127,jsxs as jsxs83}from"react/jsx-runtime";var smokingStatusOptions={266919005:"Never smoked tobacco",266927001:"Tobacco smoking consumption unknown","428041000124106":"Occasional tobacco smoker","428061000124105":"Light tobacco smoker","428071000124103":"Heavy tobacco smoker",449868002:"Smokes tobacco daily",77176002:"Smoker",8517006:"Ex-smoker"};function SmokingStatus(props){let medplum=useMedplum37(),[smokingStatus,setSmokingStatus]=useState72(props.smokingStatus),[opened,{open,close}]=useDisclosure8(!1),handleSubmit=useCallback22(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG10+"/fhir/us/core/StructureDefinition/us-core-smokingstatus"]},status:"final",category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC2,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference12(props.patient),encounter:props.encounter?createReference12(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED2,version:SNOMED2+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return jsxs83(Fragment43,{children:[jsx127(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx127(UnstyledButton6,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx127(Text36,{children:formatCodeableConcept4(smokingStatus.valueCodeableConcept)})}):jsx127(Text36,{children:"(none)"})}),jsx127(Modal10,{opened,onClose:close,title:"Set Smoking Status",children:jsx127(Form,{onSubmit:handleSubmit,children:jsxs83(Stack32,{children:[jsx127(Radio4.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx127(Radio4,{value:code,label:text,my:"xs"},code))}),jsx127(Group48,{justify:"flex-end",gap:4,mt:"md",children:jsx127(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group49,Modal as Modal11,SimpleGrid,Stack as Stack33,Text as Text37,Textarea as Textarea4,TextInput as TextInput25}from"@mantine/core";import{useDisclosure as useDisclosure9}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum38}from"@medplum/react-hooks";import{useCallback as useCallback23,useState as useState73}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference13}from"@medplum/core";function getObservationValue(obs,component){return component?obs.component?.find(c=>c.code?.coding?.[0].code===component)?.valueQuantity:obs.valueQuantity}function createObservation(patient,encounter,code,title,valueQuantity){if(isValidNumber(valueQuantity.value))return{...createBaseObservation(patient,encounter,code,title),valueQuantity}}function createCompoundObservation(patient,encounter,code,title,components){let component=components.filter(c=>isValidNumber(c.valueQuantity?.value));if(component.length!==0)return{...createBaseObservation(patient,encounter,code,title),component}}function createBaseObservation(patient,encounter,code,title){return{resourceType:"Observation",status:"preliminary",subject:createReference13(patient),encounter:encounter?createReference13(encounter):void 0,effectiveDateTime:new Date().toISOString(),category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"vital-signs",display:"Vital Signs"}]}],code:createLoincCode(code,title)}}function createLoincCode(code,display){return{coding:[{code,display,system:LOINC3}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!Number.isNaN(value)&&Number.isFinite(value)}import{Fragment as Fragment44,jsx as jsx128,jsxs as jsxs84}from"react/jsx-runtime";var BP="85354-9",SYSTOLIC="8480-6",DIASTOLIC="8462-4",LOINC_CODES=[{name:"systolic",short:"BP Sys",code:BP,component:SYSTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"diastolic",short:"BP Dias",code:BP,component:DIASTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"heartRate",short:"HR",code:"8867-4",title:"Heart Rate",unit:"/min"},{name:"bodyTemperature",short:"Temp",code:"8310-5",title:"Body Temperature",unit:"Cel"},{name:"respiratoryRate",short:"RR",code:"9279-1",title:"Respiratory Rate",unit:"/min"},{name:"height",short:"Ht",code:"8302-2",title:"Height",unit:"cm"},{name:"weight",short:"Wt",code:"29463-7",title:"Weight",unit:"kg"},{name:"bmi",short:"BMI",code:"39156-5",title:"BMI",unit:"kg/m2"},{name:"oxygen",short:"O2",code:"2708-6",title:"Oxygen",unit:"%"},{name:"headCircumference",short:"HC",code:"9843-4",title:"Head Circumference",unit:"cm"}];function Vitals(props){let medplum=useMedplum38(),{patient,encounter}=props,[vitals,setVitals]=useState73(props.vitals),[opened,{open,close}]=useDisclosure9(!1),handleSubmit=useCallback23(formData=>{let newObservations=[];newObservations.push(createCompoundObservation(patient,encounter,BP,"Blood pressure",[{code:createLoincCode(SYSTOLIC,"Systolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.systolic),"mm[Hg]")},{code:createLoincCode(DIASTOLIC,"Diastolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.diastolic),"mm[Hg]")}]));for(let meta of LOINC_CODES)meta.component||newObservations.push(createObservation(patient,encounter,meta.code,meta.title,createQuantity(Number.parseFloat(formData[meta.name]),meta.unit)));Promise.all(newObservations.filter(Boolean).map(obs=>medplum.createResource(obs))).then(newVitals=>setVitals([...newVitals,...vitals])).catch(console.error),close()},[medplum,patient,encounter,vitals,close]);return jsxs84(Fragment44,{children:[jsx128(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx128(Stack33,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs84(Group49,{align:"center",children:[jsx128(Text37,{c:"dimmed",children:meta.short}),obs&&jsx128(Text37,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx128(Modal11,{opened,onClose:close,title:"Add Vitals",children:jsxs84(Form,{onSubmit:handleSubmit,children:[jsx128(SimpleGrid,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx128(TextInput25,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx128(Textarea4,{name:"notes",label:"Notes"}),jsx128(Group49,{justify:"flex-end",gap:4,mt:"md",children:jsx128(SubmitButton,{children:"Save"})})]})})]})}import{jsx as jsx129,jsxs as jsxs85}from"react/jsx-runtime";var DemographicsSection={key:"demographics",title:"Demographics",component:({patient,onClickResource})=>{let languageDisplay=getPreferredLanguage(patient);return jsxs85(Stack34,{gap:"xs",py:8,children:[jsx129(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${calculateAgeString(patient.birthDate)})`:void 0,icon:jsx129(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),jsx129(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:jsx129(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),jsx129(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:jsx129(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),jsx129(PatientInfoItem,{patient,value:patient.address?.[0]?formatAddress3(patient.address[0]):void 0,icon:jsx129(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),jsx129(PatientInfoItem,{patient,value:languageDisplay,icon:jsx129(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),jsx129(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:jsx129(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add General Practitioner",label:"General Practitioner",onClickResource})]})}},InsuranceSection={key:"insurance",title:"Insurance",searches:[{key:"coverages",resourceType:"Coverage",patientParam:"beneficiary"}],component:({results,onClickResource})=>jsx129(Insurance,{coverages:results.coverages||[],onClickResource})},AllergiesSection={key:"allergies",title:"Allergies",searches:[{key:"allergies",resourceType:"AllergyIntolerance",patientParam:"patient"}],component:({results,patient,onClickResource})=>jsx129(Allergies,{patient,allergies:results.allergies||[],onClickResource})},ProblemListSection={key:"problemList",title:"Problems",searches:[{key:"conditions",resourceType:"Condition",patientParam:"patient"}],component:({results,patient,onClickResource})=>jsx129(ProblemList,{patient,problems:results.conditions||[],onClickResource})},MedicationsSection={key:"medications",title:"Medications",searches:[{key:"medications",resourceType:"MedicationRequest",patientParam:"subject"}],component:({results,patient,onClickResource})=>jsx129(Medications,{patient,medicationRequests:results.medications||[],onClickResource})};function createLabsSection(onRequestLabs){return{key:"labs",title:"Labs",searches:[{key:"serviceRequests",resourceType:"ServiceRequest",patientParam:"subject"},{key:"diagnosticReports",resourceType:"DiagnosticReport",patientParam:"subject"}],component:({results,patient,onClickResource})=>jsx129(Labs,{patient,serviceRequests:results.serviceRequests||[],diagnosticReports:results.diagnosticReports||[],onClickResource,onRequestLabs})}}var LabsSection=createLabsSection(),SexualOrientationSection={key:"sexualOrientation",title:"Sexual Orientation",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{code:"76690-7"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return jsx129(SexualOrientation,{patient,sexualOrientation:observations[0],onClickResource})}},SmokingStatusSection={key:"smokingStatus",title:"Smoking Status",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{code:"72166-2"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return jsx129(SmokingStatus,{patient,smokingStatus:observations[0],onClickResource})}},VitalsSection={key:"vitals",title:"Vitals",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{category:"vital-signs"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return jsx129(Vitals,{patient,vitals:observations,onClickResource})}};function createPharmaciesSection(pharmacyDialogComponent){return{key:"pharmacies",title:"Pharmacies",component:({patient,onClickResource})=>jsx129(Pharmacies,{patient,onClickResource,pharmacyDialogComponent})}}var PharmaciesSection=createPharmaciesSection();function getDefaultSections(onRequestLabs){return[DemographicsSection,InsuranceSection,AllergiesSection,ProblemListSection,MedicationsSection,createLabsSection(onRequestLabs),SexualOrientationSection,SmokingStatusSection,VitalsSection,PharmaciesSection]}import{Fragment as Fragment45,jsx as jsx130,jsxs as jsxs86}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum39(),{patient:propsPatient,onClickResource,onRequestLabs}=props,patient=useResource9(propsPatient),[createdDate,setCreatedDate]=useState74(),defaultSections=useMemo33(()=>getDefaultSections(onRequestLabs),[onRequestLabs]),sections=props.sections??defaultSections,{sectionData,loading,error}=usePatientSummaryData(propsPatient,sections);return useEffect25(()=>{let id=resolveId(propsPatient);id&&medplum.readHistory("Patient",id).then(history=>{let lastUpdated=history.entry?.[history.entry.length-1]?.resource?.meta?.lastUpdated;setCreatedDate(typeof lastUpdated=="string"?lastUpdated:"")}).catch(()=>{})},[propsPatient,medplum]),patient?jsxs86(Flex19,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs86(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs86(Group50,{align:"center",gap:"sm",p:16,children:[jsx130(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs86(Stack35,{gap:0,style:{flex:1,minWidth:0},children:[jsx130(Tooltip6,{label:formatHumanName9(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx130(Text38,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:formatHumanName9(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return jsxs86(Text38,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx130(Divider9,{})]}),jsxs86(Stack35,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:[error&&jsxs86(Text38,{c:"red",fz:"sm",children:["Error loading patient summary: ",error.message]}),!loading&§ions.length>0&&jsx130(Fragment45,{children:sections.map((section,index)=>{let SectionComponent=section.component;return jsxs86("div",{children:[jsx130(SectionComponent,{patient,onClickResource,results:sectionData[index]??{}}),jsx130(Divider9,{})]},section.key)})})]})]}):null}var ThreadInbox_default={container:"ThreadInbox_container",rightBorder:"ThreadInbox_rightBorder"};import{Fragment as Fragment46,jsx as jsx131,jsxs as jsxs87}from"react/jsx-runtime";function ThreadInbox(props){let{query,threadId,subject,showPatientSummary=!1,sections,onNew,getThreadUri,uploadEnabled,onViewInDocuments,onChange,inProgressUri,completedUri,allowPatientSelection=!1}=props,navigate=useMedplumNavigate5(),[modalOpened,{open:openModal,close:closeModal}]=useDisclosure10(!1),currentSearch=useMemo34(()=>parseSearchRequest(`Communication?${query}`),[query]),searchParams=useMemo34(()=>new URLSearchParams(query),[query]),itemsPerPage=Number.parseInt(searchParams.get("_count")||"20",10),currentOffset=Number.parseInt(searchParams.get("_offset")||"0",10),currentPage=Math.floor(currentOffset/itemsPerPage)+1,status=searchParams.get("status")||"in-progress",selectedParticipants=useMemo34(()=>(currentSearch.filters?.filter(f=>f.code==="recipient")??[]).flatMap(f=>f.value.split(",").filter(Boolean).map(ref=>({reference:ref}))),[currentSearch]),{loading,error,threadMessages,selectedThread,total,handleThreadStatusChange,addThreadMessage,refreshThreadMessages}=useThreadInbox({query,threadId}),handleParticipantsChange=useCallback24(participants=>{let otherFilters=currentSearch.filters?.filter(f=>f.code!=="recipient")??[],participantRefs=participants.map(p=>p.reference).filter(Boolean),newFilters=participantRefs.length>0?[...otherFilters,{code:"recipient",operator:Operator.EQUALS,value:participantRefs.join(",")}]:otherFilters;onChange({...currentSearch,filters:newFilters,offset:0})},[currentSearch,onChange]),skeletonTitleWidths=[80,72,68,64],skeletonSubtitleWidths=[85,78,70,60];useEffect26(()=>{error&&showNotification8({title:"Error",message:normalizeErrorString10(error),color:"red"})},[error]);let handleTopicStatusChangeWithErrorHandling=async newStatus=>{handleThreadStatusChange(newStatus);try{await refreshThreadMessages()}catch(error2){showNotification8({title:"Error",message:normalizeErrorString10(error2),color:"red"})}},handleNewTopicCompletion=message=>{addThreadMessage(message),onNew(message)};return jsxs87(Fragment46,{children:[jsx131("div",{className:ThreadInbox_default.container,children:jsxs87(Flex20,{direction:"row",h:"100%",w:"100%",children:[jsx131(Flex20,{direction:"column",w:380,h:"100%",className:ThreadInbox_default.rightBorder,children:jsxs87(Paper4,{h:"100%",style:{display:"flex",flexDirection:"column"},children:[jsxs87(ScrollArea3,{style:{flex:1},scrollbarSize:10,type:"hover",scrollHideDelay:250,children:[jsxs87(Flex20,{h:64,align:"center",justify:"space-between",p:"md",children:[jsx131(Tabs,{value:status,onChange:value=>{navigate(value==="in-progress"?inProgressUri:completedUri)},variant:"unstyled",className:"pill-tabs",children:jsxs87(Tabs.List,{children:[jsx131(Tabs.Tab,{value:"in-progress",children:"In Progress"}),jsx131(Tabs.Tab,{value:"completed",children:"Completed"})]})}),jsxs87(Group51,{gap:"xs",children:[jsx131(ParticipantFilter,{selectedParticipants,onFilterChange:handleParticipantsChange}),jsx131(Tooltip7,{label:"New Message",position:"bottom",openDelay:500,children:jsx131(ActionIcon12,{radius:"xl",variant:"filled",color:"blue",size:32,onClick:openModal,children:jsx131(IconPlus,{size:16})})})]})]}),jsx131(Divider10,{}),loading?jsx131(Stack36,{gap:"md",p:"md",children:Array.from({length:10}).map((_,index)=>{let titleWidth=skeletonTitleWidths[index%skeletonTitleWidths.length],subtitleWidth=skeletonSubtitleWidths[index%skeletonSubtitleWidths.length];return jsxs87(Flex20,{gap:"sm",align:"flex-start",children:[jsx131(Skeleton2,{height:40,width:40,radius:"50%"}),jsx131(Box20,{style:{flex:1},children:jsxs87(Flex20,{direction:"column",gap:"xs",children:[jsx131(Skeleton2,{height:16,width:`${titleWidth}%`}),jsx131(Skeleton2,{height:14,width:`${subtitleWidth}%`})]})})]},index)})}):threadMessages.length>0&&jsx131(ChatList,{threads:threadMessages,selectedCommunication:selectedThread,getThreadUri}),threadMessages.length===0&&!loading&&jsx131(EmptyMessagesState,{})]}),!loading&&total!==void 0&&total>itemsPerPage&&jsx131(Box20,{p:"md",children:jsx131(Center3,{children:jsx131(Pagination,{value:currentPage,total:Math.ceil(total/itemsPerPage),onChange:page=>{let offset=(page-1)*itemsPerPage;onChange({...currentSearch,offset})},size:"sm",siblings:1,boundaries:1})})})]})}),selectedThread?jsxs87(Fragment46,{children:[jsx131(Flex20,{direction:"column",style:{flex:1},h:"100%",className:ThreadInbox_default.rightBorder,children:jsx131(Paper4,{h:"100%",children:jsxs87(Stack36,{h:"100%",gap:0,children:[jsxs87(Flex20,{h:64,align:"center",justify:"space-between",p:"md",children:[jsx131(Text39,{fw:800,truncate:!0,fz:"lg",children:selectedThread.topic?.text??"Messages"}),jsxs87(Menu5,{position:"bottom-end",shadow:"md",children:[jsx131(Menu5.Target,{children:jsx131(Button12,{variant:"light",color:getStatusColor4(selectedThread.status),rightSection:selectedThread.status==="completed"?void 0:jsx131(IconChevronDown,{size:16}),radius:"xl",size:"sm",children:selectedThread.status.split("-").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")})}),selectedThread.status!=="completed"&&jsx131(Menu5.Dropdown,{children:jsx131(Menu5.Item,{onClick:()=>handleTopicStatusChangeWithErrorHandling("completed"),children:"Completed"})})]})]}),jsx131(Divider10,{}),jsx131(Flex20,{direction:"column",style:{flex:1},h:"100%",children:jsx131(ThreadChat,{title:"Messages",thread:selectedThread,excludeHeader:!0,uploadEnabled,onViewInDocuments},`${getReferenceString10(selectedThread)}`)})]})})}),selectedThread.subject&&showPatientSummary&&jsx131(Flex20,{direction:"column",w:300,h:"100%",children:jsx131(ScrollArea3,{p:0,h:"100%",scrollbarSize:10,type:"hover",scrollHideDelay:250,children:jsx131(PatientSummary,{patient:selectedThread.subject,sections},selectedThread.id)})})]}):jsx131(Flex20,{direction:"column",style:{flex:1},h:"100%",children:jsx131(NoMessages,{})})]})}),jsx131(NewTopicDialog,{subject,opened:modalOpened,onClose:closeModal,onSubmit:handleNewTopicCompletion,allowPatientSelection})]})}function NoMessages(){return jsx131(Center3,{h:"100%",w:"100%",children:jsxs87(Stack36,{align:"center",gap:"md",children:[jsx131(ThemeIcon,{size:64,variant:"light",color:"gray",children:jsx131(IconMessageCircle,{size:32})}),jsx131(Stack36,{align:"center",gap:"xs",children:jsx131(Text39,{size:"sm",c:"dimmed",ta:"center",children:"Select a message from the list to view details"})})]})})}function getStatusColor4(status){return status==="completed"?"green":status==="stopped"?"red":"blue"}function EmptyMessagesState(){return jsx131(Flex20,{direction:"column",h:"100%",justify:"center",align:"center",children:jsxs87(Stack36,{align:"center",gap:"md",pt:"xl",children:[jsx131(IconMessageCircle,{size:64,color:"var(--mantine-color-gray-4)"}),jsx131(Text39,{size:"lg",c:"dimmed",fw:500,children:"No messages found"})]})})}import{ActionIcon as ActionIcon14,Button as Button14,Center as Center4,Group as Group53,Loader as Loader6,ScrollArea as ScrollArea4,TextInput as TextInput26}from"@mantine/core";import{showNotification as showNotification9,updateNotification}from"@mantine/notifications";import{createReference as createReference14,normalizeErrorString as normalizeErrorString11}from"@medplum/core";import{useMedplum as useMedplum42,useResource as useResource11}from"@medplum/react-hooks";import{useCallback as useCallback25,useEffect as useEffect29,useLayoutEffect as useLayoutEffect4,useRef as useRef14,useState as useState78}from"react";var import_rfc6902=__toESM(require_rfc6902(),1);import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize5,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum40}from"@medplum/react-hooks";import{useEffect as useEffect27,useMemo as useMemo35,useState as useState76}from"react";import{Button as Button13,Table}from"@mantine/core";import{useState as useState75}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment47,jsx as jsx132,jsxs as jsxs88}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState75(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx132(Fragment47,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx132(Fragment47,{children:jsxs88(Table.Tr,{children:[jsx132(Table.Td,{children:name}),jsx132(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx132(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx132(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx132(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs88(Table.Tr,{children:[jsx132(Table.Td,{children:name}),jsx132(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx132(Button13,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx133,jsxs as jsxs89}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum40(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState76(!1);useEffect27(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo35(()=>{if(!schemaLoaded)return null;let typedOriginal=[toTypedValue(original)],typedRevised=[toTypedValue(revised)],result=[],patch=mergePatchOperations((0,import_rfc6902.createPatch)(original,revised));for(let op of patch){let path=op.path,fhirPath=jsonPathToFhirPath(path),property=tryGetElementDefinition(original.resourceType,fhirPath),originalValue=op.op==="add"?void 0:evalFhirPathTyped(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:evalFhirPathTyped(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${capitalize5(op.op)} ${fhirPath}`,path:property?.path??original.resourceType+"."+fhirPath,property,originalValue:touchUpValue(property,originalValue),revisedValue:touchUpValue(property,revisedValue)})}return result},[schemaLoaded,original,revised]);return diffTable?jsxs89(Table2,{className:ResourceDiffTable_default.root,children:[jsx133(Table2.Thead,{children:jsxs89(Table2.Tr,{children:[jsx133(Table2.Th,{}),jsx133(Table2.Th,{children:"Before"}),jsx133(Table2.Th,{children:"After"})]})}),jsx133(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx133(ResourceDiffRow,{...rest},key)})})]}):null}function mergePatchOperations(patch){let result=[];for(let patchOperation of patch){let{op,path}=patchOperation;if(path.startsWith("/meta/author")||path.startsWith("/meta/compartment")||path.startsWith("/meta/lastUpdated")||path.startsWith("/meta/versionId"))continue;let count=patch.filter(el=>el.op===op&&el.path===path).length,resultOperation={op,path};count>1&&(op==="add"||op==="remove")&&/\/[0-9-]+$/.test(path)&&(resultOperation.op="replace",resultOperation.path=path.replace(/\/[^/]+$/,"")),result.some(el=>el.op===resultOperation.op&&el.path===resultOperation.path)||result.push(resultOperation)}return result}function jsonPathToFhirPath(path){let parts=path.split("/").filter(Boolean),result="";for(let i=0;i<parts.length;i++){let part=parts[i];part==="-"?result+=".last()":/^\d+$/.test(part)?result+=`[${part}]`:(i>0&&(result+="."),result+=part)}return result.endsWith(".url")&&(result=result.replace(/\.url$/,"")),result}function tryGetElementDefinition(resourceType,fhirPath){try{return getSearchParameterDetails(resourceType,{resourceType:"SearchParameter",base:[resourceType],code:resourceType+"."+fhirPath,expression:resourceType+"."+fhirPath})?.elementDefinitions?.[0]}catch(err){console.warn("Failed to get element definition",{resourceType,fhirPath,err});return}}function touchUpValue(property,input){return input&&{type:Array.isArray(input)?input[0].type:input.type,value:fixArray(input,!!property?.isArray)}}function fixArray(input,isArray){let inputValue=arrayify(input).flatMap(v=>v.value);return isArray?inputValue:inputValue[0]}import{AccessPolicyInteraction,satisfiedAccessPolicy,tryGetProfile as tryGetProfile4}from"@medplum/core";import{useMedplum as useMedplum41,useResource as useResource10}from"@medplum/react-hooks";import{useEffect as useEffect28,useMemo as useMemo36,useState as useState77}from"react";import{jsx as jsx134}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum41(),accessPolicy=medplum.getAccessPolicy(),value=useResource10(props.value),[schemaLoaded,setSchemaLoaded]=useState77(!1);useEffect28(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{tryGetProfile4(profileUrl)?setSchemaLoaded(!0):console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)});else{let schemaName=value.resourceType;medplum.requestSchema(schemaName).then(()=>{setSchemaLoaded(!0)}).catch(console.error)}},[medplum,profileUrl,value]);let accessPolicyResource=useMemo36(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx134(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon13,Group as Group52,Menu as Menu6,Text as Text40}from"@mantine/core";import{formatDateTime as formatDateTime4,getReferenceString as getReferenceString11}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx135,jsxs as jsxs90}from"react/jsx-runtime";function Timeline(props){return jsx135(Container,{children:props.children})}function TimelineItem(props){let{resource,profile,padding,popupMenuItems,...others}=props,author=profile??resource.meta?.author,onBehalfOf=resource.meta?.onBehalfOf,dateTime=props.dateTime??resource.meta?.lastUpdated;return jsxs90(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs90(Group52,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx135(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs90("div",{style:{flex:1},children:[jsxs90(Text40,{size:"sm",children:[jsx135(ResourceName,{c:"inherit",fw:500,value:author,link:!0}),onBehalfOf&&jsxs90(Text40,{component:"span",size:"xs",c:"dimmed",children:[" on behalf of ",jsx135(ResourceName,{c:"inherit",value:onBehalfOf,link:!0})]})]}),jsxs90(Text40,{size:"xs",children:[jsx135(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime4(dateTime)}),jsx135(Text40,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx135(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs90(Menu6,{position:"bottom-end",shadow:"md",width:200,children:[jsx135(Menu6.Target,{children:jsx135(ActionIcon13,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString11(props.resource)}`,children:jsx135(IconDots,{})})}),popupMenuItems]})]}),jsx135(ErrorBoundary,{children:jsx135("div",{className:clsx_default(Timeline_default.item,{[Timeline_default.itemPadding]:padding}),children:props.children})})]})}function sortByDateAndPriority(resources,timelineResource){resources.sort((a,b)=>{let priority1=getPriorityScore(a,timelineResource),priority2=getPriorityScore(b,timelineResource);return priority1>priority2?1:priority1<priority2?-1:getTime(a,timelineResource)-getTime(b,timelineResource)})}function getPriorityScore(resource,timelineResource){if(!isSameResourceType(resource,timelineResource)){let priority=resource.priority;if(typeof priority=="string")return{stat:4,asap:3,urgent:2}[priority]??0}return 0}function getTime(resource,timelineResource){if(!isSameResourceType(resource,timelineResource)){if(resource.resourceType==="Communication"&&resource.sent)return new Date(resource.sent).getTime();if((resource.resourceType==="DiagnosticReport"||resource.resourceType==="Media"||resource.resourceType==="Observation")&&resource.issued)return new Date(resource.issued).getTime();if(resource.resourceType==="DocumentReference"&&resource.date)return new Date(resource.date).getTime()}let dateTime=resource.meta?.lastUpdated;return dateTime?new Date(dateTime).getTime():0}function isSameResourceType(a,b){return!!b&&a.resourceType===b.resourceType&&a.id===b.id}var ResourceTimeline_default={pinnedComment:"ResourceTimeline_pinnedComment"};import{jsx as jsx136,jsxs as jsxs91}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum42(),sender=medplum.getProfile(),inputRef=useRef14(null),resource=useResource11(props.value),[history,setHistory]=useState78(),[items,setItems]=useState78([]),[countToShow,setCountToShow]=useState78(10),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef14(items);useLayoutEffect4(()=>{itemsRef.current=items});let sortAndSetItems=useCallback25(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback25(batchResponse=>{let newItems=[];for(let settledResult of batchResponse){if(settledResult.status!=="fulfilled")continue;let bundle=settledResult.value;if(bundle.type==="history"&&setHistory(bundle),bundle.entry)for(let entry of bundle.entry)newItems.push(entry.resource)}sortAndSetItems(newItems)},[sortAndSetItems]),addResource=useCallback25(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback25(()=>{let resourceType,id;"resourceType"in props.value?(resourceType=props.value.resourceType,id=props.value.id):[resourceType,id]=props.value.reference?.split("/"),loadTimelineResources(medplum,resourceType,id).then(handleBatchResponse).catch(console.error)},[medplum,props.value,loadTimelineResources,handleBatchResponse]);useEffect29(()=>loadTimeline(),[loadTimeline]);function createComment(contentString){!resource||!props.createCommunication||medplum.createResource(props.createCommunication(resource,sender,contentString)).then(result=>addResource(result)).catch(console.error)}function createMedia(attachment){!resource||!props.createMedia||medplum.createResource(props.createMedia(resource,sender,attachment)).then(result=>addResource(result)).then(()=>updateNotification({id:"upload-notification",color:"teal",title:"Upload complete",message:"",icon:jsx136(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString11(reason),icon:jsx136(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification9({id:"upload-notification",loading:!0,title:"Initializing upload...",message:"Please wait...",autoClose:!1,withCloseButton:!1})}function onUploadProgress(e){updateNotification({id:"upload-notification",loading:!0,title:"Uploading...",message:getProgressMessage(e),autoClose:!1,withCloseButton:!1})}function onUploadError(outcome){updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString11(outcome),icon:jsx136(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return jsx136(Center4,{style:{width:"100%",height:"100%"},children:jsx136(Loader6,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return jsxs91(Timeline,{children:[props.createCommunication&&jsx136(Panel,{children:jsx136(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs91(Group53,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx136(ResourceAvatar,{value:sender}),jsx136(TextInput26,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx136(ActionIcon14,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx136(IconMessage,{size:16})}),jsx136(AttachmentButton,{securityContext:createReference14(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx136(ActionIcon14,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx136(IconCloudUpload,{size:16})})})]})})}),itemsToShow.map(item=>{let key=`${item.resourceType}/${item.id}/${item.meta?.versionId}`,menu=props.getMenu?props.getMenu({primaryResource:resource,currentResource:item,reloadTimeline:loadTimeline}):void 0;if(item.resourceType===resource.resourceType&&item.id===resource.id)return jsx136(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx136(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx136(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx136(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx136(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx136(TimelineItem,{resource:item,padding:!0,children:jsx136(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&jsx136(Group53,{justify:"center",pb:"lg",children:jsx136(Button14,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx136(TimelineItem,{resource,padding:!0,...rest,children:jsx136(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs91(TimelineItem,{resource,padding:!0,...rest,children:[jsx136("h3",{children:"Created"}),jsx136(ResourceTable,{value:resource,ignoreMissingValues:!0,forceUseInput:!0})]})}function getPrevious(history,version){let entries=history.entry??[],index=entries.findIndex(entry=>entry.resource?.meta?.versionId===version.meta?.versionId);if(!(index>=entries.length-1))return entries[index+1].resource}function CommunicationTimelineItem(props){let className=!props.resource.priority||props.resource.priority==="routine"?void 0:ResourceTimeline_default.pinnedComment;return jsx136(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx136("p",{children:props.resource.payload?.[0]?.contentString})})}function MediaTimelineItem(props){let contentType=props.resource.content?.contentType,padding=contentType&&!contentType.startsWith("image/")&&!contentType.startsWith("video/")&&contentType!=="application/pdf";return jsx136(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx136(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx136(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx136(ScrollArea4,{children:jsx136("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx136(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx136(DiagnosticReportDisplay,{value:props.resource})})}function getProgressMessage(e){if(e.lengthComputable){let percent=100*e.loaded/e.total;return`Uploaded: ${formatFileSize(e.loaded)} / ${formatFileSize(e.total)} ${percent.toFixed(2)}%`}return`Uploaded: ${formatFileSize(e.loaded)}`}function formatFileSize(bytes){if(bytes===0)return"0.00 B";let e=Math.floor(Math.log(bytes)/Math.log(1024));return(bytes/Math.pow(1024,e)).toFixed(2)+" "+" KMGTP".charAt(e)+"B"}import{jsx as jsx137}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx137(ResourceTimeline,{value:resource,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`;return Promise.allSettled([medplum.readHistory(resourceType,id),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count:100})])},...rest})}import{createReference as createReference15}from"@medplum/core";import{jsx as jsx138}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx138(ResourceTimeline,{value:encounter,loadTimelineResources:async(medplum,_resourceType,id)=>Promise.allSettled([medplum.readHistory("Encounter",id),medplum.search("Communication","encounter=Encounter/"+id),medplum.search("Media","encounter=Encounter/"+id)]),createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",encounter:createReference15(resource),subject:resource.subject,sender:createReference15(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference15(resource),subject:resource.subject,operator:createReference15(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button19,Loader as Loader8,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome11}from"@medplum/core";import{useMedplum as useMedplum44}from"@medplum/react-hooks";import{memo,useEffect as useEffect33,useState as useState83}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx139}from"react/jsx-runtime";function FhirPathDisplay(props){let value;try{value=evalFhirPath(props.path,props.resource)}catch(err){return console.warn("FhirPathDisplay:",err),null}if(value.length>1)throw new Error(`Component "path" for "FhirPathDisplay" must resolve to a single element. Received ${value.length} elements [${JSON.stringify(value,null,2)}]`);return jsx139(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon16,Button as Button18,Center as Center5,Group as Group56,Loader as Loader7,Menu as Menu8,Pagination as Pagination2,Table as Table3,Text as Text42,UnstyledButton as UnstyledButton7}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals as deepEquals2,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome10}from"@medplum/core";import{useMedplum as useMedplum43}from"@medplum/react-hooks";import{useCallback as useCallback26,useEffect as useEffect32,useLayoutEffect as useLayoutEffect6,useRef as useRef17,useState as useState82}from"react";import{Box as Box21,Button as Button15,Modal as Modal12,Text as Text41}from"@mantine/core";import{jsx as jsx140,jsxs as jsxs92}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs92(Modal12,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs92(Box21,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx140(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx140(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx140(Text41,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx140(Button15,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button16,Group as Group54,Modal as Modal13,MultiSelect as MultiSelect2,Stack as Stack37}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify3}from"@medplum/core";import{useEffect as useEffect30,useMemo as useMemo37,useRef as useRef15,useState as useState79}from"react";import{capitalize as capitalize6,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime5,Operator as Operator2}from"@medplum/core";import{Fragment as Fragment48,jsx as jsx141}from"react/jsx-runtime";var searchParamToOperators={string:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],fulltext:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],token:[Operator2.EQUALS,Operator2.NOT,Operator2.TEXT],reference:[Operator2.EQUALS,Operator2.NOT],numeric:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],quantity:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],date:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],datetime:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],uri:[Operator2.EQUALS,Operator2.NOT,Operator2.ABOVE,Operator2.BELOW]},operatorNames={eq:"equals",ne:"not equals",gt:"greater than",lt:"less than",ge:"greater than or equals",le:"less than or equals",sa:"starts after",eb:"ends before",ap:"approximately",sw:"starts with",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",present:"present",identifier:"identifier",iterate:"iterate"};function setFilters(definition,filters){return{...definition,filters,offset:0,name:void 0}}function clearFilters(definition){return setFilters(definition,[])}function clearFiltersOnField(definition,code){return setFilters(definition,(definition.filters??[]).filter(f=>f.code!==code))}function addFilter(definition,field,op,value,opt_clear){opt_clear&&(definition=clearFiltersOnField(definition,field));let nextFilters=[];return definition.filters&&nextFilters.push(...definition.filters),nextFilters.push({code:field,operator:op,value:value??""}),setFilters(definition,nextFilters)}function addField(definition,field){if(definition.fields?.includes(field))return definition;let newFields=[];return definition.fields&&newFields.push(...definition.fields),newFields.push(field),{...definition,fields:newFields,name:void 0}}function deleteFilter(definition,index){if(!definition.filters)return definition;let newFilters=[...definition.filters];return newFilters.splice(index,1),{...definition,filters:newFilters,name:void 0}}function addYesterdayFilter(definition,field){return addDayFilter(definition,field,-1)}function addTodayFilter(definition,field){return addDayFilter(definition,field,0)}function addTomorrowFilter(definition,field){return addDayFilter(definition,field,1)}function addDayFilter(definition,field,delta){let startTime=new Date;startTime.setDate(startTime.getDate()+delta),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setDate(endTime.getDate()+1),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addNext24HoursFilter(definition,field){let now=new Date,endTime=new Date(now.getTime()+1440*60*1e3);return addDateFilterBetween(definition,field,now,endTime)}function addLastMonthFilter(definition,field){return addMonthFilter(definition,field,-1)}function addThisMonthFilter(definition,field){return addMonthFilter(definition,field,0)}function addNextMonthFilter(definition,field){return addMonthFilter(definition,field,1)}function addMonthFilter(definition,field,delta){let startTime=new Date;startTime.setMonth(startTime.getMonth()+delta),startTime.setDate(1),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setMonth(endTime.getMonth()+1),endTime.setDate(1),endTime.setHours(0,0,0,0),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addYearToDateFilter(definition,field){let startTime=new Date;return startTime.setMonth(0),startTime.setDate(1),startTime.setHours(0,0,0,0),addDateFilterBetween(definition,field,startTime,new Date)}function addDateFilterBetween(definition,field,d1,d2){return definition=clearFiltersOnField(definition,field),definition=addDateFilterImpl(definition,field,Operator2.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator2.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator2.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.replaceAll(/([A-Z])/g," $1"),tmp=tmp.replaceAll(/[-_]/g," "),tmp=tmp.replaceAll(/\s+/g," "),tmp=tmp.trim(),tmp.toLowerCase()==="id"?"ID":tmp.split(/\s/).map(capitalize6).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?jsx141(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children:resource.id}):key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?formatDateTime5(resource.meta?.lastUpdated):`${resource.resourceType}.${field.name}`===field.elementDefinition?.path?renderPropertyValue(resource,field.elementDefinition):field.searchParams?.length===1&&field.name===field.searchParams[0].code?renderSearchParameterValue(resource,field.searchParams[0]):null}function renderPropertyValue(resource,elementDefinition){let path=elementDefinition.path?.split(".")?.pop()?.replaceAll("[x]","")??"",[value,propertyType]=getValueAndType({type:resource.resourceType,value:resource},path);return value?jsx141(ResourcePropertyDisplay,{path:elementDefinition.path,property:elementDefinition,propertyType,value,maxWidth:200,ignoreMissingValues:!0,link:!1}):null}function renderSearchParameterValue(resource,searchParam){let value=evalFhirPathTyped2(searchParam.expression,[{type:resource.resourceType,value:resource}]);return!value||value.length===0?null:jsx141(Fragment48,{children:value.map((v,index)=>jsx141(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx142,jsxs as jsxs93}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef15(!1),[state,setState]=useState79({search:JSON.parse(stringify3(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState79(!1);useEffect30(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo37(()=>{if(!props.visible)return[];let resourceType=props.search.resourceType,typeSchema=getDataType2(resourceType),searchParams=getSearchParameters(resourceType);return sortStringArray(getFieldsList(typeSchema,searchParams)).map(field=>({value:field,label:buildFieldNameString(field)}))},[props.visible,props.search.resourceType]);function handleChange(newFields){setState({search:{...state.search,fields:newFields}})}return jsx142(Modal13,{title:"Fields",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>{props.onCancel()},size:"auto",withOverlay:!0,closeOnClickOutside:!1,overlayProps:{onMouseDownCapture:()=>{wasDropdownOpen.current=isDropdownOpen},onClick:()=>{wasDropdownOpen.current||props.onCancel(),wasDropdownOpen.current=!1},children:jsx142("div",{"data-testid":"overlay-child"})},children:jsxs93(Stack37,{children:[jsx142(MultiSelect2,{style:{width:550},placeholder:"Select fields to display",data:allFields,value:state.search.fields??[],onChange:handleChange,onDropdownOpen:()=>setIsDropdownOpen(!0),onDropdownClose:()=>setIsDropdownOpen(!1),maxDropdownHeight:"250px",clearButtonProps:{"aria-label":"Clear selection"},clearable:!0,searchable:!0}),jsx142(Group54,{justify:"flex-end",children:jsx142(Button16,{onClick:()=>props.onOk(state.search),children:"OK"})})]})})}function getFieldsList(typeSchema,searchParams){let result=[],keys=new Set,names=new Set;for(let key of Object.keys(typeSchema.elements))result.push(key),keys.add(key.toLowerCase()),names.add(buildFieldNameString(key));if(searchParams)for(let code of Object.keys(searchParams)){let name=buildFieldNameString(code);!keys.has(code)&&!names.has(name)&&(result.push(code),keys.add(code),names.add(name))}return result}import{ActionIcon as ActionIcon15,Group as Group55,Modal as Modal14,NativeSelect as NativeSelect11}from"@mantine/core";import{Operator as Operator3,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect31,useLayoutEffect as useLayoutEffect5,useRef as useRef16,useState as useState80}from"react";import{Checkbox as Checkbox7,TextInput as TextInput27}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx143}from"react/jsx-runtime";function SearchFilterValueInput(props){let details=getSearchParameterDetails2(props.resourceType,props.searchParam),name=props.name??"filter-value";switch(details.type){case SearchParameterType.REFERENCE:return jsx143(ReferenceInput,{name,defaultValue:props.defaultValue?{reference:props.defaultValue}:void 0,targetTypes:props.searchParam.target,autoFocus:props.autoFocus,onChange:newReference=>{newReference?props.onChange(newReference.reference):props.onChange("")}});case SearchParameterType.BOOLEAN:return jsx143(Checkbox7,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType.DATE:return jsx143(TextInput27,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.DATETIME:return jsx143(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx143(TextInput27,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.QUANTITY:return jsx143(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx143(TextInput27,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value),placeholder:"Search value"})}}function tryParseQuantity(value){if(value){let[valueString,systemString,unitString]=value.split("|");if(valueString)return{value:Number.parseFloat(valueString),system:systemString,unit:unitString}}}import{jsx as jsx144,jsxs as jsxs94}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState80(deepClone2(props.search)),searchRef=useRef16(search);useLayoutEffect5(()=>{searchRef.current=search}),useEffect31(()=>{setSearch(deepClone2(props.search))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}let resourceType=props.search.resourceType,searchParams=getSearchParameters2(resourceType)??{},filters=search.filters||[];return jsx144(Modal14,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs94(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs94("div",{children:[jsxs94("table",{children:[jsxs94("colgroup",{children:[jsx144("col",{style:{width:200}}),jsx144("col",{style:{width:200}}),jsx144("col",{style:{width:380}}),jsx144("col",{style:{width:40}})]}),jsx144("thead",{children:jsxs94("tr",{children:[jsx144("th",{children:"Field"}),jsx144("th",{children:"Operation"}),jsx144("th",{children:"Value"}),jsx144("th",{})]})}),jsx144("tbody",{children:filters.map((filter,index)=>jsx144(FilterRowInput,{id:`filter-${index}-row`,resourceType,searchParams,value:filter,onChange:newFilter=>{let newFilters=[...filters];newFilters[index]=newFilter,setSearch(setFilters(searchRef.current,newFilters))},onDelete:()=>setSearch(deleteFilter(searchRef.current,index))},`filter-${index}-row`))})]}),jsx144(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx144(Group55,{justify:"flex-end",mt:"xl",children:jsx144(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value;function setFilterCode(newCode){props.onChange({code:newCode,operator:Operator3.EQUALS,value:""})}function setFilterOperator(newOperator){props.onChange({code:value.code,operator:newOperator,value:""})}function setFilterValue(newFilterValue){props.onChange({code:value.code,operator:value.operator,value:newFilterValue})}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return jsxs94("tr",{children:[jsx144("td",{children:jsx144(NativeSelect11,{"data-testid":`${props.id}-filter-field`,defaultValue:props.value.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...Object.keys(props.searchParams).map(param=>({value:param,label:buildFieldNameString(param)}))]})}),jsx144("td",{children:operators&&jsx144(NativeSelect11,{"data-testid":`${props.id}-filter-operation`,defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]},`${props.id}-filter-value-${props.value.code}`)}),jsx144("td",{children:searchParam&&value.operator&&jsx144(SearchFilterValueInput,{name:`${props.id}-filter-value`,resourceType:props.resourceType,searchParam,defaultValue:value.value,onChange:setFilterValue},`${props.id}-filter-value-${props.value.code}-${props.value.operator}`)}),jsx144("td",{children:props.onDelete&&jsx144(ActionIcon15,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx144(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button17,Grid,Modal as Modal15}from"@mantine/core";import{useState as useState81}from"react";import{jsx as jsx145,jsxs as jsxs95}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState81(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx145(Modal15,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx145(Form,{onSubmit:onOk,children:jsxs95(Grid,{children:[jsx145(Grid.Col,{span:10,children:jsx145(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx145(Grid.Col,{span:2,children:jsx145(Button17,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime6,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator4,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment49,jsx as jsx146}from"react/jsx-runtime";function SearchFilterValueDisplay(props){let{resourceType,filter}=props,searchParam=globalSchema.types[resourceType].searchParams?.[filter.code];if(searchParam){if(searchParam.type==="reference"&&(filter.operator===Operator4.EQUALS||filter.operator===Operator4.NOT_EQUALS))return jsx146(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx146(Fragment49,{children:formatDateTime6(filter.value)})}return jsx146(Fragment49,{children:filter.value})}import{Menu as Menu7}from"@mantine/core";import{Operator as Operator5}from"@medplum/core";import{Fragment as Fragment50,jsx as jsx147,jsxs as jsxs96}from"react/jsx-runtime";function SearchPopupMenu(props){if(!props.searchParams)return null;function onSort(searchParam,desc){onChange(setSort(props.search,searchParam.code,desc))}function onClear(searchParam){onChange(clearFiltersOnField(props.search,searchParam.code))}function onPrompt(searchParam,operator){props.onPrompt(searchParam,{code:searchParam.code,operator,value:""})}function onChange(definition){props.onChange(definition)}return props.searchParams.length===1?jsx147(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx147(Menu7.Dropdown,{children:props.searchParams.map(searchParam=>jsx147(Menu7.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx147(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx147(NumericFilterSubMenu,{...props});case"reference":return jsx147(ReferenceFilterSubMenu,{...props});case"string":return jsx147(TextFilterSubMenu,{...props});case"token":return jsx147(TokenFilterSubMenu,{...props});case"uri":return jsx147(UriFilterSubMenu,{...props});default:return jsxs96(Fragment50,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx147(Menu7.Item,{leftSection:jsx147(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.ENDS_BEFORE),children:"Before..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.STARTS_AFTER),children:"After..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Between..."}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx147(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx147(Menu7.Item,{leftSection:jsx147(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN),children:"Greater than..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN),children:"Less than..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx147(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx147(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx147(Menu7.Item,{leftSection:jsx147(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.CONTAINS),children:"Contains..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Does not contain..."}),jsx147(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.TEXT),children:"Text contains..."}),jsx147(CommonMenuItems,{...props})]})}function UriFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx147(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs96(Fragment50,{children:[jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx147(Menu7.Item,{leftSection:jsx147(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconX,{size:14}),onClick:()=>props.onClear(searchParam),children:"Clear filters"})]})}function getPaginationControlProps(controlName){switch(controlName){case"next":return{"aria-label":"Next page"};case"previous":return{"aria-label":"Previous page"};case"first":return{"aria-label":"First page"};case"last":return{"aria-label":"Last page"};default:return{}}}var SearchControl_default={root:"SearchControl_root",table:"SearchControl_table",tr:"SearchControl_tr",th:"SearchControl_th",control:"SearchControl_control",icon:"SearchControl_icon"};import{getElementDefinition as getElementDefinition2,getSearchParameter,getSearchParameterDetails as getSearchParameterDetails4,getSearchParameters as getSearchParameters3}from"@medplum/core";function getFieldDefinitions(search){let resourceType=search.resourceType,fields=[];for(let name of search.fields||["id","_lastUpdated"])fields.push(getFieldDefinition(resourceType,name));return fields}function getFieldDefinition(resourceType,name){if(name==="_lastUpdated")return{name:"_lastUpdated",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_lastUpdated",name:"_lastUpdated",type:"date",expression:"Resource.meta.lastUpdated"}]};if(name==="meta.versionId")return{name:"meta.versionId",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_versionId",name:"_versionId",type:"token",expression:"Resource.meta.versionId"}]};let exactElementDefinition=getElementDefinition2(resourceType,name),exactSearchParam=getSearchParameter(resourceType,name.toLowerCase());if(exactElementDefinition&&exactSearchParam)return{name,elementDefinition:exactElementDefinition,searchParams:[exactSearchParam]};if(exactElementDefinition){let allSearchParams=getSearchParameters3(resourceType),searchParams;if(allSearchParams){let pathRegex=new RegExp(`${resourceType}\\.${name.replaceAll("[x]","")}([^\\w-]|$)`);searchParams=Object.values(allSearchParams).filter(p=>!!p.expression&&pathRegex.test(p?.expression)),searchParams.length===0&&(searchParams=void 0)}return{name,elementDefinition:exactElementDefinition,searchParams}}if(exactSearchParam){let details=getSearchParameterDetails4(resourceType,exactSearchParam);return{name,elementDefinition:details.elementDefinitions?.[0],searchParams:[exactSearchParam]}}return{name}}import{Fragment as Fragment51,jsx as jsx148,jsxs as jsxs97}from"react/jsx-runtime";var SearchChangeEvent=class extends Event{constructor(definition){super("change");__publicField(this,"definition");this.definition=definition}},SearchLoadEvent=class extends Event{constructor(response){super("load");__publicField(this,"response");this.response=response}},SearchClickEvent=class extends Event{constructor(resource,browserEvent){super("click");__publicField(this,"resource");__publicField(this,"browserEvent");this.resource=resource,this.browserEvent=browserEvent}};function SearchControl(props){let medplum=useMedplum43(),[outcome,setOutcome]=useState82(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState82(search);deepEquals2(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState82({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef17(state);useLayoutEffect6(()=>{stateRef.current=state});let total=memoizedSearch.total??"accurate",loadResults=useCallback26(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,formatSearchQuery({...memoizedSearch,total,fields:void 0}),options)).then(response=>{setState({...stateRef.current,searchResponse:response}),onLoad&&onLoad(new SearchLoadEvent(response))}).catch(reason=>{setState({...stateRef.current,searchResponse:void 0}),setOutcome(normalizeOperationOutcome10(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback26(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect32(()=>{loadResults()},[loadResults]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...stateRef.current.selected};checked?newSelected[id]=!0:delete newSelected[id],setState({...stateRef.current,selected:newSelected})}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},searchResponse=stateRef.current.searchResponse;checked&&searchResponse?.entry&&searchResponse.entry.forEach(entry=>{entry.resource?.id&&(newSelected[entry.resource.id]=!0)}),setState({...stateRef.current,selected:newSelected})}function isAllSelected(){if(!state.searchResponse?.entry||state.searchResponse.entry.length===0)return!1;for(let e of state.searchResponse.entry)if(e.resource?.id&&!state.selected[e.resource.id])return!1;return!0}function emitSearchChange(newSearch){props.onChange&&props.onChange(new SearchChangeEvent(newSearch))}function handleRowClick(e,resource){if(isCheckboxCell(e.target)||e.button===2)return;killEvent(e);let isAux=isAuxClick(e);!isAux&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),isAux&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e))}function isExportPassed(){return!!(props.onExport??props.onExportCsv??props.onExportTransactionBundle)}if(outcome)return jsx148(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx148(Center5,{style:{width:"100%",height:"100%"},children:jsx148(Loader7,{})});let checkboxColumn=props.checkboxesEnabled,fields=getFieldDefinitions(memoizedSearch),resourceType=memoizedSearch.resourceType,lastResult=state.searchResponse,resources=lastResult?.entry?.map(e=>e.resource),buttonVariant="subtle",buttonColor="gray",iconSize=16,isMobile=window.innerWidth<768;return jsxs97("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs97(Group56,{justify:"space-between",mb:"xl",children:[jsxs97(Group56,{gap:2,children:[jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs97(Group56,{gap:2,children:[lastResult&&jsxs97(Text42,{size:"xs",c:"dimmed","data-testid":"count-display",children:[getStart(memoizedSearch,lastResult).toLocaleString(),"-",getEnd(memoizedSearch,lastResult).toLocaleString(),lastResult.total!==void 0&&` of ${memoizedSearch.total==="estimate"?"~":""}${lastResult.total?.toLocaleString()}`]}),jsx148(ActionIcon16,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx148(IconRefresh,{size:iconSize})})]})]}),jsxs97(Table3,{className:SearchControl_default.table,children:[jsxs97(Table3.Thead,{children:[jsxs97(Table3.Tr,{children:[checkboxColumn&&jsx148(Table3.Th,{children:jsx148("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx148(Table3.Th,{children:jsxs97(Menu8,{shadow:"md",width:240,position:"bottom-end",children:[jsx148(Menu8.Target,{children:jsx148(UnstyledButton7,{className:SearchControl_default.control,p:2,children:jsxs97(Group56,{justify:"space-between",wrap:"nowrap",children:[jsx148(Text42,{fw:500,children:buildFieldNameString(field.name)}),jsx148(Center5,{className:SearchControl_default.icon,children:jsx148(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx148(SearchPopupMenu,{search:memoizedSearch,searchParams:field.searchParams,onPrompt:(searchParam,filter)=>{setState({...stateRef.current,filterDialogVisible:!0,filterDialogSearchParam:searchParam,filterDialogFilter:filter,dialogOpenTime:Date.now()})},onChange:result=>{emitSearchChange(result)}})]})},field.name))]}),!props.hideFilters&&jsxs97(Table3.Tr,{children:[checkboxColumn&&jsx148(Table3.Th,{}),fields.map(field=>jsx148(Table3.Th,{children:field.searchParams&&jsx148(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),jsx148(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs97(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx148(Table3.Td,{children:jsx148("input",{type:"checkbox",value:"checked","data-testid":"row-checkbox","aria-label":`Checkbox for ${resource.id}`,checked:!!state.selected[resource.id],onChange:e=>handleSingleCheckboxClick(e,resource.id)})}),fields.map(field=>jsx148(Table3.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&jsx148(Container,{children:jsx148(Center5,{style:{height:150},children:jsx148(Text42,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx148(Center5,{m:"md",p:"md",children:jsx148(Pagination2,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),jsx148(SearchFieldEditor,{search:memoizedSearch,visible:state.fieldEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,fieldEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,fieldEditorVisible:!1})}},`search-field-editor-${state.dialogOpenTime}`),jsx148(SearchFilterEditor,{search:memoizedSearch,visible:state.filterEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,filterEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterEditorVisible:!1})}},`search-filter-editor-${state.dialogOpenTime}`),jsx148(SearchExportDialog,{visible:state.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx148(SearchFilterValueDialog,{visible:state.filterDialogVisible,title:state.filterDialogSearchParam?.code?buildFieldNameString(state.filterDialogSearchParam.code):"",resourceType,searchParam:state.filterDialogSearchParam,filter:state.filterDialogFilter,defaultValue:"",onOk:filter=>{emitSearchChange(addFilter(memoizedSearch,filter.code,filter.operator,filter.value)),setState({...stateRef.current,filterDialogVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterDialogVisible:!1})}},`search-filter-dialog-${state.dialogOpenTime}`)]})}function FilterDescription(props){let filters=(props.filters??[]).filter(f=>props.searchParams.find(p=>p.code===f.code));return filters.length===0?jsx148("span",{children:"no filters"}):jsx148(Fragment51,{children:filters.map(filter=>jsxs97("div",{children:[getOpString(filter.operator),"\xA0",jsx148(SearchFilterValueDisplay,{resourceType:props.resourceType,filter})]},`filter-${filter.code}-${filter.operator}-${filter.value}`))})}function getPage(search){return Math.floor((search.offset??0)/(search.count??DEFAULT_SEARCH_COUNT2))+1}function getTotalPages(search,lastResult){let pageSize=search.count??DEFAULT_SEARCH_COUNT2,total=getTotal(search,lastResult);return Math.ceil(total/pageSize)}function getStart(search,lastResult){return Math.min(getTotal(search,lastResult),(search.offset??0)+1)}function getEnd(search,lastResult){return Math.max(getStart(search,lastResult)+(lastResult.entry?.length??0)-1,0)}function getTotal(search,lastResult){let total=lastResult.total;return total===void 0&&(total=(search.offset??0)+(lastResult.entry?.length??0)+(lastResult.link?.some(l=>l.relation==="next")?1:0)),total}import{jsx as jsx149,jsxs as jsxs98}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum44(),[schemaLoaded,setSchemaLoaded]=useState83(!1),[outcome,setOutcome]=useState83(),{query,fields}=props,[response,setResponse]=useState83(),[selected,setSelected]=useState83({});useEffect33(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome11(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selected};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=response?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=response?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selected[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if(useEffect33(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx149(Loader8,{});let checkboxColumn=props.checkboxesEnabled;return jsxs98("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs98(Table4,{children:[jsx149(Table4.Thead,{children:jsxs98(Table4.Tr,{children:[checkboxColumn&&jsx149(Table4.Th,{children:jsx149("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx149(Table4.Th,{children:field.name},field.name))]})}),jsx149(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs98(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx149(Table4.Td,{children:jsx149("input",{type:"checkbox",value:"checked","data-testid":"row-checkbox","aria-label":`Checkbox for ${resource.id}`,checked:!!selected[resource.id],onChange:e=>handleSingleCheckboxClick(e,resource.id)})}),fields.map(field=>jsx149(Table4.Td,{children:jsx149(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx149("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx149("div",{"data-testid":"search-error",children:jsx149("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx149(Button19,{onClick:()=>props.onBulk(Object.keys(selected)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo(FhirPathTable);import{ScrollArea as ScrollArea5}from"@mantine/core";var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};import{jsx as jsx150}from"react/jsx-runtime";function InfoBar(props){return jsx150(ScrollArea5,{children:jsx150("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx150("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx150("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx150("div",{className:InfoBar_default.value,children:props.children})};import{Anchor as Anchor11,Tabs as Tabs2}from"@mantine/core";import{isString as isString2,locationUtils as locationUtils5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate6}from"@medplum/react-hooks";import{useState as useState84}from"react";var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};import{jsx as jsx151,jsxs as jsxs99}from"react/jsx-runtime";function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=useMedplumNavigate6(),[currentTab,setCurrentTab]=useState84(()=>{let segment=locationUtils5.getPathname().split("/").pop();if(segment){let segmentLower=segment.toLowerCase(),matched=tabs.find(t=>t.value.split(/[?#]/)[0].toLowerCase()===segmentLower);if(matched)return matched.value}return tabs[0].value});function onTabChange(newTabName){newTabName=newTabName||tabs[0].value,setCurrentTab(newTabName),navigate(`${baseUrl}/${newTabName}`)}return jsxs99(Tabs2,{value:currentTab,onChange:onTabChange,...rest,children:[jsx151(Tabs2.List,{className:LinkTabs_default.list,children:tabs.map(t=>jsx151(Tabs2.Tab,{value:t.value,children:jsx151(Anchor11,{className:LinkTabs_default.link,href:`${baseUrl}/${t.value}`,onClick:onLinkClick,children:t.label})},t.value))}),children]})}function normalizeTabDefinitions(tabs){return tabs.map(t=>isString2(t)?{label:t,value:t.toLowerCase()}:t)}function onLinkClick(e){isAuxClick(e)||e.preventDefault()}import{Box as Box23,SimpleGrid as SimpleGrid2}from"@mantine/core";import{useResource as useResource12,useSearchOne}from"@medplum/react-hooks";import{Box as Box22,Flex as Flex21,Group as Group57,Paper as Paper5,RingProgress,Text as Text43,Title as Title12}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{Fragment as Fragment52,jsx as jsx152,jsxs as jsxs100}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx152(Paper5,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs100(Group57,{children:[group.measureScore&&jsx152(MeasureScore,{group}),!group.measureScore&&jsx152(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs100(Fragment52,{children:[jsx152(Text43,{fz:"md",fw:500,mb:8,children:measure.title}),jsx152(Text43,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept5(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept5(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs100(Box22,{children:[jsx152(Title12,{order:3,children:"Not Applicable"}),jsx152(Text43,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs100(Box22,{children:[jsx152(Title12,{order:3,children:"Insufficient Data"}),jsx152(Text43,{children:`Numerator: ${numeratorCount}`}),jsx152(Text43,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx152(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx152(Flex21,{justify:"center",children:jsxs100(Text43,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx152(Fragment52,{children:unit==="%"?jsx152(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx152(Flex21,{justify:"center",children:jsx152(Text43,{fw:700,fz:18,children:jsx152(QuantityDisplay,{value:group.measureScore})})})}):jsx152(Flex21,{h:120,align:"center",children:jsx152(Title12,{order:3,children:jsx152(QuantityDisplay,{value:group.measureScore})})})})}function groupValue(group){let score=group.measureScore?.value,unit=group.measureScore?.unit;return score?score<=1&&unit==="%"?score*100:score:0}function groupColor(score){return score<=33?"red":score<=67?"yellow":"green"}import{jsx as jsx153,jsxs as jsxs101}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource12(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs101(Box23,{children:[measure&&jsx153(MeasureTitle,{measure}),jsx153(SimpleGrid2,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx153(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon17,Indicator as Indicator2,Tooltip as Tooltip8}from"@mantine/core";import{useNotificationCount as useNotificationCount2}from"@medplum/react-hooks";import{jsx as jsx154}from"react/jsx-runtime";function NotificationIcon(props){let{resourceType,countCriteria,subscriptionCriteria}=props,unreadCount=useNotificationCount2({resourceType,countCriteria,subscriptionCriteria}),result=props.iconComponent;return props.onClick&&(result=jsx154(ActionIcon17,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=jsx154(Tooltip8,{label:props.tooltip,children:result})),unreadCount>0&&(result=jsx154(Indicator2,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}import{ActionIcon as ActionIcon18,Alert as Alert5,Badge as Badge3,Box as Box24,Button as Button20,Checkbox as Checkbox8,Divider as Divider11,Group as Group58,Modal as Modal16,Stack as Stack38,Table as Table5,Text as Text44,Title as Title13}from"@mantine/core";import{notifications}from"@mantine/notifications";import{extractAccountReferences,normalizeErrorString as normalizeErrorString12}from"@medplum/core";import{useMedplum as useMedplum45}from"@medplum/react-hooks";import{useCallback as useCallback27,useMemo as useMemo38,useState as useState85}from"react";import{Fragment as Fragment53,jsx as jsx155,jsxs as jsxs102}from"react/jsx-runtime";var NOTIFICATION_ID="patient-accounts",NOTIFICATION_TITLE="Patient Accounts",ACCOUNT_TARGET_TYPES=["Organization","HealthcareService","CareTeam"];function PatientAccountsForm(props){let{patient}=props,medplum=useMedplum45(),isAdmin=medplum.isProjectAdmin()||medplum.isSuperAdmin(),originalAccounts=useMemo38(()=>extractAccountReferences(patient.meta)??[],[patient.meta]),[pendingAccounts,setPendingAccounts]=useState85(originalAccounts),[confirmModalOpen,setConfirmModalOpen]=useState85(!1),[propagate,setPropagate]=useState85(!0),[saving,setSaving]=useState85(!1),changes=useMemo38(()=>{let result=[];for(let account of pendingAccounts)originalAccounts.some(o=>o.reference===account.reference)||result.push({reference:account,type:"addition"});for(let account of originalAccounts)pendingAccounts.some(p=>p.reference===account.reference)||result.push({reference:account,type:"removal"});return result},[originalAccounts,pendingAccounts]),hasChanges=changes.length>0,handleAddAccount=useCallback27(value=>{value?.reference&&(pendingAccounts.some(a=>a.reference===value.reference)||setPendingAccounts(prev=>[...prev,value]))},[pendingAccounts]),handleRemoveAccount=useCallback27(referenceString=>{setPendingAccounts(prev=>prev.filter(a=>a.reference!==referenceString))},[]),handleSave=useCallback27(async()=>{let patientId=patient.id;if(!patientId){notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:"Cannot update accounts: Patient resource has no ID.",icon:jsx155(IconX,{size:"1rem"}),autoClose:!1,withCloseButton:!0});return}setSaving(!0),setConfirmModalOpen(!1);let url=medplum.fhirUrl("Patient",patientId,"$set-accounts"),parameters={resourceType:"Parameters",parameter:[...pendingAccounts.map(account=>({name:"accounts",valueReference:{reference:account.reference}})),{name:"propagate",valueBoolean:propagate}]};notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,loading:!0,message:propagate?"Saving account changes and propagating to compartment...":"Saving account changes...",autoClose:!1,withCloseButton:!1});try{let headers={};propagate&&(headers.Prefer="respond-async"),await medplum.post(url,parameters,void 0,{headers}),medplum.invalidateUrl(medplum.fhirUrl("Patient",patientId)),notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"green",message:propagate?"Account changes saved. Compartment updates are being applied.":"Account changes saved.",icon:jsx155(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0}),props.onSaved?.()}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString12(err),icon:jsx155(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}finally{setSaving(!1)}},[medplum,patient,pendingAccounts,propagate,props]);return isAdmin?jsxs102(Fragment53,{children:[jsxs102(Stack38,{children:[jsx155(Title13,{order:3,children:"Current Accounts"}),pendingAccounts.length===0?jsx155(Text44,{c:"dimmed",children:"No accounts assigned to this patient."}):jsxs102(Table5,{children:[jsx155(Table5.Thead,{children:jsxs102(Table5.Tr,{children:[jsx155(Table5.Th,{children:"Type"}),jsx155(Table5.Th,{children:"Account"}),jsx155(Table5.Th,{})]})}),jsx155(Table5.Tbody,{children:pendingAccounts.map(account=>jsxs102(Table5.Tr,{children:[jsx155(Table5.Td,{children:jsx155(AccountTypeBadge,{reference:account})}),jsx155(Table5.Td,{children:jsx155(ResourceBadge,{value:account,link:!0})}),jsx155(Table5.Td,{children:jsx155(ActionIcon18,{variant:"subtle",color:"red","aria-label":`Remove ${account.reference}`,onClick:()=>handleRemoveAccount(account.reference),children:jsx155(IconX,{size:16})})})]},account.reference))})]}),jsx155(Divider11,{}),jsx155(Title13,{order:4,children:"Add Account"}),jsx155(ReferenceInput,{name:"newAccount",placeholder:"Search for Organization, HealthcareService, or CareTeam...",targetTypes:ACCOUNT_TARGET_TYPES,onChange:value=>{value&&handleAddAccount(value)}}),hasChanges&&jsxs102(Fragment53,{children:[jsx155(Divider11,{}),jsx155(Title13,{order:4,children:"Pending Changes"}),jsx155(Stack38,{gap:"xs",children:changes.map(change=>jsxs102(Group58,{gap:"xs",children:[change.type==="addition"?jsx155(Badge3,{color:"green",variant:"light",leftSection:jsx155(IconPlus,{size:12}),children:"Add"}):jsx155(Badge3,{color:"red",variant:"light",leftSection:jsx155(IconMinus,{size:12}),children:"Remove"}),jsx155(ResourceBadge,{value:change.reference,link:!0})]},`${change.type}-${change.reference.reference}`))})]}),jsx155(Box24,{children:jsx155(Button20,{disabled:!hasChanges||saving,onClick:()=>setConfirmModalOpen(!0),children:"Save Changes"})})]}),jsx155(Modal16,{opened:confirmModalOpen,onClose:()=>setConfirmModalOpen(!1),title:"Confirm Account Changes",size:"md",keepMounted:!0,children:jsxs102(Stack38,{children:[jsxs102(Text44,{children:["The following changes will be applied to Patient"," ",jsxs102("strong",{children:[patient.name?.[0]?.given?.join(" ")," ",patient.name?.[0]?.family]}),":"]}),changes.filter(c=>c.type==="addition").length>0&&jsxs102(Box24,{children:[jsx155(Text44,{fw:600,c:"green",children:"Adding:"}),jsx155(Stack38,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="addition").map(c=>jsxs102(Group58,{gap:"xs",children:[jsx155(IconPlus,{size:14,color:"green"}),jsx155(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),changes.filter(c=>c.type==="removal").length>0&&jsxs102(Box24,{children:[jsx155(Text44,{fw:600,c:"red",children:"Removing:"}),jsx155(Stack38,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="removal").map(c=>jsxs102(Group58,{gap:"xs",children:[jsx155(IconMinus,{size:14,color:"red"}),jsx155(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),jsx155(Checkbox8,{label:"Propagate changes to all resources in this patient's compartment",checked:propagate,onChange:event=>setPropagate(event.currentTarget.checked)}),jsxs102(Group58,{justify:"right",mt:"md",children:[jsx155(Button20,{variant:"default",onClick:()=>setConfirmModalOpen(!1),children:"Cancel"}),jsx155(Button20,{onClick:handleSave,loading:saving,children:"Confirm"})]})]})})]}):jsx155(Alert5,{color:"blue",title:"Admin access required",children:"You need project admin access to manage patient account assignments."})}function AccountTypeBadge({reference}){let type=reference.reference?.split("/")[0]??"Unknown";return jsx155(Badge3,{variant:"light",color:{Organization:"blue",HealthcareService:"teal",CareTeam:"violet"}[type]??"gray",size:"sm",children:type})}import{Checkbox as Checkbox9,Group as Group59,SegmentedControl as SegmentedControl2,Stack as Stack39}from"@mantine/core";import{notifications as notifications2}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString13,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum46}from"@medplum/react-hooks";import{useCallback as useCallback28,useState as useState86}from"react";import{jsx as jsx156,jsxs as jsxs103}from"react/jsx-runtime";var NOTIFICATION_ID2="patient-export",NOTIFICATION_TITLE2="Patient Export",formats={everything:{operation:"$everything",extension:"json",contentType:ContentType3.FHIR_JSON},summary:{operation:"$summary",extension:"json",contentType:ContentType3.FHIR_JSON},ccda:{operation:"$ccda-export",extension:"xml",contentType:ContentType3.CDA_XML},ccdaReferral:{operation:"$ccda-export",type:"referral",extension:"xml",contentType:ContentType3.CDA_XML}};function PatientExportForm(props){let medplum=useMedplum46(),{patient}=props,[format,setFormat]=useState86("everything"),[inlineAttachments,setInlineAttachments]=useState86(!1),handleSubmit=useCallback28(async data2=>{let patientId=resolveId2(patient),{operation,type,contentType,extension}=formats[format],url=medplum.fhirUrl("Patient",patientId,operation),params={};format==="everything"&&inlineAttachments&&url.searchParams.set("_inlineAttachments","true"),type&&(params.type=type),data2.author&&(params.author={reference:data2.author}),data2.authoredOn&&(params.authoredOn=convertLocalToIso(data2.authoredOn)),data2.startDate&&(params.start=data2.startDate),data2.endDate&&(params.end=data2.endDate),notifications2.show({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,loading:!0,message:"Exporting...",autoClose:!1,withCloseButton:!1});try{let response=await medplum.post(url,params,void 0,{cache:"no-cache",headers:{Accept:contentType}}),fileName=`Patient-export-${patientId}-${new Date().toISOString().replaceAll(":","-")}.${extension}`;saveData(response,fileName,contentType),notifications2.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"green",message:"Done",icon:jsx156(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications2.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"red",message:normalizeErrorString13(err),icon:jsx156(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient,format,inlineAttachments]);return jsx156(Form,{onSubmit:handleSubmit,children:jsxs103(Stack39,{children:[jsx156(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx156(SegmentedControl2,{name:"format",value:format,onChange:setFormat,data:[{label:"FHIR Everything",value:"everything"},{label:"Patient Summary",value:"summary"},{label:"C-CDA",value:"ccda"},{label:"C-CDA Referral",value:"ccdaReferral"}],fullWidth:!0})}),jsx156(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx156(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx156(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx156(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx156(FormSection,{title:"Start Date",description:"The start date of care. If no start date is provided, all records prior to the end date are in scope.",children:jsx156(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx156(FormSection,{title:"End Date",description:"The end date of care. If no end date is provided, all records subsequent to the start date are in scope.",children:jsx156(DateTimeInput,{name:"endDate",placeholder:"End date"})}),format==="everything"&&jsx156(FormSection,{title:"Inline Attachments",description:"Embed DocumentReference file attachments as base64-encoded data instead of storage URLs.",children:jsx156(Stack39,{gap:"xs",children:jsx156(Checkbox9,{label:"Inline attachments",checked:inlineAttachments,onChange:e=>setInlineAttachments(e.currentTarget.checked)})})}),jsx156(Group59,{justify:"right",children:jsx156(SubmitButton,{children:"Request Export"})})]})})}function saveData(data2,fileName,contentType){let content=typeof data2=="string"?data2:JSON.stringify(data2,null,2),blob=new Blob([content],{type:contentType}),url=window.URL.createObjectURL(blob),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=url,a.download=fileName,a.click(),window.URL.revokeObjectURL(url)}import{calculateAgeString as calculateAgeString2}from"@medplum/core";import{useResource as useResource13}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment54,jsx as jsx157,jsxs as jsxs104}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource13(props.patient);return patient?jsxs104(InfoBar,{children:[jsx157(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs104(InfoBar.Entry,{children:[jsx157(InfoBar.Key,{children:"Name"}),jsx157(InfoBar.Value,{children:jsx157(MedplumLink,{to:patient,fw:500,children:patient.name?jsx157(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs104(Fragment54,{children:[jsxs104(InfoBar.Entry,{children:[jsx157(InfoBar.Key,{children:"DoB"}),jsx157(InfoBar.Value,{children:patient.birthDate})]}),jsxs104(InfoBar.Entry,{children:[jsx157(InfoBar.Key,{children:"Age"}),jsx157(InfoBar.Value,{children:calculateAgeString2(patient.birthDate)})]})]}),patient.gender&&jsxs104(InfoBar.Entry,{children:[jsx157(InfoBar.Key,{children:"Gender"}),jsx157(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs104(InfoBar.Entry,{children:[jsx157(InfoBar.Key,{children:"State"}),jsx157(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs104(InfoBar.Entry,{children:[jsx157(InfoBar.Key,{children:identifier?.system}),jsx157(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Box as Box25,Button as Button21,Checkbox as Checkbox10,Flex as Flex22,Group as Group60,Loader as Loader9,Radio as Radio5,Stack as Stack40,Text as Text45,TextInput as TextInput28}from"@mantine/core";import{showNotification as showNotification10}from"@mantine/notifications";import{formatAddress as formatAddress4,normalizeErrorString as normalizeErrorString14}from"@medplum/core";import{useCallback as useCallback29,useState as useState87}from"react";var PharmacyDialog_default={pharmacyItem:"PharmacyDialog_pharmacyItem",pharmacyItemSelected:"PharmacyDialog_pharmacyItemSelected"};import{jsx as jsx158,jsxs as jsxs105}from"react/jsx-runtime";function getPharmacyKey(pharmacy,index){return pharmacy.identifier?.[0]?.value||`pharmacy-${index}`}function SearchForm({onSearch,searching}){return jsx158("form",{onSubmit:e=>{e.preventDefault();let formData=new FormData(e.currentTarget);onSearch(formData)},children:jsxs105(Stack40,{gap:"md",children:[jsx158(TextInput28,{name:"name",label:"Pharmacy Name",placeholder:"Enter pharmacy name (min 3 chars)"}),jsxs105(Group60,{grow:!0,children:[jsx158(TextInput28,{name:"city",label:"City",placeholder:"City (min 3 chars)"}),jsx158(TextInput28,{name:"state",label:"State",placeholder:"State (min 3 chars)"})]}),jsxs105(Group60,{grow:!0,children:[jsx158(TextInput28,{name:"zip",label:"Zip Code",placeholder:"Zip code (min 3 chars)"}),jsx158(TextInput28,{name:"phoneOrFax",label:"Phone or Fax",placeholder:"Phone or fax number"})]}),jsx158(TextInput28,{name:"address",label:"Address",placeholder:"Street address (min 3 chars)"}),jsx158(TextInput28,{name:"ncpdpID",label:"NCPDP ID",placeholder:"National Council for Prescription Drug Programs ID"}),jsx158(Button21,{type:"submit",loading:searching,children:"Search"})]})})}function PharmacyItem({pharmacy,pharmacyKey,isSelected,onSelect}){return jsx158(Box25,{p:"sm",className:isSelected?PharmacyDialog_default.pharmacyItemSelected:PharmacyDialog_default.pharmacyItem,onClick:onSelect,children:jsx158(Radio5,{value:pharmacyKey,label:jsxs105(Box25,{children:[jsx158(Text45,{fw:500,size:"sm",children:pharmacy.name}),pharmacy.address?.[0]&&jsx158(Text45,{size:"xs",c:"dimmed",children:formatAddress4(pharmacy.address[0])}),pharmacy.telecom?.find(t=>t.system==="phone")&&jsxs105(Text45,{size:"xs",c:"dimmed",children:["Phone: ",pharmacy.telecom.find(t=>t.system==="phone")?.value]}),pharmacy.telecom?.find(t=>t.system==="fax")&&jsxs105(Text45,{size:"xs",c:"dimmed",children:["Fax: ",pharmacy.telecom.find(t=>t.system==="fax")?.value]})]})})},pharmacyKey)}function SearchResults({searchResults,selectedPharmacy,onSelectPharmacy,setAsPrimary,onSetAsPrimary,onAddFavorite,onClose,adding}){return jsxs105(Box25,{mt:"xl",children:[jsxs105(Text45,{fw:600,mb:"md",children:["Search Results (",searchResults.length,")"]}),jsx158(Radio5.Group,{value:selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy)):"",onChange:value=>{let selected=searchResults.find((p,i)=>getPharmacyKey(p,i)===value);selected&&onSelectPharmacy(selected)},children:jsx158(Stack40,{gap:"sm",children:searchResults.map((pharmacy,index)=>{let pharmacyKey=getPharmacyKey(pharmacy,index),isSelected=selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy))===pharmacyKey:!1;return jsx158(PharmacyItem,{pharmacy,pharmacyKey,isSelected,onSelect:()=>onSelectPharmacy(pharmacy)},pharmacyKey)})})}),jsxs105(Flex22,{mt:"lg",gap:"md",align:"center",justify:"space-between",children:[jsx158(Checkbox10,{label:"Set as primary pharmacy",checked:setAsPrimary,onChange:e=>onSetAsPrimary(e.currentTarget.checked)}),jsxs105(Group60,{children:[jsx158(Button21,{variant:"subtle",onClick:onClose,children:"Cancel"}),jsx158(Button21,{onClick:onAddFavorite,disabled:!selectedPharmacy,loading:adding,children:"Add to Favorites"})]})]})]})}function PharmacyDialog(props){let{patient,onSubmit,onClose,onSearch,onAddToFavorites}=props,[searchResults,setSearchResults]=useState87([]),[searching,setSearching]=useState87(!1),[selectedPharmacy,setSelectedPharmacy]=useState87(),[setAsPrimary,setSetAsPrimary]=useState87(!1),[adding,setAdding]=useState87(!1),handleSearch=useCallback29(async formData=>{let searchParams={name:formData.get("name")||void 0,city:formData.get("city")||void 0,state:formData.get("state")||void 0,zip:formData.get("zip")||void 0,address:formData.get("address")||void 0,phoneOrFax:formData.get("phoneOrFax")||void 0,ncpdpID:formData.get("ncpdpID")||void 0},cleanParams=Object.fromEntries(Object.entries(searchParams).filter(([_,v])=>typeof v=="string"&&v.trim()!==""));if(Object.keys(cleanParams).length===0){showNotification10({color:"yellow",title:"Search Required",message:"Please enter at least one search criterion"});return}setSearching(!0),setSelectedPharmacy(void 0);try{let results=await onSearch(cleanParams);setSearchResults(results),results.length===0&&showNotification10({color:"blue",title:"No Results",message:"No pharmacies found matching your search criteria"})}catch(error){showNotification10({color:"red",title:"Search Error",message:normalizeErrorString14(error)})}finally{setSearching(!1)}},[onSearch]),handleAddFavorite=useCallback29(async()=>{if(!(!selectedPharmacy||!patient.id)){setAdding(!0);try{let response=await onAddToFavorites({patientId:patient.id,pharmacy:selectedPharmacy,setAsPrimary});response.success?(showNotification10({color:"green",title:"Success",message:response.message}),onSubmit(response.organization||selectedPharmacy)):showNotification10({color:"red",title:"Error",message:response.message})}catch(error){showNotification10({color:"red",title:"Error",message:normalizeErrorString14(error)})}finally{setAdding(!1)}}},[selectedPharmacy,patient.id,setAsPrimary,onAddToFavorites,onSubmit]);return jsxs105(Box25,{children:[jsx158(SearchForm,{onSearch:formData=>handleSearch(formData).catch(console.error),searching}),searching&&jsx158(Flex22,{justify:"center",mt:"xl",children:jsx158(Loader9,{})}),searchResults.length>0&&!searching&&jsx158(SearchResults,{searchResults,selectedPharmacy,onSelectPharmacy:setSelectedPharmacy,setAsPrimary,onSetAsPrimary:setSetAsPrimary,onAddFavorite:handleAddFavorite,onClose,adding})]})}import{Box as Box26,Flex as Flex23,Group as Group61,Text as Text46}from"@mantine/core";import{getDisplayString as coreGetDisplayString}from"@medplum/core";import{jsx as jsx159,jsxs as jsxs106}from"react/jsx-runtime";function summaryResourceListSection(options){return{key:options.key,title:options.title,searches:[{key:options.key,resourceType:options.search.resourceType,patientParam:options.search.patientParam,query:options.search.query}],component:context=>jsx159(ResourceListDisplay,{options,resources:context.results[options.key]??[],context})}}function ResourceListDisplay(props){let{options,context}=props,resources=[...props.resources];return options.filter&&(resources=resources.filter(options.filter)),options.sort&&resources.sort(options.sort),jsx159(CollapsibleSection,{title:options.title,onAdd:options.onAdd,children:resources.length>0?jsx159(Flex23,{direction:"column",gap:8,children:resources.map(resource=>{let displayString=options.getDisplayString?options.getDisplayString(resource):coreGetDisplayString(resource),status=options.getStatus?.(resource),secondaryText=options.getSecondaryText?.(resource);return jsx159(SummaryItem,{onClick:()=>context.onClickResource?.(resource),children:jsxs106(Box26,{children:[jsx159(Text46,{fw:500,className:SummaryItem_default.itemText,children:displayString}),(status||secondaryText)&&jsxs106(Group61,{mt:2,gap:4,children:[status&&jsx159(StatusBadge,{color:status.color,variant:"light",status:status.label}),secondaryText&&jsx159(Text46,{size:"xs",fw:500,c:"dimmed",children:secondaryText})]})]})},resource.id)})}):jsx159(Text46,{children:"(none)"})})}import{createReference as createReference16}from"@medplum/core";import{useCallback as useCallback30}from"react";import{jsx as jsx160}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback30((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),medplum.search("ClinicalImpression",{subject:ref,_count}),medplum.search("Communication",{subject:ref,_count}),medplum.search("Device",{patient:ref,_count}),medplum.search("DeviceRequest",{patient:ref,_count}),medplum.search("DiagnosticReport",{subject:ref,_count}),medplum.search("Media",{subject:ref,_count}),medplum.search("ServiceRequest",{subject:ref,_count}),medplum.search("Task",{subject:ref,_count})])},[]);return jsx160(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference16(resource),sender:createReference16(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference16(resource),operator:createReference16(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor12,Box as Box27,Button as Button22,CloseButton as CloseButton2,Flex as Flex24,Group as Group62,Loader as Loader10,NativeSelect as NativeSelect12,Paper as Paper6,Stack as Stack41,Text as Text47,TextInput as TextInput29}from"@mantine/core";import{getReferenceString as getReferenceString12}from"@medplum/core";import{useMedplum as useMedplum47,useResource as useResource14}from"@medplum/react-hooks";import{useEffect as useEffect34,useState as useState88}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx161,jsxs as jsxs107}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum47(),defaultValue2=useResource14(props.value),[schemaLoaded,setSchemaLoaded]=useState88(!1),[selectedKey,setSelectedKey]=useState88(),[hoverKey,setHoverKey]=useState88(),[value,setValue]=useState88();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}if(useEffect34(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect34(()=>(setValue(ensurePlanDefinitionKeys(defaultValue2??{resourceType:"PlanDefinition",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]),!schemaLoaded||!value)return null;function changeProperty(property,newValue){setValue(prevValue=>({...prevValue,[property]:newValue}))}return jsx161("div",{children:jsxs107(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx161(TextInput29,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx161(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx161(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){function changeAction(changedAction){props.onChange(props.actions.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...props.actions,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(props.actions.filter(i=>i!==removedAction))}return jsxs107(Stack41,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx161(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx161("div",{children:jsx161(Button22,{variant:"outline",onClick:e=>{killEvent(e),addAction({id:generateId()})},children:"Add action"})})]})}function ActionBuilder(props){let{action}=props;function onClick(e){e.stopPropagation(),props.setSelectedKey(props.action.id)}function onHover(e){killEvent(e),props.setHoverKey(props.action.id)}return jsx161("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx161(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState88(),medplum=useMedplum47(),[loading,setLoading]=useState88(!1),[resource,setResource]=useState88(),editing=props.selectedKey===props.action.id,hovering=props.hoverKey===props.action.id;function changeProperty(property,value){props.onChange({...action,[property]:value})}let className=clsx_default(PlanDefinitionBuilder_default.section,{[PlanDefinitionBuilder_default.hovering]:hovering&&!editing});return useEffect34(()=>{(async()=>{if(!action.definitionCanonical)return;setLoading(!0);let resource2=await medplum.readCanonical(["Questionnaire","ActivityDefinition"],action.definitionCanonical);setActionType(getInitialActionType(resource2)),setResource(resource2),setLoading(!1)})().catch(console.error)},[action.definitionCanonical,medplum]),loading?jsx161(Loader10,{}):jsxs107(Paper6,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs107(Flex24,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx161(TextInput29,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx161(CloseButton2,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs107(Stack41,{gap:"xl",p:"md",children:[jsx161(Box27,{children:jsx161(TextInput29,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx161(Box27,{children:jsx161(NativeSelect12,{label:"Type of Action",value:actionType,onChange:e=>{let value=e.currentTarget.value==="standard"?void 0:e.currentTarget.value;setActionType(value),props.onChange({...props.action,definitionCanonical:value==="standard"?void 0:props.action.definitionCanonical})},data:[{value:"standard",label:"Standard task"},{value:"questionnaire",label:"Task with Questionnaire"},{value:"activitydefinition",label:"Task with Activity Definition"}]})}),actionType==="questionnaire"&&jsxs107(Stack41,{gap:0,children:[jsxs107(Group62,{gap:0,mb:"xs",children:[jsx161(Text47,{fw:600,children:"Select questionnaire"}),jsx161(Text47,{c:"red",children:"*"})]}),jsxs107(Text47,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx161(Anchor12,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx161(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&jsxs107(Stack41,{gap:0,children:[jsxs107(Group62,{gap:0,mb:"xs",children:[jsx161(Text47,{fw:600,children:"Select activity definition"}),jsx161(Text47,{c:"red",children:"*"})]}),jsxs107(Text47,{size:"sm",c:"dimmed",mb:"sm",children:["ActivityDefinition.kind resource to be shown in the task in Encounter view. You can create new one from"," ",jsx161(Anchor12,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx161(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return jsx161(ResourceInput,{name:id,placeholder:props.placeholder,resourceType:props.resourceType,defaultValue:resource,onChange:newValue=>{newValue?props.onChange({...props.action,definitionCanonical:"url"in newValue?newValue.url:void 0,definitionUri:"url"in newValue?void 0:getReferenceString12(newValue)}):props.onChange({...props.action,definitionCanonical:void 0})}})}function getInitialActionType(resource){return resource===void 0?"standard":resource.resourceType.toLowerCase()}var nextId=1;function generateId(existing){if(existing){if(existing.startsWith("id-")){let existingNum=Number.parseInt(existing.substring(3),10);Number.isNaN(existingNum)||(nextId=Math.max(nextId,existingNum+1))}return existing}return"id-"+nextId++}function ensurePlanDefinitionKeys(planDefinition){return{...planDefinition,action:ensurePlanDefinitionActionKeys(planDefinition.action)}}function ensurePlanDefinitionActionKeys(actions){if(actions)return actions.map(action=>({...action,id:generateId(action.id),action:ensurePlanDefinitionActionKeys(action.action)}))}import{Anchor as Anchor13,Box as Box28,Group as Group63,NativeSelect as NativeSelect13,Space,Textarea as Textarea5,TextInput as TextInput30,Title as Title14}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{getQuestionnaireItemReferenceTargetTypes as getQuestionnaireItemReferenceTargetTypes2,isChoiceQuestion,QUESTIONNAIRE_ITEM_CONTROL_URL as QUESTIONNAIRE_ITEM_CONTROL_URL2,QuestionnaireItemType as QuestionnaireItemType4,setQuestionnaireItemReferenceTargetTypes,useMedplum as useMedplum48,useResource as useResource15}from"@medplum/react-hooks";import{useEffect as useEffect35,useLayoutEffect as useLayoutEffect7,useRef as useRef18,useState as useState89}from"react";var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};import{Fragment as Fragment55,jsx as jsx162,jsxs as jsxs108}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum48(),defaultValue2=useResource15(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState89(!1),[value,setValue]=useState89(),[selectedKey,setSelectedKey]=useState89(),[hoverKey,setHoverKey]=useState89();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect35(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect35(()=>(setValue(ensureQuestionnaireKeys(defaultValue2??{resourceType:"Questionnaire",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]);let handleChange=(questionnaire2,disableSubmit)=>{setValue(questionnaire2),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire2)};return!schemaLoaded||!value?null:jsx162("div",{children:jsxs108(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx162(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx162(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource4=isResourceType(props.item),isContainer=isResource4||item.type===QuestionnaireItemType4.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef18(props.item);useLayoutEffect7(()=>{itemRef.current=props.item});function onClick(e){killEvent(e),props.setSelectedKey(props.item.id)}function onHover(e){killEvent(e),props.setHoverKey(props.item.id)}function changeItem(changedItem){let curr=itemRef.current;props.onChange({...curr,item:curr.item?.map(i=>i.id===changedItem.id?changedItem:i)})}function addItem(addedItem,disableSubmit){props.onChange({...props.item,item:[...props.item.item??[],addedItem]},disableSubmit)}function removeItem(removedItem){props.onChange({...props.item,item:props.item.item?.filter(i=>i!==removedItem)})}function changeProperty(property,value){props.onChange({...itemRef.current,[property]:value})}function updateItem(updatedItem){props.onChange({...props.item,...updatedItem})}function toggleRepeatable(item2){props.onChange({...props.item,item:props.item.item?.map(i=>i===item2?{...i,repeats:!i.repeats}:i)})}function moveItem(itemIndex,delta){let updatedItems=reorderItems(props.item.item,itemIndex,delta);props.onChange({...props.item,item:updatedItems})}let className=clsx_default(QuestionnaireBuilder_default.section,{[QuestionnaireBuilder_default.editing]:editing,[QuestionnaireBuilder_default.hovering]:hovering&&!editing});return jsxs108("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx162("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs108(Fragment55,{children:[isResource4&&jsx162(TextInput30,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource4&&jsx162(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx162(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx162(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs108(Fragment55,{children:[resource.title&&jsx162(Title14,{children:resource.title}),item.text&&jsx162("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx162(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx162("div",{children:jsx162(ItemBuilder,{item:item2,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,isFirst:i===0,isLast:i===(props.item.item??[]).length-1,setHoverKey:props.setHoverKey,onChange:changeItem,onRemove:()=>removeItem(item2),onRepeatable:toggleRepeatable,onMoveUp:()=>moveItem(i,-1),onMoveDown:()=>moveItem(i,1)})},item2.id)),!isContainer&&jsx162("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs108(Fragment55,{children:[jsx162(TextInput30,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx162(NativeSelect13,{size:"xs",className:QuestionnaireBuilder_default.typeSelect,defaultValue:item.type,onChange:e=>changeProperty("type",e.currentTarget.value),data:[{value:"display",label:"Display"},{value:"boolean",label:"Boolean"},{value:"decimal",label:"Decimal"},{value:"integer",label:"Integer"},{value:"date",label:"Date"},{value:"dateTime",label:"Date/Time"},{value:"time",label:"Time"},{value:"string",label:"String"},{value:"text",label:"Text"},{value:"url",label:"URL"},{value:"choice",label:"Choice"},{value:"open-choice",label:"Open Choice"},{value:"attachment",label:"Attachment"},{value:"reference",label:"Reference"},{value:"quantity",label:"Quantity"}]})]}):jsx162("div",{children:linkId})}),!isResource4&&jsx162(Box28,{className:QuestionnaireBuilder_default.movementActions,children:jsxs108(Box28,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx162(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx162(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx162(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx162(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs108("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs108(Fragment55,{children:[jsx162(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx162(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource4&&jsx162(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource4&&jsxs108(Fragment55,{children:[jsx162(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx162(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),props.onRemove&&props.onRemove()},children:"Remove"})]})]})]})}function AnswerBuilder(props){let property=getElementDefinition3("QuestionnaireItemAnswerOption","value[x]"),options=props.item.answerOption??[];return jsxs108("div",{children:[props.item.answerValueSet!==void 0?jsx162(TextInput30,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx162(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs108(Box28,{display:"flex",children:[jsx162(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),jsx162(Space,{w:"lg"}),jsx162(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx162("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs108("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx162("div",{children:jsx162(ResourcePropertyInput,{name:"value[x]",path:"Questionnaire.answerOption.value[x]",property:props.property,defaultPropertyType:propertyType,defaultValue:propertyValue,onChange:(newValue,propName)=>{let newOptions=[...props.options],index=newOptions.findIndex(o=>o.id===option.id);newOptions[index]={id:option.id,[propName]:newValue},props.onChange({...props.item,answerOption:newOptions})},outcome:void 0},option.id)}),jsx162("div",{children:jsx162(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:props.options.filter(o=>o.id!==option.id)})},children:"Remove"})})]},option.id)})})}function ReferenceProfiles(props){let targetTypes=getQuestionnaireItemReferenceTargetTypes2(props.item)??[];return jsxs108(Fragment55,{children:[targetTypes.map((targetType,index)=>jsxs108(Group63,{children:[jsx162(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx162(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx162(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId2=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId2(){return"id-"+nextId2++}function ensureQuestionnaireKeys(questionnaire2){return{...questionnaire2,id:questionnaire2.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire2.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId2=Math.max(nextId2,Number.parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,Number.parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId2(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId2()}))}function createPage(){return{id:generateId2(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:QUESTIONNAIRE_ITEM_CONTROL_URL2,valueCodeableConcept:{coding:[{system:"http://hl7.org/fhir/questionnaire-item-control",code:"page"}]}}]}}function reorderItems(items,itemIndex,delta){let currentItems=items??[],newIndex=itemIndex+delta;if(newIndex<0||newIndex>=currentItems.length)return currentItems;let updatedItems=[...currentItems];return[updatedItems[itemIndex],updatedItems[newIndex]]=[updatedItems[newIndex],updatedItems[itemIndex]],updatedItems}import{ActionIcon as ActionIcon19,Box as Box29,Button as Button23,Collapse as Collapse2,Divider as Divider12,Flex as Flex25,Loader as Loader11,Stack as Stack42,Text as Text48}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback4}from"@mantine/hooks";import{showNotification as showNotification11}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString15}from"@medplum/core";import{useMedplum as useMedplum49,useWhisper}from"@medplum/react-hooks";import{useCallback as useCallback31,useEffect as useEffect36,useRef as useRef19,useState as useState90}from"react";var AIRealTimeQuestionnaireForm_default={banner:"AIRealTimeQuestionnaireForm_banner",headerRow:"AIRealTimeQuestionnaireForm_headerRow",statusRow:"AIRealTimeQuestionnaireForm_statusRow",iconWrapper:"AIRealTimeQuestionnaireForm_iconWrapper",recordingPulse:"AIRealTimeQuestionnaireForm_recordingPulse",statusLabel:"AIRealTimeQuestionnaireForm_statusLabel",statusLabelPrimary:"AIRealTimeQuestionnaireForm_statusLabelPrimary",statusLabelFinishing:"AIRealTimeQuestionnaireForm_statusLabelFinishing",dictationButton:"AIRealTimeQuestionnaireForm_dictationButton",dictationButtonLoading:"AIRealTimeQuestionnaireForm_dictationButtonLoading",instructions:"AIRealTimeQuestionnaireForm_instructions",panelGrid:"AIRealTimeQuestionnaireForm_panelGrid",panelColumn:"AIRealTimeQuestionnaireForm_panelColumn",transcriptWrapper:"AIRealTimeQuestionnaireForm_transcriptWrapper",transcriptArea:"AIRealTimeQuestionnaireForm_transcriptArea",transcriptText:"AIRealTimeQuestionnaireForm_transcriptText"};import{Fragment as Fragment56,jsx as jsx163,jsxs as jsxs109}from"react/jsx-runtime";var SILENCE_DEBOUNCE_MS=3e3,DEFAULT_IDLE_LABEL="Start Dictation to complete this form with your voice",TRANSCRIPT_PLACEHOLDER="Start speaking to see your transcribed words...",VOICE_TRANSCRIPT_EXTENSION_URL="https://medplum.com/ai-voice-transcript",botIdentifier={system:"https://www.medplum.com/bots",value:"ai-realtime-questionnaire"};function getStoredTranscript(response){return response?.extension?.find(e=>e.url===VOICE_TRANSCRIPT_EXTENSION_URL)?.valueString??""}var DEFAULT_INSTRUCTIONS=jsxs109(Stack42,{gap:"xs",children:[jsx163(Text48,{children:"To fill out the form, just speak naturally and the dictation tool will map your spoken answers to the form fields."}),jsx163(Text48,{children:"Pause briefly between thoughts to start processing."})]});function AIRealTimeQuestionnaireForm(props){let{aiModel,onTranscript,voiceInstructions,...questionnaireFormProps}=props,medplum=useMedplum49(),[questionnaireResponse,setQuestionnaireResponse]=useState90(props.questionnaireResponse),[isProcessing,setIsProcessing]=useState90(!1),[transcript,setTranscript]=useState90(""),[displayTranscript,setDisplayTranscript]=useState90(()=>getStoredTranscript(props.questionnaireResponse)),[expanded,setExpanded]=useState90(!1),[isStopping,setIsStopping]=useState90(!1),[responseVersion,setResponseVersion]=useState90(0),questionnaireRef=useRef19(null),inputRef=useRef19(""),inFlightRef=useRef19(!1),responseRef=useRef19(questionnaireResponse),flushTranscriptRef=useRef19(async()=>{}),transcriptViewportRef=useRef19(null),fullTranscriptRef=useRef19(getStoredTranscript(questionnaireResponse));useEffect36(()=>{responseRef.current=questionnaireResponse},[questionnaireResponse]);let[botAvailability,setBotAvailability]=useState90("loading");useEffect36(()=>{let cancelled=!1;async function checkBotAvailability(){try{let bot=await medplum.searchOne("Bot",{identifier:`${botIdentifier.system??""}|${botIdentifier.value??""}`});cancelled||setBotAvailability(bot?"available":"unavailable")}catch(err){console.error("Error checking bot availability:",err),cancelled||setBotAvailability("unavailable")}}return checkBotAvailability().catch(console.error),()=>{cancelled=!0}},[medplum]);let isProjectVoiceEnabled=medplum.getProject()?.features?.includes("ai-realtime")??!1,isVoiceEnabled=isProjectVoiceEnabled&&botAvailability==="available",idleLabel=DEFAULT_IDLE_LABEL;isProjectVoiceEnabled?botAvailability==="unavailable"&&(idleLabel=jsxs109(Fragment56,{children:["Voice dictation unavailable: bot '",botIdentifier.value??"","' is not deployed",jsx163("br",{}),"Please contact support"]})):idleLabel=jsxs109(Fragment56,{children:["Voice dictation is not enabled for this project",jsx163("br",{}),"Please contact support"]});let{start,stop,status}=useWhisper({model:"gpt-4o-transcribe",onTranscript:text=>{let trimmed=text.trim();if(!trimmed)return;let previous=inputRef.current.trim(),next=previous?`${previous} ${trimmed}`:trimmed;inputRef.current=next,setTranscript(next),onTranscript?.(next,trimmed)}}),statusRef=useRef19(status);useEffect36(()=>{statusRef.current=status},[status]);let processTranscript=useCallback31(async transcript2=>{if(!(!questionnaireRef.current||!transcript2.trim())){setIsProcessing(!0);try{let existingResponse=responseRef.current,parameter=[{name:"questionnaire",valueString:JSON.stringify(questionnaireRef.current)},{name:"transcript",valueString:transcript2}];existingResponse?.item&&existingResponse.item.length>0&¶meter.push({name:"questionnaireResponse",valueString:JSON.stringify(existingResponse)}),aiModel&¶meter.push({name:"model",valueString:aiModel});let responseParam=(await medplum.executeBot(botIdentifier,{resourceType:"Parameters",parameter})).parameter?.find(p=>p.name==="questionnaireResponse");if(responseParam?.valueString)try{let aiQuestionnaireResponse=JSON.parse(responseParam.valueString),preservedExtensions=(aiQuestionnaireResponse.extension??[]).filter(e=>e.url!==VOICE_TRANSCRIPT_EXTENSION_URL);aiQuestionnaireResponse.extension=[...preservedExtensions,{url:VOICE_TRANSCRIPT_EXTENSION_URL,valueString:fullTranscriptRef.current}],responseRef.current=aiQuestionnaireResponse,setQuestionnaireResponse(aiQuestionnaireResponse),setResponseVersion(v=>v+1)}catch(parseError){console.error("Failed to parse bot response as QuestionnaireResponse:",parseError),showNotification11({color:"red",message:`Failed to parse bot response as QuestionnaireResponse: ${normalizeErrorString15(parseError)}`})}}catch(error){console.error("Error processing transcript with AI:",error)}finally{setIsProcessing(!1)}}},[medplum,aiModel]);useEffect36(()=>{flushTranscriptRef.current=async()=>{if(inFlightRef.current)return;let pending=inputRef.current.trim();if(pending){inputRef.current="",setTranscript(""),onTranscript?.("",""),fullTranscriptRef.current=fullTranscriptRef.current?`${fullTranscriptRef.current} ${pending}`:pending,setDisplayTranscript(fullTranscriptRef.current),inFlightRef.current=!0;try{await processTranscript(pending)}finally{inFlightRef.current=!1}inputRef.current.trim()&&statusRef.current!=="speech_started"&&flushTranscriptRef.current().catch(err=>console.error("Error draining transcript:",err))}}},[processTranscript,onTranscript]);let debouncedFlush=useDebouncedCallback4(()=>{statusRef.current!=="speech_started"&&flushTranscriptRef.current().catch(err=>showNotification11({color:"red",message:`Error flushing transcript: ${normalizeErrorString15(err)}`}))},SILENCE_DEBOUNCE_MS);useEffect36(()=>{status==="speech_stopped"&&debouncedFlush()},[status,debouncedFlush]),useEffect36(()=>{let viewport=transcriptViewportRef.current;viewport&&viewport.scrollTo({top:viewport.scrollHeight,behavior:"smooth"})},[transcript,displayTranscript]);let isConnecting=status==="requesting_microphone"||status==="connecting"||status==="connected",isRecording=status==="listening"||status==="speech_started"||status==="speech_stopped",handleStartDictation=useCallback31(()=>{setExpanded(!0),start().catch(err=>console.error("Error starting voice input:",err))},[start]),handleStopDictation=useCallback31(()=>{setIsStopping(!0),stop(),debouncedFlush.cancel(),flushTranscriptRef.current().catch(err=>showNotification11({color:"red",message:`Error flushing transcript: ${normalizeErrorString15(err)}`}))},[stop,debouncedFlush]),handleToggleExpanded=useCallback31(()=>{setExpanded(prev=>!prev)},[]),handleClearTranscript=useCallback31(()=>{inputRef.current="",fullTranscriptRef.current="",setTranscript(""),setDisplayTranscript(""),onTranscript?.("","");let existing=responseRef.current;if(existing?.extension?.some(e=>e.url===VOICE_TRANSCRIPT_EXTENSION_URL)){let next={...existing,extension:existing.extension.filter(e=>e.url!==VOICE_TRANSCRIPT_EXTENSION_URL)};responseRef.current=next,setQuestionnaireResponse(next)}},[onTranscript]);useEffect36(()=>{isStopping&&!isConnecting&&!isRecording&&setIsStopping(!1)},[isStopping,isProcessing,isConnecting,isRecording]),useEffect36(()=>{typeof props.questionnaire=="object"&&"resourceType"in props.questionnaire&&(questionnaireRef.current=props.questionnaire)},[props.questionnaire]);let isActive=isRecording&&!isStopping,isButtonLoading=isConnecting||isStopping,showStopButton=isActive&&!isButtonLoading,showButtonLoader=isButtonLoading,dictationLabel="Start Dictation";isStopping?dictationLabel="Stopping\u2026":isConnecting?dictationLabel="Starting\u2026":showStopButton&&(dictationLabel="Stop Dictation");let isFinishing=(isProcessing||isStopping)&&!isRecording&&!isConnecting,activeStatusLabel;isProcessing||isStopping?activeStatusLabel="Processing\u2026":isRecording&&(activeStatusLabel="Listening\u2026");let statusState="idle",statusIcon=jsx163(IconMicrophone,{size:20});isFinishing?(statusState="finishing",statusIcon=jsx163(Loader11,{size:16,color:"blue"})):activeStatusLabel&&(statusState="recording",statusIcon=jsx163(IconCircleFilled,{size:16}));let afterHeader=jsxs109(Box29,{className:AIRealTimeQuestionnaireForm_default.banner,children:[jsxs109(Flex25,{align:"center",justify:"space-between",gap:"sm",p:"md",className:AIRealTimeQuestionnaireForm_default.headerRow,children:[jsxs109("div",{className:AIRealTimeQuestionnaireForm_default.statusRow,"data-state":statusState,children:[jsx163("span",{className:AIRealTimeQuestionnaireForm_default.iconWrapper,"aria-hidden":!0,children:statusIcon}),jsx163("span",{className:AIRealTimeQuestionnaireForm_default.statusLabel,"aria-live":"polite",children:activeStatusLabel?jsx163("span",{className:isFinishing?AIRealTimeQuestionnaireForm_default.statusLabelFinishing:AIRealTimeQuestionnaireForm_default.statusLabelPrimary,children:activeStatusLabel}):idleLabel})]}),jsxs109(Flex25,{align:"center",gap:"xs",children:[jsx163(Button23,{className:clsx_default(AIRealTimeQuestionnaireForm_default.dictationButton,showButtonLoader&&AIRealTimeQuestionnaireForm_default.dictationButtonLoading),variant:showStopButton?"light":"filled",color:showStopButton?"red":"blue",size:"sm",leftSection:showButtonLoader?jsx163(Loader11,{size:14,color:"dimmed"}):void 0,disabled:showButtonLoader||!isVoiceEnabled&&!showStopButton,onClick:showStopButton?handleStopDictation:handleStartDictation,children:dictationLabel}),jsx163(ActionIcon19,{variant:"subtle",color:"gray",size:"lg",radius:"xl","aria-label":expanded?"Collapse transcript":"Expand transcript","aria-expanded":expanded,onClick:handleToggleExpanded,children:expanded?jsx163(IconChevronUp,{size:18}):jsx163(IconChevronDown,{size:18})})]})]}),jsxs109(Collapse2,{in:expanded,children:[jsx163(Box29,{px:"md",children:jsx163(Divider12,{color:"var(--mantine-color-gray-2)"})}),jsx163(Box29,{p:"md",children:jsxs109("div",{className:AIRealTimeQuestionnaireForm_default.panelGrid,children:[jsxs109("div",{className:AIRealTimeQuestionnaireForm_default.panelColumn,children:[jsx163(Text48,{size:"sm",fw:700,children:"How to Use"}),jsx163("div",{className:AIRealTimeQuestionnaireForm_default.instructions,children:voiceInstructions??DEFAULT_INSTRUCTIONS})]}),jsxs109("div",{className:AIRealTimeQuestionnaireForm_default.panelColumn,children:[jsxs109(Flex25,{align:"center",justify:"space-between",gap:"xs",children:[jsx163(Text48,{size:"sm",fw:700,children:"Transcript"}),jsx163(Button23,{variant:"subtle",color:"red",size:"compact-xs",leftSection:jsx163(IconTrash,{size:14}),disabled:!displayTranscript&&!transcript,onClick:handleClearTranscript,children:"Clear"})]}),jsx163("div",{className:AIRealTimeQuestionnaireForm_default.transcriptWrapper,children:jsx163("div",{ref:transcriptViewportRef,className:AIRealTimeQuestionnaireForm_default.transcriptArea,children:jsx163(Text48,{component:"pre",className:AIRealTimeQuestionnaireForm_default.transcriptText,children:(displayTranscript&&transcript?`${displayTranscript} ${transcript}`:displayTranscript||transcript)||TRANSCRIPT_PLACEHOLDER})})})]})]})})]})]});return jsx163(QuestionnaireForm,{...questionnaireFormProps,questionnaireResponse,afterHeader,onChange:response=>{setQuestionnaireResponse(response),props.onChange?.(response)}},responseVersion)}import{Stack as Stack44}from"@mantine/core";import{useResource as useResource16}from"@medplum/react-hooks";import{Stack as Stack43,Text as Text49}from"@mantine/core";import{formatDate as formatDate4}from"@medplum/core";import{useMemo as useMemo39}from"react";import{Fragment as Fragment57,jsx as jsx164,jsxs as jsxs110}from"react/jsx-runtime";function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=useMemo39(()=>answer&&answer.length>0?jsx164(Fragment57,{children:answer.map((ans,index)=>jsx164(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?jsx164(Fragment57,{children:nestedAnswers.map((nestedAnswer,index)=>jsx164(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):jsx164(Text49,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return jsxs110(Stack43,{gap:0,pb:"xs",children:[jsx164(Text49,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return jsx164(Text49,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return jsx164(Text49,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return jsx164(Text49,{children:value});case"valueQuantity":return jsx164(QuantityDisplay,{value});case"valueString":return jsx164(Text49,{children:value});case"valueCoding":return jsx164(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return jsx164(RangeDisplay,{value});case"valueDateTime":return jsx164(Text49,{children:formatDate4(value)});case"valueBoolean":return jsx164(Text49,{children:value?"True":"False"});case"valueReference":return jsx164(Text49,{children:value.display??value.reference});default:return jsx164(Text49,{children:value.toString()})}}import{jsx as jsx165}from"react/jsx-runtime";function QuestionnaireResponseDisplay(props){let questionnaireResponse=useResource16(props.questionnaireResponse);return jsx165(Stack44,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>jsx165(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}import{ActionIcon as ActionIcon20,Divider as Divider13,Group as Group64,NativeSelect as NativeSelect14,Stack as Stack45,Text as Text50,TextInput as TextInput31}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect37,useState as useState91}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx166,jsxs as jsxs111}from"react/jsx-runtime";var intervalFilters=["gender","age","gestationalAge","context","appliesTo","category"],defaultProps={definition:{resourceType:"ObservationDefinition",code:{text:""}},onSubmit:()=>{}};function ReferenceRangeEditor(props){props=Object.assign(defaultProps,props);let defaultDefinition=props.definition,[intervalGroups,setIntervalGroups]=useState91([]),[groupId,setGroupId]=useState91(1),[intervalId,setIntervalId]=useState91(1);return useEffect37(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs111(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx166(Stack45,{children:intervalGroups.map(intervalGroup=>jsx166(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx166(ActionIcon20,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx166(IconCirclePlus,{})}),jsx166(Group64,{justify:"flex-end",children:jsx166(SubmitButton,{children:"Save"})})]});function submitDefinition(){let qualifiedInterval=intervalGroups.flatMap(group=>group.intervals).filter(interval=>!isEmptyInterval(interval));props.onSubmit({...defaultDefinition,qualifiedInterval})}function addGroup(addedGroup){setIntervalGroups(currentGroups=>[...currentGroups,addedGroup])}function removeGroup(removedGroup){setIntervalGroups(currentGroups=>currentGroups.filter(group=>group.id!==removedGroup.id))}function changeInterval(groupId2,changedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2),index=currentGroup?.intervals.findIndex(interval=>interval.id===changedInterval.id);return index!==void 0&¤tGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g=>g.id===groupId2);if(currentGroupIndex!==-1){let currentGroup={...groups[currentGroupIndex]};addedInterval={...addedInterval,...currentGroup.filters},currentGroup.intervals=[...currentGroup.intervals,addedInterval],groups[currentGroupIndex]=currentGroup}return groups})}function removeInterval(groupId2,removedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx166(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs111(Stack45,{gap:"lg",children:[jsx166(Group64,{justify:"flex-end",children:jsx166(ActionIcon20,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx166(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx166(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx166(Divider13,{}),intervalGroup.intervals.map(interval=>jsxs111(Stack45,{gap:"xs",children:[jsxs111(Group64,{children:[jsx166(TextInput31,{"data-testid":`condition-${interval.id}`,defaultValue:interval.condition,label:"Condition: ",size:"sm",onChange:e=>{killEvent(e),props.onChange(intervalGroup.id,{...interval,condition:e.currentTarget.value.trim()})}},`condition-${interval.id}`),jsx166(ActionIcon20,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx166(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx166(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx166(ActionIcon20,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx166(IconCirclePlus,{})})]})})}function ReferenceRangeGroupFilters(props){let{intervalGroup,onChange}=props,age=intervalGroup.filters.age??{},ageWithDefaults={low:age.low?.unit?age.low:{...age.low,unit:"years",system:"http://unitsofmeasure.org"},high:age.high?.unit?age.high:{...age.high,unit:"years",system:"http://unitsofmeasure.org"}};return jsxs111(Stack45,{style:{maxWidth:"50%"},children:[jsx166(Group64,{children:jsx166(NativeSelect14,{data:["","male","female"],label:"Gender:",defaultValue:intervalGroup.filters.gender||"",onChange:e=>{for(let interval of intervalGroup.intervals){let newGender=e.currentTarget.value;newGender===""&&(newGender=void 0),onChange(intervalGroup.id,{...interval,gender:newGender})}}})}),jsxs111(Group64,{gap:"xs",children:[jsx166(Text50,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx166("div",{id:`div-age-${intervalGroup.id}`,children:jsx166(RangeInput,{path:"",name:`age-${intervalGroup.id}`,defaultValue:ageWithDefaults,onChange:ageRange=>{for(let interval of intervalGroup.intervals)onChange(intervalGroup.id,{...interval,age:ageRange})}},`age-${intervalGroup.id}`)})]}),jsx166(NativeSelect14,{data:["","pre-puberty","follicular","midcycle","luteal","postmenopausal"],label:"Endocrine:",defaultValue:intervalGroup.filters.context?.text||"",onChange:e=>{for(let interval of intervalGroup.intervals){let newEndocrine=e.currentTarget.value;newEndocrine===""?(newEndocrine=void 0,onChange(intervalGroup.id,{...interval,context:void 0})):onChange(intervalGroup.id,{...interval,context:{text:newEndocrine,coding:[{code:newEndocrine,system:"http://terminology.hl7.org/CodeSystem/referencerange-meaning"}]}})}}}),jsx166(NativeSelect14,{data:["","reference","critical","absolute"],label:"Category: ",defaultValue:intervalGroup.filters.category,onChange:e=>{for(let interval of intervalGroup.intervals){let newCategory=e.currentTarget.value;newCategory===""?onChange(intervalGroup.id,{...interval,category:void 0}):onChange(intervalGroup.id,{...interval,category:newCategory})}}})]})}function ensureQualifiedIntervalKeys(definition,setIntervalId){let intervals=definition.qualifiedInterval||[],nextId3=Math.max(...intervals.map(interval=>{let existingNum=Number.parseInt(interval.id?.substring(3)||"",10);return Number.isNaN(existingNum)?Number.NEGATIVE_INFINITY:existingNum}))+1;return Number.isFinite(nextId3)||(nextId3=1),definition={...definition,qualifiedInterval:intervals.map(interval=>({...interval,id:interval.id||`id-${nextId3++}`}))},setIntervalId(nextId3),definition}function groupQualifiedIntervals(intervals,setGroupId){let groupId=1,groups={};for(let interval of intervals){let groupKey=generateGroupKey(interval);groupKey in groups||(groups[groupKey]={id:`group-id-${groupId++}`,filters:Object.fromEntries(intervalFilters.map(f=>[f,interval[f]])),intervals:[]}),groups[groupKey].intervals.push(interval)}return setGroupId(groupId),Object.values(groups)}function generateGroupKey(interval){return[`gender=${interval.gender}`,`age=${formatRange2(interval.age)}`,`gestationalAge=${formatRange2(interval.gestationalAge)}`,`context=${interval.context?.text}`,`appliesTo=${interval.appliesTo?.map(c=>c.text).join("+")}`,`category=${interval.category}`].join(":")}function getUnitString(unit){return unit&&(getCodeBySystem(unit,"http://unitsofmeasure.org")||unit.text)}function isEmptyInterval(interval){return interval.range?.low?.value===void 0&&interval.range?.high?.value===void 0}import{Button as Button24,Grid as Grid2,Text as Text51}from"@mantine/core";import{formatDateTime as formatDateTime7,getReferenceString as getReferenceString13}from"@medplum/core";import{useMedplum as useMedplum50,useResource as useResource17}from"@medplum/react-hooks";import{Fragment as Fragment58,useEffect as useEffect38,useState as useState92}from"react";import{jsx as jsx167,jsxs as jsxs112}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum50(),requestGroup=useResource17(props.value),[startedLoading,setStartedLoading]=useState92(!1),[responseBundle,setResponseBundle]=useState92();if(useEffect38(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx167(Grid2,{children:requestGroup.action?.map((action,index)=>{let task=action.resource&&findBundleEntry(action.resource),taskInput=task?.input?.[0]?.valueReference,taskOutput=task?.output?.[0]?.valueReference;return jsxs112(Fragment58,{children:[jsx167(Grid2.Col,{span:1,p:"md",children:task?.status==="completed"?jsx167(IconCheckbox,{}):jsx167(IconSquare,{color:"gray"})}),jsxs112(Grid2.Col,{span:9,p:"xs",children:[jsx167(Text51,{fw:500,children:action.title}),action.description&&jsx167("div",{children:action.description}),jsxs112("div",{children:["Last edited by\xA0",jsx167(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime7(task?.meta?.lastUpdated)]}),jsxs112("div",{children:["Status: ",jsx167(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs112(Grid2.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx167(Button24,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx167(Button24,{onClick:()=>props.onEdit(task,taskInput,taskOutput),children:"Edit"})]})]},`action-${index}`)})});function buildBatchRequest(request){let batchEntries=[];if(request.action)for(let action of request.action)action.resource?.reference&&batchEntries.push({request:{method:"GET",url:action.resource.reference}});return{resourceType:"Bundle",type:"batch",entry:batchEntries}}function findBundleEntry(reference){for(let entry of responseBundle?.entry??[])if(entry.resource&&reference.reference===getReferenceString13(entry.resource))return entry.resource}}import{useMedplum as useMedplum51}from"@medplum/react-hooks";import{useEffect as useEffect39,useState as useState93}from"react";import{stringify as stringify4}from"@medplum/core";function diff(original,revised){let path=buildPath(original,revised);return buildRevisions(path,original,revised)}function buildPath(orig,rev){let N=orig.length,M=rev.length,MAX=N+M+1,size=1+2*MAX,middle=Math.trunc(size/2),diagonal=new Array(size);diagonal[middle+1]={i:0,j:-1,prev:void 0,snake:!0};for(let d=0;d<MAX;d++){for(let k=-d;k<=d;k+=2){let kmiddle=middle+k,kplus=kmiddle+1,kminus=kmiddle-1,kplusNode=diagonal[kplus],kminusNode=diagonal[kminus],prev,i=0;k===-d||k!==d&&kminusNode.i<kplusNode.i?(i=kplusNode.i,prev=kplusNode):(i=kminusNode.i+1,prev=kminusNode),diagonal[kminus]=void 0;let j=i-k,node={i,j,prev:previousSnake(prev),snake:!1};for(;i<N&&j<M&&orig[i]===rev[j];)i++,j++;if(i>node.i&&(node={i,j,prev:node,snake:!0}),diagonal[kmiddle]=node,i>=N&&j>=M)return diagonal[kmiddle]}diagonal[middle+d-1]=void 0}}function buildRevisions(startNode,orig,rev){let deltas=[],path=startNode;for(path.snake&&(path=path.prev);path?.prev&&path.prev.j>=0;){let i=path.i,j=path.j;path=path.prev;let ianchor=path.i,janchor=path.j,original={position:ianchor,lines:orig.slice(ianchor,i)},revised={position:janchor,lines:rev.slice(janchor,j)},type;original.lines.length===0&&revised.lines.length>0?type="insert":original.lines.length>0&&revised.lines.length===0?type="delete":type="change",deltas.push({original,revised,type}),path.snake&&(path=path.prev)}return deltas}function previousSnake(node){return node&&!node.snake&&node.prev?node.prev:node}function blame(history){let versions=(history.entry??[]).filter(entry=>!!entry.resource).map(entry=>({meta:entry.resource?.meta,lines:stringify4(entry.resource,!0).match(/[^\r\n]+/g)})).sort((a,b)=>a.meta.lastUpdated.localeCompare(b.meta.lastUpdated));if(!versions.length)return[];let table=versions[0].lines.map(line=>({id:versions[0].meta.versionId,meta:versions[0].meta,value:line,span:1}));return compareVersions(table,versions),combineSpans(table),table}function compareVersions(table,versions){for(let i=1;i<versions.length;i++){let revisions=diff(versions[i-1].lines,versions[i].lines);for(let revision of revisions){let position=revision.original.position,oldLines=revision.original.lines,newLines=revision.revised.lines;if((revision.type==="delete"||revision.type==="change")&&table.splice(position,oldLines.length),revision.type==="insert"||revision.type==="change")for(let k=0;k<revision.revised.lines.length;k++)table.splice(position+k,0,{id:versions[i].meta.versionId,meta:versions[i].meta,value:newLines[k],span:1})}}}function combineSpans(table){let start=0;for(;start<table.length;){let curr=start;for(;curr<table.length&&table[curr].id===table[start].id;)table[curr].span=-1,curr++;table[start].span=curr-start,start=curr}}var ResourceBlame_default={container:"ResourceBlame_container",root:"ResourceBlame_root",startRow:"ResourceBlame_startRow",normalRow:"ResourceBlame_normalRow",author:"ResourceBlame_author",onBehalfOf:"ResourceBlame_onBehalfOf",dateTime:"ResourceBlame_dateTime",lineNumber:"ResourceBlame_lineNumber",line:"ResourceBlame_line",pre:"ResourceBlame_pre"};function getVersionUrl(resource,versionId){return`/${resource.resourceType}/${resource.id}/_history/${versionId}`}function getTimeString(lastUpdated){let seconds=Math.floor((Date.now()-Date.parse(lastUpdated))/1e3),years=Math.floor(seconds/31536e3);if(years>0)return pluralizeTime(years,"year");let months=Math.floor(seconds/2592e3);if(months>0)return pluralizeTime(months,"month");let days=Math.floor(seconds/86400);if(days>0)return pluralizeTime(days,"day");let hours=Math.floor(seconds/3600);if(hours>0)return pluralizeTime(hours,"hour");let minutes=Math.floor(seconds/60);return minutes>0?pluralizeTime(minutes,"minute"):pluralizeTime(seconds,"second")}function pluralizeTime(count,noun){return`${count} ${count===1?noun:noun+"s"} ago`}import{Fragment as Fragment59,jsx as jsx168,jsxs as jsxs113}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum51(),[value,setValue]=useState93(props.history);if(useEffect39(()=>{!props.history&&props.resourceType&&props.id&&medplum.readHistory(props.resourceType,props.id).then(setValue).catch(console.log)},[medplum,props.history,props.resourceType,props.id]),!value)return jsx168("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx168("div",{className:ResourceBlame_default.container,children:jsx168("table",{className:ResourceBlame_default.root,children:jsx168("tbody",{children:table.map((row,index)=>jsxs113("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs113(Fragment59,{children:[jsxs113("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:[jsx168(ResourceName,{value:row.meta.author,link:!0,fz:"xs"}),row.meta.onBehalfOf&&jsxs113("div",{className:ResourceBlame_default.onBehalfOf,children:["on behalf of ",jsx168(ResourceName,{value:row.meta.onBehalfOf,link:!0,fz:"xs",c:"dimmed"})]})]}),jsx168("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx168(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),fz:"xs",children:getTimeString(row.meta.lastUpdated)})})]}),jsx168("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx168("td",{className:ResourceBlame_default.line,children:jsx168("pre",{className:ResourceBlame_default.pre,children:row.value})})]},"row-"+index))})})})}import{stringify as stringify5}from"@medplum/core";var ResourceDiff_default={removed:"ResourceDiff_removed",added:"ResourceDiff_added"};import{Fragment as Fragment60,jsx as jsx169,jsxs as jsxs114}from"react/jsx-runtime";function ResourceDiff(props){let originalResource=props.original,revisedResource=props.revised;props.ignoreMeta&&(originalResource={...originalResource,meta:void 0},revisedResource={...revisedResource,meta:void 0});let original=stringify5(originalResource,!0).match(/[^\r\n]+/g)??["{","}"],revised=stringify5(revisedResource,!0).match(/[^\r\n]+/g)??["{","}"],deltas=diff(original,revised);return jsx169("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx169(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs114(Fragment60,{children:["...",jsx169("br",{}),props.delta.original.lines.length>0&&jsx169("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
|
|
110
|
-
`)}),props.delta.revised.lines.length>0&&
|
|
111
|
-
`)}),"...",jsx169("br",{})]})}import{ActionIcon as ActionIcon21,Alert as Alert6,Button as Button25,Group as Group65,Menu as Menu9,Stack as Stack46,TextInput as TextInput32,useMantineTheme}from"@mantine/core";import{AccessPolicyInteraction as AccessPolicyInteraction2,applyDefaultValuesToResource,canWriteResourceType,isPopulated as isPopulated11,satisfiedAccessPolicy as satisfiedAccessPolicy2,tryGetProfile as tryGetProfile5}from"@medplum/core";import{useMedplum as useMedplum52,useResource as useResource18}from"@medplum/react-hooks";import{useEffect as useEffect40,useMemo as useMemo40,useState as useState94}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx170,jsxs as jsxs115}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum52(),defaultValue2=useResource18(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState94(!1),[value,setValue]=useState94(),accessPolicy=medplum.getAccessPolicy(),theme=useMantineTheme();useEffect40(()=>{if(defaultValue2)if(props.profileUrl){let profileUrl=props.profileUrl;medplum.requestProfileSchema(props.profileUrl,{expandProfile:!0}).then(()=>{let profile=tryGetProfile5(profileUrl);if(profile){setSchemaLoaded(!0);let modifiedDefaultValue=applyDefaultValuesToResource(defaultValue2,profile);setValue(modifiedDefaultValue)}else console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)})}else medplum.requestSchema(resourceType).then(()=>{setValue(defaultValue2),setSchemaLoaded(!0)}).catch(console.log)},[medplum,defaultValue2,resourceType,props.profileUrl]);let accessPolicyResource=useMemo40(()=>defaultValue2&&satisfiedAccessPolicy2(defaultValue2,AccessPolicyInteraction2.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=useMemo40(()=>medplum.isSuperAdmin()||!accessPolicy||!isPopulated11(value?.resourceType)?!0:canWriteResourceType(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?jsx170("div",{children:"Loading..."}):canWrite?jsxs115("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs115(Stack46,{mb:"xl",children:[jsx170(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx170(TextInput32,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx170(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx170(TextInput32,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx170(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:resourceType,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl,accessPolicyResource}),jsxs115(Group65,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx170(Button25,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs115(Menu9,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx170(Menu9.Target,{children:jsx170(ActionIcon21,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx170(IconChevronDown,{size:14,stroke:1.5})})}),jsxs115(Menu9.Dropdown,{children:[props.onPatch&&jsx170(Menu9.Item,{leftSection:jsx170(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx170(Menu9.Item,{color:"red",leftSection:jsx170(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs115(Alert6,{color:"red",title:"Permission denied",icon:jsx170(IconAlertCircle,{}),children:["Your access level prevents you from editing and creating ",value.resourceType," resources."]})}import{Table as Table6}from"@mantine/core";import{formatDateTime as formatDateTime8,normalizeErrorString as normalizeErrorString16}from"@medplum/core";import{useMedplum as useMedplum53}from"@medplum/react-hooks";import{useEffect as useEffect41,useState as useState95}from"react";import{jsx as jsx171,jsxs as jsxs116}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum53(),[value,setValue]=useState95(props.history);return useEffect41(()=>{!props.history&&props.resourceType&&props.id&&medplum.readHistory(props.resourceType,props.id).then(setValue).catch(console.log)},[medplum,props.history,props.resourceType,props.id]),value?jsxs116(Table6,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx171(Table6.Thead,{children:jsxs116(Table6.Tr,{children:[jsx171(Table6.Th,{children:"Author"}),jsx171(Table6.Th,{children:"On Behalf Of"}),jsx171(Table6.Th,{children:"Date"}),jsx171(Table6.Th,{children:"Version"})]})}),jsx171(Table6.Tbody,{children:value.entry?.map((entry,index)=>jsx171(HistoryRow,{entry},"entry-"+index))})]}):jsx171("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs116(Table6.Tr,{children:[jsx171(Table6.Td,{children:jsx171(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx171(Table6.Td,{children:resource.meta?.onBehalfOf&&jsx171(ResourceBadge,{value:resource.meta.onBehalfOf,link:!0})}),jsx171(Table6.Td,{children:formatDateTime8(resource.meta?.lastUpdated)}),jsx171(Table6.Td,{children:jsx171(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx171(Table6.Tr,{children:jsx171(Table6.Td,{colSpan:4,children:normalizeErrorString16(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button26,Loader as Loader12,Stack as Stack47,Text as Text52}from"@mantine/core";import{showNotification as showNotification12}from"@mantine/notifications";import{arrayify as arrayify2,getReferenceString as getReferenceString14,isDefined,isReference as isReference4,isResource as isResource3,normalizeErrorString as normalizeErrorString17}from"@medplum/core";import{useMedplum as useMedplum54}from"@medplum/react-hooks";import{useCallback as useCallback32,useEffect as useEffect42,useMemo as useMemo41,useState as useState96}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx172,jsxs as jsxs117}from"react/jsx-runtime";function BaseScheduler(props){let[month,setMonth]=useState96(getStartMonth),[date,setDate]=useState96(),[options,setOptions]=useState96(),[selectedOption,setSelectedOption]=useState96(),{fetchOptions,onSelectOption}=props;useEffect42(()=>{let active=!0;async function doSearch(){let start=getStart2(month),end=getEnd2(month),options2=await fetchOptions({start,end});active&&setOptions(options2)}return doSearch().catch(console.error),()=>{active=!1}},[fetchOptions,month]);let handleSelectOption=useCallback32(option=>{setSelectedOption(option),onSelectOption?.(...option)},[onSelectOption]),filteredOptions=useMemo41(()=>{if(!date||!options)return[];let start=date.getTime(),end=start+1440*60*1e3,seen=new Set;return options.filter(([_,optionDate])=>{let optionTime=optionDate.getTime();return seen.has(optionTime)?!1:(seen.add(optionTime),start<=optionTime&&optionTime<end)})},[date,options]);return options?jsxs117("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs117("div",{className:Scheduler_default.info,children:[props.actor&&jsx172(ResourceAvatar,{value:props.actor,size:"xl"}),props.actor&&jsx172(Text52,{size:"xl",fw:500,children:jsx172(ResourceName,{value:props.actor})}),jsx172("p",{children:"1 hour"}),date&&jsx172("p",{children:date.toLocaleDateString()}),selectedOption&&jsx172("p",{children:formatTime(selectedOption[1])})]}),jsxs117("div",{className:Scheduler_default.selection,children:[!date&&jsxs117("div",{children:[jsx172("h3",{children:"Select date"}),jsx172(CalendarDateInput,{availableDates:options.map(opt=>opt[1]),onChangeMonth:setMonth,onClick:setDate})]}),date&&!selectedOption&&jsxs117("div",{children:[jsx172("h3",{children:"Select time"}),jsx172(Stack47,{children:filteredOptions.map(option=>jsx172("div",{children:jsx172(Button26,{variant:"outline",style:{width:150},onClick:()=>handleSelectOption(option),children:formatTime(option[1])})},option[1].toISOString()))})]}),props.children]})]}):jsx172("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:jsx172(Loader12,{})})}function onlyPractitioner(schedule){let refs=schedule.actor.filter(ref=>isReference4(ref,"Practitioner"));if(refs.length===1)return refs[0]}function Scheduler(props){let medplum=useMedplum54(),{fetchSlots,schedule}=props,[actor,setActor]=useState96(),fetchOptions=useCallback32(async period=>{if(fetchSlots)return(await fetchSlots(period)).map(slot=>[slot,new Date(slot.start)]);let scheduleRefs=arrayify2(schedule??[]).map(getReferenceString14).filter(isDefined),slotSearchParams=new URLSearchParams([["_count","720"],["schedule",scheduleRefs.join(",")],["start","gt"+period.start],["start","lt"+period.end]]);return(await medplum.searchResources("Slot",slotSearchParams)).map(slot=>[slot,new Date(slot.start)])},[medplum,fetchSlots,schedule]);return useEffect42(()=>{let schedules=arrayify2(props.schedule);if(schedules?.length!==1)return;let schedule2=schedules[0];isResource3(schedule2)?setActor(onlyPractitioner(schedule2)):medplum.readReference(schedule2).then(schedule3=>{setActor(onlyPractitioner(schedule3))}).catch(error=>{showNotification12({color:"red",title:"Error",message:normalizeErrorString17(error)})})},[medplum,props.schedule]),jsx172(BaseScheduler,{fetchOptions,onSelectOption:props.onSelectSlot,actor,children:props.children})}function getStart2(month){return formatSlotInstant(month.getTime())}function getEnd2(month){return formatSlotInstant(month.getTime()+744*60*60*1e3)}function formatSlotInstant(time){let date=new Date(Math.max(Date.now(),time));return date.setHours(0,0,0,0),date.toISOString()}function formatTime(date){return date.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})}import{useEffect as useEffect43}from"react";var dist_exports={};__export(dist_exports,{HydratedRouter:()=>HydratedRouter,RouterProvider:()=>RouterProvider});__reExport(dist_exports,react_router_star);import{HydratedRouter,RouterProvider}from"react-router/dom";import*as react_router_star from"react-router";function ScrollToTop(){let{pathname}=(0,dist_exports.useLocation)();return useEffect43(()=>{window.scrollTo(0,0)},[pathname]),null}import{createReference as createReference17}from"@medplum/core";import{jsx as jsx173}from"react/jsx-runtime";function ServiceRequestTimeline(props){let{serviceRequest,...rest}=props;return jsx173(ResourceTimeline,{value:serviceRequest,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("ServiceRequest",id),medplum.search("Communication",{"based-on":ref,_count}),medplum.search("DiagnosticReport",{"based-on":ref,_count}),medplum.search("Media",{"based-on":ref,_count}),medplum.search("DocumentReference",{related:ref,_count}),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count})])},createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",basedOn:[createReference17(resource)],subject:resource.subject,sender:createReference17(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference17(resource)],subject:resource.subject,operator:createReference17(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor14}from"@mantine/core";import{showNotification as showNotification13}from"@mantine/notifications";import{ensureTrailingSlash,normalizeErrorString as normalizeErrorString18}from"@medplum/core";import{useMedplum as useMedplum55,useResource as useResource19}from"@medplum/react-hooks";import{jsx as jsx174}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum55(),{client,patient,encounter,children,...rest}=props,patientResource=useResource19(patient),encounterResource=useResource19(encounter);function launchApp(){let patientRef=patient,encounterRef=encounter;if(client.launchIdentifierSystems?.length){let patientIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Patient");if(patientRef&&patientResource&&patientIdentifierConfig?.system){let identifier=patientResource.identifier?.find(i=>i.system===patientIdentifierConfig.system);identifier&&(patientRef={...patient,identifier})}let encounterIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Encounter");if(encounterRef&&encounterResource&&encounterIdentifierConfig?.system){let identifier=encounterResource.identifier?.find(i=>i.system===encounterIdentifierConfig.system);identifier&&(encounterRef={...encounter,identifier})}}medplum.createResource({resourceType:"SmartAppLaunch",patient:patientRef,encounter:encounterRef,fhirContext:props.fhirContext}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",ensureTrailingSlash(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),window.open(url.toString(),"_blank")}).catch(err=>showNotification13({color:"red",message:normalizeErrorString18(err),autoClose:!1}))}return jsx174(Anchor14,{onClick:()=>launchApp(),...rest,children})}export{AIRealTimeQuestionnaireForm,AddressDisplay,AddressInput,AllergiesSection,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,BaseScheduler,CalendarDateInput,CalendarInput,ChangePasswordForm,ChatList,ChatListItem,ChatModal,CheckboxFormSection,ChooseScopeForm,CodeInput,CodeableConceptDisplay,CodeableConceptInput,CodingDisplay,CodingInput,ContactDetailDisplay,ContactDetailInput,ContactPointDisplay,ContactPointInput,Container,DateTimeInput,DefaultResourceItemComponent,DefaultResourceTimeline,DemographicsSection,DescriptionList,DescriptionListEntry,DiagnosticReportDisplay,Document,ElementDefinitionInputSelector,ElementDefinitionTypeInput,EncounterTimeline,ErrorBoundary,FhirPathTable,Form,FormSection,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,InfoBar,InsuranceSection,LabsSection,LinkTabs,Loading,Logo,MeasureReportDisplay,MedicationsSection,MedplumLink,MemoizedFhirPathTable,MfaForm,MoneyDisplay,MoneyInput,MultiResourceInput,Navbar,NewTopicDialog,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,Panel,ParticipantFilter,PatientAccountsForm,PatientExportForm,PatientHeader,PatientSummary,PatientTimeline,Pharmacies,PharmaciesSection,PharmacyDialog,PlanDefinitionBuilder,ProblemListSection,QuantityDisplay,QuantityInput,QuestionnaireBuilder,QuestionnaireForm,QuestionnaireResponseDisplay,RangeDisplay,RangeInput,RatioInput,ReferenceDisplay,ReferenceInput,ReferenceRangeEditor,ReferenceRangeGroupEditor,RegisterForm,RequestGroupDisplay,ResetPasswordForm,ResourceArrayDisplay,ResourceArrayInput,ResourceAvatar,ResourceBadge,ResourceBlame,ResourceDiff,ResourceDiffTable,ResourceForm,ResourceHistoryTable,ResourceInput,ResourceName,ResourcePropertyDisplay,ResourcePropertyInput,ResourceTable,ResourceTimeline,Scheduler,ScrollToTop,SearchChangeEvent,SearchClickEvent,SearchControl,SearchFieldEditor,SearchFilterEditor,SearchLoadEvent,ServiceRequestTimeline,SetPasswordForm,SexualOrientationSection,SignInForm,SignatureInput,SmartAppLaunchLink,SmokingStatusSection,Spotlight,StatusBadge,SubmitButton,ThreadChat,ThreadInbox,Timeline,TimelineItem,TimingInput,ValueSetAutocomplete,VitalsSection,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNext24HoursFilter,addNextMonthFilter,addPreferredPharmacyToPatient,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,clearFilters,clearFiltersOnField,codingToValueSetElement,convertIsoToLocal,convertLocalToIso,createLabsSection,createPharmaciesSection,createPreferredPharmacyExtension,createScriptTag,deleteFilter,exportJsonFile,getAppName,getDefaultSections,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getOpString,getPaginationControlProps,getPreferredPharmaciesFromPatient,getRecaptcha,getSearchOperators,getSortField,getValuePath,initRecaptcha,isAddPharmacyResponse,isAuxClick,isCheckboxCell,isOrganizationArray,isSortDescending,isSupportedProfileStructureDefinition,killEvent,parseForm,removePreferredPharmacyFromPatient,renderValue,sendCommand,setFilters,setOffset,setPage,setPropertyValue,setSort,sortByDateAndPriority,summaryResourceListSection,toggleSort,valueSetElementToCoding};
|
|
109
|
+
}`.replaceAll(/\s+/g," ");return(await medplum.graphql(query)).data.StructureDefinitionList[0]}function shouldFetchResourceType(targetType){return targetType.type==="profile"&&!targetType?.error&&isEmpty4(targetType.resourceType)}import{Group as Group24,Stack as Stack14,Text as Text17}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useMedplum as useMedplum22}from"@medplum/react-hooks";import{useContext as useContext19,useEffect as useEffect14,useState as useState45}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group23,Stack as Stack13,Text as Text16}from"@mantine/core";import{buildElementsContext as buildElementsContext3,getPropertyDisplayName,isEmpty as isEmpty5,isPopulated as isPopulated9}from"@medplum/core";import{useContext as useContext18,useMemo as useMemo18,useState as useState44}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon4,Button as Button6}from"@mantine/core";import{jsx as jsx82}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx82(Button6,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx82(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx82(ActionIcon4,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx82(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon5}from"@mantine/core";import{jsx as jsx83}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx83(ActionIcon5,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx83(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx84,jsxs as jsxs46}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState44(props.defaultValue),sliceElements=slice.typeSchema?.elements??slice.elements,parentElementsContextValue=useContext18(ElementsContext),contextValue=useMemo18(()=>{if(isPopulated9(sliceElements))return buildElementsContext3({parentContext:parentElementsContextValue,elements:sliceElements,path:props.path,profileUrl:slice.typeSchema?.url})},[parentElementsContextValue,props.path,slice.typeSchema?.url,sliceElements]);function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}let required=slice.min>0,indentedStack=isEmpty5(slice.elements),propertyDisplayName=getPropertyDisplayName(slice.name),showEmptyMessage=props.property.readonly&&values.length===0;return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx84(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx84(Text16,{c:"dimmed",children:"(empty)"}):jsxs46(Stack13,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs46(Group23,{wrap:"nowrap",children:[jsx84("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx84(ElementDefinitionTypeInput,{elementDefinitionType:slice.type[0],name:slice.name,defaultValue:value,onChange:newValue=>{let newValues=[...values];newValues[valueIndex]=newValue,setValuesWrapper(newValues)},outcome:props.outcome,min:slice.min,max:slice.max,binding:slice.binding,path:props.path,valuePath:void 0,readOnly:props.property.readonly})}),!props.property.readonly&&values.length>slice.min&&jsx84(ArrayRemoveButton,{propertyDisplayName,testId:props.testId&&`${props.testId}-remove-${valueIndex}`,onClick:e=>{killEvent(e);let newValues=[...values];newValues.splice(valueIndex,1),setValuesWrapper(newValues)}})]},`${valueIndex}-${values.length}`)),!props.property.readonly&&values.length<slice.max&&jsx84(Group23,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx84(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx85,jsxs as jsxs47}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum22(),[loading,setLoading]=useState45(!0),[slices,setSlices]=useState45([]),[defaultValue2]=useState45(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState45(()=>[defaultValue2]),ctx=useContext19(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect14(()=>{prepareSlices({medplum,property}).then(slices2=>{setSlices(slices2);let slicedValues2=assignValuesIntoSlices(defaultValue2,slices2,property.slicing,ctx.profileUrl);addPlaceholderValues(slicedValues2,slices2),setSlicedValues(slicedValues2),setLoading(!1)}).catch(reason=>{console.error(reason),setLoading(!1)})},[medplum,property,defaultValue2,ctx.profileUrl,setSlicedValues]);function setValuesWrapper(newValues,sliceIndex){let newSlicedValues=[...slicedValues];if(newSlicedValues[sliceIndex]=newValues,setSlicedValues(newSlicedValues),props.onChange){let cleaned=newSlicedValues.flat().filter(val=>val!==void 0);props.onChange(cleaned)}}if(loading)return jsx85("div",{children:"Loading..."});let nonSliceIndex=slices.length,nonSliceValues=slicedValues[nonSliceIndex],showNonSliceValues=!(props.hideNonSliceValues??(propertyTypeCode==="Extension"&&slices.length>0)),propertyDisplayName=getPathDisplayName4(property.path),showEmptyMessage=props.property.readonly&&slices.length===0&&defaultValue2.length===0;return jsxs47(Stack14,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx85(Text17,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx85(SliceInput,{slice,path:props.path,valuePath:props.valuePath,property,defaultValue:slicedValues[sliceIndex],onChange:newValue=>{setValuesWrapper(newValue,sliceIndex)},testId:`slice-${slice.name}`},slice.name)),showNonSliceValues&&nonSliceValues.map((value,valueIndex)=>jsxs47(Group24,{wrap:"nowrap",style:{flexGrow:1},children:[jsx85("div",{style:{flexGrow:1},children:jsx85(ResourcePropertyInput,{arrayElement:!0,property:props.property,name:props.name+"."+valueIndex,path:props.path,valuePath:getValuePath(props.path,props.valuePath,valueIndex),defaultValue:value,onChange:newValue=>{let newNonSliceValues=[...nonSliceValues];newNonSliceValues[valueIndex]=newValue,setValuesWrapper(newNonSliceValues,nonSliceIndex)},defaultPropertyType:void 0,outcome:props.outcome})}),!props.property.readonly&&jsx85(ArrayRemoveButton,{propertyDisplayName,testId:`nonsliced-remove-${valueIndex}`,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.splice(valueIndex,1),setValuesWrapper(newNonSliceValues,nonSliceIndex)}})]},`${valueIndex}-${nonSliceValues.length}`)),!props.property.readonly&&showNonSliceValues&&slicedValues.flat().length<property.max&&jsx85(Group24,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx85(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.push(void 0),setValuesWrapper(newNonSliceValues,nonSliceIndex)},testId:"nonsliced-add"})})]})}function addPlaceholderValues(slicedValues,slices){for(let sliceIndex=0;sliceIndex<slices.length;sliceIndex++){let slice=slices[sliceIndex],sliceValues=slicedValues[sliceIndex];for(;sliceValues.length<slice.min;)sliceValues.push(void 0)}}import{ActionIcon as ActionIcon6,Flex as Flex11,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification4}from"@mantine/notifications";import{useRef as useRef9,useState as useState46}from"react";import{jsx as jsx86,jsxs as jsxs48}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState46(!1),clipboard=useClipboard(),ref=useRef9(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs48(Flex11,{gap:"xs",children:[jsx86(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx86(ActionIcon6,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification4({color:"green",message:"Copied"})},children:jsx86(IconCopy,{})})]})}import{Box as Box7,Button as Button7,Chip,Group as Group25,Modal as Modal2,NativeSelect as NativeSelect8,Stack as Stack15,Switch,TextInput as TextInput17}from"@mantine/core";import{formatTiming as formatTiming2}from"@medplum/core";import{useContext as useContext20,useMemo as useMemo19,useRef as useRef10,useState as useState47}from"react";import{Fragment as Fragment28,jsx as jsx87,jsxs as jsxs49}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState47(props.defaultValue),[open,setOpen]=useState47(!props.disabled&&(props.defaultModalOpen??!1));return jsxs49(Fragment28,{children:[jsxs49(Group25,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx87("span",{"data-testid":"timinginput-display",children:formatTiming2(value)||"No repeat"}),jsx87(Button7,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx87(TimingEditorDialog,{path:props.path,visible:open,defaultValue:value,onOk:newValue=>{props.onChange&&props.onChange(newValue),setValue(newValue),setOpen(!1)},onCancel:()=>setOpen(!1)})]})}var defaultValue={repeat:{period:1,periodUnit:"d"}};function TimingEditorDialog(props){let[value,setValue]=useState47(props.defaultValue||defaultValue),[timeOfDayItems,setTimeOfDayItems]=useState47(()=>(props.defaultValue?.repeat?.timeOfDay??[]).map((v,i)=>({id:i,value:v}))),nextTimeOfDayId=useRef10(timeOfDayItems.length),{getExtendedProps}=useContext20(ElementsContext),[eventProps,repeatProps,repeatPeriodProps,repeatPeriodUnitProps,repeatDayOfWeekProps,repeatTimeOfDayProps]=useMemo19(()=>["event","repeat","repeat.period","repeat.periodUnit","repeat.dayOfWeek","repeat.timeOfDay"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setStart(newStart){setValue(value2=>({...value2,event:[newStart]}))}function setRepeat(repeat){setValue(value2=>({...value2,repeat}))}function setPeriod(period){setValue(value2=>({...value2,repeat:{...value2.repeat,period}}))}function setPeriodUnit(periodUnit){setValue(value2=>({...value2,repeat:{...value2.repeat,periodUnit}}))}function setDaysOfWeek(dayOfWeek){setValue(value2=>({...value2,repeat:{...value2.repeat,dayOfWeek}}))}function setTimeOfDay(updater){setTimeOfDayItems(items=>{let newItems=updater(items),timeOfDay=newItems.map(item=>item.value);return setValue(value2=>({...value2,repeat:{...value2.repeat,timeOfDay}})),newItems})}return jsx87(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs49(Stack15,{gap:"md",children:[jsx87(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx87(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx87(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs49(Fragment28,{children:[jsx87(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs49(Group25,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx87(TextInput17,{disabled:repeatPeriodProps?.readonly,type:"number",step:1,id:"timing-dialog-period",name:"timing-dialog-period",defaultValue:value.repeat.period||1,onChange:e=>setPeriod(Number.parseInt(e.currentTarget.value,10)||1)}),jsx87(NativeSelect8,{disabled:repeatPeriodUnitProps?.readonly,id:"timing-dialog-periodUnit",name:"timing-dialog-periodUnit",defaultValue:value.repeat.periodUnit,onChange:e=>setPeriodUnit(e.currentTarget.value),data:[{label:"minute",value:"min"},{label:"hour",value:"h"},{label:"day",value:"d"},{label:"week",value:"wk"},{label:"month",value:"mo"},{label:"year",value:"a"}]})]})}),value.repeat.periodUnit==="wk"&&jsx87(FormSection,{title:"Repeat on",children:jsx87(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,value:value.repeat?.dayOfWeek,children:jsx87(Group25,{justify:"space-between",mt:"xs",gap:"xs",children:daysOfWeek.map(day=>jsx87(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,checked:(value.repeat?.dayOfWeek??[]).includes(day),children:day.charAt(0).toUpperCase()},day))})})}),jsx87(FormSection,{title:"At times",children:jsxs49(Stack15,{mt:"xs",children:[timeOfDayItems.map((item,idx)=>jsxs49(Group25,{children:[jsx87(TextInput17,{disabled:repeatTimeOfDayProps?.readonly,type:"time",id:`timing-dialog-repeat-timeOfDay[${idx}]`,name:`timing-dialog-repeat-timeOfDay[${idx}]`,"data-testid":`timing-repeat-timeOfDay-input-${idx}`,defaultValue:item.value.slice(0,5),onChange:e=>{let newValue=`${e.currentTarget.value}:00`;setTimeOfDay(items=>items.with(idx,{...item,value:newValue}))},style:{flexGrow:1}}),jsx87(ArrayRemoveButton,{testId:`timing-repeat-timeOfDay-remove-${idx}`,onClick:()=>setTimeOfDay(items=>items.toSpliced(idx,1))})]},item.id)),jsx87(Box7,{children:jsx87(ArrayAddButton,{propertyDisplayName:"Time of Day",onClick:()=>setTimeOfDay(items=>{let id=nextTimeOfDayId.current++;return items.concat({id,value:"00:00:00"})})})})]})})]}),jsx87(Group25,{justify:"flex-end",children:jsx87(Button7,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx88,jsxs as jsxs50}from"react/jsx-runtime";function ResourcePropertyInput(props){let{property,name,onChange,defaultValue:defaultValue2}=props,defaultPropertyType=props.defaultPropertyType&&props.defaultPropertyType!=="undefined"?props.defaultPropertyType:property.type[0].code,propertyTypes=property.type;if((property.isArray||property.max>1)&&!props.arrayElement){if(defaultPropertyType===PropertyType2.Attachment)return jsx88(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx88(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx88(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx88(ElementDefinitionTypeInput,{name,defaultValue:defaultValue2,onChange:newValue=>{if(props.onChange){let newPropName=props.name.replace("[x]",capitalize2(propertyTypes[0].code));props.onChange(newValue,newPropName)}},outcome:props.outcome,elementDefinitionType:propertyTypes[0],min:property.min,max:property.min,binding:property.binding,path:props.path,valuePath:props.valuePath,readOnly:property.readonly})}function ElementDefinitionInputSelector(props){let propertyTypes=props.elementDefinitionTypes,initialPropertyType;props.defaultPropertyType&&(initialPropertyType=propertyTypes.find(t=>t.code===props.defaultPropertyType)),initialPropertyType||(initialPropertyType=propertyTypes[0]);let[selectedType,setSelectedType]=useState48(initialPropertyType);return jsxs50(Group26,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx88(NativeSelect9,{disabled:props.property.readonly,style:{width:"200px"},defaultValue:selectedType.code,"data-testid":props.name&&props.name+"-selector",onChange:e=>{setSelectedType(propertyTypes.find(type=>type.code===e.currentTarget.value))},data:propertyTypes.map(type=>({value:type.code,label:type.code}))}),jsx88(ElementDefinitionTypeInput,{name:props.name,defaultValue:props.defaultValue,outcome:props.outcome,elementDefinitionType:selectedType,onChange:newValue=>{props.onChange&&props.onChange(newValue,props.name.replace("[x]",capitalize2(selectedType.code)))},min:props.property.min,max:props.property.max,binding:props.property.binding,path:props.property.path,valuePath:props.valuePath,readOnly:props.property.readonly})]})}function ElementDefinitionTypeInput(props){let{name,onChange,outcome,binding,path,valuePath,readOnly}=props,required=props.min!==void 0&&props.min>0,propertyType=props.elementDefinitionType.code,elementsContext=useContext21(ElementsContext),defaultValue2=useMemo20(()=>{if(!isComplexTypeCode(propertyType)||!isEmpty6(props.defaultValue))return props.defaultValue;let withDefaults=Object.create(null);if(elementsContext.path===props.path)applyDefaultValuesToElement(withDefaults,elementsContext.elements);else{let key=getPathDifference(elementsContext.path,props.path);if(key===void 0)return props.defaultValue;applyDefaultValuesToElement(withDefaults,elementsContext.elements,key)}return isPopulated10(withDefaults)?withDefaults:props.defaultValue},[propertyType,elementsContext.path,elementsContext.elements,props.path,props.defaultValue]);if(!propertyType)return jsx88("div",{children:"Property type not specified "});function getComplexInputProps(){return{name,defaultValue:defaultValue2,onChange,outcome,path,valuePath,disabled:readOnly}}function getPrimitiveInputProps(){let error=getErrorsForInput(props.outcome,valuePath??path);return{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,error,disabled:readOnly}}switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.string:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"||props.path==="ClientApplication.certificateTrustStore"?jsx88(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx88(TextInput18,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx88(TextInput18,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.time:return jsx88(TextInput18,{...getPrimitiveInputProps(),type:"time",step:1,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx88(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx88(TextInput18,{...getPrimitiveInputProps(),type:"number",step:propertyType===PropertyType2.decimal?"any":"1",onChange:e=>{if(onChange){let num=e.currentTarget.valueAsNumber;onChange(Number.isNaN(num)?void 0:num)}}});case PropertyType2.code:return jsx88(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx88(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:case PropertyType2.xhtml:return jsx88(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx88(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx88(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx88(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx88(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx88(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx88(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx88(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx88(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx88(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx88(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx88(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx88(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx88(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx88(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx88(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx88(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx88(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx88(BackboneElementInput,{...getComplexInputProps(),typeName:propertyType})}}var RESOURCE_TYPE_URL_PREFIXES=[`${HTTP_HL7_ORG}/fhir/StructureDefinition/`,"https://medplum.com/fhir/StructureDefinition/"];function getTargetTypes(elementDefinitionType){return elementDefinitionType?.targetProfile?.map(p=>{let resourceTypePrefix=RESOURCE_TYPE_URL_PREFIXES.find(prefix=>p.startsWith(prefix));return resourceTypePrefix?p.slice(resourceTypePrefix.length):p})}import{jsx as jsx89}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState49(props.defaultValue??{}),elementsContext=useContext22(ElementsContext),elementsToRender=useMemo21(()=>getElementsToRender(elementsContext.elements),[elementsContext.elements]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let typedValue={type:props.type,value};return jsx89(Stack16,{style:{flexGrow:1},"data-testid":props.testId,children:elementsToRender.map(([key,element])=>{let[propertyValue,propertyType]=getValueAndTypeFromElement(typedValue,key,element),required=element.min!==void 0&&element.min>0,valuePath=props.valuePath?props.valuePath+"."+key:void 0,resourcePropertyInput=jsx89(ResourcePropertyInput,{property:element,name:key,path:props.path+"."+key,valuePath,defaultValue:propertyValue,defaultPropertyType:propertyType,onChange:(newValue,propName)=>{setValueWrapper(setPropertyValue({...value},key,propName??key,element,newValue))},outcome:props.outcome},key);return props.type==="Extension"||EXTENSION_KEYS.includes(key)?resourcePropertyInput:element.type.length===1&&element.type[0].code==="boolean"?jsx89(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx89(FormSection,{title:getPathDisplayName5(key),description:element.description,withAsterisk:required,htmlFor:key,outcome:props.outcome,fhirPath:element.path,errorExpression:valuePath,readonly:element.readonly,children:resourcePropertyInput},key)})})}var BackboneElementInput_default={nested:"BackboneElementInput_nested"};import{jsx as jsx90,jsxs as jsxs51}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState50(()=>props.defaultValue??{}),parentElementsContext=useContext23(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo22(()=>tryGetDataType2(props.typeName,profileUrl),[props.typeName,profileUrl]),type=typeSchema?.type??props.typeName,contextValue=useMemo22(()=>{if(typeSchema)return buildElementsContext4({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);if(!typeSchema)return jsxs51("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx90(Box8,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:jsx90(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}import{Button as Button8,Group as Group27}from"@mantine/core";import{useMemo as useMemo23,useState as useState51}from"react";var CalendarDateInput_default={table:"CalendarDateInput_table"};function getMonthString(date){return date.toLocaleString("default",{month:"long"})+" "+date.getFullYear()}function getStartMonth(){let result=new Date;return result.setDate(1),result.setHours(0,0,0,0),result}import{jsx as jsx91,jsxs as jsxs52}from"react/jsx-runtime";function CalendarDateInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState51(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth);return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=useMemo23(()=>buildGrid(month,props.availableDates),[month,props.availableDates]);return jsxs52("div",{children:[jsxs52(Group27,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx91("p",{style:{flex:1},children:getMonthString(month)}),jsxs52(Group27,{justify:"flex-end",gap:"xs",children:[jsx91(Button8,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx91(Button8,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs52("table",{className:CalendarDateInput_default.table,children:[jsx91("thead",{children:jsxs52("tr",{children:[jsx91("th",{children:"SUN"}),jsx91("th",{children:"MON"}),jsx91("th",{children:"TUE"}),jsx91("th",{children:"WED"}),jsx91("th",{children:"THU"}),jsx91("th",{children:"FRI"}),jsx91("th",{children:"SAT"})]})}),jsx91("tbody",{children:grid.map((week,weekIndex)=>jsx91("tr",{children:week.map((day,dayIndex)=>jsx91("td",{children:day&&jsx91(Button8,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,availableDates){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d),available:isDayAvailable(d,availableDates)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,availableDates){for(let availableDate of availableDates)if(availableDate.getFullYear()===day.getFullYear()&&availableDate.getMonth()===day.getMonth()&&availableDate.getDate()===day.getDate())return!0;return!1}import{useMemo as useMemo24}from"react";import{jsx as jsx92}from"react/jsx-runtime";function CalendarInput(props){let{slots,...rest}=props,availableDates=useMemo24(()=>slots.map(slot=>new Date(slot.start)),[slots]);return jsx92(CalendarDateInput,{...rest,availableDates})}import{ActionIcon as ActionIcon7,Group as Group28,LoadingOverlay,Menu as Menu4,Paper as Paper2,Popover,ScrollArea as ScrollArea2,Skeleton,Stack as Stack18,Text as Text19,TextInput as TextInput20,Title as Title8}from"@mantine/core";import{useResizeObserver}from"@mantine/hooks";import{showNotification as showNotification5}from"@mantine/notifications";import{getDisplayString as getDisplayString4,getReferenceString as getReferenceString5,normalizeErrorString as normalizeErrorString6}from"@medplum/core";import{useCachedBinaryUrl as useCachedBinaryUrl3,useMedplum as useMedplum24,useResource as useResource2,useSubscription}from"@medplum/react-hooks";import{useCallback as useCallback11,useEffect as useEffect16,useMemo as useMemo25,useRef as useRef11,useState as useState53}from"react";var BaseChat_default={chatPaper:"BaseChat_chatPaper",chatTitle:"BaseChat_chatTitle",chatBody:"BaseChat_chatBody",chatScrollArea:"BaseChat_chatScrollArea",chatInputContainer:"BaseChat_chatInputContainer",chatPendingFile:"BaseChat_chatPendingFile",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble",chatBubbleNameRight:"BaseChat_chatBubbleNameRight",chatBubbleAttachmentWithText:"BaseChat_chatBubbleAttachmentWithText",chatBubbleAttachmentIcon:"BaseChat_chatBubbleAttachmentIcon",chatBubbleMenu:"BaseChat_chatBubbleMenu"};import{Box as Box9,Divider as Divider5,Loader as Loader4,Stack as Stack17,Text as Text18,TextInput as TextInput19,UnstyledButton as UnstyledButton3}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback2}from"@mantine/hooks";import{getReferenceString as getReferenceString4}from"@medplum/core";import{useMedplum as useMedplum23}from"@medplum/react-hooks";import{useEffect as useEffect15,useState as useState52}from"react";import{jsx as jsx93,jsxs as jsxs53}from"react/jsx-runtime";function DocumentPicker({subjectRef,onSelect,onUpload}){let medplum=useMedplum23(),[search,setSearch]=useState52(""),[docs,setDocs]=useState52([]),[loading,setLoading]=useState52(!0),subjectRefStr=subjectRef?getReferenceString4(subjectRef):void 0,fetchDocs=useDebouncedCallback2(async query=>{setLoading(!0);try{let params=new URLSearchParams;subjectRefStr&¶ms.set("subject",subjectRefStr),query.trim()&¶ms.set("description:contains",query.trim()),params.set("_sort","-date"),params.set("_count","5");let results=await medplum.searchResources("DocumentReference",params);setDocs([...results])}catch(err){console.error(err)}finally{setLoading(!1)}},300);useEffect15(()=>{fetchDocs(search)},[fetchDocs,search]);let getDocName=doc=>doc.description??doc.content?.[0]?.attachment?.title??"Untitled";return jsxs53(Stack17,{gap:0,w:280,children:[jsx93(Text18,{fw:500,fz:"sm",px:"sm",pt:"sm",pb:"xs",children:"Attachments"}),jsx93(Box9,{px:"sm",pb:"xs",children:jsx93(TextInput19,{placeholder:"Search for a Document...",size:"xs",value:search,onChange:e=>setSearch(e.currentTarget.value)})}),jsx93(Divider5,{}),loading?jsx93(Box9,{py:"sm",style:{display:"flex",justifyContent:"center"},children:jsx93(Loader4,{size:"xs"})}):jsxs53(Stack17,{gap:0,children:[docs.map(doc=>jsxs53(UnstyledButton3,{px:"sm",py:"xs",onClick:()=>onSelect(doc),style:{display:"flex",alignItems:"center",gap:8},children:[jsx93(IconFileText,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-blue-6)"}}),jsx93(Text18,{fz:"sm",truncate:!0,children:getDocName(doc)})]},doc.id)),docs.length===0&&jsx93(Text18,{fz:"xs",c:"dimmed",px:"sm",py:"xs",children:"No documents found"})]}),jsx93(Divider5,{}),jsxs53(UnstyledButton3,{px:"sm",py:"xs",onClick:onUpload,style:{display:"flex",alignItems:"center",gap:8},children:[jsx93(IconPaperclip,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-gray-6)"}}),jsx93(Text18,{fz:"sm",c:"dimmed",children:"Upload an image, pdf, etc."})]})]})}import{jsx as jsx94,jsxs as jsxs54}from"react/jsx-runtime";function toSafeUrl(url){if(url)try{let{protocol}=new URL(url);return protocol==="https:"||protocol==="http:"||protocol==="blob:"?url:void 0}catch{return}}function showError(message){showNotification5({color:"red",title:"Error",message,autoClose:!1})}function parseSentTime(communication){return new Date(communication.sent??0).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function upsertCommunications(communications,received,setCommunications){let newCommunications=[...communications],foundNew=!1;for(let comm of received){let existingIdx=newCommunications.findIndex(c=>c.id===comm.id);existingIdx!==-1?newCommunications[existingIdx]=comm:(newCommunications.push(comm),foundNew=!0)}foundNew&&newCommunications.sort((a,b)=>!a.sent&&!b.sent?0:a.sent?b.sent?a.sent.localeCompare(b.sent):1:-1),setCommunications(newCommunications)}function BaseChat(props){let{title,communications,setCommunications,query,sendMessage,onMessageReceived,onMessageUpdated,inputDisabled,onError,excludeHeader=!1,uploadEnabled=!1,attachmentSubjectRef,onViewInDocuments,...paperProps}=props,medplum=useMedplum24(),inputRef=useRef11(null),scrollAreaRef=useRef11(null),firstScrollRef=useRef11(!0),initialLoadRef=useRef11(!0),[profile,setProfile]=useState53(medplum.getProfile()),[reconnecting,setReconnecting]=useState53(!1),[loading,setLoading]=useState53(!0),[pendingFile,setPendingFile]=useState53(void 0),[pendingDocRef,setPendingDocRef]=useState53(void 0),[pickerOpen,setPickerOpen]=useState53(!1),fileInputRef=useRef11(null);loading||(initialLoadRef.current=!1);let profileRefStr=useMemo25(()=>profile?getReferenceString5(medplum.getProfile()):"",[profile,medplum]),searchMessages=useCallback11(async()=>{setLoading(!0);let searchParams=new URLSearchParams(query);searchParams.append("_sort","-sent"),searchParams.append("sent:missing","false");let searchResult=await medplum.searchResources("Communication",searchParams,{cache:"no-cache"});upsertCommunications(communicationsRef.current,searchResult,setCommunications),setLoading(!1)},[medplum,setCommunications,query]);useEffect16(()=>{searchMessages().catch(err=>showNotification5({color:"red",message:normalizeErrorString6(err)}))},[searchMessages]),useSubscription(`Communication?${query}`,bundle=>{let communication=bundle.entry?.[1]?.resource;upsertCommunications(communicationsRef.current,[communication],setCommunications),getReferenceString5(communication.sender)!==profileRefStr&&(communicationsRef.current.find(c=>c.id===communication.id)?onMessageUpdated?.(communication):onMessageReceived?.(communication))},{onWebSocketClose:useCallback11(()=>{reconnecting||setReconnecting(!0),showNotification5({color:"red",message:"Live chat disconnected. Attempting to reconnect..."})},[reconnecting]),onWebSocketOpen:useCallback11(()=>{reconnecting&&showNotification5({color:"green",message:"Live chat reconnected."})},[reconnecting]),onSubscriptionConnect:useCallback11(()=>{reconnecting&&(searchMessages().catch(err=>showNotification5({color:"red",message:normalizeErrorString6(err)})),setReconnecting(!1))},[reconnecting,searchMessages]),onError:useCallback11(err=>{onError?onError(err):showError(normalizeErrorString6(err))},[onError])});let sendMessageInternal=useCallback11(formData=>{if(inputDisabled)return;let message=formData.message?.trim()??"";!message&&!pendingFile&&!pendingDocRef||(inputRef.current&&(inputRef.current.value=""),fileInputRef.current&&(fileInputRef.current.value=""),sendMessage(message,pendingFile,pendingDocRef),setPendingFile(void 0),setPendingDocRef(void 0),scrollToBottomRef.current=!0)},[inputDisabled,sendMessage,pendingFile,pendingDocRef]);useEffect16(()=>{let latestProfile=medplum.getProfile();profile?.id!==latestProfile?.id&&(setProfile(latestProfile),setCommunications([]))});let[parentRef,parentRect]=useResizeObserver(),communicationsRef=useRef11(communications);communicationsRef.current=communications;let prevCommunicationsRef=useRef11(communications),scrollToBottomRef=useRef11(!0);useEffect16(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),useEffect16(()=>{scrollToBottomRef.current&&scrollAreaRef.current?.scrollTo&&(scrollAreaRef.current.scrollTo({top:scrollAreaRef.current.scrollHeight,...firstScrollRef.current?{duration:0}:{behavior:"smooth"}}),firstScrollRef.current=!1,scrollToBottomRef.current=!1)});let myLastDeliveredId=useMemo25(()=>{let i=communications.length;for(;i--;){let comm=communications[i];if(comm.sender?.reference===profileRefStr&&comm.received)return comm.id}return""},[communications,profileRefStr]);return profile?jsxs54(Paper2,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[!excludeHeader&&jsx94(Title8,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx94("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs54(Stack18,{align:"stretch",mt:"lg",children:[jsxs54(Group28,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(Skeleton,{height:38,circle:!0,ml:"md"}),jsx94(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs54(Group28,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx94(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs54(Group28,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(Skeleton,{height:38,circle:!0,ml:"md"}),jsx94(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs54(ScrollArea2,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx94(LoadingOverlay,{visible:loading||reconnecting,style:{width:parentRect.width,height:parentRect.height,position:"absolute",zIndex:1}}),communications.map((c,i)=>{let prevCommunication=i>0?communications[i-1]:void 0,prevCommTime=prevCommunication?parseSentTime(prevCommunication):void 0,currCommTime=parseSentTime(c),showDelivered=!!c.received&&c.id===myLastDeliveredId,payloads=c.payload??[],contentRef=payloads.find(p=>p.contentReference)?.contentReference,contentAttachment=payloads.find(p=>p.contentAttachment)?.contentAttachment,hasAttachment=!!(contentRef||contentAttachment),isSender=c.sender?.reference===profileRefStr,menu=hasAttachment?jsx94(ChatBubbleMenu,{contentRef,contentAttachment,onViewInDocuments}):null;return jsxs54(Stack18,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx94(Text19,{fz:"xs",ta:"center",children:currCommTime}),isSender?jsxs54(Group28,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94("div",{className:BaseChat_default.chatBubbleMenu,children:menu}),jsx94(ChatBubble,{alignment:"right",communication:c,showDelivered}),jsx94(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender,mb:showDelivered?void 0:"sm"})]}):jsxs54(Group28,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),jsx94(ChatBubble,{alignment:"left",communication:c}),jsx94("div",{className:BaseChat_default.chatBubbleMenu,children:menu})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsxs54("div",{className:BaseChat_default.chatInputContainer,children:[(pendingFile||pendingDocRef)&&jsxs54(Group28,{className:BaseChat_default.chatPendingFile,gap:4,align:"center",wrap:"nowrap",children:[pendingDocRef?jsx94(IconFileText,{size:"0.75rem"}):jsx94(IconPaperclip,{size:"0.75rem"}),jsx94(Text19,{fz:"xs",c:"dimmed",flex:1,truncate:!0,children:pendingDocRef?pendingDocRef.description??pendingDocRef.content?.[0]?.attachment?.title??"Document":pendingFile?.name}),jsx94(ActionIcon7,{size:"xs",variant:"subtle",color:"red",onClick:()=>{setPendingDocRef(void 0),setPendingFile(void 0),fileInputRef.current&&(fileInputRef.current.value="")},"aria-label":"Remove attachment",children:jsx94(IconX,{size:"0.75rem"})})]}),jsx94("input",{ref:fileInputRef,type:"file",style:{display:"none"},disabled:inputDisabled,onChange:e=>{let file=e.target.files?.[0];file&&(setPendingFile(file),setPendingDocRef(void 0))}}),jsx94(Form,{onSubmit:sendMessageInternal,children:jsx94(TextInput20,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",leftSectionWidth:42,rightSectionWidth:42,disabled:inputDisabled,leftSection:!inputDisabled&&uploadEnabled?jsxs54(Popover,{opened:pickerOpen,onChange:setPickerOpen,position:"top-start",withArrow:!0,shadow:"md",withinPortal:!0,children:[jsx94(Popover.Target,{children:jsx94(ActionIcon7,{onClick:()=>setPickerOpen(o=>!o),size:"1.5rem",radius:"xl",color:pendingFile||pendingDocRef?"blue":"gray",variant:pendingFile||pendingDocRef?"filled":"subtle","aria-label":"Attach file",children:jsx94(IconPaperclip,{size:"1rem",stroke:1.5})})}),jsx94(Popover.Dropdown,{p:0,children:jsx94(DocumentPicker,{subjectRef:attachmentSubjectRef,onSelect:doc=>{setPendingDocRef(doc),setPendingFile(void 0),setPickerOpen(!1)},onUpload:()=>{setPickerOpen(!1),fileInputRef.current?.click()}})})]}):void 0,rightSection:inputDisabled?void 0:jsx94(ActionIcon7,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx94(IconArrowRight,{size:"1rem",stroke:1.5})})})})]})]}):null}function ChatBubble(props){let{communication,alignment,showDelivered}=props,payloads=communication.payload??[],textContent=payloads.find(p=>p.contentString)?.contentString??"",contentRef=payloads.find(p=>p.contentReference)?.contentReference,attachment=payloads.find(p=>p.contentAttachment)?.contentAttachment,sentTime=new Date(communication.sent??-1),seenTime=new Date(communication.received??-1),senderResource=useResource2(communication.sender);return jsxs54("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsxs54(Text19,{fz:"xs",mb:"xs",fw:500,className:alignment==="right"?BaseChat_default.chatBubbleNameRight:void 0,"aria-label":"Sender name",children:[senderResource?getDisplayString4(senderResource):"[Unknown sender]","\xA0\xB7\xA0",jsx94(Text19,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),jsx94("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsxs54("div",{className:BaseChat_default.chatBubble,children:[textContent&&jsx94("span",{children:textContent}),contentRef&&jsx94(ChatBubbleDocumentReference,{reference:contentRef,hasText:!!textContent}),attachment&&jsx94(ChatBubbleAttachment,{attachment,hasText:!!textContent})]})}),showDelivered&&jsxs54("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleAttachment({attachment,hasText}){return jsx94("div",{className:hasText?BaseChat_default.chatBubbleAttachmentWithText:void 0,children:jsxs54(Group28,{gap:4,wrap:"nowrap",children:[jsx94("span",{className:BaseChat_default.chatBubbleAttachmentIcon,children:jsx94(IconPaperclip,{size:"0.75rem"})}),jsx94(Text19,{fz:"xs",truncate:!0,children:attachment.title??"File attached"})]})})}function ChatBubbleDocumentReference({reference,hasText}){let attachment=useResource2(reference)?.content?.[0]?.attachment;return attachment?jsx94(ChatBubbleAttachment,{attachment,hasText}):null}function ChatBubbleMenu({contentRef,contentAttachment,onViewInDocuments}){let docRef=useResource2(contentRef),attachment=contentRef?docRef?.content?.[0]?.attachment:contentAttachment,cachedUrl=useCachedBinaryUrl3(attachment?.url),handleDownload=()=>{let href=toSafeUrl(cachedUrl??attachment?.url);href&&window.open(href,"_blank","noopener,noreferrer")};return jsxs54(Menu4,{withinPortal:!0,position:"bottom-start",shadow:"md",children:[jsx94(Menu4.Target,{children:jsx94(ActionIcon7,{variant:"outline",color:"gray",radius:"xl",size:"sm","aria-label":"Attachment options",children:jsx94(IconDots,{size:"0.75rem"})})}),jsxs54(Menu4.Dropdown,{children:[contentRef&&onViewInDocuments&&jsx94(Menu4.Item,{leftSection:jsx94(IconFileExport,{size:"0.9rem"}),onClick:()=>onViewInDocuments(contentRef),children:"View in Documents"}),jsx94(Menu4.Item,{leftSection:jsx94(IconDownload,{size:"0.9rem"}),onClick:handleDownload,children:"Download"})]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs54("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx94("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx94("div",{style:{position:"relative"},children:jsx94(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx94("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx94("div",{className:BaseChat_default.chatBubble,children:jsx94(Skeleton,{height:14,width:parentWidth*.5,radius:"l"})})})]})}import{ActionIcon as ActionIcon8}from"@mantine/core";import{useMedplumProfile as useMedplumProfile5}from"@medplum/react-hooks";import{useEffect as useEffect17,useState as useState54}from"react";var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};import{Fragment as Fragment29,jsx as jsx95,jsxs as jsxs55}from"react/jsx-runtime";function ChatModal(props){let{open,children}=props,profile=useMedplumProfile5(),[opened,setOpened]=useState54(open??!1);return useEffect17(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?jsxs55(Fragment29,{children:[opened&&jsx95("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx95("div",{className:ChatModal_default.iconContainer,children:jsx95(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx95(IconChevronDown,{size:"1.625rem"})})}):jsx95("div",{className:ChatModal_default.iconContainer,children:jsx95(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx95(IconChevronUp,{size:"1.625rem"})})})]}):null}import{createReference as createReference3,formatCodeableConcept as formatCodeableConcept2,getReferenceString as getReferenceString6}from"@medplum/core";import{useMedplum as useMedplum25,useMedplumProfile as useMedplumProfile6,usePrevious}from"@medplum/react-hooks";import{useCallback as useCallback12,useEffect as useEffect18,useMemo as useMemo26,useState as useState55}from"react";import{jsx as jsx96}from"react/jsx-runtime";function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,excludeHeader,uploadEnabled,onError,onViewInDocuments}=props,medplum=useMedplum25(),profile=useMedplumProfile6(),prevThreadId=usePrevious(thread?.id),[communications,setCommunications]=useState55([]),profileRef=useMemo26(()=>profile?createReference3(profile):void 0,[profile]),threadRef=useMemo26(()=>createReference3(thread),[thread]);useEffect18(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=useCallback12((message,file,existingDocRef)=>{let profileRefStr=profileRef?getReferenceString6(profileRef):void 0;if(!profileRefStr)return;(async()=>{let payload=[];if(message&&payload.push({contentString:message}),existingDocRef)payload.push({contentReference:createReference3(existingDocRef)});else if(file){let docRef=await medplum.createDocumentReference({data:file,contentType:file.type||"application/octet-stream",filename:file.name,additionalFields:{...thread.subject?{subject:thread.subject}:{},description:file.name}});payload.push({contentReference:createReference3(docRef)})}let communication=await medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>getReferenceString6(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload,partOf:[threadRef],subject:thread.subject});setCommunications([...communications,communication]),onMessageSent?.(communication)})().catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent]),onMessageReceived=useMemo26(()=>thread.recipient?.length===2?message=>{message.received&&message.status==="completed"||medplum.updateResource({...message,received:message.received??new Date().toISOString(),status:"completed"}).catch(console.error)}:void 0,[medplum,thread.recipient?.length]);return profile?jsx96(BaseChat,{title:title??(thread?.topic?formatCodeableConcept2(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled,excludeHeader,uploadEnabled,onError,attachmentSubjectRef:thread.subject,onViewInDocuments}):null}import{Button as Button11,Modal as Modal3,Stack as Stack22,Text as Text22,TextInput as TextInput22}from"@mantine/core";import{showNotification as showNotification6}from"@mantine/notifications";import{createReference as createReference6,HTTP_HL7_ORG as HTTP_HL7_ORG4,normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useMedplum as useMedplum29,useMedplumProfile as useMedplumProfile7}from"@medplum/react-hooks";import{useMemo as useMemo28,useState as useState58}from"react";import{Divider as Divider7,Group as Group31,Stack as Stack21,Text as Text21,Title as Title10}from"@mantine/core";import{createReference as createReference5,getExtension as getExtension2,getReferenceString as getReferenceString7}from"@medplum/core";import{QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,useMedplum as useMedplum28,useQuestionnaireForm}from"@medplum/react-hooks";import{useCallback as useCallback13,useEffect as useEffect21,useLayoutEffect as useLayoutEffect3,useMemo as useMemo27,useRef as useRef13,useState as useState57}from"react";import{Button as Button9,Paper as Paper3}from"@mantine/core";import{createReference as createReference4,HTTP_HL7_ORG as HTTP_HL7_ORG2}from"@medplum/core";import{useMedplum as useMedplum26}from"@medplum/react-hooks";import{useEffect as useEffect19,useLayoutEffect as useLayoutEffect2,useRef as useRef12}from"react";var Point=class{constructor(x,y,pressure,time){__publicField(this,"x");__publicField(this,"y");__publicField(this,"pressure");__publicField(this,"time");if(isNaN(x)||isNaN(y))throw new Error(`Point is invalid: (${x}, ${y})`);this.x=+x,this.y=+y,this.pressure=pressure||0,this.time=time||Date.now()}distanceTo(start){return Math.sqrt(Math.pow(this.x-start.x,2)+Math.pow(this.y-start.y,2))}equals(other){return this.x===other.x&&this.y===other.y&&this.pressure===other.pressure&&this.time===other.time}velocityFrom(start){return this.time!==start.time?this.distanceTo(start)/(this.time-start.time):0}},Bezier=class _Bezier{constructor(startPoint,control2,control1,endPoint,startWidth,endWidth){this.startPoint=startPoint,this.control2=control2,this.control1=control1,this.endPoint=endPoint,this.startWidth=startWidth,this.endWidth=endWidth}static fromPoints(points,widths){let c2=this.calculateControlPoints(points[0],points[1],points[2]).c2,c3=this.calculateControlPoints(points[1],points[2],points[3]).c1;return new _Bezier(points[1],c2,c3,points[2],widths.start,widths.end)}static calculateControlPoints(s1,s2,s3){let dx1=s1.x-s2.x,dy1=s1.y-s2.y,dx2=s2.x-s3.x,dy2=s2.y-s3.y,m1={x:(s1.x+s2.x)/2,y:(s1.y+s2.y)/2},m2={x:(s2.x+s3.x)/2,y:(s2.y+s3.y)/2},l1=Math.sqrt(dx1*dx1+dy1*dy1),l2=Math.sqrt(dx2*dx2+dy2*dy2),dxm=m1.x-m2.x,dym=m1.y-m2.y,k=l1+l2==0?0:l2/(l1+l2),cm={x:m2.x+dxm*k,y:m2.y+dym*k},tx=s2.x-cm.x,ty=s2.y-cm.y;return{c1:new Point(m1.x+tx,m1.y+ty),c2:new Point(m2.x+tx,m2.y+ty)}}length(){let length=0,px,py;for(let i=0;i<=10;i+=1){let t=i/10,cx=this.point(t,this.startPoint.x,this.control1.x,this.control2.x,this.endPoint.x),cy=this.point(t,this.startPoint.y,this.control1.y,this.control2.y,this.endPoint.y);if(i>0){let xdiff=cx-px,ydiff=cy-py;length+=Math.sqrt(xdiff*xdiff+ydiff*ydiff)}px=cx,py=cy}return length}point(t,start,c1,c2,end){return start*(1-t)*(1-t)*(1-t)+3*c1*(1-t)*(1-t)*t+3*c2*(1-t)*t*t+end*t*t*t}},SignatureEventTarget=class{constructor(){__publicField(this,"_et");try{this._et=new EventTarget}catch{this._et=document}}addEventListener(type,listener,options){this._et.addEventListener(type,listener,options)}dispatchEvent(event){return this._et.dispatchEvent(event)}removeEventListener(type,callback,options){this._et.removeEventListener(type,callback,options)}};function throttle(fn,wait=250){let previous=0,timeout=null,result,storedContext,storedArgs,later=()=>{previous=Date.now(),timeout=null,result=fn.apply(storedContext,storedArgs),timeout||(storedContext=null,storedArgs=[])};return function(...args){let now=Date.now(),remaining=wait-(now-previous);return storedContext=this,storedArgs=args,remaining<=0||remaining>wait?(timeout&&(clearTimeout(timeout),timeout=null),previous=now,result=fn.apply(storedContext,storedArgs),timeout||(storedContext=null,storedArgs=[])):timeout||(timeout=window.setTimeout(later,remaining)),result}}var SignaturePad=class _SignaturePad extends SignatureEventTarget{constructor(canvas,options={}){super();__publicField(this,"dotSize");__publicField(this,"minWidth");__publicField(this,"maxWidth");__publicField(this,"penColor");__publicField(this,"minDistance");__publicField(this,"velocityFilterWeight");__publicField(this,"compositeOperation");__publicField(this,"backgroundColor");__publicField(this,"throttle");__publicField(this,"canvasContextOptions");__publicField(this,"_ctx");__publicField(this,"_drawingStroke",!1);__publicField(this,"_isEmpty",!0);__publicField(this,"_dataUrl");__publicField(this,"_dataUrlOptions");__publicField(this,"_lastPoints",[]);__publicField(this,"_data",[]);__publicField(this,"_lastVelocity",0);__publicField(this,"_lastWidth",0);__publicField(this,"_strokeMoveUpdate");__publicField(this,"_strokePointerId");this.canvas=canvas,this.velocityFilterWeight=options.velocityFilterWeight||.7,this.minWidth=options.minWidth||.5,this.maxWidth=options.maxWidth||2.5,this.throttle=options.throttle??16,this.minDistance=options.minDistance??5,this.dotSize=options.dotSize||0,this.penColor=options.penColor||"black",this.backgroundColor=options.backgroundColor||"rgba(0,0,0,0)",this.compositeOperation=options.compositeOperation||"source-over",this.canvasContextOptions=options.canvasContextOptions??{},this._strokeMoveUpdate=this.throttle?throttle(_SignaturePad.prototype._strokeUpdate,this.throttle):_SignaturePad.prototype._strokeUpdate,this._handleMouseDown=this._handleMouseDown.bind(this),this._handleMouseMove=this._handleMouseMove.bind(this),this._handleMouseUp=this._handleMouseUp.bind(this),this._handleTouchStart=this._handleTouchStart.bind(this),this._handleTouchMove=this._handleTouchMove.bind(this),this._handleTouchEnd=this._handleTouchEnd.bind(this),this._handlePointerDown=this._handlePointerDown.bind(this),this._handlePointerMove=this._handlePointerMove.bind(this),this._handlePointerUp=this._handlePointerUp.bind(this),this._handlePointerCancel=this._handlePointerCancel.bind(this),this._handleTouchCancel=this._handleTouchCancel.bind(this),this._ctx=canvas.getContext("2d",this.canvasContextOptions),this.clear(),this.on()}clear(){let{_ctx:ctx,canvas}=this;ctx.fillStyle=this.backgroundColor,ctx.clearRect(0,0,canvas.width,canvas.height),ctx.fillRect(0,0,canvas.width,canvas.height),this._data=[],this._reset(this._getPointGroupOptions()),this._isEmpty=!0,this._dataUrl=void 0,this._dataUrlOptions=void 0,this._strokePointerId=void 0}redraw(){let data2=this._data,dataUrl=this._dataUrl,dataUrlOptions=this._dataUrlOptions;this.clear(),dataUrl&&this.fromDataURL(dataUrl,dataUrlOptions),this.fromData(data2,{clear:!1})}fromDataURL(dataUrl,options={}){return new Promise((resolve,reject)=>{let image=new Image,ratio=options.ratio||window.devicePixelRatio||1,width=options.width||this.canvas.width/ratio,height=options.height||this.canvas.height/ratio,xOffset=options.xOffset||0,yOffset=options.yOffset||0;this._reset(this._getPointGroupOptions()),image.onload=()=>{this._ctx.drawImage(image,xOffset,yOffset,width,height),resolve()},image.onerror=error=>{reject(error)},image.crossOrigin="anonymous",image.src=dataUrl,this._isEmpty=!1,this._dataUrl=dataUrl,this._dataUrlOptions={...options}})}toDataURL(type="image/png",encoderOptions){return type==="image/svg+xml"?(typeof encoderOptions!="object"&&(encoderOptions=void 0),`data:image/svg+xml;base64,${btoa(this.toSVG(encoderOptions))}`):(typeof encoderOptions!="number"&&(encoderOptions=void 0),this.canvas.toDataURL(type,encoderOptions))}on(){this.canvas.style.touchAction="none",this.canvas.style.msTouchAction="none",this.canvas.style.userSelect="none",this.canvas.style.webkitUserSelect="none";let isIOS=/Macintosh/.test(navigator.userAgent)&&"ontouchstart"in document;window.PointerEvent&&!isIOS?this._handlePointerEvents():(this._handleMouseEvents(),"ontouchstart"in window&&this._handleTouchEvents())}off(){this.canvas.style.touchAction="auto",this.canvas.style.msTouchAction="auto",this.canvas.style.userSelect="auto",this.canvas.style.webkitUserSelect="auto",this.canvas.removeEventListener("pointerdown",this._handlePointerDown),this.canvas.removeEventListener("mousedown",this._handleMouseDown),this.canvas.removeEventListener("touchstart",this._handleTouchStart),this._removeMoveUpEventListeners()}_getListenerFunctions(){let canvasWindow=window.document===this.canvas.ownerDocument?window:this.canvas.ownerDocument.defaultView??this.canvas.ownerDocument;return{addEventListener:canvasWindow.addEventListener.bind(canvasWindow),removeEventListener:canvasWindow.removeEventListener.bind(canvasWindow)}}_removeMoveUpEventListeners(){let{removeEventListener}=this._getListenerFunctions();removeEventListener("pointermove",this._handlePointerMove),removeEventListener("pointerup",this._handlePointerUp),removeEventListener("pointercancel",this._handlePointerCancel),removeEventListener("mousemove",this._handleMouseMove),removeEventListener("mouseup",this._handleMouseUp),removeEventListener("touchmove",this._handleTouchMove),removeEventListener("touchend",this._handleTouchEnd),removeEventListener("touchcancel",this._handleTouchCancel)}isEmpty(){return this._isEmpty}fromData(pointGroups,{clear=!0}={}){clear&&this.clear(),this._fromData(pointGroups,this._drawCurve.bind(this),this._drawDot.bind(this)),this._data=this._data.concat(pointGroups)}toData(){return this._data}_isLeftButtonPressed(event,only){return only?event.buttons===1:(event.buttons&1)===1}_pointerEventToSignatureEvent(event){return{event,type:event.type,x:event.clientX,y:event.clientY,pressure:"pressure"in event?event.pressure:0}}_touchEventToSignatureEvent(event){let touch=event.changedTouches[0];return{event,type:event.type,x:touch.clientX,y:touch.clientY,pressure:touch.force}}_handleMouseDown(event){!this._isLeftButtonPressed(event,!0)||this._drawingStroke||this._strokeBegin(this._pointerEventToSignatureEvent(event))}_handleMouseMove(event){if(!this._isLeftButtonPressed(event,!0)||!this._drawingStroke){this._strokeEnd(this._pointerEventToSignatureEvent(event),!1);return}this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event))}_handleMouseUp(event){this._isLeftButtonPressed(event)||this._strokeEnd(this._pointerEventToSignatureEvent(event))}_handleTouchStart(event){event.targetTouches.length!==1||this._drawingStroke||(event.cancelable&&event.preventDefault(),this._strokeBegin(this._touchEventToSignatureEvent(event)))}_handleTouchMove(event){if(event.targetTouches.length===1){if(event.cancelable&&event.preventDefault(),!this._drawingStroke){this._strokeEnd(this._touchEventToSignatureEvent(event),!1);return}this._strokeMoveUpdate(this._touchEventToSignatureEvent(event))}}_handleTouchEnd(event){event.targetTouches.length===0&&(event.cancelable&&event.preventDefault(),this._strokeEnd(this._touchEventToSignatureEvent(event)))}_handlePointerCancel(event){this._allowPointerId(event)&&(event.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(event),!1))}_handleTouchCancel(event){event.cancelable&&event.preventDefault(),this._strokeEnd(this._touchEventToSignatureEvent(event),!1)}_getPointerId(event){return event.persistentDeviceId||event.pointerId}_allowPointerId(event,allowUndefined=!1){return typeof this._strokePointerId>"u"?allowUndefined:this._getPointerId(event)===this._strokePointerId}_handlePointerDown(event){this._drawingStroke||!this._isLeftButtonPressed(event)||!this._allowPointerId(event,!0)||(this._strokePointerId=this._getPointerId(event),event.preventDefault(),this._strokeBegin(this._pointerEventToSignatureEvent(event)))}_handlePointerMove(event){if(this._allowPointerId(event)){if(!this._isLeftButtonPressed(event,!0)||!this._drawingStroke){this._strokeEnd(this._pointerEventToSignatureEvent(event),!1);return}event.preventDefault(),this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event))}}_handlePointerUp(event){this._isLeftButtonPressed(event)||!this._allowPointerId(event)||(event.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(event)))}_getPointGroupOptions(group){return{penColor:group&&"penColor"in group?group.penColor:this.penColor,dotSize:group&&"dotSize"in group?group.dotSize:this.dotSize,minWidth:group&&"minWidth"in group?group.minWidth:this.minWidth,maxWidth:group&&"maxWidth"in group?group.maxWidth:this.maxWidth,velocityFilterWeight:group&&"velocityFilterWeight"in group?group.velocityFilterWeight:this.velocityFilterWeight,compositeOperation:group&&"compositeOperation"in group?group.compositeOperation:this.compositeOperation}}_strokeBegin(event){if(!this.dispatchEvent(new CustomEvent("beginStroke",{detail:event,cancelable:!0})))return;let{addEventListener}=this._getListenerFunctions();switch(event.event.type){case"mousedown":addEventListener("mousemove",this._handleMouseMove,{passive:!1}),addEventListener("mouseup",this._handleMouseUp,{passive:!1});break;case"touchstart":addEventListener("touchmove",this._handleTouchMove,{passive:!1}),addEventListener("touchend",this._handleTouchEnd,{passive:!1}),addEventListener("touchcancel",this._handleTouchCancel,{passive:!1});break;case"pointerdown":addEventListener("pointermove",this._handlePointerMove,{passive:!1}),addEventListener("pointerup",this._handlePointerUp,{passive:!1}),addEventListener("pointercancel",this._handlePointerCancel,{passive:!1});break;default:}this._drawingStroke=!0;let pointGroupOptions=this._getPointGroupOptions(),newPointGroup={...pointGroupOptions,points:[]};this._data.push(newPointGroup),this._reset(pointGroupOptions),this._strokeUpdate(event)}_strokeUpdate(event){if(!this._drawingStroke)return;if(this._data.length===0){this._strokeBegin(event);return}this.dispatchEvent(new CustomEvent("beforeUpdateStroke",{detail:event}));let point=this._createPoint(event.x,event.y,event.pressure),lastPointGroup=this._data[this._data.length-1],lastPoints=lastPointGroup.points,lastPoint=lastPoints.length>0&&lastPoints[lastPoints.length-1],isLastPointTooClose=lastPoint?point.distanceTo(lastPoint)<=this.minDistance:!1,pointGroupOptions=this._getPointGroupOptions(lastPointGroup);if(!lastPoint||!(lastPoint&&isLastPointTooClose)){let curve=this._addPoint(point,pointGroupOptions);lastPoint?curve&&this._drawCurve(curve,pointGroupOptions):this._drawDot(point,pointGroupOptions),lastPoints.push({time:point.time,x:point.x,y:point.y,pressure:point.pressure})}this.dispatchEvent(new CustomEvent("afterUpdateStroke",{detail:event}))}_strokeEnd(event,shouldUpdate=!0){this._removeMoveUpEventListeners(),this._drawingStroke&&(shouldUpdate&&this._strokeUpdate(event),this._drawingStroke=!1,this._strokePointerId=void 0,this.dispatchEvent(new CustomEvent("endStroke",{detail:event})))}_handlePointerEvents(){this._drawingStroke=!1,this.canvas.addEventListener("pointerdown",this._handlePointerDown,{passive:!1})}_handleMouseEvents(){this._drawingStroke=!1,this.canvas.addEventListener("mousedown",this._handleMouseDown,{passive:!1})}_handleTouchEvents(){this.canvas.addEventListener("touchstart",this._handleTouchStart,{passive:!1})}_reset(options){this._lastPoints=[],this._lastVelocity=0,this._lastWidth=(options.minWidth+options.maxWidth)/2,this._ctx.fillStyle=options.penColor,this._ctx.globalCompositeOperation=options.compositeOperation}_createPoint(x,y,pressure){let rect=this.canvas.getBoundingClientRect();return new Point(x-rect.left,y-rect.top,pressure,new Date().getTime())}_addPoint(point,options){let{_lastPoints}=this;if(_lastPoints.push(point),_lastPoints.length>2){_lastPoints.length===3&&_lastPoints.unshift(_lastPoints[0]);let widths=this._calculateCurveWidths(_lastPoints[1],_lastPoints[2],options),curve=Bezier.fromPoints(_lastPoints,widths);return _lastPoints.shift(),curve}return null}_calculateCurveWidths(startPoint,endPoint,options){let velocity=options.velocityFilterWeight*endPoint.velocityFrom(startPoint)+(1-options.velocityFilterWeight)*this._lastVelocity,newWidth=this._strokeWidth(velocity,options),widths={end:newWidth,start:this._lastWidth};return this._lastVelocity=velocity,this._lastWidth=newWidth,widths}_strokeWidth(velocity,options){return Math.max(options.maxWidth/(velocity+1),options.minWidth)}_drawCurveSegment(x,y,width){let ctx=this._ctx;ctx.moveTo(x,y),ctx.arc(x,y,width,0,2*Math.PI,!1),this._isEmpty=!1}_drawCurve(curve,options){let ctx=this._ctx,widthDelta=curve.endWidth-curve.startWidth,drawSteps=Math.ceil(curve.length())*2;ctx.beginPath(),ctx.fillStyle=options.penColor;for(let i=0;i<drawSteps;i+=1){let t=i/drawSteps,tt=t*t,ttt=tt*t,u=1-t,uu=u*u,uuu=uu*u,x=uuu*curve.startPoint.x;x+=3*uu*t*curve.control1.x,x+=3*u*tt*curve.control2.x,x+=ttt*curve.endPoint.x;let y=uuu*curve.startPoint.y;y+=3*uu*t*curve.control1.y,y+=3*u*tt*curve.control2.y,y+=ttt*curve.endPoint.y;let width=Math.min(curve.startWidth+ttt*widthDelta,options.maxWidth);this._drawCurveSegment(x,y,width)}ctx.closePath(),ctx.fill()}_drawDot(point,options){let ctx=this._ctx,width=options.dotSize>0?options.dotSize:(options.minWidth+options.maxWidth)/2;ctx.beginPath(),this._drawCurveSegment(point.x,point.y,width),ctx.closePath(),ctx.fillStyle=options.penColor,ctx.fill()}_fromData(pointGroups,drawCurve,drawDot){for(let group of pointGroups){let{points}=group,pointGroupOptions=this._getPointGroupOptions(group);if(points.length>1)for(let j=0;j<points.length;j+=1){let basicPoint=points[j],point=new Point(basicPoint.x,basicPoint.y,basicPoint.pressure,basicPoint.time);j===0&&this._reset(pointGroupOptions);let curve=this._addPoint(point,pointGroupOptions);curve&&drawCurve(curve,pointGroupOptions)}else this._reset(pointGroupOptions),drawDot(points[0],pointGroupOptions)}}toSVG({includeBackgroundColor=!1,includeDataUrl=!1}={}){let pointGroups=this._data,ratio=Math.max(window.devicePixelRatio||1,1),minX=0,minY=0,maxX=this.canvas.width/ratio,maxY=this.canvas.height/ratio,svg=document.createElementNS("http://www.w3.org/2000/svg","svg");if(svg.setAttribute("xmlns","http://www.w3.org/2000/svg"),svg.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink"),svg.setAttribute("viewBox",`${minX} ${minY} ${maxX} ${maxY}`),svg.setAttribute("width",maxX.toString()),svg.setAttribute("height",maxY.toString()),includeBackgroundColor&&this.backgroundColor){let rect=document.createElement("rect");rect.setAttribute("width","100%"),rect.setAttribute("height","100%"),rect.setAttribute("fill",this.backgroundColor),svg.appendChild(rect)}if(includeDataUrl&&this._dataUrl){let ratio2=this._dataUrlOptions?.ratio||window.devicePixelRatio||1,width=this._dataUrlOptions?.width||this.canvas.width/ratio2,height=this._dataUrlOptions?.height||this.canvas.height/ratio2,xOffset=this._dataUrlOptions?.xOffset||0,yOffset=this._dataUrlOptions?.yOffset||0,image=document.createElement("image");image.setAttribute("x",xOffset.toString()),image.setAttribute("y",yOffset.toString()),image.setAttribute("width",width.toString()),image.setAttribute("height",height.toString()),image.setAttribute("preserveAspectRatio","none"),image.setAttribute("href",this._dataUrl),svg.appendChild(image)}return this._fromData(pointGroups,(curve,{penColor})=>{let path=document.createElement("path");if(!isNaN(curve.control1.x)&&!isNaN(curve.control1.y)&&!isNaN(curve.control2.x)&&!isNaN(curve.control2.y)){let attr=`M ${curve.startPoint.x.toFixed(3)},${curve.startPoint.y.toFixed(3)} C ${curve.control1.x.toFixed(3)},${curve.control1.y.toFixed(3)} ${curve.control2.x.toFixed(3)},${curve.control2.y.toFixed(3)} ${curve.endPoint.x.toFixed(3)},${curve.endPoint.y.toFixed(3)}`;path.setAttribute("d",attr),path.setAttribute("stroke-width",(curve.endWidth*2.25).toFixed(3)),path.setAttribute("stroke",penColor),path.setAttribute("fill","none"),path.setAttribute("stroke-linecap","round"),svg.appendChild(path)}},(point,{penColor,dotSize,minWidth,maxWidth})=>{let circle=document.createElement("circle"),size=dotSize>0?dotSize:(minWidth+maxWidth)/2;circle.setAttribute("r",size.toString()),circle.setAttribute("cx",point.x.toString()),circle.setAttribute("cy",point.y.toString()),circle.setAttribute("fill",penColor),svg.appendChild(circle)}),svg.outerHTML}};import{jsx as jsx97,jsxs as jsxs56}from"react/jsx-runtime";function SignatureInput(props){let medplum=useMedplum26(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=useRef12(null),signaturePadRef=useRef12(null),onChangeRef=useRef12(onChange);return useLayoutEffect2(()=>{onChangeRef.current=onChange}),useEffect19(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:HTTP_HL7_ORG2+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??createReference4(medplum.getProfile()),data:signaturePadRef.current?.toDataURL().split(",")[1]})}if(canvasRef.current){let signaturePad=new SignaturePad(canvasRef.current);defaultValue2?.data&&signaturePad.fromDataURL(defaultValue2.data).catch(console.error),signaturePad.addEventListener("endStroke",handleEndStroke),signaturePadRef.current=signaturePad}return()=>{signaturePadRef.current&&signaturePadRef.current.removeEventListener("beginStroke",handleEndStroke)}},[medplum,defaultValue2,who]),jsxs56(Paper3,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[jsx97("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),jsx97(Button9,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:jsx97(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}import{Divider as Divider6,Stack as Stack20}from"@mantine/core";import{isQuestionEnabled,QuestionnaireItemType as QuestionnaireItemType3}from"@medplum/react-hooks";import{Fragment as Fragment32}from"react";import{Title as Title9}from"@mantine/core";import{jsx as jsx98,jsxs as jsxs57}from"react/jsx-runtime";function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return jsxs57("div",{children:[props.item.text&&jsx98(Title9,{order:4,mb:"md",children:props.item.text}),jsx98(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}import{Checkbox as Checkbox5,Group as Group29,MultiSelect,NativeSelect as NativeSelect10,Radio,Text as Text20,Textarea as Textarea3,TextInput as TextInput21}from"@mantine/core";import{capitalize as capitalize3,deepEquals,formatCoding as formatCoding2,getElementDefinition,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG3,stringify as stringify2,typedValueToString}from"@medplum/core";import{getItemAnswerOptionValue,getItemInitialValue,getNewMultiSelectValues,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,QUESTIONNAIRE_ITEM_CONTROL_URL,QuestionnaireItemType,useMedplum as useMedplum27}from"@medplum/react-hooks";import{useEffect as useEffect20,useState as useState56}from"react";import{Fragment as Fragment30,jsx as jsx99,jsxs as jsxs58}from"react/jsx-runtime";var MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS=30,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS=50;function QuestionnaireFormItem(props){let formState=props.formState,item=props.item,response=props.responseItem;function onChangeAnswer(newResponseAnswer){if(formState&&props.context)if(item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice){let updatedAnswers=[...response.answer||[]];newResponseAnswer.length===0?updatedAnswers.splice(props.index,1):updatedAnswers[props.index]=newResponseAnswer[0],formState.onChangeAnswer(props.context,props.item,updatedAnswers)}else formState.onChangeAnswer(props.context,props.item,newResponseAnswer)}let type=item.type;if(!type)return null;let name=item.linkId;if(!name)return null;let inputId=item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice?`${name}-${props.index}`:name,initial;item.initial&&item.initial.length>0?initial=item.initial[0]:item.answerOption&&item.answerOption.length>0&&(initial=item.answerOption.find(option=>option.initialSelected));let defaultValue2=getCurrentAnswer(response,props.index)??getItemInitialValue(initial),validationError=getExtension(response,`${HTTP_HL7_ORG3}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx99("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx99(CheckboxFormSection,{title:props.item.text,htmlFor:inputId,children:jsx99(Checkbox5,{id:inputId,name,required:props.required??item.required,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueBoolean:e.currentTarget.checked}])})},props.item.linkId);break;case QuestionnaireItemType.decimal:formComponent=jsx99(TextInput21,{type:"number",step:"any",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueDecimal:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.integer:formComponent=jsx99(TextInput21,{type:"number",step:1,id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueInteger:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.date:formComponent=jsx99(TextInput21,{type:"date",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueDate:e.currentTarget.value}])});break;case QuestionnaireItemType.dateTime:formComponent=jsx99(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case QuestionnaireItemType.time:formComponent=jsx99(TextInput21,{type:"time",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueTime:e.currentTarget.value}])});break;case QuestionnaireItemType.string:case QuestionnaireItemType.url:formComponent=jsx99(TextInput21,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.text:formComponent=jsx99(Textarea3,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.attachment:formComponent=jsx99(Group29,{py:4,children:jsx99(AttachmentInput,{path:"",name:inputId,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case QuestionnaireItemType.reference:formComponent=jsx99(ReferenceInput,{name:inputId,required:props.required??item.required,targetTypes:getQuestionnaireItemReferenceTargetTypes(item),searchCriteria:getQuestionnaireItemReferenceFilter(item,formState?.subject,formState?.encounter),defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueReference:newValue}])});break;case QuestionnaireItemType.quantity:formComponent=jsx99(QuantityInput,{path:"",name:inputId,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueQuantity:newValue}]),disableWheel:!0});break;case QuestionnaireItemType.choice:case QuestionnaireItemType.openChoice:{let{widget,multiselect}=resolveChoiceControl(item),sharedProps={name:inputId,item,required:props.required??item.required,initial,response,multiselect,onChangeAnswer};widget==="check-box"?formComponent=jsx99(QuestionnaireCheckboxInput,{...sharedProps}):widget==="drop-down"?formComponent=jsx99(QuestionnaireDropdownInput,{...sharedProps}):formComponent=jsx99(QuestionnaireRadioButtonInput,{...sharedProps})}break;default:return null}return jsxs58(Fragment30,{children:[formComponent,validationError?.valueString&&jsx99(Text20,{c:"red",size:"lg",mt:4,children:validationError.valueString})]})}function QuestionnaireDropdownInput(props){let{name,item,required,initial,onChangeAnswer,response,multiselect}=props;if(!item.answerOption?.length&&!item.answerValueSet)return jsx99(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||multiselect;if(item.answerValueSet)return jsx99(ValueSetAutocomplete,{name,placeholder:"Select items",binding:item.answerValueSet,maxValues:isMultiSelect?void 0:1,required,onChange:values=>{isMultiSelect?values.length===0?onChangeAnswer([{}]):onChangeAnswer(values.map(coding=>({valueCoding:coding}))):onChangeAnswer([{valueCoding:values[0]}])},defaultValue:defaultValue2?.value});if(isMultiSelect){let{propertyName,data:data2}=formatSelectData(item);return jsx99(MultiSelect,{data:data2,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[typedValueToString(initialValue)],required,onChange:selected=>{if(selected.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(selected,propertyName,item);onChangeAnswer(values)}}})}else{let data2=[""];if(item.answerOption)for(let option of item.answerOption){let optionValue=getItemAnswerOptionValue(option);data2.push(typedValueToString(optionValue))}return jsx99(NativeSelect10,{id:name,name,required,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){onChangeAnswer([{}]);return}let option=item.answerOption[index-1],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize3(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])},defaultValue:formatCoding2(defaultValue2?.value)||defaultValue2?.value,data:data2})}}function getValueSetOptions(valueSetUrl,medplum){return valueSetUrl?medplum.valueSetExpand({url:valueSetUrl,count:MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS+1}).then(valueSet=>valueSet.expansion?.contains??[]):Promise.resolve([])}function useValueSetOptions(valueSetUrl){let medplum=useMedplum27(),[valueSetOptions,setValueSetOptions]=useState56([]),[isLoading,setIsLoading]=useState56(!1);return useEffect20(()=>{async function loadValueSet(){if(valueSetUrl){setIsLoading(!0);try{let options=await getValueSetOptions(valueSetUrl,medplum);setValueSetOptions(options)}catch(err){console.error("Error loading value set:",err)}finally{setIsLoading(!1)}}}loadValueSet().catch(console.error)},[valueSetUrl,medplum]),[valueSetOptions,isLoading]}function getOptionsFromValueSet(valueSetOptions,name){return valueSetOptions.map((option,i)=>{let optionName=`${name}-valueset-${i}`,optionValue={type:"Coding",value:{system:option.system,code:option.code,display:option.display}};return[optionName,optionValue]})}function QuestionnaireRadioButtonInput(props){let{name,item,required,initial,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition("QuestionnaireItemAnswerOption","value[x]"),initialValue=getItemInitialValue(initial),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),options=[],defaultValue2;if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?(initialValue&&stringify2(optionValue)===stringify2(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return jsx99(Text20,{children:"Loading options..."});if(options.length===0)return jsx99(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs58(Fragment30,{children:[jsx99(Radio.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+capitalize3(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>jsx99(Radio,{id:optionName,value:optionName,py:4,required,label:jsx99(ResourcePropertyDisplay,{property:valueElementDefinition,propertyType:optionValue.type,value:optionValue.value})},optionName))}),(item.answerValueSet&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS||item.answerOption&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS)&&jsxs58(Text20,{size:"sm",c:"dimmed",mt:"xs",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function QuestionnaireCheckboxInput(props){let{name,item,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition("QuestionnaireItemAnswerOption","value[x]"),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),initialSelectedValues=item.answerValueSet?(response?.answer?.map(a=>a.valueCoding)||[]).filter(c=>c!==void 0):getCurrentMultiSelectAnswer(response),[selectedValues,setSelectedValues]=useState56(initialSelectedValues),options=[];if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?[optionName,optionValue]:null}).filter(option=>option!==null);options.push(...mappedOptions)}if(isLoading)return jsx99(Text20,{children:"Loading options..."});if(options.length===0)return jsx99(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS),handleCheckboxChange=(optionValue,selected)=>{if(item.answerValueSet){let currentCodings=selectedValues,newCodings;selected?newCodings=[...currentCodings,optionValue.value]:newCodings=currentCodings.filter(c=>!deepEquals(c,optionValue.value)),setSelectedValues(newCodings),newCodings.length===0?onChangeAnswer([{}]):onChangeAnswer(newCodings.map(coding=>({valueCoding:coding})))}else{let currentValues=selectedValues,optionValueStr=typedValueToString(optionValue),newValues;if(selected?newValues=[...currentValues,optionValueStr]:newValues=currentValues.filter(v=>v!==optionValueStr),setSelectedValues(newValues),newValues.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(newValues,"value"+capitalize3(optionValue.type),item);onChangeAnswer(values)}}};return jsxs58(Group29,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=typedValueToString(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>deepEquals(coding,optionValue.value)):selectedValues.includes(optionValueStr);return jsx99(Checkbox5,{id:optionName,label:jsx99(ResourcePropertyDisplay,{property:valueElementDefinition,propertyType:optionValue.type,value:optionValue.value}),checked:isChecked,onChange:event=>handleCheckboxChange(optionValue,event.currentTarget.checked)},optionName)}),(item.answerValueSet&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS||item.answerOption&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS)&&jsxs58(Text20,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx99(TextInput21,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){return getItemAnswerOptionValue(response?.answer?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response?.answer;return results?results.map(a=>getItemAnswerOptionValue(a)).map(type=>formatCoding2(type?.value)||type?.value).filter(Boolean):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals(option[1].value,defaultAnswer?.value))?.[0]}var choiceTypes=["drop-down","radio-button","check-box"];function resolveChoiceControl(item){let widget="radio-button",multiselect=!1;item.answerValueSet&&(widget="drop-down");for(let ext of item.extension??[]){if(ext.url!==QUESTIONNAIRE_ITEM_CONTROL_URL)continue;let code=ext.valueCodeableConcept?.coding?.[0]?.code;choiceTypes.includes(code)&&(widget=code),code==="multi-select"&&(multiselect=!0)}return widget==="radio-button"&&multiselect&&(widget="check-box"),{widget,multiselect}}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize3(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}import{Anchor as Anchor9}from"@mantine/core";import{Fragment as Fragment31,jsx as jsx100,jsxs as jsxs59}from"react/jsx-runtime";function QuestionnaireFormRepeatableGroup(props){return jsxs59(Fragment31,{children:[props.responseItems.map(response=>jsx100(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),jsx100(Anchor9,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}import{Anchor as Anchor10,Stack as Stack19}from"@mantine/core";import{QuestionnaireItemType as QuestionnaireItemType2}from"@medplum/react-hooks";import{jsx as jsx101,jsxs as jsxs60}from"react/jsx-runtime";function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,isChoiceType=item.type===QuestionnaireItemType2.choice||item.type===QuestionnaireItemType2.openChoice,showAddButton=!isChoiceType,answers=!isChoiceType&&responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return jsxs60(FormSection,{title:props.item.text,withAsterisk:props.item.required,children:[jsx101(Stack19,{gap:"xs",children:answers?.map((_,index)=>jsx101(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&jsx101(Anchor10,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}import{jsx as jsx102,jsxs as jsxs61}from"react/jsx-runtime";function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props,isTopLevel=context.length===0,hasRenderedSection=!1;return jsx102(Stack20,{gap:"xl",children:items.map((item,index)=>{if(!isQuestionEnabled(item,formState.questionnaireResponse))return null;let isGroup=item.type===QuestionnaireItemType3.group,showSectionDivider=isTopLevel&&isGroup&&hasRenderedSection;if(isGroup&&(hasRenderedSection=!0),item.type===QuestionnaireItemType3.display)return jsx102("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===QuestionnaireItemType3.group&&item.repeats?jsxs61(Fragment32,{children:[showSectionDivider&&jsx102(Divider6,{color:"var(--mantine-color-gray-2)"}),jsx102(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems})]},`repeating-group-${item.id}-${index}`):item.type===QuestionnaireItemType3.group?jsxs61(Fragment32,{children:[showSectionDivider&&jsx102(Divider6,{color:"var(--mantine-color-gray-2)"}),jsx102(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]})]},`group-${item.id}-${index}`):item.type===QuestionnaireItemType3.boolean?jsx102(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?jsx102(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):jsx102(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:jsx102(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}import{Button as Button10,Group as Group30,Stepper}from"@mantine/core";import{Fragment as Fragment33,jsx as jsx103,jsxs as jsxs62}from"react/jsx-runtime";function QuestionnaireFormStepper(props){let{formState,submitButtonText,excludeButtons,children}=props,pages=formState.pages,activePage=formState.activePage,showBackButton=activePage>0,showNextButton=activePage<pages.length-1,showSubmitButton=activePage===pages.length-1;return jsxs62(Fragment33,{children:[jsx103(Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>jsx103(Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&jsxs62(Group30,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx103(Button10,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&jsx103(Button10,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&jsx103(SubmitButton,{children:submitButtonText??"Submit"})]})]})}import{Fragment as Fragment34,jsx as jsx104,jsxs as jsxs63}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum28(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=useState57(!1),propsRef=useRef13(props),pendingChangeRef=useRef13(void 0);useLayoutEffect3(()=>{propsRef.current=props});let onFormChange=useCallback13(response=>{pendingChangeRef.current=response},[]),formState=useQuestionnaireForm({questionnaire:props.questionnaire,defaultValue:props.questionnaireResponse,subject:props.subject,encounter:props.encounter,source:props.source,disablePagination:props.disablePagination,onChange:onFormChange}),formStateRef=useRef13(formState);useLayoutEffect3(()=>{formStateRef.current=formState}),useEffect21(()=>{let pendingChange=pendingChangeRef.current;pendingChange&&(pendingChangeRef.current=void 0,setSignatureRequiredSubmitted(!1),propsRef.current.onChange?.(pendingChange))});let isSignatureRequired=useMemo27(()=>formState.loading?!1:!!getExtension2(formState.questionnaire,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=useMemo27(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=useCallback13(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire2=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=createReference5(profile))}onSubmit({...response,questionnaire:questionnaire2.url??getReferenceString7(questionnaire2),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:jsxs63(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&jsx104(Title10,{order:1,fz:"1.625rem",fw:700,lh:1.3,mb:"xl",children:formState.questionnaire.title}),props.afterHeader&&jsxs63(Stack21,{gap:"xl",mb:"xl",children:[props.afterHeader,jsx104(Divider7,{color:"var(--mantine-color-gray-2)"})]}),formState.pagination?jsx104(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:jsx104(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):jsxs63(Fragment34,{children:[jsx104(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&jsxs63(Stack21,{mt:"md",gap:0,children:[jsx104(Text21,{size:"sm",fw:500,children:"Signature"}),jsx104(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&jsx104(Text21,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&jsx104(Group31,{justify:"flex-end",mt:"xl",gap:"xs",children:jsx104(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}import{jsx as jsx105,jsxs as jsxs64}from"react/jsx-runtime";var NewTopicDialog=props=>{let{subject,opened,onClose,onSubmit,allowPatientSelection=!1}=props,medplum=useMedplum29(),profile=useMedplumProfile7(),profileRef=useMemo28(()=>profile?createReference6(profile):void 0,[profile]),[topic,setTopic]=useState58(""),[practitioners,setPractitioners]=useState58(profile?.resourceType==="Practitioner"?[createReference6(profile)]:[]),[patient,setPatient]=useState58(subject?createReference6(subject):void 0),initialResponse=useMemo28(()=>{if(profile?.resourceType==="Practitioner")return{resourceType:"QuestionnaireResponse",status:"in-progress",item:[{linkId:"q1",answer:[{valueReference:createReference6(profile)}]}]}},[profile]);return jsx105(Modal3,{opened,onClose,title:"New Message",size:"md",children:jsxs64(Stack22,{gap:"xl",children:[jsxs64(Stack22,{gap:0,children:[jsx105(Text22,{fw:500,children:"Patient"}),allowPatientSelection&&jsx105(Text22,{c:"dimmed",children:"Select a patient"}),jsx105(ResourceInput,{resourceType:"Patient",name:"patient",required:!0,defaultValue:patient,disabled:!allowPatientSelection&&!!patient,onChange:value=>{setPatient(value?createReference6(value):void 0)}})]}),jsxs64(Stack22,{gap:0,children:[jsx105(Text22,{fw:500,children:"Practitioner (optional)"}),jsx105(Text22,{c:"dimmed",children:"Select one or more practitioners"}),jsx105(QuestionnaireForm,{questionnaire,questionnaireResponse:initialResponse,excludeButtons:!0,onChange:value=>{let references=value.item?.[0].answer?.map(item=>item.valueReference).filter(ref=>ref!==void 0)??[];setPractitioners(references)}})]}),jsxs64(Stack22,{gap:0,children:[jsx105(Text22,{fw:500,children:"Topic (optional)"}),jsx105(Text22,{c:"dimmed",children:"Enter a topic for the message"}),jsx105(TextInput22,{placeholder:"Enter your topic",value:topic,onChange:e=>setTopic(e.target.value)})]}),jsx105(Button11,{onClick:async()=>{if(!patient){showNotification6({title:"Error",message:"Please select a patient",color:"red"});return}let communication={resourceType:"Communication",status:"in-progress",subject:patient,sender:profileRef,recipient:[patient,...practitioners.map(practitioner=>({reference:practitioner.reference}))],topic:{text:topic}};try{let createdCommunication=await medplum.createResource(communication);onSubmit?.(createdCommunication),onClose()}catch(error){showNotification6({title:"Error",message:normalizeErrorString7(error),color:"red"})}},children:"Next"})]})})},questionnaire={resourceType:"Questionnaire",status:"active",item:[{linkId:"q1",type:"reference",repeats:!0,extension:[{url:`${HTTP_HL7_ORG4}/fhir/StructureDefinition/questionnaire-referenceResource`,valueCodeableConcept:{coding:[{system:`${HTTP_HL7_ORG4}/fhir/fhir-types`,display:"Practitioner",code:"Practitioner"}]}}]}]};import{ActionIcon as ActionIcon9,Checkbox as Checkbox6,CloseButton,Group as Group32,Indicator,Popover as Popover2,Stack as Stack23,Text as Text23,TextInput as TextInput23,Tooltip as Tooltip4}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback3,useDisclosure}from"@mantine/hooks";import{showNotification as showNotification7}from"@mantine/notifications";import{createReference as createReference7,formatHumanName as formatHumanName7,getReferenceString as getReferenceString8,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useMedplum as useMedplum30,useMedplumProfile as useMedplumProfile8,useResource as useResource3}from"@medplum/react-hooks";import{useEffect as useEffect22,useMemo as useMemo29,useState as useState59}from"react";var ParticipantFilter_default={participantItem:"ParticipantFilter_participantItem"};import{jsx as jsx106,jsxs as jsxs65}from"react/jsx-runtime";function ParticipantFilter(props){let{selectedParticipants,onFilterChange}=props,[opened,{open,close}]=useDisclosure(!1),[searchQuery,setSearchQuery]=useState59(""),[searchResults,setSearchResults]=useState59([]),[isSearching,setIsSearching]=useState59(!1),medplum=useMedplum30(),profile=useMedplumProfile8(),currentUserParticipant=useMemo29(()=>{if(profile)return createReference7(profile)},[profile]),additionalParticipants=useMemo29(()=>{let currentUserRef=currentUserParticipant?.reference;return selectedParticipants.filter(p=>p.reference!==currentUserRef)},[selectedParticipants,currentUserParticipant]),debouncedSearch=useDebouncedCallback3(async query=>{if(!query.trim()){setSearchResults([]);return}setIsSearching(!0);try{let bundle=await medplum.search("Patient",{_type:"Patient,Practitioner",name:query,_count:"10"}),currentUserRef=currentUserParticipant?.reference,results=(bundle.entry??[]).map(entry=>entry.resource).filter(resource=>{if(!resource)return!1;let refString=getReferenceString8(resource);return!!refString&&refString!==currentUserRef}).map(resource=>createReference7(resource));setSearchResults(results)}catch(error){showNotification7({title:"Error",message:normalizeErrorString8(error),color:"red"}),setSearchResults([])}finally{setIsSearching(!1)}},300);useEffect22(()=>(debouncedSearch(searchQuery),debouncedSearch.cancel),[searchQuery,debouncedSearch]);let isSelected=participant=>selectedParticipants.some(p=>p.reference===participant.reference),toggleParticipant=participant=>{let newParticipants=isSelected(participant)?selectedParticipants.filter(p=>p.reference!==participant.reference):[...selectedParticipants,participant];onFilterChange(newParticipants)},removeParticipant=participant=>{let newParticipants=selectedParticipants.filter(p=>p.reference!==participant.reference);onFilterChange(newParticipants)},displayParticipants=useMemo29(()=>{let result=[];for(let p of additionalParticipants)result.some(r2=>r2.reference===p.reference)||result.push(p);if(searchQuery.trim()&&searchResults.length>0)for(let p of searchResults)currentUserParticipant?.reference!==p.reference&&(result.some(r2=>r2.reference===p.reference)||result.push(p));return result},[additionalParticipants,searchQuery,searchResults,currentUserParticipant]),hasActiveFilter=selectedParticipants.length>0;return jsxs65(Popover2,{opened,onChange:o=>!o&&close(),position:"bottom-start",width:360,shadow:"md",radius:"md",withinPortal:!0,children:[jsx106(Popover2.Target,{children:jsx106(Tooltip4,{label:"Message Participants",position:"bottom",openDelay:500,disabled:opened,children:jsx106(Indicator,{disabled:!hasActiveFilter,color:"blue",size:8,offset:4,children:jsx106(ActionIcon9,{variant:"transparent",onClick:opened?close:open,radius:"xl",size:32,className:"outline-icon-button","data-opened":opened||void 0,children:jsx106(IconUsers,{size:16})})})})}),jsx106(Popover2.Dropdown,{p:"md",children:jsxs65(Stack23,{gap:"md",children:[jsx106(Text23,{size:"xs",c:"dimmed",fw:500,children:"Message Participants"}),jsx106(TextInput23,{placeholder:"Search for a Patient or Practitioner...",value:searchQuery,autoFocus:!0,onChange:e=>setSearchQuery(e.target.value),rightSection:searchQuery?jsx106(CloseButton,{size:"sm",onClick:()=>setSearchQuery("")}):null}),jsxs65(Stack23,{gap:"xs",mah:250,style:{overflowY:"auto"},children:[currentUserParticipant&&jsx106(ParticipantItem,{participant:currentUserParticipant,isSelected:isSelected(currentUserParticipant),isCurrentUser:!0,onToggle:()=>toggleParticipant(currentUserParticipant)}),displayParticipants.map(participant=>jsx106(ParticipantItem,{participant,isSelected:isSelected(participant),isCurrentUser:!1,onToggle:()=>toggleParticipant(participant),onRemove:isSelected(participant)?()=>removeParticipant(participant):void 0},participant.reference)),isSearching&&jsx106(Text23,{size:"sm",c:"dimmed",ta:"center",children:"Searching..."}),searchQuery.trim()&&!isSearching&&searchResults.length===0&&jsx106(Text23,{size:"sm",c:"dimmed",ta:"center",children:"No results found"})]})]})})]})}function ParticipantItem(props){let{participant,isSelected,isCurrentUser,onToggle,onRemove}=props,patientResource=useResource3(participant);return patientResource?jsxs65(Group32,{justify:"space-between",wrap:"nowrap",className:ParticipantFilter_default.participantItem,children:[jsxs65(Group32,{gap:"sm",wrap:"nowrap",style:{flex:1,minWidth:0},children:[jsx106(Checkbox6,{checked:isSelected,onChange:onToggle}),jsx106(ResourceAvatar,{value:participant,radius:"xl",size:32}),jsxs65(Text23,{size:"sm",truncate:!0,style:{flex:1},children:[formatHumanName7(patientResource?.name?.[0]??{}),isCurrentUser&&jsxs65(Text23,{component:"span",c:"dimmed",size:"sm",children:[" ","(you)"]})]})]}),onRemove&&jsx106(CloseButton,{size:"sm",onClick:onRemove})]}):null}import{ActionIcon as ActionIcon12,Box as Box20,Button as Button12,Center as Center3,Divider as Divider10,Flex as Flex20,Group as Group51,Menu as Menu5,Pagination,Paper as Paper4,ScrollArea as ScrollArea3,Skeleton as Skeleton2,Stack as Stack36,Tabs,Text as Text39,ThemeIcon,Tooltip as Tooltip7}from"@mantine/core";import{useDisclosure as useDisclosure10}from"@mantine/hooks";import{showNotification as showNotification8}from"@mantine/notifications";import{getReferenceString as getReferenceString10,normalizeErrorString as normalizeErrorString10,Operator,parseSearchRequest}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate5,useThreadInbox}from"@medplum/react-hooks";import{useCallback as useCallback24,useEffect as useEffect26,useMemo as useMemo34}from"react";import{Divider as Divider8,Flex as Flex19,Group as Group49,Stack as Stack33,Text as Text37,Tooltip as Tooltip6}from"@mantine/core";import{formatHumanName as formatHumanName8,resolveId}from"@medplum/core";import{useMedplum as useMedplum39,usePatientSummaryData,useResource as useResource8}from"@medplum/react-hooks";import{useEffect as useEffect25,useMemo as useMemo33,useState as useState74}from"react";var PatientSummary_default={panel:"PatientSummary_panel",patientSummaryBadge:"PatientSummary_patientSummaryBadge",patientSummaryAddButton:"PatientSummary_patientSummaryAddButton",patientSummaryHeader:"PatientSummary_patientSummaryHeader",patientSummaryCollapseIcon:"PatientSummary_patientSummaryCollapseIcon",collapsed:"PatientSummary_collapsed"};import{Stack as Stack32}from"@mantine/core";import{calculateAgeString,formatAddress as formatAddress3}from"@medplum/core";import{Box as Box12,Flex as Flex12,Group as Group35,Modal as Modal4,Text as Text25}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{getDisplayString as getDisplayString5}from"@medplum/core";import{useMedplum as useMedplum31}from"@medplum/react-hooks";import{useCallback as useCallback15,useMemo as useMemo30,useState as useState62}from"react";import{Badge}from"@mantine/core";import{jsx as jsx107}from"react/jsx-runtime";var statusToColor={draft:"blue",active:"blue","on-hold":"yellow",revoked:"red",completed:"green","entered-in-error":"red",unknown:"gray",retired:"gray",registered:"blue",preliminary:"blue",final:"green",amended:"yellow",corrected:"yellow",cancelled:"red",requested:"blue",received:"blue",accepted:"blue",rejected:"red",ready:"blue","in-progress":"blue",failed:"red",proposed:"blue",pending:"blue",booked:"blue",arrived:"blue",fulfilled:"green",noshow:"red","checked-in":"blue",waitlist:"gray",routine:"gray",urgent:"red",asap:"red",stat:"red","not-done":"red",connected:"green",disconnected:"red",finished:"green",planned:"gray"};function StatusBadge(props){let{status,...badgeProps}=props;return jsx107(Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}import{Group as Group33,Stack as Stack24,TextInput as TextInput24}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,addProfileToResource,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback14,useState as useState60}from"react";import{jsx as jsx108,jsxs as jsxs66}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG5+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState60(allergy?.code),[clinicalStatus,setClinicalStatus]=useState60(allergy?.clinicalStatus),handleSubmit=useCallback14(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference8(patient),encounter:encounter?createReference8(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0},PATIENT_ALLERGY_PROFILE))},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx108(Form,{onSubmit:handleSubmit,children:jsxs66(Stack24,{children:[jsx108(CodeableConceptInput,{name:"allergy",label:"Code",path:"AllergyIntolerance.code","data-autofocus":!0,binding:HTTP+"cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1186.8",maxValues:1,defaultValue:allergy?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx108(TextInput24,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx108(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG5+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx108(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx108(Group33,{justify:"flex-end",gap:4,mt:"md",children:jsx108(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon10,Box as Box10,Collapse,Group as Group34,Text as Text24}from"@mantine/core";import{useState as useState61}from"react";var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title",addButton:"CollapsibleSection_addButton"};import{jsx as jsx109,jsxs as jsxs67}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState61(!1);return jsxs67(Box10,{className:CollapsibleSection_default.root,children:[jsxs67(Group34,{justify:"space-between",className:CollapsibleSection_default.header,children:[jsxs67(Group34,{gap:8,children:[jsx109(ActionIcon10,{variant:"subtle",onClick:()=>setCollapsed(c=>!c),"aria-label":collapsed?`Show ${title.toLowerCase()}`:`Hide ${title.toLowerCase()}`,className:CollapsibleSection_default.chevron,"data-collapsed":collapsed||void 0,size:"md",children:jsx109(IconChevronDown,{size:20})}),jsx109(Text24,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx109(ActionIcon10,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx109(IconPlus,{size:18})})]}),jsx109(Collapse,{in:!collapsed,children:jsx109(Box10,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}import{ActionIcon as ActionIcon11,Box as Box11}from"@mantine/core";var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};import{jsx as jsx110,jsxs as jsxs68}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs68(Box11,{className:SummaryItem_default.item,onClick,children:[children,jsx110("div",{className:SummaryItem_default.gradient}),jsx110("div",{className:SummaryItem_default.container,children:jsx110(ActionIcon11,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx110(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment35,jsx as jsx111,jsxs as jsxs69}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum31(),{patient,encounter}=props,[allergies,setAllergies]=useState62(props.allergies),[opened,{open,close}]=useDisclosure2(!1),[editAllergy,setEditAllergy]=useState62(),sortedAllergies=useMemo30(()=>[...allergies].sort((a,b)=>{let aStatus=a.clinicalStatus?.coding?.[0]?.code,bStatus=b.clinicalStatus?.coding?.[0]?.code;return aStatus==="active"&&bStatus!=="active"?-1:aStatus!=="active"&&bStatus==="active"?1:getDisplayString5(a).localeCompare(getDisplayString5(b))}),[allergies]),handleSubmit=useCallback15(async allergy=>{if(allergy.id){let updatedAllergy=await medplum.updateResource(allergy);setAllergies(allergies.map(a=>a.id===updatedAllergy.id?updatedAllergy:a))}else{let newAllergy=await medplum.createResource(allergy);setAllergies([...allergies,newAllergy])}setEditAllergy(void 0),close()},[medplum,allergies,close]);return jsxs69(Fragment35,{children:[jsx111(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx111(Box12,{children:jsx111(Flex12,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx111(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs69(Box12,{children:[jsx111(Text25,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString5(allergy)}),jsx111(Group35,{mt:2,gap:4,children:status&&jsx111(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx111(Text25,{children:"(none)"})}),jsx111(Modal4,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx111(AllergyDialog,{patient,encounter,allergy:editAllergy,onSubmit:handleSubmit})})]})}function getClinicalStatusColor(status){if(!status)return"gray";switch(status){case"active":return"red";case"inactive":return"orange";case"resolved":return"blue";default:return"gray"}}import{Box as Box13,Flex as Flex13,Group as Group36,Text as Text26}from"@mantine/core";import{formatDate}from"@medplum/core";import{useResource as useResource4}from"@medplum/react-hooks";import{jsx as jsx112,jsxs as jsxs70}from"react/jsx-runtime";function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=useResource4(coverage),organizationResource=useResource4(organization),payorName="Unknown Payor";organizationResource&&"name"in organizationResource&&typeof organizationResource.name=="string"&&(payorName=organizationResource.name);let detailsText=`ID: ${coverageResource?.subscriberId??"N/A"}${formatClassInfo(coverageResource)?` \xB7 ${formatClassInfo(coverageResource)}`:""}`;return jsx112(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs70(Box13,{children:[jsx112(Text26,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx112(Text26,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs70(Group36,{mt:2,gap:4,children:[jsx112(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs70(Text26,{size:"xs",fw:500,color:"gray.6",children:["Ends ",formatDate(coverageResource?.period?.end)]})]})]})})}function Insurance(props){let{coverages,onClickResource}=props,activeCoverages=coverages.filter(coverage=>coverage.status==="active"&&!coverage.type?.coding?.some(coding=>coding.code==="SELFPAY"));return jsx112(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx112(Flex13,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx112(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx112(Text26,{children:"(none)"})})}function capitalizeWords(str){return str.split(" ").map(word=>word.charAt(0).toUpperCase()+word.slice(1).toLowerCase()).join(" ")}function formatClassInfo(coverage){return coverage?coverage.class?.filter(cls=>cls.type?.coding?.[0]?.code!=="plan").map(cls=>{let type=cls.type?.coding?.[0]?.code??"";return`${capitalizeWords(type)}: ${cls.value}`}).join(" \xB7 ")??"":""}import{Box as Box14,Flex as Flex14,Group as Group39,Modal as Modal5,Text as Text29}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{formatDate as formatDate2,getDisplayString as getDisplayString7}from"@medplum/core";import{useState as useState65}from"react";import{Group as Group38,List,Stack as Stack26,Text as Text28,Title as Title11}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime2,formatObservationValue,isReference as isReference3}from"@medplum/core";import{useMedplum as useMedplum32,useResource as useResource6}from"@medplum/react-hooks";import{useEffect as useEffect23,useState as useState64}from"react";import{Blockquote,Stack as Stack25}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx113}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx113(Stack25,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx113(Blockquote,{classNames:{cite:NoteDisplay_default.noteCite,root:NoteDisplay_default.noteRoot},cite:note.authorReference?.display||note.authorString,icon:null,children:note.text},`note-${note.text}`))}):null}import{Group as Group37}from"@mantine/core";import{Text as Text27}from"@mantine/core";import{getDisplayString as getDisplayString6,isOk,normalizeErrorString as normalizeErrorString9}from"@medplum/core";import{useResource as useResource5}from"@medplum/react-hooks";import{useState as useState63}from"react";import{jsx as jsx114}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState63(),resource=useResource5(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString9(outcome)}]`;else if(resource)text=getDisplayString6(resource);else return null;return link?jsx114(MedplumLink,{to:value,...rest,children:text}):jsx114(Text27,{component:"span",...rest,children:text})}import{jsx as jsx115,jsxs as jsxs71}from"react/jsx-runtime";function ResourceBadge(props){return jsxs71(Group37,{gap:"xs",children:[jsx115(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx115(ResourceName,{value:props.value,link:props.link})]})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment36,jsx as jsx116,jsxs as jsxs72}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum32(),diagnosticReport=useResource6(props.value),[specimens,setSpecimens]=useState64();if(useEffect23(()=>{diagnosticReport?.specimen&&Promise.allSettled(diagnosticReport.specimen.map(ref=>medplum.readReference(ref))).then(outcomes=>outcomes.filter(outcome=>outcome.status==="fulfilled").map(outcome=>outcome.value)).then(setSpecimens).catch(console.error)},[medplum,diagnosticReport]),!diagnosticReport)return null;let specimenNotes=specimens?.flatMap(spec=>spec.note||[])||[];if(diagnosticReport.presentedForm&&diagnosticReport.presentedForm.length>0){let pf=diagnosticReport.presentedForm[0];pf.contentType?.startsWith("text/plain")&&pf.data&&specimenNotes.push({text:window.atob(pf.data)})}return jsxs72(Stack26,{children:[jsx116(Title11,{children:"Diagnostic Report"}),jsx116(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx116(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx116(NoteDisplay,{value:specimenNotes}),diagnosticReport.conclusion&&jsxs72(Stack26,{mt:"md",children:[jsx116(Text28,{fw:500,size:"sm",c:"dimmed",children:"Conclusion"}),jsx116(Text28,{children:diagnosticReport.conclusion})]})]})}function DiagnosticReportHeader({value,hideSubject=!1}){return jsxs72(Group38,{mt:"md",gap:30,children:[value.subject&&!hideSubject&&jsxs72("div",{children:[jsx116(Text28,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx116(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs72("div",{children:[jsx116(Text28,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx116(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs72("div",{children:[jsx116(Text28,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx116(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs72("div",{children:[jsx116(Text28,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx116(Text28,{children:formatDateTime2(value.issued)})]}),value.status&&jsxs72("div",{children:[jsx116(Text28,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx116(StatusBadge,{status:value.status})]})]})}function SpecimenInfo(specimens){return jsxs72(Stack26,{gap:"xs",children:[jsx116(Title11,{order:2,size:"h6",children:"Specimens"}),jsx116(List,{type:"ordered",children:specimens?.map(specimen=>jsx116(List.Item,{ml:"sm",children:jsxs72(Group38,{gap:20,children:[jsxs72(Group38,{gap:5,children:[jsx116(Text28,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs72(Group38,{gap:5,children:[jsx116(Text28,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs72("table",{className:DiagnosticReportDisplay_default.table,children:[jsx116("thead",{children:jsxs72("tr",{children:[jsx116("th",{children:"Test"}),jsx116("th",{children:"Value"}),jsx116("th",{children:"Reference Range"}),jsx116("th",{children:"Interpretation"}),jsx116("th",{children:"Category"}),jsx116("th",{children:"Performer"}),jsx116("th",{children:"Status"})]})}),jsx116("tbody",{children:jsx116(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx116(Fragment36,{children:props.value?.map(observation=>jsx116(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference3(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource6(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs72(Fragment36,{children:[jsxs72("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx116("td",{rowSpan:displayNotes?2:1,children:jsx116(MedplumLink,{to:observation,children:jsx116(CodeableConceptDisplay,{value:observation.code})})}),jsx116("td",{children:jsx116(ObservationValueDisplay,{value:observation})}),jsx116("td",{children:jsx116(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx116("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx116(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx116("td",{children:observation.category&&observation.category.length>0&&jsx116(Fragment36,{children:observation.category.map(concept=>jsx116("div",{children:jsx116(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx116("td",{children:observation.performer?.map(performer=>jsx116(ReferenceDisplay,{value:performer},performer.reference))}),jsx116("td",{children:observation.status&&jsx116(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx116(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx116("tr",{children:jsx116("td",{colSpan:6,children:jsx116(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx116(Fragment36,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx116(Fragment36,{children:range.text}):jsx116(RangeDisplay,{value:range}):null}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;return code==="AA"||code==="LL"||code==="HH"||code==="A"}import{Fragment as Fragment37,jsx as jsx117,jsxs as jsxs73}from"react/jsx-runtime";function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=useState65(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=useDisclosure3(!1),diagnosticReportsRequests=new Set,filteredDiagnosticReports=diagnosticReports.filter(report=>{let flag=isLaboratoryReport(report);return flag&&report.basedOn&&report.basedOn.forEach(basedOn=>{if(basedOn.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn.reference.split("/");diagnosticReportsRequests.add(id)}}),flag}),completedRequisitionNumbers=new Set,filteredServiceRequests=serviceRequests.filter(request=>{if(request.id&&diagnosticReportsRequests.has(request.id)||request.basedOn&&request.basedOn.find(basedOn2=>{if(basedOn2.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn2.reference.split("/");return diagnosticReportsRequests.has(id)}return!1}))return!1;let shouldFilter=shouldFilterRequest(request,completedRequisitionNumbers);return!shouldFilter&&request.requisition?.value&&completedRequisitionNumbers.add(request.requisition?.value),!shouldFilter}),handleDiagnosticReportClick=report=>{setSelectedReport(report),openReportDialog()};return jsxs73(Fragment37,{children:[jsx117(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:jsxs73(Flex14,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>jsx117(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:jsxs73(Box14,{children:[jsx117(Text29,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(serviceRequest)}),jsxs73(Group39,{mt:2,gap:4,children:[serviceRequest.status&&jsx117(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),jsx117(Text29,{size:"xs",fw:500,c:"dimmed",children:formatDate2(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>jsx117(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:jsxs73(Box14,{children:[jsx117(Text29,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(report)}),jsxs73(Group39,{mt:2,gap:4,children:[report.status&&jsx117(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),jsx117(Text29,{size:"xs",fw:500,c:"dimmed",children:formatDate2(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&jsx117(Text29,{children:"(none)"})]})}),jsx117(Modal5,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&jsx117(DiagnosticReportDisplay,{value:selectedReport,hideSubject:!0})})]})}var getStatusColor=status=>{switch(status){case"active":return"indigo";case"final":return"teal";case"cancelled":return"red";default:return"gray"}};function hasLaboratoryCategory(category){if(!category.coding||!Array.isArray(category.coding))return!1;for(let coding of category.coding)if(coding.code==="LAB")return!0;return!1}function isLaboratoryReport(report){if(!report.category||!Array.isArray(report.category))return!1;for(let category of report.category)if(hasLaboratoryCategory(category))return!0;return!1}function shouldFilterRequest(request,completedRequisitionNumbers){if(["completed","draft","entered-in-error"].includes(request.status))return!0;let requisitionNumber=request.requisition?.value;return!!(requisitionNumber&&completedRequisitionNumbers.has(requisitionNumber))}import{Box as Box15,Flex as Flex15,Group as Group41,Modal as Modal6,Text as Text30}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{getDisplayString as getDisplayString8}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback17,useState as useState67}from"react";import{Alert as Alert4,Group as Group40,Radio as Radio2,Stack as Stack27}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG6,addProfileToResource as addProfileToResource2,createReference as createReference9}from"@medplum/core";import{useMedplumProfile as useMedplumProfile9}from"@medplum/react-hooks";import{useCallback as useCallback16,useState as useState66}from"react";import{jsx as jsx118,jsxs as jsxs74}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile9(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState66(medication?.medicationCodeableConcept),handleSubmit=useCallback16(formData=>{if(!me)throw new Error("Not signed in");onSubmit(addProfileToResource2({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&createReference9(encounter)),requester:medication?.requester??createReference9(me),medicationCodeableConcept:code,subject:createReference9(patient)},HTTP_HL7_ORG6+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx118(Form,{onSubmit:handleSubmit,children:jsxs74(Stack27,{children:[jsx118(CodeableConceptInput,{name:"request",path:"MedicationRequest.medication[x]","data-autofocus":!0,binding:HTTP2+"cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1010.4",maxValues:1,defaultValue:medication?.medicationCodeableConcept,onChange:request=>setCode(request),outcome:void 0}),jsx118(Radio2.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx118(Radio2,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx118(Group40,{justify:"flex-end",gap:4,children:jsx118(SubmitButton,{children:"Save"})})]})}):jsx118(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment38,jsx as jsx119,jsxs as jsxs75}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum33(),[medicationRequests,setMedicationRequests]=useState67(props.medicationRequests),[editMedication,setEditMedication]=useState67(),[opened,{open,close}]=useDisclosure4(!1),handleSubmit=useCallback17(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m=>m.id===updatedMedication.id?updatedMedication:m))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs75(Fragment38,{children:[jsx119(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medicationRequests.length>0?jsx119(Flex15,{direction:"column",gap:8,children:medicationRequests.map(medication=>jsx119(SummaryItem,{onClick:()=>{setEditMedication(medication),open()},children:jsxs75(Box15,{children:[jsx119(Text30,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(medication)}),jsx119(Group41,{mt:2,gap:4,children:medication.status&&jsx119(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},medication.id))}):jsx119(Text30,{children:"(none)"})}),jsx119(Modal6,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx119(MedicationDialog,{patient:props.patient,encounter:props.encounter,medication:editMedication,onSubmit:handleSubmit})})]})}function getStatusColor2(status){if(!status)return"gray";switch(status){case"active":return"green";case"stopped":return"red";case"on-hold":return"yellow";case"cancelled":return"red";case"completed":return"blue";case"entered-in-error":return"red";case"draft":return"gray";default:return"gray"}}import{Box as Box16,Group as Group42,Text as Text31,Tooltip as Tooltip5}from"@mantine/core";import{jsx as jsx120,jsxs as jsxs76}from"react/jsx-runtime";var PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return jsx120(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx120(Box16,{className:PatientSummary_default.patientSummaryListItem,children:jsx120(Tooltip5,{label,position:"top-start",openDelay:650,children:jsxs76(Group42,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,jsx120(Text31,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};import{capitalize as capitalize4,getExtension as getExtension3,HTTP_HL7_ORG as HTTP_HL7_ORG7}from"@medplum/core";function getGenderIdentity(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-ethnicity`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getGeneralPractitioner(patient){return patient.generalPractitioner?.[0]?.display}function formatPatientGenderDisplay(patient){let capitalizedGender=patient.gender?capitalize4(patient.gender):"",genderIdentity=getGenderIdentity(patient),birthSex=getBirthSex(patient),parts=[];return capitalizedGender&&parts.push(capitalizedGender),genderIdentity&&parts.push(genderIdentity),birthSex&&parts.push(`Born as ${birthSex}`),parts.join(" \xB7 ")}function formatPatientRaceEthnicityDisplay(patient){let race=getRace(patient),ethnicity=getEthnicity(patient),parts=[];return race&&parts.push(race),ethnicity&&parts.push(ethnicity),parts.join(" \xB7 ")}var getPreferredLanguage=patient=>{if(!patient.communication?.length)return;let preferred=patient.communication?.find(comm=>comm.preferred===!0);return preferred?.language?.coding?.[0]?.display?preferred.language.coding[0].display:patient.communication[0]?.language?.coding?.[0]?.display};import{Box as Box17,Flex as Flex16,Group as Group43,Loader as Loader5,Modal as Modal7,Text as Text32}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{formatAddress as formatAddress2,getReferenceString as getReferenceString9,OperationOutcomeError}from"@medplum/core";import{useMedplum as useMedplum34,useResource as useResource7}from"@medplum/react-hooks";import{useCallback as useCallback18,useEffect as useEffect24,useMemo as useMemo31,useState as useState68}from"react";import{PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,addPreferredPharmacyToPatient,createPreferredPharmacyExtension,getPreferredPharmaciesFromPatient,isAddPharmacyResponse,isOrganizationArray,removePreferredPharmacyFromPatient}from"@medplum/core";import{Fragment as Fragment39,jsx as jsx121,jsxs as jsxs77}from"react/jsx-runtime";function Pharmacies(props){let{patient:patientProp,onClickResource,pharmacyDialogComponent}=props,PharmacyDialogComponent=pharmacyDialogComponent,medplum=useMedplum34(),[opened,{open,close}]=useDisclosure5(!1),[resolvedPharmacies,setResolvedPharmacies]=useState68([]),[loadState,setLoadState]=useState68("loading"),patient=useResource7(patientProp),pharmacyRefs=useMemo31(()=>patient?getPreferredPharmaciesFromPatient(patient):[],[patient]);useEffect24(()=>{let cancelled=!1;return(async()=>{if(props.pharmacies){cancelled||(setResolvedPharmacies(props.pharmacies),setLoadState("loaded"));return}if(pharmacyRefs.length===0){cancelled||(setResolvedPharmacies([]),setLoadState("loaded"));return}setLoadState("loading");try{let results=await Promise.all(pharmacyRefs.map(async pharmacyRef=>{try{return{...await medplum.readReference(pharmacyRef.organizationRef),isPrimary:pharmacyRef.isPrimary}}catch(error){return isNotFoundError(error),null}}));if(!cancelled){let validResults=results.filter(result=>result!==null);setResolvedPharmacies(validResults),setLoadState(validResults.length===0&&pharmacyRefs.length>0?"error":"loaded")}}catch{cancelled||setLoadState("error")}})().catch(()=>{}),()=>{cancelled=!0}},[medplum,pharmacyRefs,props.pharmacies]);let handleSubmit=useCallback18(async _pharmacy=>{patient?.id&&medplum.invalidateUrl(getReferenceString9(patient)),close()},[medplum,patient,close]);return patient?jsxs77(Fragment39,{children:[jsx121(CollapsibleSection,{title:"Pharmacies",onAdd:pharmacyDialogComponent?open:void 0,children:loadState==="loading"?jsx121(Loader5,{size:"sm"}):loadState==="error"?jsx121(Text32,{c:"red",size:"sm",children:"Failed to load pharmacies"}):resolvedPharmacies.length===0?jsx121(Text32,{children:"(none)"}):jsx121(Box17,{children:jsx121(Flex16,{direction:"column",gap:8,children:resolvedPharmacies.map((pharmacy,index)=>jsx121(SummaryItem,{onClick:()=>onClickResource?.(pharmacy),children:jsxs77(Box17,{children:[jsx121(Text32,{fw:500,className:SummaryItem_default.itemText,children:pharmacy.name}),jsxs77(Group43,{mt:2,gap:4,children:[pharmacy.isPrimary&&jsx121(StatusBadge,{color:"blue",variant:"light",status:"primary"}),pharmacy.address?.[0]&&jsx121(Text32,{size:"xs",c:"dimmed",children:formatAddress2(pharmacy.address[0])})]})]})},pharmacy.id||index))})})}),PharmacyDialogComponent?jsx121(Modal7,{opened,onClose:close,title:"Add Pharmacy",size:"lg",children:jsx121(PharmacyDialogComponent,{patient,onSubmit:handleSubmit,onClose:close})}):null]}):jsx121(Fragment39,{})}function isNotFoundError(error){return error instanceof OperationOutcomeError?error.outcome.issue?.some(issue=>issue.code==="not-found")??!1:!1}import{Badge as Badge2,Box as Box18,Flex as Flex17,Group as Group45,Modal as Modal8,Text as Text33,UnstyledButton as UnstyledButton4}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{formatDate as formatDate3,getDisplayString as getDisplayString9}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{useCallback as useCallback20,useMemo as useMemo32,useState as useState70}from"react";import{Group as Group44,Stack as Stack28}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG8,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference10}from"@medplum/core";import{useCallback as useCallback19,useState as useState69}from"react";import{jsx as jsx122,jsxs as jsxs78}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState69(condition?.code),[clinicalStatus,setClinicalStatus]=useState69(condition?.clinicalStatus),handleSubmit=useCallback19(formData=>{let updatedCondition=addProfileToResource3({...condition,resourceType:"Condition",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:createReference10(patient),encounter:encounter&&createReference10(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG8+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx122(Form,{onSubmit:handleSubmit,children:jsxs78(Stack28,{children:[jsx122(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG8+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx122(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG8+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx122(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx122(Group44,{justify:"flex-end",gap:4,mt:"md",children:jsx122(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment40,jsx as jsx123,jsxs as jsxs79}from"react/jsx-runtime";function getCodeKey(condition){let coding=condition.code?.coding?.[0];return coding?.system&&coding?.code?`${coding.system}|${coding.code}`:coding?.code?coding.code:condition.code?.text??condition.id}function ProblemList(props){let medplum=useMedplum35(),{patient,encounter}=props,[problems,setProblems]=useState70(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=useState70(),[opened,{open,close}]=useDisclosure6(!1),[expandedGroups,setExpandedGroups]=useState70(()=>new Set),groupedProblems=useMemo32(()=>{let groups=new Map;for(let i=0;i<problems.length;i++){let problem=problems[i],key=getCodeKey(problem)??`ungrouped-${i}`,existing=groups.get(key);existing?existing.push(problem):groups.set(key,[problem])}return Array.from(groups.entries())},[problems]),toggleGroup=useCallback20(key=>{setExpandedGroups(prev=>{let next=new Set(prev);return next.has(key)?next.delete(key):next.add(key),next})},[]),handleSubmit=useCallback20(async condition=>{if(condition.id){let updatedCondition=await medplum.updateResource(condition);setProblems(problems.map(p=>p.id===updatedCondition.id?updatedCondition:p))}else{let newCondition=await medplum.createResource(condition);setProblems([newCondition,...problems])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs79(Fragment40,{children:[jsx123(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx123(Flex17,{direction:"column",gap:8,children:groupedProblems.map(([key,group],groupIndex)=>{let isExpanded=expandedGroups.has(key),displayProblems=isExpanded?group:[group[0]],groupContentId=`problem-group-content-${groupIndex}`;return jsxs79(Box18,{children:[jsx123(Flex17,{direction:"column",gap:4,id:groupContentId,children:displayProblems.map(problem=>jsx123(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs79(Box18,{children:[jsxs79(Group45,{gap:6,wrap:"nowrap",children:[jsx123(Text33,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString9(problem)}),!isExpanded&&group.length>1&&jsxs79(Badge2,{size:"xs",color:"gray",variant:"light",style:{flexShrink:0},children:["+",group.length-1]})]}),jsxs79(Group45,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx123(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx123(Text33,{size:"xs",fw:500,c:"dimmed",children:formatDate3(problem.onsetDateTime)})]})]})},problem.id))}),group.length>1&&jsx123(UnstyledButton4,{onClick:()=>toggleGroup(key),"aria-expanded":isExpanded,"aria-controls":groupContentId,pl:4,pt:2,style:{fontSize:"var(--mantine-font-size-xs)",color:"var(--mantine-color-dimmed)"},children:isExpanded?"Show less":`Show all ${group.length} entries`})]},key)})}):jsx123(Text33,{children:"(none)"})}),jsx123(Modal8,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx123(ConditionDialog,{patient,encounter,condition:editCondition,onSubmit:handleSubmit})})]})}var getStatusColor3=status=>{if(!status)return"gray";switch(status){case"active":case"recurrence":case"relapse":return"green";case"inactive":return"orange";case"remission":return"blue";case"resolved":return"teal";default:return"gray"}};import{Box as Box19,Flex as Flex18,Group as Group46,Modal as Modal9,Radio as Radio3,Stack as Stack29,Text as Text34,UnstyledButton as UnstyledButton5}from"@mantine/core";import{useDisclosure as useDisclosure7}from"@mantine/hooks";import{createReference as createReference11,HTTP_HL7_ORG as HTTP_HL7_ORG9,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum36}from"@medplum/react-hooks";import{useCallback as useCallback21,useState as useState71}from"react";import{Fragment as Fragment41,jsx as jsx124,jsxs as jsxs80}from"react/jsx-runtime";var NULLFLAVOR=HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/v3-NullFlavor",CodesToText={38628009:"Homosexual",20430005:"Heterosexual",42035005:"Bisexual",OTH:"Other",UNK:"Unknown",ASKU:"Asked but no answer"},CodesToSystem={38628009:SNOMED,20430005:SNOMED,42035005:SNOMED,OTH:NULLFLAVOR,UNK:NULLFLAVOR,ASKU:NULLFLAVOR};function SexualOrientation(props){let{patient,encounter}=props,medplum=useMedplum36(),[sexualOrientation,setSexualOrientation]=useState71(props.sexualOrientation),[opened,{open,close}]=useDisclosure7(!1),[hoverIndex,setHoverIndex]=useState71(null),handleSubmit=useCallback21(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG9+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:createReference11(patient),encounter:encounter?createReference11(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:CodesToSystem[code],code:formData.sexualOrientation}],text:CodesToText[code]}}).then(newSexualOrientation=>{setSexualOrientation(newSexualOrientation),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs80(Fragment41,{children:[jsx124(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx124(Flex18,{direction:"column",gap:8,children:jsx124(Box19,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx124(UnstyledButton5,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx124(Box19,{pr:hoverIndex===0?24:0,children:jsx124(Text34,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx124(Text34,{children:"(none)"})}),jsx124(Modal9,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx124(Form,{onSubmit:handleSubmit,children:jsxs80(Stack29,{children:[jsx124(Radio3.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx124(Radio3,{value:code,label:text,my:"xs"},code))}),jsx124(Group46,{justify:"flex-end",gap:4,mt:"md",children:jsx124(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group47,Modal as Modal10,Radio as Radio4,Stack as Stack30,Text as Text35,UnstyledButton as UnstyledButton6}from"@mantine/core";import{useDisclosure as useDisclosure8}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG10,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference12,formatCodeableConcept as formatCodeableConcept4}from"@medplum/core";import{useMedplum as useMedplum37}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState72}from"react";import{Fragment as Fragment42,jsx as jsx125,jsxs as jsxs81}from"react/jsx-runtime";var smokingStatusOptions={266919005:"Never smoked tobacco",266927001:"Tobacco smoking consumption unknown","428041000124106":"Occasional tobacco smoker","428061000124105":"Light tobacco smoker","428071000124103":"Heavy tobacco smoker",449868002:"Smokes tobacco daily",77176002:"Smoker",8517006:"Ex-smoker"};function SmokingStatus(props){let medplum=useMedplum37(),[smokingStatus,setSmokingStatus]=useState72(props.smokingStatus),[opened,{open,close}]=useDisclosure8(!1),handleSubmit=useCallback22(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG10+"/fhir/us/core/StructureDefinition/us-core-smokingstatus"]},status:"final",category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC2,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference12(props.patient),encounter:props.encounter?createReference12(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED2,version:SNOMED2+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return jsxs81(Fragment42,{children:[jsx125(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx125(UnstyledButton6,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx125(Text35,{children:formatCodeableConcept4(smokingStatus.valueCodeableConcept)})}):jsx125(Text35,{children:"(none)"})}),jsx125(Modal10,{opened,onClose:close,title:"Set Smoking Status",children:jsx125(Form,{onSubmit:handleSubmit,children:jsxs81(Stack30,{children:[jsx125(Radio4.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx125(Radio4,{value:code,label:text,my:"xs"},code))}),jsx125(Group47,{justify:"flex-end",gap:4,mt:"md",children:jsx125(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group48,Modal as Modal11,SimpleGrid,Stack as Stack31,Text as Text36,Textarea as Textarea4,TextInput as TextInput25}from"@mantine/core";import{useDisclosure as useDisclosure9}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum38}from"@medplum/react-hooks";import{useCallback as useCallback23,useState as useState73}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference13}from"@medplum/core";function getObservationValue(obs,component){return component?obs.component?.find(c=>c.code?.coding?.[0].code===component)?.valueQuantity:obs.valueQuantity}function createObservation(patient,encounter,code,title,valueQuantity){if(isValidNumber(valueQuantity.value))return{...createBaseObservation(patient,encounter,code,title),valueQuantity}}function createCompoundObservation(patient,encounter,code,title,components){let component=components.filter(c=>isValidNumber(c.valueQuantity?.value));if(component.length!==0)return{...createBaseObservation(patient,encounter,code,title),component}}function createBaseObservation(patient,encounter,code,title){return{resourceType:"Observation",status:"preliminary",subject:createReference13(patient),encounter:encounter?createReference13(encounter):void 0,effectiveDateTime:new Date().toISOString(),category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"vital-signs",display:"Vital Signs"}]}],code:createLoincCode(code,title)}}function createLoincCode(code,display){return{coding:[{code,display,system:LOINC3}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!Number.isNaN(value)&&Number.isFinite(value)}import{Fragment as Fragment43,jsx as jsx126,jsxs as jsxs82}from"react/jsx-runtime";var BP="85354-9",SYSTOLIC="8480-6",DIASTOLIC="8462-4",LOINC_CODES=[{name:"systolic",short:"BP Sys",code:BP,component:SYSTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"diastolic",short:"BP Dias",code:BP,component:DIASTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"heartRate",short:"HR",code:"8867-4",title:"Heart Rate",unit:"/min"},{name:"bodyTemperature",short:"Temp",code:"8310-5",title:"Body Temperature",unit:"Cel"},{name:"respiratoryRate",short:"RR",code:"9279-1",title:"Respiratory Rate",unit:"/min"},{name:"height",short:"Ht",code:"8302-2",title:"Height",unit:"cm"},{name:"weight",short:"Wt",code:"29463-7",title:"Weight",unit:"kg"},{name:"bmi",short:"BMI",code:"39156-5",title:"BMI",unit:"kg/m2"},{name:"oxygen",short:"O2",code:"2708-6",title:"Oxygen",unit:"%"},{name:"headCircumference",short:"HC",code:"9843-4",title:"Head Circumference",unit:"cm"}];function Vitals(props){let medplum=useMedplum38(),{patient,encounter}=props,[vitals,setVitals]=useState73(props.vitals),[opened,{open,close}]=useDisclosure9(!1),handleSubmit=useCallback23(formData=>{let newObservations=[];newObservations.push(createCompoundObservation(patient,encounter,BP,"Blood pressure",[{code:createLoincCode(SYSTOLIC,"Systolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.systolic),"mm[Hg]")},{code:createLoincCode(DIASTOLIC,"Diastolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.diastolic),"mm[Hg]")}]));for(let meta of LOINC_CODES)meta.component||newObservations.push(createObservation(patient,encounter,meta.code,meta.title,createQuantity(Number.parseFloat(formData[meta.name]),meta.unit)));Promise.all(newObservations.filter(Boolean).map(obs=>medplum.createResource(obs))).then(newVitals=>setVitals([...newVitals,...vitals])).catch(console.error),close()},[medplum,patient,encounter,vitals,close]);return jsxs82(Fragment43,{children:[jsx126(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx126(Stack31,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs82(Group48,{align:"center",children:[jsx126(Text36,{c:"dimmed",children:meta.short}),obs&&jsx126(Text36,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx126(Modal11,{opened,onClose:close,title:"Add Vitals",children:jsxs82(Form,{onSubmit:handleSubmit,children:[jsx126(SimpleGrid,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx126(TextInput25,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx126(Textarea4,{name:"notes",label:"Notes"}),jsx126(Group48,{justify:"flex-end",gap:4,mt:"md",children:jsx126(SubmitButton,{children:"Save"})})]})})]})}import{jsx as jsx127,jsxs as jsxs83}from"react/jsx-runtime";var DemographicsSection={key:"demographics",title:"Demographics",component:({patient,onClickResource})=>{let languageDisplay=getPreferredLanguage(patient);return jsxs83(Stack32,{gap:"xs",py:8,children:[jsx127(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${calculateAgeString(patient.birthDate)})`:void 0,icon:jsx127(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),jsx127(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:jsx127(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),jsx127(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:jsx127(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),jsx127(PatientInfoItem,{patient,value:patient.address?.[0]?formatAddress3(patient.address[0]):void 0,icon:jsx127(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),jsx127(PatientInfoItem,{patient,value:languageDisplay,icon:jsx127(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),jsx127(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:jsx127(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add General Practitioner",label:"General Practitioner",onClickResource})]})}},InsuranceSection={key:"insurance",title:"Insurance",searches:[{key:"coverages",resourceType:"Coverage",patientParam:"beneficiary"}],component:({results,onClickResource})=>jsx127(Insurance,{coverages:results.coverages||[],onClickResource})},AllergiesSection={key:"allergies",title:"Allergies",searches:[{key:"allergies",resourceType:"AllergyIntolerance",patientParam:"patient"}],component:({results,patient,onClickResource})=>jsx127(Allergies,{patient,allergies:results.allergies||[],onClickResource})},ProblemListSection={key:"problemList",title:"Problems",searches:[{key:"conditions",resourceType:"Condition",patientParam:"patient"}],component:({results,patient,onClickResource})=>jsx127(ProblemList,{patient,problems:results.conditions||[],onClickResource})},MedicationsSection={key:"medications",title:"Medications",searches:[{key:"medications",resourceType:"MedicationRequest",patientParam:"subject"}],component:({results,patient,onClickResource})=>jsx127(Medications,{patient,medicationRequests:results.medications||[],onClickResource})};function createLabsSection(onRequestLabs){return{key:"labs",title:"Labs",searches:[{key:"serviceRequests",resourceType:"ServiceRequest",patientParam:"subject"},{key:"diagnosticReports",resourceType:"DiagnosticReport",patientParam:"subject"}],component:({results,patient,onClickResource})=>jsx127(Labs,{patient,serviceRequests:results.serviceRequests||[],diagnosticReports:results.diagnosticReports||[],onClickResource,onRequestLabs})}}var LabsSection=createLabsSection(),SexualOrientationSection={key:"sexualOrientation",title:"Sexual Orientation",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{code:"76690-7"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return jsx127(SexualOrientation,{patient,sexualOrientation:observations[0],onClickResource})}},SmokingStatusSection={key:"smokingStatus",title:"Smoking Status",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{code:"72166-2"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return jsx127(SmokingStatus,{patient,smokingStatus:observations[0],onClickResource})}},VitalsSection={key:"vitals",title:"Vitals",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{category:"vital-signs"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return jsx127(Vitals,{patient,vitals:observations,onClickResource})}};function createPharmaciesSection(pharmacyDialogComponent){return{key:"pharmacies",title:"Pharmacies",component:({patient,onClickResource})=>jsx127(Pharmacies,{patient,onClickResource,pharmacyDialogComponent})}}var PharmaciesSection=createPharmaciesSection();function getDefaultSections(onRequestLabs){return[DemographicsSection,InsuranceSection,AllergiesSection,ProblemListSection,MedicationsSection,createLabsSection(onRequestLabs),SexualOrientationSection,SmokingStatusSection,VitalsSection,PharmaciesSection]}import{Fragment as Fragment44,jsx as jsx128,jsxs as jsxs84}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum39(),{patient:propsPatient,onClickResource,onRequestLabs}=props,patient=useResource8(propsPatient),[createdDate,setCreatedDate]=useState74(),defaultSections=useMemo33(()=>getDefaultSections(onRequestLabs),[onRequestLabs]),sections=props.sections??defaultSections,{sectionData,loading,error}=usePatientSummaryData(propsPatient,sections);return useEffect25(()=>{let id=resolveId(propsPatient);id&&medplum.readHistory("Patient",id).then(history=>{let lastUpdated=history.entry?.[history.entry.length-1]?.resource?.meta?.lastUpdated;setCreatedDate(typeof lastUpdated=="string"?lastUpdated:"")}).catch(()=>{})},[propsPatient,medplum]),patient?jsxs84(Flex19,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs84(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs84(Group49,{align:"center",gap:"sm",p:16,children:[jsx128(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs84(Stack33,{gap:0,style:{flex:1,minWidth:0},children:[jsx128(Tooltip6,{label:formatHumanName8(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx128(Text37,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:formatHumanName8(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return jsxs84(Text37,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx128(Divider8,{})]}),jsxs84(Stack33,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:[error&&jsxs84(Text37,{c:"red",fz:"sm",children:["Error loading patient summary: ",error.message]}),!loading&§ions.length>0&&jsx128(Fragment44,{children:sections.map((section,index)=>{let SectionComponent=section.component;return jsxs84("div",{children:[jsx128(SectionComponent,{patient,onClickResource,results:sectionData[index]??{}}),jsx128(Divider8,{})]},section.key)})})]})]}):null}import{Divider as Divider9,Stack as Stack35}from"@mantine/core";import{Fragment as Fragment45}from"react";import{Group as Group50,Stack as Stack34,Text as Text38}from"@mantine/core";import{formatDateTime as formatDateTime3,formatHumanName as formatHumanName9}from"@medplum/core";import{useResource as useResource9}from"@medplum/react-hooks";var ChatListItem_default={content:"ChatListItem_content",contentContainer:"ChatListItem_contentContainer",selected:"ChatListItem_selected"};import{jsx as jsx129,jsxs as jsxs85}from"react/jsx-runtime";var ChatListItem=props=>{let{topic,lastCommunication,isSelected,getThreadUri}=props,patientResource=useResource9(topic.subject),patientName=formatHumanName9(patientResource?.name?.[0]),lastMsg=lastCommunication?.payload?.[0]?.contentString,trimmedMsg=lastMsg?.length&&lastMsg.length>100?lastMsg.slice(0,100)+"...":lastMsg,senderName=lastCommunication?.sender?.display?`${lastCommunication?.sender?.display}: `:"",content=trimmedMsg?`${senderName} ${trimmedMsg}`:"No messages available",topicName=topic.topic?.text??content;return jsx129(MedplumLink,{to:getThreadUri(topic),underline:"never",children:jsxs85(Group50,{p:"xs",align:"center",wrap:"nowrap",className:clsx_default(ChatListItem_default.contentContainer,{[ChatListItem_default.selected]:isSelected}),children:[jsx129(ResourceAvatar,{value:topic.subject,radius:"xl",size:36}),jsxs85(Stack34,{gap:0,children:[jsx129(Text38,{size:"sm",fw:700,truncate:"end",children:patientName}),jsx129(Text38,{size:"sm",fw:400,lineClamp:2,className:ChatListItem_default.content,children:topicName}),jsx129(Text38,{size:"xs",style:{marginTop:2},children:lastCommunication?formatDateTime3(lastCommunication.sent):""})]})]})})};import{jsx as jsx130,jsxs as jsxs86}from"react/jsx-runtime";var ChatList=props=>{let{threads,selectedCommunication,getThreadUri}=props;return jsx130(Stack35,{gap:0,children:threads.map(thread=>{let topicCommunication=thread[0],lastCommunication=thread[1],_isSelected=selectedCommunication?.id===topicCommunication.id;return jsxs86(Fragment45,{children:[jsx130(ChatListItem,{topic:topicCommunication,lastCommunication,isSelected:_isSelected,getThreadUri}),jsx130(Divider9,{})]},topicCommunication.id)})})};var ThreadInbox_default={container:"ThreadInbox_container",rightBorder:"ThreadInbox_rightBorder"};import{Fragment as Fragment46,jsx as jsx131,jsxs as jsxs87}from"react/jsx-runtime";function ThreadInbox(props){let{query,threadId,subject,showPatientSummary=!1,sections,onNew,getThreadUri,uploadEnabled,onViewInDocuments,onChange,inProgressUri,completedUri,allowPatientSelection=!1}=props,navigate=useMedplumNavigate5(),[modalOpened,{open:openModal,close:closeModal}]=useDisclosure10(!1),currentSearch=useMemo34(()=>parseSearchRequest(`Communication?${query}`),[query]),searchParams=useMemo34(()=>new URLSearchParams(query),[query]),itemsPerPage=Number.parseInt(searchParams.get("_count")||"20",10),currentOffset=Number.parseInt(searchParams.get("_offset")||"0",10),currentPage=Math.floor(currentOffset/itemsPerPage)+1,status=searchParams.get("status")||"in-progress",selectedParticipants=useMemo34(()=>(currentSearch.filters?.filter(f=>f.code==="recipient")??[]).flatMap(f=>f.value.split(",").filter(Boolean).map(ref=>({reference:ref}))),[currentSearch]),{loading,error,threadMessages,selectedThread,total,handleThreadStatusChange,addThreadMessage,refreshThreadMessages}=useThreadInbox({query,threadId}),handleParticipantsChange=useCallback24(participants=>{let otherFilters=currentSearch.filters?.filter(f=>f.code!=="recipient")??[],participantRefs=participants.map(p=>p.reference).filter(Boolean),newFilters=participantRefs.length>0?[...otherFilters,{code:"recipient",operator:Operator.EQUALS,value:participantRefs.join(",")}]:otherFilters;onChange({...currentSearch,filters:newFilters,offset:0})},[currentSearch,onChange]),skeletonTitleWidths=[80,72,68,64],skeletonSubtitleWidths=[85,78,70,60];useEffect26(()=>{error&&showNotification8({title:"Error",message:normalizeErrorString10(error),color:"red"})},[error]);let handleTopicStatusChangeWithErrorHandling=async newStatus=>{handleThreadStatusChange(newStatus);try{await refreshThreadMessages()}catch(error2){showNotification8({title:"Error",message:normalizeErrorString10(error2),color:"red"})}},handleNewTopicCompletion=message=>{addThreadMessage(message),onNew(message)};return jsxs87(Fragment46,{children:[jsx131("div",{className:ThreadInbox_default.container,children:jsxs87(Flex20,{direction:"row",h:"100%",w:"100%",children:[jsx131(Flex20,{direction:"column",w:380,h:"100%",className:ThreadInbox_default.rightBorder,children:jsxs87(Paper4,{h:"100%",style:{display:"flex",flexDirection:"column"},children:[jsxs87(ScrollArea3,{style:{flex:1},scrollbarSize:10,type:"hover",scrollHideDelay:250,children:[jsxs87(Flex20,{h:64,align:"center",justify:"space-between",p:"md",children:[jsx131(Tabs,{value:status,onChange:value=>{navigate(value==="in-progress"?inProgressUri:completedUri)},variant:"unstyled",className:"pill-tabs",children:jsxs87(Tabs.List,{children:[jsx131(Tabs.Tab,{value:"in-progress",children:"In Progress"}),jsx131(Tabs.Tab,{value:"completed",children:"Completed"})]})}),jsxs87(Group51,{gap:"xs",children:[jsx131(ParticipantFilter,{selectedParticipants,onFilterChange:handleParticipantsChange}),jsx131(Tooltip7,{label:"New Message",position:"bottom",openDelay:500,children:jsx131(ActionIcon12,{radius:"xl",variant:"filled",color:"blue",size:32,onClick:openModal,children:jsx131(IconPlus,{size:16})})})]})]}),jsx131(Divider10,{}),loading?jsx131(Stack36,{gap:"md",p:"md",children:Array.from({length:10}).map((_,index)=>{let titleWidth=skeletonTitleWidths[index%skeletonTitleWidths.length],subtitleWidth=skeletonSubtitleWidths[index%skeletonSubtitleWidths.length];return jsxs87(Flex20,{gap:"sm",align:"flex-start",children:[jsx131(Skeleton2,{height:40,width:40,radius:"50%"}),jsx131(Box20,{style:{flex:1},children:jsxs87(Flex20,{direction:"column",gap:"xs",children:[jsx131(Skeleton2,{height:16,width:`${titleWidth}%`}),jsx131(Skeleton2,{height:14,width:`${subtitleWidth}%`})]})})]},index)})}):threadMessages.length>0&&jsx131(ChatList,{threads:threadMessages,selectedCommunication:selectedThread,getThreadUri}),threadMessages.length===0&&!loading&&jsx131(EmptyMessagesState,{})]}),!loading&&total!==void 0&&total>itemsPerPage&&jsx131(Box20,{p:"md",children:jsx131(Center3,{children:jsx131(Pagination,{value:currentPage,total:Math.ceil(total/itemsPerPage),onChange:page=>{let offset=(page-1)*itemsPerPage;onChange({...currentSearch,offset})},size:"sm",siblings:1,boundaries:1})})})]})}),selectedThread?jsxs87(Fragment46,{children:[jsx131(Flex20,{direction:"column",style:{flex:1},h:"100%",className:ThreadInbox_default.rightBorder,children:jsx131(Paper4,{h:"100%",children:jsxs87(Stack36,{h:"100%",gap:0,children:[jsxs87(Flex20,{h:64,align:"center",justify:"space-between",p:"md",children:[jsx131(Text39,{fw:800,truncate:!0,fz:"lg",children:selectedThread.topic?.text??"Messages"}),jsxs87(Menu5,{position:"bottom-end",shadow:"md",children:[jsx131(Menu5.Target,{children:jsx131(Button12,{variant:"light",color:getStatusColor4(selectedThread.status),rightSection:selectedThread.status==="completed"?void 0:jsx131(IconChevronDown,{size:16}),radius:"xl",size:"sm",children:selectedThread.status.split("-").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")})}),selectedThread.status!=="completed"&&jsx131(Menu5.Dropdown,{children:jsx131(Menu5.Item,{onClick:()=>handleTopicStatusChangeWithErrorHandling("completed"),children:"Completed"})})]})]}),jsx131(Divider10,{}),jsx131(Flex20,{direction:"column",style:{flex:1},h:"100%",children:jsx131(ThreadChat,{title:"Messages",thread:selectedThread,excludeHeader:!0,uploadEnabled,onViewInDocuments},`${getReferenceString10(selectedThread)}`)})]})})}),selectedThread.subject&&showPatientSummary&&jsx131(Flex20,{direction:"column",w:300,h:"100%",children:jsx131(ScrollArea3,{p:0,h:"100%",scrollbarSize:10,type:"hover",scrollHideDelay:250,children:jsx131(PatientSummary,{patient:selectedThread.subject,sections},selectedThread.id)})})]}):jsx131(Flex20,{direction:"column",style:{flex:1},h:"100%",children:jsx131(NoMessages,{})})]})}),jsx131(NewTopicDialog,{subject,opened:modalOpened,onClose:closeModal,onSubmit:handleNewTopicCompletion,allowPatientSelection})]})}function NoMessages(){return jsx131(Center3,{h:"100%",w:"100%",children:jsxs87(Stack36,{align:"center",gap:"md",children:[jsx131(ThemeIcon,{size:64,variant:"light",color:"gray",children:jsx131(IconMessageCircle,{size:32})}),jsx131(Stack36,{align:"center",gap:"xs",children:jsx131(Text39,{size:"sm",c:"dimmed",ta:"center",children:"Select a message from the list to view details"})})]})})}function getStatusColor4(status){return status==="completed"?"green":status==="stopped"?"red":"blue"}function EmptyMessagesState(){return jsx131(Flex20,{direction:"column",h:"100%",justify:"center",align:"center",children:jsxs87(Stack36,{align:"center",gap:"md",pt:"xl",children:[jsx131(IconMessageCircle,{size:64,color:"var(--mantine-color-gray-4)"}),jsx131(Text39,{size:"lg",c:"dimmed",fw:500,children:"No messages found"})]})})}import{ActionIcon as ActionIcon14,Button as Button14,Center as Center4,Group as Group53,Loader as Loader6,ScrollArea as ScrollArea4,TextInput as TextInput26}from"@mantine/core";import{showNotification as showNotification9,updateNotification}from"@mantine/notifications";import{createReference as createReference14,normalizeErrorString as normalizeErrorString11}from"@medplum/core";import{useMedplum as useMedplum42,useResource as useResource11}from"@medplum/react-hooks";import{useCallback as useCallback25,useEffect as useEffect29,useLayoutEffect as useLayoutEffect4,useRef as useRef14,useState as useState78}from"react";var import_rfc6902=__toESM(require_rfc6902(),1);import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize5,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum40}from"@medplum/react-hooks";import{useEffect as useEffect27,useMemo as useMemo35,useState as useState76}from"react";import{Button as Button13,Table}from"@mantine/core";import{useState as useState75}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment47,jsx as jsx132,jsxs as jsxs88}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState75(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx132(Fragment47,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx132(Fragment47,{children:jsxs88(Table.Tr,{children:[jsx132(Table.Td,{children:name}),jsx132(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx132(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx132(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx132(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs88(Table.Tr,{children:[jsx132(Table.Td,{children:name}),jsx132(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx132(Button13,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx133,jsxs as jsxs89}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum40(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState76(!1);useEffect27(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo35(()=>{if(!schemaLoaded)return null;let typedOriginal=[toTypedValue(original)],typedRevised=[toTypedValue(revised)],result=[],patch=mergePatchOperations((0,import_rfc6902.createPatch)(original,revised));for(let op of patch){let path=op.path,fhirPath=jsonPathToFhirPath(path),property=tryGetElementDefinition(original.resourceType,fhirPath),originalValue=op.op==="add"?void 0:evalFhirPathTyped(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:evalFhirPathTyped(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${capitalize5(op.op)} ${fhirPath}`,path:property?.path??original.resourceType+"."+fhirPath,property,originalValue:touchUpValue(property,originalValue),revisedValue:touchUpValue(property,revisedValue)})}return result},[schemaLoaded,original,revised]);return diffTable?jsxs89(Table2,{className:ResourceDiffTable_default.root,children:[jsx133(Table2.Thead,{children:jsxs89(Table2.Tr,{children:[jsx133(Table2.Th,{}),jsx133(Table2.Th,{children:"Before"}),jsx133(Table2.Th,{children:"After"})]})}),jsx133(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx133(ResourceDiffRow,{...rest},key)})})]}):null}function mergePatchOperations(patch){let result=[];for(let patchOperation of patch){let{op,path}=patchOperation;if(path.startsWith("/meta/author")||path.startsWith("/meta/compartment")||path.startsWith("/meta/lastUpdated")||path.startsWith("/meta/versionId"))continue;let count=patch.filter(el=>el.op===op&&el.path===path).length,resultOperation={op,path};count>1&&(op==="add"||op==="remove")&&/\/[0-9-]+$/.test(path)&&(resultOperation.op="replace",resultOperation.path=path.replace(/\/[^/]+$/,"")),result.some(el=>el.op===resultOperation.op&&el.path===resultOperation.path)||result.push(resultOperation)}return result}function jsonPathToFhirPath(path){let parts=path.split("/").filter(Boolean),result="";for(let i=0;i<parts.length;i++){let part=parts[i];part==="-"?result+=".last()":/^\d+$/.test(part)?result+=`[${part}]`:(i>0&&(result+="."),result+=part)}return result.endsWith(".url")&&(result=result.replace(/\.url$/,"")),result}function tryGetElementDefinition(resourceType,fhirPath){try{return getSearchParameterDetails(resourceType,{resourceType:"SearchParameter",base:[resourceType],code:resourceType+"."+fhirPath,expression:resourceType+"."+fhirPath})?.elementDefinitions?.[0]}catch(err){console.warn("Failed to get element definition",{resourceType,fhirPath,err});return}}function touchUpValue(property,input){return input&&{type:Array.isArray(input)?input[0].type:input.type,value:fixArray(input,!!property?.isArray)}}function fixArray(input,isArray){let inputValue=arrayify(input).flatMap(v=>v.value);return isArray?inputValue:inputValue[0]}import{AccessPolicyInteraction,satisfiedAccessPolicy,tryGetProfile as tryGetProfile4}from"@medplum/core";import{useMedplum as useMedplum41,useResource as useResource10}from"@medplum/react-hooks";import{useEffect as useEffect28,useMemo as useMemo36,useState as useState77}from"react";import{jsx as jsx134}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum41(),accessPolicy=medplum.getAccessPolicy(),value=useResource10(props.value),[schemaLoaded,setSchemaLoaded]=useState77(!1);useEffect28(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{tryGetProfile4(profileUrl)?setSchemaLoaded(!0):console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)});else{let schemaName=value.resourceType;medplum.requestSchema(schemaName).then(()=>{setSchemaLoaded(!0)}).catch(console.error)}},[medplum,profileUrl,value]);let accessPolicyResource=useMemo36(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx134(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon13,Group as Group52,Menu as Menu6,Text as Text40}from"@mantine/core";import{formatDateTime as formatDateTime4,getReferenceString as getReferenceString11}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx135,jsxs as jsxs90}from"react/jsx-runtime";function Timeline(props){return jsx135(Container,{children:props.children})}function TimelineItem(props){let{resource,profile,padding,popupMenuItems,...others}=props,author=profile??resource.meta?.author,onBehalfOf=resource.meta?.onBehalfOf,dateTime=props.dateTime??resource.meta?.lastUpdated;return jsxs90(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs90(Group52,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx135(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs90("div",{style:{flex:1},children:[jsxs90(Text40,{size:"sm",children:[jsx135(ResourceName,{c:"inherit",fw:500,value:author,link:!0}),onBehalfOf&&jsxs90(Text40,{component:"span",size:"xs",c:"dimmed",children:[" on behalf of ",jsx135(ResourceName,{c:"inherit",value:onBehalfOf,link:!0})]})]}),jsxs90(Text40,{size:"xs",children:[jsx135(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime4(dateTime)}),jsx135(Text40,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx135(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs90(Menu6,{position:"bottom-end",shadow:"md",width:200,children:[jsx135(Menu6.Target,{children:jsx135(ActionIcon13,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString11(props.resource)}`,children:jsx135(IconDots,{})})}),popupMenuItems]})]}),jsx135(ErrorBoundary,{children:jsx135("div",{className:clsx_default(Timeline_default.item,{[Timeline_default.itemPadding]:padding}),children:props.children})})]})}function sortByDateAndPriority(resources,timelineResource){resources.sort((a,b)=>{let priority1=getPriorityScore(a,timelineResource),priority2=getPriorityScore(b,timelineResource);return priority1>priority2?1:priority1<priority2?-1:getTime(a,timelineResource)-getTime(b,timelineResource)})}function getPriorityScore(resource,timelineResource){if(!isSameResourceType(resource,timelineResource)){let priority=resource.priority;if(typeof priority=="string")return{stat:4,asap:3,urgent:2}[priority]??0}return 0}function getTime(resource,timelineResource){if(!isSameResourceType(resource,timelineResource)){if(resource.resourceType==="Communication"&&resource.sent)return new Date(resource.sent).getTime();if((resource.resourceType==="DiagnosticReport"||resource.resourceType==="Media"||resource.resourceType==="Observation")&&resource.issued)return new Date(resource.issued).getTime();if(resource.resourceType==="DocumentReference"&&resource.date)return new Date(resource.date).getTime()}let dateTime=resource.meta?.lastUpdated;return dateTime?new Date(dateTime).getTime():0}function isSameResourceType(a,b){return!!b&&a.resourceType===b.resourceType&&a.id===b.id}var ResourceTimeline_default={pinnedComment:"ResourceTimeline_pinnedComment"};import{jsx as jsx136,jsxs as jsxs91}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum42(),sender=medplum.getProfile(),inputRef=useRef14(null),resource=useResource11(props.value),[history,setHistory]=useState78(),[items,setItems]=useState78([]),[countToShow,setCountToShow]=useState78(10),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef14(items);useLayoutEffect4(()=>{itemsRef.current=items});let sortAndSetItems=useCallback25(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback25(batchResponse=>{let newItems=[];for(let settledResult of batchResponse){if(settledResult.status!=="fulfilled")continue;let bundle=settledResult.value;if(bundle.type==="history"&&setHistory(bundle),bundle.entry)for(let entry of bundle.entry)newItems.push(entry.resource)}sortAndSetItems(newItems)},[sortAndSetItems]),addResource=useCallback25(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback25(()=>{let resourceType,id;"resourceType"in props.value?(resourceType=props.value.resourceType,id=props.value.id):[resourceType,id]=props.value.reference?.split("/"),loadTimelineResources(medplum,resourceType,id).then(handleBatchResponse).catch(console.error)},[medplum,props.value,loadTimelineResources,handleBatchResponse]);useEffect29(()=>loadTimeline(),[loadTimeline]);function createComment(contentString){!resource||!props.createCommunication||medplum.createResource(props.createCommunication(resource,sender,contentString)).then(result=>addResource(result)).catch(console.error)}function createMedia(attachment){!resource||!props.createMedia||medplum.createResource(props.createMedia(resource,sender,attachment)).then(result=>addResource(result)).then(()=>updateNotification({id:"upload-notification",color:"teal",title:"Upload complete",message:"",icon:jsx136(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString11(reason),icon:jsx136(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification9({id:"upload-notification",loading:!0,title:"Initializing upload...",message:"Please wait...",autoClose:!1,withCloseButton:!1})}function onUploadProgress(e){updateNotification({id:"upload-notification",loading:!0,title:"Uploading...",message:getProgressMessage(e),autoClose:!1,withCloseButton:!1})}function onUploadError(outcome){updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString11(outcome),icon:jsx136(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return jsx136(Center4,{style:{width:"100%",height:"100%"},children:jsx136(Loader6,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return jsxs91(Timeline,{children:[props.createCommunication&&jsx136(Panel,{children:jsx136(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs91(Group53,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx136(ResourceAvatar,{value:sender}),jsx136(TextInput26,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx136(ActionIcon14,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx136(IconMessage,{size:16})}),jsx136(AttachmentButton,{securityContext:createReference14(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx136(ActionIcon14,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx136(IconCloudUpload,{size:16})})})]})})}),itemsToShow.map(item=>{let key=`${item.resourceType}/${item.id}/${item.meta?.versionId}`,menu=props.getMenu?props.getMenu({primaryResource:resource,currentResource:item,reloadTimeline:loadTimeline}):void 0;if(item.resourceType===resource.resourceType&&item.id===resource.id)return jsx136(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx136(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx136(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx136(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx136(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx136(TimelineItem,{resource:item,padding:!0,children:jsx136(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&jsx136(Group53,{justify:"center",pb:"lg",children:jsx136(Button14,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx136(TimelineItem,{resource,padding:!0,...rest,children:jsx136(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs91(TimelineItem,{resource,padding:!0,...rest,children:[jsx136("h3",{children:"Created"}),jsx136(ResourceTable,{value:resource,ignoreMissingValues:!0,forceUseInput:!0})]})}function getPrevious(history,version){let entries=history.entry??[],index=entries.findIndex(entry=>entry.resource?.meta?.versionId===version.meta?.versionId);if(!(index>=entries.length-1))return entries[index+1].resource}function CommunicationTimelineItem(props){let className=!props.resource.priority||props.resource.priority==="routine"?void 0:ResourceTimeline_default.pinnedComment;return jsx136(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx136("p",{children:props.resource.payload?.[0]?.contentString})})}function MediaTimelineItem(props){let contentType=props.resource.content?.contentType,padding=contentType&&!contentType.startsWith("image/")&&!contentType.startsWith("video/")&&contentType!=="application/pdf";return jsx136(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx136(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx136(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx136(ScrollArea4,{children:jsx136("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx136(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx136(DiagnosticReportDisplay,{value:props.resource})})}function getProgressMessage(e){if(e.lengthComputable){let percent=100*e.loaded/e.total;return`Uploaded: ${formatFileSize(e.loaded)} / ${formatFileSize(e.total)} ${percent.toFixed(2)}%`}return`Uploaded: ${formatFileSize(e.loaded)}`}function formatFileSize(bytes){if(bytes===0)return"0.00 B";let e=Math.floor(Math.log(bytes)/Math.log(1024));return(bytes/Math.pow(1024,e)).toFixed(2)+" "+" KMGTP".charAt(e)+"B"}import{jsx as jsx137}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx137(ResourceTimeline,{value:resource,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`;return Promise.allSettled([medplum.readHistory(resourceType,id),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count:100})])},...rest})}import{createReference as createReference15}from"@medplum/core";import{jsx as jsx138}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx138(ResourceTimeline,{value:encounter,loadTimelineResources:async(medplum,_resourceType,id)=>Promise.allSettled([medplum.readHistory("Encounter",id),medplum.search("Communication","encounter=Encounter/"+id),medplum.search("Media","encounter=Encounter/"+id)]),createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",encounter:createReference15(resource),subject:resource.subject,sender:createReference15(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference15(resource),subject:resource.subject,operator:createReference15(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button19,Loader as Loader8,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome11}from"@medplum/core";import{useMedplum as useMedplum44}from"@medplum/react-hooks";import{memo,useEffect as useEffect33,useState as useState83}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx139}from"react/jsx-runtime";function FhirPathDisplay(props){let value;try{value=evalFhirPath(props.path,props.resource)}catch(err){return console.warn("FhirPathDisplay:",err),null}if(value.length>1)throw new Error(`Component "path" for "FhirPathDisplay" must resolve to a single element. Received ${value.length} elements [${JSON.stringify(value,null,2)}]`);return jsx139(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon16,Button as Button18,Center as Center5,Group as Group56,Loader as Loader7,Menu as Menu8,Pagination as Pagination2,Table as Table3,Text as Text42,UnstyledButton as UnstyledButton7}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals as deepEquals2,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome10}from"@medplum/core";import{useMedplum as useMedplum43}from"@medplum/react-hooks";import{useCallback as useCallback26,useEffect as useEffect32,useLayoutEffect as useLayoutEffect6,useRef as useRef17,useState as useState82}from"react";import{Box as Box21,Button as Button15,Modal as Modal12,Text as Text41}from"@mantine/core";import{jsx as jsx140,jsxs as jsxs92}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs92(Modal12,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs92(Box21,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx140(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx140(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx140(Text41,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx140(Button15,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button16,Group as Group54,Modal as Modal13,MultiSelect as MultiSelect2,Stack as Stack37}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify3}from"@medplum/core";import{useEffect as useEffect30,useMemo as useMemo37,useRef as useRef15,useState as useState79}from"react";import{capitalize as capitalize6,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime5,Operator as Operator2}from"@medplum/core";import{Fragment as Fragment48,jsx as jsx141}from"react/jsx-runtime";var searchParamToOperators={string:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],fulltext:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],token:[Operator2.EQUALS,Operator2.NOT,Operator2.TEXT],reference:[Operator2.EQUALS,Operator2.NOT],numeric:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],quantity:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],date:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],datetime:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],uri:[Operator2.EQUALS,Operator2.NOT,Operator2.ABOVE,Operator2.BELOW]},operatorNames={eq:"equals",ne:"not equals",gt:"greater than",lt:"less than",ge:"greater than or equals",le:"less than or equals",sa:"starts after",eb:"ends before",ap:"approximately",sw:"starts with",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",present:"present",identifier:"identifier",iterate:"iterate"};function setFilters(definition,filters){return{...definition,filters,offset:0,name:void 0}}function clearFilters(definition){return setFilters(definition,[])}function clearFiltersOnField(definition,code){return setFilters(definition,(definition.filters??[]).filter(f=>f.code!==code))}function addFilter(definition,field,op,value,opt_clear){opt_clear&&(definition=clearFiltersOnField(definition,field));let nextFilters=[];return definition.filters&&nextFilters.push(...definition.filters),nextFilters.push({code:field,operator:op,value:value??""}),setFilters(definition,nextFilters)}function addField(definition,field){if(definition.fields?.includes(field))return definition;let newFields=[];return definition.fields&&newFields.push(...definition.fields),newFields.push(field),{...definition,fields:newFields,name:void 0}}function deleteFilter(definition,index){if(!definition.filters)return definition;let newFilters=[...definition.filters];return newFilters.splice(index,1),{...definition,filters:newFilters,name:void 0}}function addYesterdayFilter(definition,field){return addDayFilter(definition,field,-1)}function addTodayFilter(definition,field){return addDayFilter(definition,field,0)}function addTomorrowFilter(definition,field){return addDayFilter(definition,field,1)}function addDayFilter(definition,field,delta){let startTime=new Date;startTime.setDate(startTime.getDate()+delta),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setDate(endTime.getDate()+1),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addNext24HoursFilter(definition,field){let now=new Date,endTime=new Date(now.getTime()+1440*60*1e3);return addDateFilterBetween(definition,field,now,endTime)}function addLastMonthFilter(definition,field){return addMonthFilter(definition,field,-1)}function addThisMonthFilter(definition,field){return addMonthFilter(definition,field,0)}function addNextMonthFilter(definition,field){return addMonthFilter(definition,field,1)}function addMonthFilter(definition,field,delta){let startTime=new Date;startTime.setMonth(startTime.getMonth()+delta),startTime.setDate(1),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setMonth(endTime.getMonth()+1),endTime.setDate(1),endTime.setHours(0,0,0,0),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addYearToDateFilter(definition,field){let startTime=new Date;return startTime.setMonth(0),startTime.setDate(1),startTime.setHours(0,0,0,0),addDateFilterBetween(definition,field,startTime,new Date)}function addDateFilterBetween(definition,field,d1,d2){return definition=clearFiltersOnField(definition,field),definition=addDateFilterImpl(definition,field,Operator2.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator2.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator2.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.replaceAll(/([A-Z])/g," $1"),tmp=tmp.replaceAll(/[-_]/g," "),tmp=tmp.replaceAll(/\s+/g," "),tmp=tmp.trim(),tmp.toLowerCase()==="id"?"ID":tmp.split(/\s/).map(capitalize6).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?jsx141(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children:resource.id}):key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?formatDateTime5(resource.meta?.lastUpdated):`${resource.resourceType}.${field.name}`===field.elementDefinition?.path?renderPropertyValue(resource,field.elementDefinition):field.searchParams?.length===1&&field.name===field.searchParams[0].code?renderSearchParameterValue(resource,field.searchParams[0]):null}function renderPropertyValue(resource,elementDefinition){let path=elementDefinition.path?.split(".")?.pop()?.replaceAll("[x]","")??"",[value,propertyType]=getValueAndType({type:resource.resourceType,value:resource},path);return value?jsx141(ResourcePropertyDisplay,{path:elementDefinition.path,property:elementDefinition,propertyType,value,maxWidth:200,ignoreMissingValues:!0,link:!1}):null}function renderSearchParameterValue(resource,searchParam){let value=evalFhirPathTyped2(searchParam.expression,[{type:resource.resourceType,value:resource}]);return!value||value.length===0?null:jsx141(Fragment48,{children:value.map((v,index)=>jsx141(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx142,jsxs as jsxs93}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef15(!1),[state,setState]=useState79({search:JSON.parse(stringify3(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState79(!1);useEffect30(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo37(()=>{if(!props.visible)return[];let resourceType=props.search.resourceType,typeSchema=getDataType2(resourceType),searchParams=getSearchParameters(resourceType);return sortStringArray(getFieldsList(typeSchema,searchParams)).map(field=>({value:field,label:buildFieldNameString(field)}))},[props.visible,props.search.resourceType]);function handleChange(newFields){setState({search:{...state.search,fields:newFields}})}return jsx142(Modal13,{title:"Fields",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>{props.onCancel()},size:"auto",withOverlay:!0,closeOnClickOutside:!1,overlayProps:{onMouseDownCapture:()=>{wasDropdownOpen.current=isDropdownOpen},onClick:()=>{wasDropdownOpen.current||props.onCancel(),wasDropdownOpen.current=!1},children:jsx142("div",{"data-testid":"overlay-child"})},children:jsxs93(Stack37,{children:[jsx142(MultiSelect2,{style:{width:550},placeholder:"Select fields to display",data:allFields,value:state.search.fields??[],onChange:handleChange,onDropdownOpen:()=>setIsDropdownOpen(!0),onDropdownClose:()=>setIsDropdownOpen(!1),maxDropdownHeight:"250px",clearButtonProps:{"aria-label":"Clear selection"},clearable:!0,searchable:!0}),jsx142(Group54,{justify:"flex-end",children:jsx142(Button16,{onClick:()=>props.onOk(state.search),children:"OK"})})]})})}function getFieldsList(typeSchema,searchParams){let result=[],keys=new Set,names=new Set;for(let key of Object.keys(typeSchema.elements))result.push(key),keys.add(key.toLowerCase()),names.add(buildFieldNameString(key));if(searchParams)for(let code of Object.keys(searchParams)){let name=buildFieldNameString(code);!keys.has(code)&&!names.has(name)&&(result.push(code),keys.add(code),names.add(name))}return result}import{ActionIcon as ActionIcon15,Group as Group55,Modal as Modal14,NativeSelect as NativeSelect11}from"@mantine/core";import{Operator as Operator3,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect31,useLayoutEffect as useLayoutEffect5,useRef as useRef16,useState as useState80}from"react";import{Checkbox as Checkbox7,TextInput as TextInput27}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx143}from"react/jsx-runtime";function SearchFilterValueInput(props){let details=getSearchParameterDetails2(props.resourceType,props.searchParam),name=props.name??"filter-value";switch(details.type){case SearchParameterType.REFERENCE:return jsx143(ReferenceInput,{name,defaultValue:props.defaultValue?{reference:props.defaultValue}:void 0,targetTypes:props.searchParam.target,autoFocus:props.autoFocus,onChange:newReference=>{newReference?props.onChange(newReference.reference):props.onChange("")}});case SearchParameterType.BOOLEAN:return jsx143(Checkbox7,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType.DATE:return jsx143(TextInput27,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.DATETIME:return jsx143(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx143(TextInput27,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.QUANTITY:return jsx143(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx143(TextInput27,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value),placeholder:"Search value"})}}function tryParseQuantity(value){if(value){let[valueString,systemString,unitString]=value.split("|");if(valueString)return{value:Number.parseFloat(valueString),system:systemString,unit:unitString}}}import{jsx as jsx144,jsxs as jsxs94}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState80(deepClone2(props.search)),searchRef=useRef16(search);useLayoutEffect5(()=>{searchRef.current=search}),useEffect31(()=>{setSearch(deepClone2(props.search))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}let resourceType=props.search.resourceType,searchParams=getSearchParameters2(resourceType)??{},filters=search.filters||[];return jsx144(Modal14,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs94(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs94("div",{children:[jsxs94("table",{children:[jsxs94("colgroup",{children:[jsx144("col",{style:{width:200}}),jsx144("col",{style:{width:200}}),jsx144("col",{style:{width:380}}),jsx144("col",{style:{width:40}})]}),jsx144("thead",{children:jsxs94("tr",{children:[jsx144("th",{children:"Field"}),jsx144("th",{children:"Operation"}),jsx144("th",{children:"Value"}),jsx144("th",{})]})}),jsx144("tbody",{children:filters.map((filter,index)=>jsx144(FilterRowInput,{id:`filter-${index}-row`,resourceType,searchParams,value:filter,onChange:newFilter=>{let newFilters=[...filters];newFilters[index]=newFilter,setSearch(setFilters(searchRef.current,newFilters))},onDelete:()=>setSearch(deleteFilter(searchRef.current,index))},`filter-${index}-row`))})]}),jsx144(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx144(Group55,{justify:"flex-end",mt:"xl",children:jsx144(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value;function setFilterCode(newCode){props.onChange({code:newCode,operator:Operator3.EQUALS,value:""})}function setFilterOperator(newOperator){props.onChange({code:value.code,operator:newOperator,value:""})}function setFilterValue(newFilterValue){props.onChange({code:value.code,operator:value.operator,value:newFilterValue})}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return jsxs94("tr",{children:[jsx144("td",{children:jsx144(NativeSelect11,{"data-testid":`${props.id}-filter-field`,defaultValue:props.value.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...Object.keys(props.searchParams).map(param=>({value:param,label:buildFieldNameString(param)}))]})}),jsx144("td",{children:operators&&jsx144(NativeSelect11,{"data-testid":`${props.id}-filter-operation`,defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]},`${props.id}-filter-value-${props.value.code}`)}),jsx144("td",{children:searchParam&&value.operator&&jsx144(SearchFilterValueInput,{name:`${props.id}-filter-value`,resourceType:props.resourceType,searchParam,defaultValue:value.value,onChange:setFilterValue},`${props.id}-filter-value-${props.value.code}-${props.value.operator}`)}),jsx144("td",{children:props.onDelete&&jsx144(ActionIcon15,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx144(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button17,Grid,Modal as Modal15}from"@mantine/core";import{useState as useState81}from"react";import{jsx as jsx145,jsxs as jsxs95}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState81(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx145(Modal15,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx145(Form,{onSubmit:onOk,children:jsxs95(Grid,{children:[jsx145(Grid.Col,{span:10,children:jsx145(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx145(Grid.Col,{span:2,children:jsx145(Button17,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime6,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator4,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment49,jsx as jsx146}from"react/jsx-runtime";function SearchFilterValueDisplay(props){let{resourceType,filter}=props,searchParam=globalSchema.types[resourceType].searchParams?.[filter.code];if(searchParam){if(searchParam.type==="reference"&&(filter.operator===Operator4.EQUALS||filter.operator===Operator4.NOT_EQUALS))return jsx146(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx146(Fragment49,{children:formatDateTime6(filter.value)})}return jsx146(Fragment49,{children:filter.value})}import{Menu as Menu7}from"@mantine/core";import{Operator as Operator5}from"@medplum/core";import{Fragment as Fragment50,jsx as jsx147,jsxs as jsxs96}from"react/jsx-runtime";function SearchPopupMenu(props){if(!props.searchParams)return null;function onSort(searchParam,desc){onChange(setSort(props.search,searchParam.code,desc))}function onClear(searchParam){onChange(clearFiltersOnField(props.search,searchParam.code))}function onPrompt(searchParam,operator){props.onPrompt(searchParam,{code:searchParam.code,operator,value:""})}function onChange(definition){props.onChange(definition)}return props.searchParams.length===1?jsx147(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx147(Menu7.Dropdown,{children:props.searchParams.map(searchParam=>jsx147(Menu7.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx147(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx147(NumericFilterSubMenu,{...props});case"reference":return jsx147(ReferenceFilterSubMenu,{...props});case"string":return jsx147(TextFilterSubMenu,{...props});case"token":return jsx147(TokenFilterSubMenu,{...props});case"uri":return jsx147(UriFilterSubMenu,{...props});default:return jsxs96(Fragment50,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx147(Menu7.Item,{leftSection:jsx147(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.ENDS_BEFORE),children:"Before..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.STARTS_AFTER),children:"After..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Between..."}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx147(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx147(Menu7.Item,{leftSection:jsx147(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN),children:"Greater than..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN),children:"Less than..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx147(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx147(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx147(Menu7.Item,{leftSection:jsx147(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.CONTAINS),children:"Contains..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Does not contain..."}),jsx147(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.TEXT),children:"Text contains..."}),jsx147(CommonMenuItems,{...props})]})}function UriFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx147(Menu7.Item,{leftSection:jsx147(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx147(Menu7.Item,{leftSection:jsx147(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx147(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs96(Fragment50,{children:[jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx147(Menu7.Item,{leftSection:jsx147(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx147(Menu7.Divider,{}),jsx147(Menu7.Item,{leftSection:jsx147(IconX,{size:14}),onClick:()=>props.onClear(searchParam),children:"Clear filters"})]})}function getPaginationControlProps(controlName){switch(controlName){case"next":return{"aria-label":"Next page"};case"previous":return{"aria-label":"Previous page"};case"first":return{"aria-label":"First page"};case"last":return{"aria-label":"Last page"};default:return{}}}var SearchControl_default={root:"SearchControl_root",table:"SearchControl_table",tr:"SearchControl_tr",th:"SearchControl_th",control:"SearchControl_control",icon:"SearchControl_icon"};import{getElementDefinition as getElementDefinition2,getSearchParameter,getSearchParameterDetails as getSearchParameterDetails4,getSearchParameters as getSearchParameters3}from"@medplum/core";function getFieldDefinitions(search){let resourceType=search.resourceType,fields=[];for(let name of search.fields||["id","_lastUpdated"])fields.push(getFieldDefinition(resourceType,name));return fields}function getFieldDefinition(resourceType,name){if(name==="_lastUpdated")return{name:"_lastUpdated",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_lastUpdated",name:"_lastUpdated",type:"date",expression:"Resource.meta.lastUpdated"}]};if(name==="meta.versionId")return{name:"meta.versionId",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_versionId",name:"_versionId",type:"token",expression:"Resource.meta.versionId"}]};let exactElementDefinition=getElementDefinition2(resourceType,name),exactSearchParam=getSearchParameter(resourceType,name.toLowerCase());if(exactElementDefinition&&exactSearchParam)return{name,elementDefinition:exactElementDefinition,searchParams:[exactSearchParam]};if(exactElementDefinition){let allSearchParams=getSearchParameters3(resourceType),searchParams;if(allSearchParams){let pathRegex=new RegExp(`${resourceType}\\.${name.replaceAll("[x]","")}([^\\w-]|$)`);searchParams=Object.values(allSearchParams).filter(p=>!!p.expression&&pathRegex.test(p?.expression)),searchParams.length===0&&(searchParams=void 0)}return{name,elementDefinition:exactElementDefinition,searchParams}}if(exactSearchParam){let details=getSearchParameterDetails4(resourceType,exactSearchParam);return{name,elementDefinition:details.elementDefinitions?.[0],searchParams:[exactSearchParam]}}return{name}}import{Fragment as Fragment51,jsx as jsx148,jsxs as jsxs97}from"react/jsx-runtime";var SearchChangeEvent=class extends Event{constructor(definition){super("change");__publicField(this,"definition");this.definition=definition}},SearchLoadEvent=class extends Event{constructor(response){super("load");__publicField(this,"response");this.response=response}},SearchClickEvent=class extends Event{constructor(resource,browserEvent){super("click");__publicField(this,"resource");__publicField(this,"browserEvent");this.resource=resource,this.browserEvent=browserEvent}};function SearchControl(props){let medplum=useMedplum43(),[outcome,setOutcome]=useState82(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState82(search);deepEquals2(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState82({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef17(state);useLayoutEffect6(()=>{stateRef.current=state});let total=memoizedSearch.total??"accurate",loadResults=useCallback26(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,formatSearchQuery({...memoizedSearch,total,fields:void 0}),options)).then(response=>{setState({...stateRef.current,searchResponse:response}),onLoad&&onLoad(new SearchLoadEvent(response))}).catch(reason=>{setState({...stateRef.current,searchResponse:void 0}),setOutcome(normalizeOperationOutcome10(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback26(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect32(()=>{loadResults()},[loadResults]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...stateRef.current.selected};checked?newSelected[id]=!0:delete newSelected[id],setState({...stateRef.current,selected:newSelected})}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},searchResponse=stateRef.current.searchResponse;checked&&searchResponse?.entry&&searchResponse.entry.forEach(entry=>{entry.resource?.id&&(newSelected[entry.resource.id]=!0)}),setState({...stateRef.current,selected:newSelected})}function isAllSelected(){if(!state.searchResponse?.entry||state.searchResponse.entry.length===0)return!1;for(let e of state.searchResponse.entry)if(e.resource?.id&&!state.selected[e.resource.id])return!1;return!0}function emitSearchChange(newSearch){props.onChange&&props.onChange(new SearchChangeEvent(newSearch))}function handleRowClick(e,resource){if(isCheckboxCell(e.target)||e.button===2)return;killEvent(e);let isAux=isAuxClick(e);!isAux&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),isAux&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e))}function isExportPassed(){return!!(props.onExport??props.onExportCsv??props.onExportTransactionBundle)}if(outcome)return jsx148(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx148(Center5,{style:{width:"100%",height:"100%"},children:jsx148(Loader7,{})});let checkboxColumn=props.checkboxesEnabled,fields=getFieldDefinitions(memoizedSearch),resourceType=memoizedSearch.resourceType,lastResult=state.searchResponse,resources=lastResult?.entry?.map(e=>e.resource),buttonVariant="subtle",buttonColor="gray",iconSize=16,isMobile=window.innerWidth<768;return jsxs97("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs97(Group56,{justify:"space-between",mb:"xl",children:[jsxs97(Group56,{gap:2,children:[jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx148(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx148(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs97(Group56,{gap:2,children:[lastResult&&jsxs97(Text42,{size:"xs",c:"dimmed","data-testid":"count-display",children:[getStart(memoizedSearch,lastResult).toLocaleString(),"-",getEnd(memoizedSearch,lastResult).toLocaleString(),lastResult.total!==void 0&&` of ${memoizedSearch.total==="estimate"?"~":""}${lastResult.total?.toLocaleString()}`]}),jsx148(ActionIcon16,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx148(IconRefresh,{size:iconSize})})]})]}),jsxs97(Table3,{className:SearchControl_default.table,children:[jsxs97(Table3.Thead,{children:[jsxs97(Table3.Tr,{children:[checkboxColumn&&jsx148(Table3.Th,{children:jsx148("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx148(Table3.Th,{children:jsxs97(Menu8,{shadow:"md",width:240,position:"bottom-end",children:[jsx148(Menu8.Target,{children:jsx148(UnstyledButton7,{className:SearchControl_default.control,p:2,children:jsxs97(Group56,{justify:"space-between",wrap:"nowrap",children:[jsx148(Text42,{fw:500,children:buildFieldNameString(field.name)}),jsx148(Center5,{className:SearchControl_default.icon,children:jsx148(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx148(SearchPopupMenu,{search:memoizedSearch,searchParams:field.searchParams,onPrompt:(searchParam,filter)=>{setState({...stateRef.current,filterDialogVisible:!0,filterDialogSearchParam:searchParam,filterDialogFilter:filter,dialogOpenTime:Date.now()})},onChange:result=>{emitSearchChange(result)}})]})},field.name))]}),!props.hideFilters&&jsxs97(Table3.Tr,{children:[checkboxColumn&&jsx148(Table3.Th,{}),fields.map(field=>jsx148(Table3.Th,{children:field.searchParams&&jsx148(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),jsx148(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs97(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx148(Table3.Td,{children:jsx148("input",{type:"checkbox",value:"checked","data-testid":"row-checkbox","aria-label":`Checkbox for ${resource.id}`,checked:!!state.selected[resource.id],onChange:e=>handleSingleCheckboxClick(e,resource.id)})}),fields.map(field=>jsx148(Table3.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&jsx148(Container,{children:jsx148(Center5,{style:{height:150},children:jsx148(Text42,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx148(Center5,{m:"md",p:"md",children:jsx148(Pagination2,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),jsx148(SearchFieldEditor,{search:memoizedSearch,visible:state.fieldEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,fieldEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,fieldEditorVisible:!1})}},`search-field-editor-${state.dialogOpenTime}`),jsx148(SearchFilterEditor,{search:memoizedSearch,visible:state.filterEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,filterEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterEditorVisible:!1})}},`search-filter-editor-${state.dialogOpenTime}`),jsx148(SearchExportDialog,{visible:state.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx148(SearchFilterValueDialog,{visible:state.filterDialogVisible,title:state.filterDialogSearchParam?.code?buildFieldNameString(state.filterDialogSearchParam.code):"",resourceType,searchParam:state.filterDialogSearchParam,filter:state.filterDialogFilter,defaultValue:"",onOk:filter=>{emitSearchChange(addFilter(memoizedSearch,filter.code,filter.operator,filter.value)),setState({...stateRef.current,filterDialogVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterDialogVisible:!1})}},`search-filter-dialog-${state.dialogOpenTime}`)]})}function FilterDescription(props){let filters=(props.filters??[]).filter(f=>props.searchParams.find(p=>p.code===f.code));return filters.length===0?jsx148("span",{children:"no filters"}):jsx148(Fragment51,{children:filters.map(filter=>jsxs97("div",{children:[getOpString(filter.operator),"\xA0",jsx148(SearchFilterValueDisplay,{resourceType:props.resourceType,filter})]},`filter-${filter.code}-${filter.operator}-${filter.value}`))})}function getPage(search){return Math.floor((search.offset??0)/(search.count??DEFAULT_SEARCH_COUNT2))+1}function getTotalPages(search,lastResult){let pageSize=search.count??DEFAULT_SEARCH_COUNT2,total=getTotal(search,lastResult);return Math.ceil(total/pageSize)}function getStart(search,lastResult){return Math.min(getTotal(search,lastResult),(search.offset??0)+1)}function getEnd(search,lastResult){return Math.max(getStart(search,lastResult)+(lastResult.entry?.length??0)-1,0)}function getTotal(search,lastResult){let total=lastResult.total;return total===void 0&&(total=(search.offset??0)+(lastResult.entry?.length??0)+(lastResult.link?.some(l=>l.relation==="next")?1:0)),total}import{jsx as jsx149,jsxs as jsxs98}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum44(),[schemaLoaded,setSchemaLoaded]=useState83(!1),[outcome,setOutcome]=useState83(),{query,fields}=props,[response,setResponse]=useState83(),[selected,setSelected]=useState83({});useEffect33(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome11(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selected};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=response?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=response?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selected[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if(useEffect33(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx149(Loader8,{});let checkboxColumn=props.checkboxesEnabled;return jsxs98("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs98(Table4,{children:[jsx149(Table4.Thead,{children:jsxs98(Table4.Tr,{children:[checkboxColumn&&jsx149(Table4.Th,{children:jsx149("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx149(Table4.Th,{children:field.name},field.name))]})}),jsx149(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs98(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx149(Table4.Td,{children:jsx149("input",{type:"checkbox",value:"checked","data-testid":"row-checkbox","aria-label":`Checkbox for ${resource.id}`,checked:!!selected[resource.id],onChange:e=>handleSingleCheckboxClick(e,resource.id)})}),fields.map(field=>jsx149(Table4.Td,{children:jsx149(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx149("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx149("div",{"data-testid":"search-error",children:jsx149("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx149(Button19,{onClick:()=>props.onBulk(Object.keys(selected)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo(FhirPathTable);import{ScrollArea as ScrollArea5}from"@mantine/core";var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};import{jsx as jsx150}from"react/jsx-runtime";function InfoBar(props){return jsx150(ScrollArea5,{children:jsx150("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx150("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx150("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx150("div",{className:InfoBar_default.value,children:props.children})};import{Anchor as Anchor11,Tabs as Tabs2}from"@mantine/core";import{isString as isString2,locationUtils as locationUtils5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate6}from"@medplum/react-hooks";import{useState as useState84}from"react";var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};import{jsx as jsx151,jsxs as jsxs99}from"react/jsx-runtime";function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=useMedplumNavigate6(),[currentTab,setCurrentTab]=useState84(()=>{let segment=locationUtils5.getPathname().split("/").pop();if(segment){let segmentLower=segment.toLowerCase(),matched=tabs.find(t=>t.value.split(/[?#]/)[0].toLowerCase()===segmentLower);if(matched)return matched.value}return tabs[0].value});function onTabChange(newTabName){newTabName=newTabName||tabs[0].value,setCurrentTab(newTabName),navigate(`${baseUrl}/${newTabName}`)}return jsxs99(Tabs2,{value:currentTab,onChange:onTabChange,...rest,children:[jsx151(Tabs2.List,{className:LinkTabs_default.list,children:tabs.map(t=>jsx151(Tabs2.Tab,{value:t.value,children:jsx151(Anchor11,{className:LinkTabs_default.link,href:`${baseUrl}/${t.value}`,onClick:onLinkClick,children:t.label})},t.value))}),children]})}function normalizeTabDefinitions(tabs){return tabs.map(t=>isString2(t)?{label:t,value:t.toLowerCase()}:t)}function onLinkClick(e){isAuxClick(e)||e.preventDefault()}import{Center as Center6,Divider as Divider12,Flex as Flex22,Group as Group57,Pagination as Pagination3,ScrollArea as ScrollArea6,Stack as Stack39,Tabs as Tabs3,Text as Text43}from"@mantine/core";var ListWithDetailPane_default={container:"ListWithDetailPane_container",shell:"ListWithDetailPane_shell",detailBorder:"ListWithDetailPane_detailBorder",item:"ListWithDetailPane_item",selected:"ListWithDetailPane_selected",footer:"ListWithDetailPane_footer",headerText:"ListWithDetailPane_headerText",pillTabs:"ListWithDetailPane_pillTabs",tabLink:"ListWithDetailPane_tabLink"};import{Divider as Divider11,Flex as Flex21,Skeleton as Skeleton3,Stack as Stack38}from"@mantine/core";import{jsx as jsx152,jsxs as jsxs100}from"react/jsx-runtime";var SKELETON_WIDTHS=[["85%","60%","72%"],["70%","80%","55%"],["92%","50%","65%"],["78%","68%","58%"],["88%","45%","75%"],["74%","70%","62%"]];function ListWithDetailPaneSkeleton(){return jsx152(Stack38,{gap:"md",p:"md",children:SKELETON_WIDTHS.map((widths,index)=>jsxs100(Stack38,{children:[jsxs100(Flex21,{direction:"column",gap:"xs",align:"flex-start",children:[jsx152(Skeleton3,{height:16,width:widths[0]}),jsx152(Skeleton3,{height:14,width:widths[1]}),jsx152(Skeleton3,{height:14,width:widths[2]})]}),jsx152(Divider11,{})]},index))})}import{Fragment as Fragment52,jsx as jsx153,jsxs as jsxs101}from"react/jsx-runtime";var DEFAULT_LIST_WIDTH=350,HEADER_HEIGHT=64;function ListWithDetailPane(props){let{items,loading,selectedKey,renderItem,emptyList,skeleton,listWidth=DEFAULT_LIST_WIDTH,tabs,activeTab,onTabChange,headerActions,selected,renderDetail,emptyDetail,refresh,page,pageCount,onPageChange}=props,handleTabChange=value=>{value&&onTabChange?.(value)};return jsxs101(Flex22,{direction:"row",h:"100%",w:"100%",className:ListWithDetailPane_default.container,children:[jsxs101(Flex22,{direction:"column",w:listWidth,h:"100%",className:ListWithDetailPane_default.shell,children:[(tabs||headerActions)&&jsxs101(Fragment52,{children:[jsxs101(Flex22,{h:HEADER_HEIGHT,align:"center",justify:"space-between",p:"md",children:[tabs?jsx153(Tabs3,{value:activeTab??null,onChange:handleTabChange,variant:"unstyled",className:ListWithDetailPane_default.pillTabs,children:jsx153(Tabs3.List,{children:tabs.map(tab=>jsx153(Tabs3.Tab,{value:tab.value,children:jsx153(MedplumLink,{className:ListWithDetailPane_default.tabLink,to:tab.uri,children:tab.label})},tab.value))})}):jsx153("span",{}),headerActions&&jsx153(Group57,{gap:"xs",children:headerActions})]}),jsx153(Divider12,{})]}),jsxs101(ScrollArea6,{flex:1,scrollbarSize:10,type:"hover",scrollHideDelay:250,children:[loading&&(skeleton??jsx153(ListWithDetailPaneSkeleton,{})),!loading&&items.length===0&&(emptyList??jsx153(DefaultEmptyList,{})),!loading&&items.map((item,index)=>{let isSelected=item.id!==void 0&&item.id===selectedKey;return jsx153("div",{className:isSelected?`${ListWithDetailPane_default.item} ${ListWithDetailPane_default.selected}`:ListWithDetailPane_default.item,children:renderItem(item,{selected:isSelected,index,items})},item.id??index)})]}),onPageChange!==void 0&&page!==void 0&&pageCount!==void 0&&pageCount>1&&jsx153("div",{className:ListWithDetailPane_default.footer,children:jsx153(Pagination3,{value:page,total:pageCount,onChange:onPageChange,size:"sm",siblings:1,boundaries:1})})]}),selected===void 0?jsx153(Flex22,{direction:"column",style:{flex:1},h:"100%",children:emptyDetail??jsx153(DefaultEmptyDetail,{})}):renderDetail(selected,{refresh})]})}function DefaultEmptyList(){return jsx153(Flex22,{direction:"column",h:"100%",justify:"center",align:"center",pt:"xl",children:jsx153(Text43,{c:"dimmed",fw:500,children:"No items found"})})}function DefaultEmptyDetail(){return jsx153(Center6,{h:"100%",w:"100%",children:jsx153(Stack39,{align:"center",gap:"xs",children:jsx153(Text43,{size:"sm",c:"dimmed",ta:"center",children:"Select an item from the list to view details"})})})}import{Box as Box23,SimpleGrid as SimpleGrid2}from"@mantine/core";import{useResource as useResource12,useSearchOne}from"@medplum/react-hooks";import{Box as Box22,Flex as Flex23,Group as Group58,Paper as Paper5,RingProgress,Text as Text44,Title as Title12}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{Fragment as Fragment53,jsx as jsx154,jsxs as jsxs102}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx154(Paper5,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs102(Group58,{children:[group.measureScore&&jsx154(MeasureScore,{group}),!group.measureScore&&jsx154(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs102(Fragment53,{children:[jsx154(Text44,{fz:"md",fw:500,mb:8,children:measure.title}),jsx154(Text44,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept5(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept5(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs102(Box22,{children:[jsx154(Title12,{order:3,children:"Not Applicable"}),jsx154(Text44,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs102(Box22,{children:[jsx154(Title12,{order:3,children:"Insufficient Data"}),jsx154(Text44,{children:`Numerator: ${numeratorCount}`}),jsx154(Text44,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx154(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx154(Flex23,{justify:"center",children:jsxs102(Text44,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx154(Fragment53,{children:unit==="%"?jsx154(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx154(Flex23,{justify:"center",children:jsx154(Text44,{fw:700,fz:18,children:jsx154(QuantityDisplay,{value:group.measureScore})})})}):jsx154(Flex23,{h:120,align:"center",children:jsx154(Title12,{order:3,children:jsx154(QuantityDisplay,{value:group.measureScore})})})})}function groupValue(group){let score=group.measureScore?.value,unit=group.measureScore?.unit;return score?score<=1&&unit==="%"?score*100:score:0}function groupColor(score){return score<=33?"red":score<=67?"yellow":"green"}import{jsx as jsx155,jsxs as jsxs103}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource12(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs103(Box23,{children:[measure&&jsx155(MeasureTitle,{measure}),jsx155(SimpleGrid2,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx155(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon17,Indicator as Indicator2,Tooltip as Tooltip8}from"@mantine/core";import{useNotificationCount as useNotificationCount2}from"@medplum/react-hooks";import{jsx as jsx156}from"react/jsx-runtime";function NotificationIcon(props){let{resourceType,countCriteria,subscriptionCriteria}=props,unreadCount=useNotificationCount2({resourceType,countCriteria,subscriptionCriteria}),result=props.iconComponent;return props.onClick&&(result=jsx156(ActionIcon17,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=jsx156(Tooltip8,{label:props.tooltip,children:result})),unreadCount>0&&(result=jsx156(Indicator2,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}import{ActionIcon as ActionIcon18,Alert as Alert5,Badge as Badge3,Box as Box24,Button as Button20,Checkbox as Checkbox8,Divider as Divider13,Group as Group59,Modal as Modal16,Stack as Stack40,Table as Table5,Text as Text45,Title as Title13}from"@mantine/core";import{notifications}from"@mantine/notifications";import{extractAccountReferences,normalizeErrorString as normalizeErrorString12}from"@medplum/core";import{useMedplum as useMedplum45}from"@medplum/react-hooks";import{useCallback as useCallback27,useMemo as useMemo38,useState as useState85}from"react";import{Fragment as Fragment54,jsx as jsx157,jsxs as jsxs104}from"react/jsx-runtime";var NOTIFICATION_ID="patient-accounts",NOTIFICATION_TITLE="Patient Accounts",ACCOUNT_TARGET_TYPES=["Organization","HealthcareService","CareTeam"];function PatientAccountsForm(props){let{patient}=props,medplum=useMedplum45(),isAdmin=medplum.isProjectAdmin()||medplum.isSuperAdmin(),originalAccounts=useMemo38(()=>extractAccountReferences(patient.meta)??[],[patient.meta]),[pendingAccounts,setPendingAccounts]=useState85(originalAccounts),[confirmModalOpen,setConfirmModalOpen]=useState85(!1),[propagate,setPropagate]=useState85(!0),[saving,setSaving]=useState85(!1),changes=useMemo38(()=>{let result=[];for(let account of pendingAccounts)originalAccounts.some(o=>o.reference===account.reference)||result.push({reference:account,type:"addition"});for(let account of originalAccounts)pendingAccounts.some(p=>p.reference===account.reference)||result.push({reference:account,type:"removal"});return result},[originalAccounts,pendingAccounts]),hasChanges=changes.length>0,handleAddAccount=useCallback27(value=>{value?.reference&&(pendingAccounts.some(a=>a.reference===value.reference)||setPendingAccounts(prev=>[...prev,value]))},[pendingAccounts]),handleRemoveAccount=useCallback27(referenceString=>{setPendingAccounts(prev=>prev.filter(a=>a.reference!==referenceString))},[]),handleSave=useCallback27(async()=>{let patientId=patient.id;if(!patientId){notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:"Cannot update accounts: Patient resource has no ID.",icon:jsx157(IconX,{size:"1rem"}),autoClose:!1,withCloseButton:!0});return}setSaving(!0),setConfirmModalOpen(!1);let url=medplum.fhirUrl("Patient",patientId,"$set-accounts"),parameters={resourceType:"Parameters",parameter:[...pendingAccounts.map(account=>({name:"accounts",valueReference:{reference:account.reference}})),{name:"propagate",valueBoolean:propagate}]};notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,loading:!0,message:propagate?"Saving account changes and propagating to compartment...":"Saving account changes...",autoClose:!1,withCloseButton:!1});try{let headers={};propagate&&(headers.Prefer="respond-async"),await medplum.post(url,parameters,void 0,{headers}),medplum.invalidateUrl(medplum.fhirUrl("Patient",patientId)),notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"green",message:propagate?"Account changes saved. Compartment updates are being applied.":"Account changes saved.",icon:jsx157(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0}),props.onSaved?.()}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString12(err),icon:jsx157(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}finally{setSaving(!1)}},[medplum,patient,pendingAccounts,propagate,props]);return isAdmin?jsxs104(Fragment54,{children:[jsxs104(Stack40,{children:[jsx157(Title13,{order:3,children:"Current Accounts"}),pendingAccounts.length===0?jsx157(Text45,{c:"dimmed",children:"No accounts assigned to this patient."}):jsxs104(Table5,{children:[jsx157(Table5.Thead,{children:jsxs104(Table5.Tr,{children:[jsx157(Table5.Th,{children:"Type"}),jsx157(Table5.Th,{children:"Account"}),jsx157(Table5.Th,{})]})}),jsx157(Table5.Tbody,{children:pendingAccounts.map(account=>jsxs104(Table5.Tr,{children:[jsx157(Table5.Td,{children:jsx157(AccountTypeBadge,{reference:account})}),jsx157(Table5.Td,{children:jsx157(ResourceBadge,{value:account,link:!0})}),jsx157(Table5.Td,{children:jsx157(ActionIcon18,{variant:"subtle",color:"red","aria-label":`Remove ${account.reference}`,onClick:()=>handleRemoveAccount(account.reference),children:jsx157(IconX,{size:16})})})]},account.reference))})]}),jsx157(Divider13,{}),jsx157(Title13,{order:4,children:"Add Account"}),jsx157(ReferenceInput,{name:"newAccount",placeholder:"Search for Organization, HealthcareService, or CareTeam...",targetTypes:ACCOUNT_TARGET_TYPES,onChange:value=>{value&&handleAddAccount(value)}}),hasChanges&&jsxs104(Fragment54,{children:[jsx157(Divider13,{}),jsx157(Title13,{order:4,children:"Pending Changes"}),jsx157(Stack40,{gap:"xs",children:changes.map(change=>jsxs104(Group59,{gap:"xs",children:[change.type==="addition"?jsx157(Badge3,{color:"green",variant:"light",leftSection:jsx157(IconPlus,{size:12}),children:"Add"}):jsx157(Badge3,{color:"red",variant:"light",leftSection:jsx157(IconMinus,{size:12}),children:"Remove"}),jsx157(ResourceBadge,{value:change.reference,link:!0})]},`${change.type}-${change.reference.reference}`))})]}),jsx157(Box24,{children:jsx157(Button20,{disabled:!hasChanges||saving,onClick:()=>setConfirmModalOpen(!0),children:"Save Changes"})})]}),jsx157(Modal16,{opened:confirmModalOpen,onClose:()=>setConfirmModalOpen(!1),title:"Confirm Account Changes",size:"md",keepMounted:!0,children:jsxs104(Stack40,{children:[jsxs104(Text45,{children:["The following changes will be applied to Patient"," ",jsxs104("strong",{children:[patient.name?.[0]?.given?.join(" ")," ",patient.name?.[0]?.family]}),":"]}),changes.filter(c=>c.type==="addition").length>0&&jsxs104(Box24,{children:[jsx157(Text45,{fw:600,c:"green",children:"Adding:"}),jsx157(Stack40,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="addition").map(c=>jsxs104(Group59,{gap:"xs",children:[jsx157(IconPlus,{size:14,color:"green"}),jsx157(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),changes.filter(c=>c.type==="removal").length>0&&jsxs104(Box24,{children:[jsx157(Text45,{fw:600,c:"red",children:"Removing:"}),jsx157(Stack40,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="removal").map(c=>jsxs104(Group59,{gap:"xs",children:[jsx157(IconMinus,{size:14,color:"red"}),jsx157(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),jsx157(Checkbox8,{label:"Propagate changes to all resources in this patient's compartment",checked:propagate,onChange:event=>setPropagate(event.currentTarget.checked)}),jsxs104(Group59,{justify:"right",mt:"md",children:[jsx157(Button20,{variant:"default",onClick:()=>setConfirmModalOpen(!1),children:"Cancel"}),jsx157(Button20,{onClick:handleSave,loading:saving,children:"Confirm"})]})]})})]}):jsx157(Alert5,{color:"blue",title:"Admin access required",children:"You need project admin access to manage patient account assignments."})}function AccountTypeBadge({reference}){let type=reference.reference?.split("/")[0]??"Unknown";return jsx157(Badge3,{variant:"light",color:{Organization:"blue",HealthcareService:"teal",CareTeam:"violet"}[type]??"gray",size:"sm",children:type})}import{Checkbox as Checkbox9,Group as Group60,SegmentedControl as SegmentedControl2,Stack as Stack41}from"@mantine/core";import{notifications as notifications2}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString13,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum46}from"@medplum/react-hooks";import{useCallback as useCallback28,useState as useState86}from"react";import{jsx as jsx158,jsxs as jsxs105}from"react/jsx-runtime";var NOTIFICATION_ID2="patient-export",NOTIFICATION_TITLE2="Patient Export",formats={everything:{operation:"$everything",extension:"json",contentType:ContentType3.FHIR_JSON},summary:{operation:"$summary",extension:"json",contentType:ContentType3.FHIR_JSON},ccda:{operation:"$ccda-export",extension:"xml",contentType:ContentType3.CDA_XML},ccdaReferral:{operation:"$ccda-export",type:"referral",extension:"xml",contentType:ContentType3.CDA_XML}};function PatientExportForm(props){let medplum=useMedplum46(),{patient}=props,[format,setFormat]=useState86("everything"),[inlineAttachments,setInlineAttachments]=useState86(!1),handleSubmit=useCallback28(async data2=>{let patientId=resolveId2(patient),{operation,type,contentType,extension}=formats[format],url=medplum.fhirUrl("Patient",patientId,operation),params={};format==="everything"&&inlineAttachments&&url.searchParams.set("_inlineAttachments","true"),type&&(params.type=type),data2.author&&(params.author={reference:data2.author}),data2.authoredOn&&(params.authoredOn=convertLocalToIso(data2.authoredOn)),data2.startDate&&(params.start=data2.startDate),data2.endDate&&(params.end=data2.endDate),notifications2.show({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,loading:!0,message:"Exporting...",autoClose:!1,withCloseButton:!1});try{let response=await medplum.post(url,params,void 0,{cache:"no-cache",headers:{Accept:contentType}}),fileName=`Patient-export-${patientId}-${new Date().toISOString().replaceAll(":","-")}.${extension}`;saveData(response,fileName,contentType),notifications2.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"green",message:"Done",icon:jsx158(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications2.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"red",message:normalizeErrorString13(err),icon:jsx158(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient,format,inlineAttachments]);return jsx158(Form,{onSubmit:handleSubmit,children:jsxs105(Stack41,{children:[jsx158(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx158(SegmentedControl2,{name:"format",value:format,onChange:setFormat,data:[{label:"FHIR Everything",value:"everything"},{label:"Patient Summary",value:"summary"},{label:"C-CDA",value:"ccda"},{label:"C-CDA Referral",value:"ccdaReferral"}],fullWidth:!0})}),jsx158(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx158(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx158(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx158(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx158(FormSection,{title:"Start Date",description:"The start date of care. If no start date is provided, all records prior to the end date are in scope.",children:jsx158(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx158(FormSection,{title:"End Date",description:"The end date of care. If no end date is provided, all records subsequent to the start date are in scope.",children:jsx158(DateTimeInput,{name:"endDate",placeholder:"End date"})}),format==="everything"&&jsx158(FormSection,{title:"Inline Attachments",description:"Embed DocumentReference file attachments as base64-encoded data instead of storage URLs.",children:jsx158(Stack41,{gap:"xs",children:jsx158(Checkbox9,{label:"Inline attachments",checked:inlineAttachments,onChange:e=>setInlineAttachments(e.currentTarget.checked)})})}),jsx158(Group60,{justify:"right",children:jsx158(SubmitButton,{children:"Request Export"})})]})})}function saveData(data2,fileName,contentType){let content=typeof data2=="string"?data2:JSON.stringify(data2,null,2),blob=new Blob([content],{type:contentType}),url=window.URL.createObjectURL(blob),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=url,a.download=fileName,a.click(),window.URL.revokeObjectURL(url)}import{calculateAgeString as calculateAgeString2}from"@medplum/core";import{useResource as useResource13}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment55,jsx as jsx159,jsxs as jsxs106}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource13(props.patient);return patient?jsxs106(InfoBar,{children:[jsx159(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs106(InfoBar.Entry,{children:[jsx159(InfoBar.Key,{children:"Name"}),jsx159(InfoBar.Value,{children:jsx159(MedplumLink,{to:patient,fw:500,children:patient.name?jsx159(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs106(Fragment55,{children:[jsxs106(InfoBar.Entry,{children:[jsx159(InfoBar.Key,{children:"DoB"}),jsx159(InfoBar.Value,{children:patient.birthDate})]}),jsxs106(InfoBar.Entry,{children:[jsx159(InfoBar.Key,{children:"Age"}),jsx159(InfoBar.Value,{children:calculateAgeString2(patient.birthDate)})]})]}),patient.gender&&jsxs106(InfoBar.Entry,{children:[jsx159(InfoBar.Key,{children:"Gender"}),jsx159(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs106(InfoBar.Entry,{children:[jsx159(InfoBar.Key,{children:"State"}),jsx159(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs106(InfoBar.Entry,{children:[jsx159(InfoBar.Key,{children:identifier?.system}),jsx159(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Box as Box25,Button as Button21,Checkbox as Checkbox10,Flex as Flex24,Group as Group61,Loader as Loader9,Radio as Radio5,Stack as Stack42,Text as Text46,TextInput as TextInput28}from"@mantine/core";import{showNotification as showNotification10}from"@mantine/notifications";import{formatAddress as formatAddress4,normalizeErrorString as normalizeErrorString14}from"@medplum/core";import{useCallback as useCallback29,useState as useState87}from"react";var PharmacyDialog_default={pharmacyItem:"PharmacyDialog_pharmacyItem",pharmacyItemSelected:"PharmacyDialog_pharmacyItemSelected"};import{jsx as jsx160,jsxs as jsxs107}from"react/jsx-runtime";function getPharmacyKey(pharmacy,index){return pharmacy.identifier?.[0]?.value||`pharmacy-${index}`}function SearchForm({onSearch,searching}){return jsx160("form",{onSubmit:e=>{e.preventDefault();let formData=new FormData(e.currentTarget);onSearch(formData)},children:jsxs107(Stack42,{gap:"md",children:[jsx160(TextInput28,{name:"name",label:"Pharmacy Name",placeholder:"Enter pharmacy name (min 3 chars)"}),jsxs107(Group61,{grow:!0,children:[jsx160(TextInput28,{name:"city",label:"City",placeholder:"City (min 3 chars)"}),jsx160(TextInput28,{name:"state",label:"State",placeholder:"State (min 3 chars)"})]}),jsxs107(Group61,{grow:!0,children:[jsx160(TextInput28,{name:"zip",label:"Zip Code",placeholder:"Zip code (min 3 chars)"}),jsx160(TextInput28,{name:"phoneOrFax",label:"Phone or Fax",placeholder:"Phone or fax number"})]}),jsx160(TextInput28,{name:"address",label:"Address",placeholder:"Street address (min 3 chars)"}),jsx160(TextInput28,{name:"ncpdpID",label:"NCPDP ID",placeholder:"National Council for Prescription Drug Programs ID"}),jsx160(Button21,{type:"submit",loading:searching,children:"Search"})]})})}function PharmacyItem({pharmacy,pharmacyKey,isSelected,onSelect}){return jsx160(Box25,{p:"sm",className:isSelected?PharmacyDialog_default.pharmacyItemSelected:PharmacyDialog_default.pharmacyItem,onClick:onSelect,children:jsx160(Radio5,{value:pharmacyKey,label:jsxs107(Box25,{children:[jsx160(Text46,{fw:500,size:"sm",children:pharmacy.name}),pharmacy.address?.[0]&&jsx160(Text46,{size:"xs",c:"dimmed",children:formatAddress4(pharmacy.address[0])}),pharmacy.telecom?.find(t=>t.system==="phone")&&jsxs107(Text46,{size:"xs",c:"dimmed",children:["Phone: ",pharmacy.telecom.find(t=>t.system==="phone")?.value]}),pharmacy.telecom?.find(t=>t.system==="fax")&&jsxs107(Text46,{size:"xs",c:"dimmed",children:["Fax: ",pharmacy.telecom.find(t=>t.system==="fax")?.value]})]})})},pharmacyKey)}function SearchResults({searchResults,selectedPharmacy,onSelectPharmacy,setAsPrimary,onSetAsPrimary,onAddFavorite,onClose,adding}){return jsxs107(Box25,{mt:"xl",children:[jsxs107(Text46,{fw:600,mb:"md",children:["Search Results (",searchResults.length,")"]}),jsx160(Radio5.Group,{value:selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy)):"",onChange:value=>{let selected=searchResults.find((p,i)=>getPharmacyKey(p,i)===value);selected&&onSelectPharmacy(selected)},children:jsx160(Stack42,{gap:"sm",children:searchResults.map((pharmacy,index)=>{let pharmacyKey=getPharmacyKey(pharmacy,index),isSelected=selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy))===pharmacyKey:!1;return jsx160(PharmacyItem,{pharmacy,pharmacyKey,isSelected,onSelect:()=>onSelectPharmacy(pharmacy)},pharmacyKey)})})}),jsxs107(Flex24,{mt:"lg",gap:"md",align:"center",justify:"space-between",children:[jsx160(Checkbox10,{label:"Set as primary pharmacy",checked:setAsPrimary,onChange:e=>onSetAsPrimary(e.currentTarget.checked)}),jsxs107(Group61,{children:[jsx160(Button21,{variant:"subtle",onClick:onClose,children:"Cancel"}),jsx160(Button21,{onClick:onAddFavorite,disabled:!selectedPharmacy,loading:adding,children:"Add to Favorites"})]})]})]})}function PharmacyDialog(props){let{patient,onSubmit,onClose,onSearch,onAddToFavorites}=props,[searchResults,setSearchResults]=useState87([]),[searching,setSearching]=useState87(!1),[selectedPharmacy,setSelectedPharmacy]=useState87(),[setAsPrimary,setSetAsPrimary]=useState87(!1),[adding,setAdding]=useState87(!1),handleSearch=useCallback29(async formData=>{let searchParams={name:formData.get("name")||void 0,city:formData.get("city")||void 0,state:formData.get("state")||void 0,zip:formData.get("zip")||void 0,address:formData.get("address")||void 0,phoneOrFax:formData.get("phoneOrFax")||void 0,ncpdpID:formData.get("ncpdpID")||void 0},cleanParams=Object.fromEntries(Object.entries(searchParams).filter(([_,v])=>typeof v=="string"&&v.trim()!==""));if(Object.keys(cleanParams).length===0){showNotification10({color:"yellow",title:"Search Required",message:"Please enter at least one search criterion"});return}setSearching(!0),setSelectedPharmacy(void 0);try{let results=await onSearch(cleanParams);setSearchResults(results),results.length===0&&showNotification10({color:"blue",title:"No Results",message:"No pharmacies found matching your search criteria"})}catch(error){showNotification10({color:"red",title:"Search Error",message:normalizeErrorString14(error)})}finally{setSearching(!1)}},[onSearch]),handleAddFavorite=useCallback29(async()=>{if(!(!selectedPharmacy||!patient.id)){setAdding(!0);try{let response=await onAddToFavorites({patientId:patient.id,pharmacy:selectedPharmacy,setAsPrimary});response.success?(showNotification10({color:"green",title:"Success",message:response.message}),onSubmit(response.organization||selectedPharmacy)):showNotification10({color:"red",title:"Error",message:response.message})}catch(error){showNotification10({color:"red",title:"Error",message:normalizeErrorString14(error)})}finally{setAdding(!1)}}},[selectedPharmacy,patient.id,setAsPrimary,onAddToFavorites,onSubmit]);return jsxs107(Box25,{children:[jsx160(SearchForm,{onSearch:formData=>handleSearch(formData).catch(console.error),searching}),searching&&jsx160(Flex24,{justify:"center",mt:"xl",children:jsx160(Loader9,{})}),searchResults.length>0&&!searching&&jsx160(SearchResults,{searchResults,selectedPharmacy,onSelectPharmacy:setSelectedPharmacy,setAsPrimary,onSetAsPrimary:setSetAsPrimary,onAddFavorite:handleAddFavorite,onClose,adding})]})}import{Box as Box26,Flex as Flex25,Group as Group62,Text as Text47}from"@mantine/core";import{getDisplayString as coreGetDisplayString}from"@medplum/core";import{jsx as jsx161,jsxs as jsxs108}from"react/jsx-runtime";function summaryResourceListSection(options){return{key:options.key,title:options.title,searches:[{key:options.key,resourceType:options.search.resourceType,patientParam:options.search.patientParam,query:options.search.query}],component:context=>jsx161(ResourceListDisplay,{options,resources:context.results[options.key]??[],context})}}function ResourceListDisplay(props){let{options,context}=props,resources=[...props.resources];return options.filter&&(resources=resources.filter(options.filter)),options.sort&&resources.sort(options.sort),jsx161(CollapsibleSection,{title:options.title,onAdd:options.onAdd,children:resources.length>0?jsx161(Flex25,{direction:"column",gap:8,children:resources.map(resource=>{let displayString=options.getDisplayString?options.getDisplayString(resource):coreGetDisplayString(resource),status=options.getStatus?.(resource),secondaryText=options.getSecondaryText?.(resource);return jsx161(SummaryItem,{onClick:()=>context.onClickResource?.(resource),children:jsxs108(Box26,{children:[jsx161(Text47,{fw:500,className:SummaryItem_default.itemText,children:displayString}),(status||secondaryText)&&jsxs108(Group62,{mt:2,gap:4,children:[status&&jsx161(StatusBadge,{color:status.color,variant:"light",status:status.label}),secondaryText&&jsx161(Text47,{size:"xs",fw:500,c:"dimmed",children:secondaryText})]})]})},resource.id)})}):jsx161(Text47,{children:"(none)"})})}import{createReference as createReference16}from"@medplum/core";import{useCallback as useCallback30}from"react";import{jsx as jsx162}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback30((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),medplum.search("ClinicalImpression",{subject:ref,_count}),medplum.search("Communication",{subject:ref,_count}),medplum.search("Device",{patient:ref,_count}),medplum.search("DeviceRequest",{patient:ref,_count}),medplum.search("DiagnosticReport",{subject:ref,_count}),medplum.search("Media",{subject:ref,_count}),medplum.search("ServiceRequest",{subject:ref,_count}),medplum.search("Task",{subject:ref,_count})])},[]);return jsx162(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference16(resource),sender:createReference16(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference16(resource),operator:createReference16(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor12,Box as Box27,Button as Button22,CloseButton as CloseButton2,Flex as Flex26,Group as Group63,Loader as Loader10,NativeSelect as NativeSelect12,Paper as Paper6,Stack as Stack43,Text as Text48,TextInput as TextInput29}from"@mantine/core";import{getReferenceString as getReferenceString12}from"@medplum/core";import{useMedplum as useMedplum47,useResource as useResource14}from"@medplum/react-hooks";import{useEffect as useEffect34,useState as useState88}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx163,jsxs as jsxs109}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum47(),defaultValue2=useResource14(props.value),[schemaLoaded,setSchemaLoaded]=useState88(!1),[selectedKey,setSelectedKey]=useState88(),[hoverKey,setHoverKey]=useState88(),[value,setValue]=useState88();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}if(useEffect34(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect34(()=>(setValue(ensurePlanDefinitionKeys(defaultValue2??{resourceType:"PlanDefinition",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]),!schemaLoaded||!value)return null;function changeProperty(property,newValue){setValue(prevValue=>({...prevValue,[property]:newValue}))}return jsx163("div",{children:jsxs109(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx163(TextInput29,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx163(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx163(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){function changeAction(changedAction){props.onChange(props.actions.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...props.actions,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(props.actions.filter(i=>i!==removedAction))}return jsxs109(Stack43,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx163(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx163("div",{children:jsx163(Button22,{variant:"outline",onClick:e=>{killEvent(e),addAction({id:generateId()})},children:"Add action"})})]})}function ActionBuilder(props){let{action}=props;function onClick(e){e.stopPropagation(),props.setSelectedKey(props.action.id)}function onHover(e){killEvent(e),props.setHoverKey(props.action.id)}return jsx163("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx163(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState88(),medplum=useMedplum47(),[loading,setLoading]=useState88(!1),[resource,setResource]=useState88(),editing=props.selectedKey===props.action.id,hovering=props.hoverKey===props.action.id;function changeProperty(property,value){props.onChange({...action,[property]:value})}let className=clsx_default(PlanDefinitionBuilder_default.section,{[PlanDefinitionBuilder_default.hovering]:hovering&&!editing});return useEffect34(()=>{(async()=>{if(!action.definitionCanonical)return;setLoading(!0);let resource2=await medplum.readCanonical(["Questionnaire","ActivityDefinition"],action.definitionCanonical);setActionType(getInitialActionType(resource2)),setResource(resource2),setLoading(!1)})().catch(console.error)},[action.definitionCanonical,medplum]),loading?jsx163(Loader10,{}):jsxs109(Paper6,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs109(Flex26,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx163(TextInput29,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx163(CloseButton2,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs109(Stack43,{gap:"xl",p:"md",children:[jsx163(Box27,{children:jsx163(TextInput29,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx163(Box27,{children:jsx163(NativeSelect12,{label:"Type of Action",value:actionType,onChange:e=>{let value=e.currentTarget.value==="standard"?void 0:e.currentTarget.value;setActionType(value),props.onChange({...props.action,definitionCanonical:value==="standard"?void 0:props.action.definitionCanonical})},data:[{value:"standard",label:"Standard task"},{value:"questionnaire",label:"Task with Questionnaire"},{value:"activitydefinition",label:"Task with Activity Definition"}]})}),actionType==="questionnaire"&&jsxs109(Stack43,{gap:0,children:[jsxs109(Group63,{gap:0,mb:"xs",children:[jsx163(Text48,{fw:600,children:"Select questionnaire"}),jsx163(Text48,{c:"red",children:"*"})]}),jsxs109(Text48,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx163(Anchor12,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx163(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&jsxs109(Stack43,{gap:0,children:[jsxs109(Group63,{gap:0,mb:"xs",children:[jsx163(Text48,{fw:600,children:"Select activity definition"}),jsx163(Text48,{c:"red",children:"*"})]}),jsxs109(Text48,{size:"sm",c:"dimmed",mb:"sm",children:["ActivityDefinition.kind resource to be shown in the task in Encounter view. You can create new one from"," ",jsx163(Anchor12,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx163(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return jsx163(ResourceInput,{name:id,placeholder:props.placeholder,resourceType:props.resourceType,defaultValue:resource,onChange:newValue=>{newValue?props.onChange({...props.action,definitionCanonical:"url"in newValue?newValue.url:void 0,definitionUri:"url"in newValue?void 0:getReferenceString12(newValue)}):props.onChange({...props.action,definitionCanonical:void 0})}})}function getInitialActionType(resource){return resource===void 0?"standard":resource.resourceType.toLowerCase()}var nextId=1;function generateId(existing){if(existing){if(existing.startsWith("id-")){let existingNum=Number.parseInt(existing.substring(3),10);Number.isNaN(existingNum)||(nextId=Math.max(nextId,existingNum+1))}return existing}return"id-"+nextId++}function ensurePlanDefinitionKeys(planDefinition){return{...planDefinition,action:ensurePlanDefinitionActionKeys(planDefinition.action)}}function ensurePlanDefinitionActionKeys(actions){if(actions)return actions.map(action=>({...action,id:generateId(action.id),action:ensurePlanDefinitionActionKeys(action.action)}))}import{Anchor as Anchor13,Box as Box28,Group as Group64,NativeSelect as NativeSelect13,Space,Textarea as Textarea5,TextInput as TextInput30,Title as Title14}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{getQuestionnaireItemReferenceTargetTypes as getQuestionnaireItemReferenceTargetTypes2,isChoiceQuestion,QUESTIONNAIRE_ITEM_CONTROL_URL as QUESTIONNAIRE_ITEM_CONTROL_URL2,QuestionnaireItemType as QuestionnaireItemType4,setQuestionnaireItemReferenceTargetTypes,useMedplum as useMedplum48,useResource as useResource15}from"@medplum/react-hooks";import{useEffect as useEffect35,useLayoutEffect as useLayoutEffect7,useRef as useRef18,useState as useState89}from"react";var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};import{Fragment as Fragment56,jsx as jsx164,jsxs as jsxs110}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum48(),defaultValue2=useResource15(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState89(!1),[value,setValue]=useState89(),[selectedKey,setSelectedKey]=useState89(),[hoverKey,setHoverKey]=useState89();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect35(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect35(()=>(setValue(ensureQuestionnaireKeys(defaultValue2??{resourceType:"Questionnaire",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]);let handleChange=(questionnaire2,disableSubmit)=>{setValue(questionnaire2),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire2)};return!schemaLoaded||!value?null:jsx164("div",{children:jsxs110(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx164(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx164(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource4=isResourceType(props.item),isContainer=isResource4||item.type===QuestionnaireItemType4.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef18(props.item);useLayoutEffect7(()=>{itemRef.current=props.item});function onClick(e){killEvent(e),props.setSelectedKey(props.item.id)}function onHover(e){killEvent(e),props.setHoverKey(props.item.id)}function changeItem(changedItem){let curr=itemRef.current;props.onChange({...curr,item:curr.item?.map(i=>i.id===changedItem.id?changedItem:i)})}function addItem(addedItem,disableSubmit){props.onChange({...props.item,item:[...props.item.item??[],addedItem]},disableSubmit)}function removeItem(removedItem){props.onChange({...props.item,item:props.item.item?.filter(i=>i!==removedItem)})}function changeProperty(property,value){props.onChange({...itemRef.current,[property]:value})}function updateItem(updatedItem){props.onChange({...props.item,...updatedItem})}function toggleRepeatable(item2){props.onChange({...props.item,item:props.item.item?.map(i=>i===item2?{...i,repeats:!i.repeats}:i)})}function moveItem(itemIndex,delta){let updatedItems=reorderItems(props.item.item,itemIndex,delta);props.onChange({...props.item,item:updatedItems})}let className=clsx_default(QuestionnaireBuilder_default.section,{[QuestionnaireBuilder_default.editing]:editing,[QuestionnaireBuilder_default.hovering]:hovering&&!editing});return jsxs110("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx164("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs110(Fragment56,{children:[isResource4&&jsx164(TextInput30,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource4&&jsx164(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx164(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx164(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs110(Fragment56,{children:[resource.title&&jsx164(Title14,{children:resource.title}),item.text&&jsx164("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx164(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx164("div",{children:jsx164(ItemBuilder,{item:item2,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,isFirst:i===0,isLast:i===(props.item.item??[]).length-1,setHoverKey:props.setHoverKey,onChange:changeItem,onRemove:()=>removeItem(item2),onRepeatable:toggleRepeatable,onMoveUp:()=>moveItem(i,-1),onMoveDown:()=>moveItem(i,1)})},item2.id)),!isContainer&&jsx164("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs110(Fragment56,{children:[jsx164(TextInput30,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx164(NativeSelect13,{size:"xs",className:QuestionnaireBuilder_default.typeSelect,defaultValue:item.type,onChange:e=>changeProperty("type",e.currentTarget.value),data:[{value:"display",label:"Display"},{value:"boolean",label:"Boolean"},{value:"decimal",label:"Decimal"},{value:"integer",label:"Integer"},{value:"date",label:"Date"},{value:"dateTime",label:"Date/Time"},{value:"time",label:"Time"},{value:"string",label:"String"},{value:"text",label:"Text"},{value:"url",label:"URL"},{value:"choice",label:"Choice"},{value:"open-choice",label:"Open Choice"},{value:"attachment",label:"Attachment"},{value:"reference",label:"Reference"},{value:"quantity",label:"Quantity"}]})]}):jsx164("div",{children:linkId})}),!isResource4&&jsx164(Box28,{className:QuestionnaireBuilder_default.movementActions,children:jsxs110(Box28,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx164(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx164(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx164(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx164(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs110("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs110(Fragment56,{children:[jsx164(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx164(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource4&&jsx164(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource4&&jsxs110(Fragment56,{children:[jsx164(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx164(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),props.onRemove&&props.onRemove()},children:"Remove"})]})]})]})}function AnswerBuilder(props){let property=getElementDefinition3("QuestionnaireItemAnswerOption","value[x]"),options=props.item.answerOption??[];return jsxs110("div",{children:[props.item.answerValueSet!==void 0?jsx164(TextInput30,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx164(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs110(Box28,{display:"flex",children:[jsx164(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),jsx164(Space,{w:"lg"}),jsx164(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx164("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs110("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx164("div",{children:jsx164(ResourcePropertyInput,{name:"value[x]",path:"Questionnaire.answerOption.value[x]",property:props.property,defaultPropertyType:propertyType,defaultValue:propertyValue,onChange:(newValue,propName)=>{let newOptions=[...props.options],index=newOptions.findIndex(o=>o.id===option.id);newOptions[index]={id:option.id,[propName]:newValue},props.onChange({...props.item,answerOption:newOptions})},outcome:void 0},option.id)}),jsx164("div",{children:jsx164(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:props.options.filter(o=>o.id!==option.id)})},children:"Remove"})})]},option.id)})})}function ReferenceProfiles(props){let targetTypes=getQuestionnaireItemReferenceTargetTypes2(props.item)??[];return jsxs110(Fragment56,{children:[targetTypes.map((targetType,index)=>jsxs110(Group64,{children:[jsx164(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx164(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx164(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId2=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId2(){return"id-"+nextId2++}function ensureQuestionnaireKeys(questionnaire2){return{...questionnaire2,id:questionnaire2.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire2.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId2=Math.max(nextId2,Number.parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,Number.parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId2(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId2()}))}function createPage(){return{id:generateId2(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:QUESTIONNAIRE_ITEM_CONTROL_URL2,valueCodeableConcept:{coding:[{system:"http://hl7.org/fhir/questionnaire-item-control",code:"page"}]}}]}}function reorderItems(items,itemIndex,delta){let currentItems=items??[],newIndex=itemIndex+delta;if(newIndex<0||newIndex>=currentItems.length)return currentItems;let updatedItems=[...currentItems];return[updatedItems[itemIndex],updatedItems[newIndex]]=[updatedItems[newIndex],updatedItems[itemIndex]],updatedItems}import{ActionIcon as ActionIcon19,Box as Box29,Button as Button23,Collapse as Collapse2,Divider as Divider14,Flex as Flex27,Loader as Loader11,Stack as Stack44,Text as Text49}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback4}from"@mantine/hooks";import{showNotification as showNotification11}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString15}from"@medplum/core";import{useMedplum as useMedplum49,useWhisper}from"@medplum/react-hooks";import{useCallback as useCallback31,useEffect as useEffect36,useRef as useRef19,useState as useState90}from"react";var AIRealTimeQuestionnaireForm_default={banner:"AIRealTimeQuestionnaireForm_banner",headerRow:"AIRealTimeQuestionnaireForm_headerRow",statusRow:"AIRealTimeQuestionnaireForm_statusRow",iconWrapper:"AIRealTimeQuestionnaireForm_iconWrapper",recordingPulse:"AIRealTimeQuestionnaireForm_recordingPulse",statusLabel:"AIRealTimeQuestionnaireForm_statusLabel",statusLabelPrimary:"AIRealTimeQuestionnaireForm_statusLabelPrimary",statusLabelFinishing:"AIRealTimeQuestionnaireForm_statusLabelFinishing",dictationButton:"AIRealTimeQuestionnaireForm_dictationButton",dictationButtonLoading:"AIRealTimeQuestionnaireForm_dictationButtonLoading",instructions:"AIRealTimeQuestionnaireForm_instructions",panelGrid:"AIRealTimeQuestionnaireForm_panelGrid",panelColumn:"AIRealTimeQuestionnaireForm_panelColumn",transcriptWrapper:"AIRealTimeQuestionnaireForm_transcriptWrapper",transcriptArea:"AIRealTimeQuestionnaireForm_transcriptArea",transcriptText:"AIRealTimeQuestionnaireForm_transcriptText"};import{Fragment as Fragment57,jsx as jsx165,jsxs as jsxs111}from"react/jsx-runtime";var SILENCE_DEBOUNCE_MS=3e3,DEFAULT_IDLE_LABEL="Start Dictation to complete this form with your voice",TRANSCRIPT_PLACEHOLDER="Start speaking to see your transcribed words...",VOICE_TRANSCRIPT_EXTENSION_URL="https://medplum.com/ai-voice-transcript",botIdentifier={system:"https://www.medplum.com/bots",value:"ai-realtime-questionnaire"};function getStoredTranscript(response){return response?.extension?.find(e=>e.url===VOICE_TRANSCRIPT_EXTENSION_URL)?.valueString??""}var DEFAULT_INSTRUCTIONS=jsxs111(Stack44,{gap:"xs",children:[jsx165(Text49,{children:"To fill out the form, just speak naturally and the dictation tool will map your spoken answers to the form fields."}),jsx165(Text49,{children:"Pause briefly between thoughts to start processing."})]});function AIRealTimeQuestionnaireForm(props){let{aiModel,onTranscript,voiceInstructions,...questionnaireFormProps}=props,medplum=useMedplum49(),[questionnaireResponse,setQuestionnaireResponse]=useState90(props.questionnaireResponse),[isProcessing,setIsProcessing]=useState90(!1),[transcript,setTranscript]=useState90(""),[displayTranscript,setDisplayTranscript]=useState90(()=>getStoredTranscript(props.questionnaireResponse)),[expanded,setExpanded]=useState90(!1),[isStopping,setIsStopping]=useState90(!1),[responseVersion,setResponseVersion]=useState90(0),questionnaireRef=useRef19(null),inputRef=useRef19(""),inFlightRef=useRef19(!1),responseRef=useRef19(questionnaireResponse),flushTranscriptRef=useRef19(async()=>{}),transcriptViewportRef=useRef19(null),fullTranscriptRef=useRef19(getStoredTranscript(questionnaireResponse));useEffect36(()=>{responseRef.current=questionnaireResponse},[questionnaireResponse]);let[botAvailability,setBotAvailability]=useState90("loading");useEffect36(()=>{let cancelled=!1;async function checkBotAvailability(){try{let bot=await medplum.searchOne("Bot",{identifier:`${botIdentifier.system??""}|${botIdentifier.value??""}`});cancelled||setBotAvailability(bot?"available":"unavailable")}catch(err){console.error("Error checking bot availability:",err),cancelled||setBotAvailability("unavailable")}}return checkBotAvailability().catch(console.error),()=>{cancelled=!0}},[medplum]);let isProjectVoiceEnabled=medplum.getProject()?.features?.includes("ai-realtime")??!1,isVoiceEnabled=isProjectVoiceEnabled&&botAvailability==="available",idleLabel=DEFAULT_IDLE_LABEL;isProjectVoiceEnabled?botAvailability==="unavailable"&&(idleLabel=jsxs111(Fragment57,{children:["Voice dictation unavailable: bot '",botIdentifier.value??"","' is not deployed",jsx165("br",{}),"Please contact support"]})):idleLabel=jsxs111(Fragment57,{children:["Voice dictation is not enabled for this project",jsx165("br",{}),"Please contact support"]});let{start,stop,status}=useWhisper({model:"gpt-4o-transcribe",onTranscript:text=>{let trimmed=text.trim();if(!trimmed)return;let previous=inputRef.current.trim(),next=previous?`${previous} ${trimmed}`:trimmed;inputRef.current=next,setTranscript(next),onTranscript?.(next,trimmed)}}),statusRef=useRef19(status);useEffect36(()=>{statusRef.current=status},[status]);let processTranscript=useCallback31(async transcript2=>{if(!(!questionnaireRef.current||!transcript2.trim())){setIsProcessing(!0);try{let existingResponse=responseRef.current,parameter=[{name:"questionnaire",valueString:JSON.stringify(questionnaireRef.current)},{name:"transcript",valueString:transcript2}];existingResponse?.item&&existingResponse.item.length>0&¶meter.push({name:"questionnaireResponse",valueString:JSON.stringify(existingResponse)}),aiModel&¶meter.push({name:"model",valueString:aiModel});let responseParam=(await medplum.executeBot(botIdentifier,{resourceType:"Parameters",parameter})).parameter?.find(p=>p.name==="questionnaireResponse");if(responseParam?.valueString)try{let aiQuestionnaireResponse=JSON.parse(responseParam.valueString),preservedExtensions=(aiQuestionnaireResponse.extension??[]).filter(e=>e.url!==VOICE_TRANSCRIPT_EXTENSION_URL);aiQuestionnaireResponse.extension=[...preservedExtensions,{url:VOICE_TRANSCRIPT_EXTENSION_URL,valueString:fullTranscriptRef.current}],responseRef.current=aiQuestionnaireResponse,setQuestionnaireResponse(aiQuestionnaireResponse),setResponseVersion(v=>v+1)}catch(parseError){console.error("Failed to parse bot response as QuestionnaireResponse:",parseError),showNotification11({color:"red",message:`Failed to parse bot response as QuestionnaireResponse: ${normalizeErrorString15(parseError)}`})}}catch(error){console.error("Error processing transcript with AI:",error)}finally{setIsProcessing(!1)}}},[medplum,aiModel]);useEffect36(()=>{flushTranscriptRef.current=async()=>{if(inFlightRef.current)return;let pending=inputRef.current.trim();if(pending){inputRef.current="",setTranscript(""),onTranscript?.("",""),fullTranscriptRef.current=fullTranscriptRef.current?`${fullTranscriptRef.current} ${pending}`:pending,setDisplayTranscript(fullTranscriptRef.current),inFlightRef.current=!0;try{await processTranscript(pending)}finally{inFlightRef.current=!1}inputRef.current.trim()&&statusRef.current!=="speech_started"&&flushTranscriptRef.current().catch(err=>console.error("Error draining transcript:",err))}}},[processTranscript,onTranscript]);let debouncedFlush=useDebouncedCallback4(()=>{statusRef.current!=="speech_started"&&flushTranscriptRef.current().catch(err=>showNotification11({color:"red",message:`Error flushing transcript: ${normalizeErrorString15(err)}`}))},SILENCE_DEBOUNCE_MS);useEffect36(()=>{status==="speech_stopped"&&debouncedFlush()},[status,debouncedFlush]),useEffect36(()=>{let viewport=transcriptViewportRef.current;viewport&&viewport.scrollTo({top:viewport.scrollHeight,behavior:"smooth"})},[transcript,displayTranscript]);let isConnecting=status==="requesting_microphone"||status==="connecting"||status==="connected",isRecording=status==="listening"||status==="speech_started"||status==="speech_stopped",handleStartDictation=useCallback31(()=>{setExpanded(!0),start().catch(err=>console.error("Error starting voice input:",err))},[start]),handleStopDictation=useCallback31(()=>{setIsStopping(!0),stop(),debouncedFlush.cancel(),flushTranscriptRef.current().catch(err=>showNotification11({color:"red",message:`Error flushing transcript: ${normalizeErrorString15(err)}`}))},[stop,debouncedFlush]),handleToggleExpanded=useCallback31(()=>{setExpanded(prev=>!prev)},[]),handleClearTranscript=useCallback31(()=>{inputRef.current="",fullTranscriptRef.current="",setTranscript(""),setDisplayTranscript(""),onTranscript?.("","");let existing=responseRef.current;if(existing?.extension?.some(e=>e.url===VOICE_TRANSCRIPT_EXTENSION_URL)){let next={...existing,extension:existing.extension.filter(e=>e.url!==VOICE_TRANSCRIPT_EXTENSION_URL)};responseRef.current=next,setQuestionnaireResponse(next)}},[onTranscript]);useEffect36(()=>{isStopping&&!isConnecting&&!isRecording&&setIsStopping(!1)},[isStopping,isProcessing,isConnecting,isRecording]),useEffect36(()=>{typeof props.questionnaire=="object"&&"resourceType"in props.questionnaire&&(questionnaireRef.current=props.questionnaire)},[props.questionnaire]);let isActive=isRecording&&!isStopping,isButtonLoading=isConnecting||isStopping,showStopButton=isActive&&!isButtonLoading,showButtonLoader=isButtonLoading,dictationLabel="Start Dictation";isStopping?dictationLabel="Stopping\u2026":isConnecting?dictationLabel="Starting\u2026":showStopButton&&(dictationLabel="Stop Dictation");let isFinishing=(isProcessing||isStopping)&&!isRecording&&!isConnecting,activeStatusLabel;isProcessing||isStopping?activeStatusLabel="Processing\u2026":isRecording&&(activeStatusLabel="Listening\u2026");let statusState="idle",statusIcon=jsx165(IconMicrophone,{size:20});isFinishing?(statusState="finishing",statusIcon=jsx165(Loader11,{size:16,color:"blue"})):activeStatusLabel&&(statusState="recording",statusIcon=jsx165(IconCircleFilled,{size:16}));let afterHeader=jsxs111(Box29,{className:AIRealTimeQuestionnaireForm_default.banner,children:[jsxs111(Flex27,{align:"center",justify:"space-between",gap:"sm",p:"md",className:AIRealTimeQuestionnaireForm_default.headerRow,children:[jsxs111("div",{className:AIRealTimeQuestionnaireForm_default.statusRow,"data-state":statusState,children:[jsx165("span",{className:AIRealTimeQuestionnaireForm_default.iconWrapper,"aria-hidden":!0,children:statusIcon}),jsx165("span",{className:AIRealTimeQuestionnaireForm_default.statusLabel,"aria-live":"polite",children:activeStatusLabel?jsx165("span",{className:isFinishing?AIRealTimeQuestionnaireForm_default.statusLabelFinishing:AIRealTimeQuestionnaireForm_default.statusLabelPrimary,children:activeStatusLabel}):idleLabel})]}),jsxs111(Flex27,{align:"center",gap:"xs",children:[jsx165(Button23,{className:clsx_default(AIRealTimeQuestionnaireForm_default.dictationButton,showButtonLoader&&AIRealTimeQuestionnaireForm_default.dictationButtonLoading),variant:showStopButton?"light":"filled",color:showStopButton?"red":"blue",size:"sm",leftSection:showButtonLoader?jsx165(Loader11,{size:14,color:"dimmed"}):void 0,disabled:showButtonLoader||!isVoiceEnabled&&!showStopButton,onClick:showStopButton?handleStopDictation:handleStartDictation,children:dictationLabel}),jsx165(ActionIcon19,{variant:"subtle",color:"gray",size:"lg",radius:"xl","aria-label":expanded?"Collapse transcript":"Expand transcript","aria-expanded":expanded,onClick:handleToggleExpanded,children:expanded?jsx165(IconChevronUp,{size:18}):jsx165(IconChevronDown,{size:18})})]})]}),jsxs111(Collapse2,{in:expanded,children:[jsx165(Box29,{px:"md",children:jsx165(Divider14,{color:"var(--mantine-color-gray-2)"})}),jsx165(Box29,{p:"md",children:jsxs111("div",{className:AIRealTimeQuestionnaireForm_default.panelGrid,children:[jsxs111("div",{className:AIRealTimeQuestionnaireForm_default.panelColumn,children:[jsx165(Text49,{size:"sm",fw:700,children:"How to Use"}),jsx165("div",{className:AIRealTimeQuestionnaireForm_default.instructions,children:voiceInstructions??DEFAULT_INSTRUCTIONS})]}),jsxs111("div",{className:AIRealTimeQuestionnaireForm_default.panelColumn,children:[jsxs111(Flex27,{align:"center",justify:"space-between",gap:"xs",children:[jsx165(Text49,{size:"sm",fw:700,children:"Transcript"}),jsx165(Button23,{variant:"subtle",color:"red",size:"compact-xs",leftSection:jsx165(IconTrash,{size:14}),disabled:!displayTranscript&&!transcript,onClick:handleClearTranscript,children:"Clear"})]}),jsx165("div",{className:AIRealTimeQuestionnaireForm_default.transcriptWrapper,children:jsx165("div",{ref:transcriptViewportRef,className:AIRealTimeQuestionnaireForm_default.transcriptArea,children:jsx165(Text49,{component:"pre",className:AIRealTimeQuestionnaireForm_default.transcriptText,children:(displayTranscript&&transcript?`${displayTranscript} ${transcript}`:displayTranscript||transcript)||TRANSCRIPT_PLACEHOLDER})})})]})]})})]})]});return jsx165(QuestionnaireForm,{...questionnaireFormProps,questionnaireResponse,afterHeader,onChange:response=>{setQuestionnaireResponse(response),props.onChange?.(response)}},responseVersion)}import{Stack as Stack46}from"@mantine/core";import{useResource as useResource16}from"@medplum/react-hooks";import{Stack as Stack45,Text as Text50}from"@mantine/core";import{formatDate as formatDate4}from"@medplum/core";import{useMemo as useMemo39}from"react";import{Fragment as Fragment58,jsx as jsx166,jsxs as jsxs112}from"react/jsx-runtime";function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=useMemo39(()=>answer&&answer.length>0?jsx166(Fragment58,{children:answer.map((ans,index)=>jsx166(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?jsx166(Fragment58,{children:nestedAnswers.map((nestedAnswer,index)=>jsx166(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):jsx166(Text50,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return jsxs112(Stack45,{gap:0,pb:"xs",children:[jsx166(Text50,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return jsx166(Text50,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return jsx166(Text50,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return jsx166(Text50,{children:value});case"valueQuantity":return jsx166(QuantityDisplay,{value});case"valueString":return jsx166(Text50,{children:value});case"valueCoding":return jsx166(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return jsx166(RangeDisplay,{value});case"valueDateTime":return jsx166(Text50,{children:formatDate4(value)});case"valueBoolean":return jsx166(Text50,{children:value?"True":"False"});case"valueReference":return jsx166(Text50,{children:value.display??value.reference});default:return jsx166(Text50,{children:value.toString()})}}import{jsx as jsx167}from"react/jsx-runtime";function QuestionnaireResponseDisplay(props){let questionnaireResponse=useResource16(props.questionnaireResponse);return jsx167(Stack46,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>jsx167(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}import{ActionIcon as ActionIcon20,Divider as Divider15,Group as Group65,NativeSelect as NativeSelect14,Stack as Stack47,Text as Text51,TextInput as TextInput31}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect37,useState as useState91}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx168,jsxs as jsxs113}from"react/jsx-runtime";var intervalFilters=["gender","age","gestationalAge","context","appliesTo","category"],defaultProps={definition:{resourceType:"ObservationDefinition",code:{text:""}},onSubmit:()=>{}};function ReferenceRangeEditor(props){props=Object.assign(defaultProps,props);let defaultDefinition=props.definition,[intervalGroups,setIntervalGroups]=useState91([]),[groupId,setGroupId]=useState91(1),[intervalId,setIntervalId]=useState91(1);return useEffect37(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs113(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx168(Stack47,{children:intervalGroups.map(intervalGroup=>jsx168(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx168(ActionIcon20,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx168(IconCirclePlus,{})}),jsx168(Group65,{justify:"flex-end",children:jsx168(SubmitButton,{children:"Save"})})]});function submitDefinition(){let qualifiedInterval=intervalGroups.flatMap(group=>group.intervals).filter(interval=>!isEmptyInterval(interval));props.onSubmit({...defaultDefinition,qualifiedInterval})}function addGroup(addedGroup){setIntervalGroups(currentGroups=>[...currentGroups,addedGroup])}function removeGroup(removedGroup){setIntervalGroups(currentGroups=>currentGroups.filter(group=>group.id!==removedGroup.id))}function changeInterval(groupId2,changedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2),index=currentGroup?.intervals.findIndex(interval=>interval.id===changedInterval.id);return index!==void 0&¤tGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g=>g.id===groupId2);if(currentGroupIndex!==-1){let currentGroup={...groups[currentGroupIndex]};addedInterval={...addedInterval,...currentGroup.filters},currentGroup.intervals=[...currentGroup.intervals,addedInterval],groups[currentGroupIndex]=currentGroup}return groups})}function removeInterval(groupId2,removedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx168(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs113(Stack47,{gap:"lg",children:[jsx168(Group65,{justify:"flex-end",children:jsx168(ActionIcon20,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx168(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx168(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx168(Divider15,{}),intervalGroup.intervals.map(interval=>jsxs113(Stack47,{gap:"xs",children:[jsxs113(Group65,{children:[jsx168(TextInput31,{"data-testid":`condition-${interval.id}`,defaultValue:interval.condition,label:"Condition: ",size:"sm",onChange:e=>{killEvent(e),props.onChange(intervalGroup.id,{...interval,condition:e.currentTarget.value.trim()})}},`condition-${interval.id}`),jsx168(ActionIcon20,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx168(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx168(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx168(ActionIcon20,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx168(IconCirclePlus,{})})]})})}function ReferenceRangeGroupFilters(props){let{intervalGroup,onChange}=props,age=intervalGroup.filters.age??{},ageWithDefaults={low:age.low?.unit?age.low:{...age.low,unit:"years",system:"http://unitsofmeasure.org"},high:age.high?.unit?age.high:{...age.high,unit:"years",system:"http://unitsofmeasure.org"}};return jsxs113(Stack47,{style:{maxWidth:"50%"},children:[jsx168(Group65,{children:jsx168(NativeSelect14,{data:["","male","female"],label:"Gender:",defaultValue:intervalGroup.filters.gender||"",onChange:e=>{for(let interval of intervalGroup.intervals){let newGender=e.currentTarget.value;newGender===""&&(newGender=void 0),onChange(intervalGroup.id,{...interval,gender:newGender})}}})}),jsxs113(Group65,{gap:"xs",children:[jsx168(Text51,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx168("div",{id:`div-age-${intervalGroup.id}`,children:jsx168(RangeInput,{path:"",name:`age-${intervalGroup.id}`,defaultValue:ageWithDefaults,onChange:ageRange=>{for(let interval of intervalGroup.intervals)onChange(intervalGroup.id,{...interval,age:ageRange})}},`age-${intervalGroup.id}`)})]}),jsx168(NativeSelect14,{data:["","pre-puberty","follicular","midcycle","luteal","postmenopausal"],label:"Endocrine:",defaultValue:intervalGroup.filters.context?.text||"",onChange:e=>{for(let interval of intervalGroup.intervals){let newEndocrine=e.currentTarget.value;newEndocrine===""?(newEndocrine=void 0,onChange(intervalGroup.id,{...interval,context:void 0})):onChange(intervalGroup.id,{...interval,context:{text:newEndocrine,coding:[{code:newEndocrine,system:"http://terminology.hl7.org/CodeSystem/referencerange-meaning"}]}})}}}),jsx168(NativeSelect14,{data:["","reference","critical","absolute"],label:"Category: ",defaultValue:intervalGroup.filters.category,onChange:e=>{for(let interval of intervalGroup.intervals){let newCategory=e.currentTarget.value;newCategory===""?onChange(intervalGroup.id,{...interval,category:void 0}):onChange(intervalGroup.id,{...interval,category:newCategory})}}})]})}function ensureQualifiedIntervalKeys(definition,setIntervalId){let intervals=definition.qualifiedInterval||[],nextId3=Math.max(...intervals.map(interval=>{let existingNum=Number.parseInt(interval.id?.substring(3)||"",10);return Number.isNaN(existingNum)?Number.NEGATIVE_INFINITY:existingNum}))+1;return Number.isFinite(nextId3)||(nextId3=1),definition={...definition,qualifiedInterval:intervals.map(interval=>({...interval,id:interval.id||`id-${nextId3++}`}))},setIntervalId(nextId3),definition}function groupQualifiedIntervals(intervals,setGroupId){let groupId=1,groups={};for(let interval of intervals){let groupKey=generateGroupKey(interval);groupKey in groups||(groups[groupKey]={id:`group-id-${groupId++}`,filters:Object.fromEntries(intervalFilters.map(f=>[f,interval[f]])),intervals:[]}),groups[groupKey].intervals.push(interval)}return setGroupId(groupId),Object.values(groups)}function generateGroupKey(interval){return[`gender=${interval.gender}`,`age=${formatRange2(interval.age)}`,`gestationalAge=${formatRange2(interval.gestationalAge)}`,`context=${interval.context?.text}`,`appliesTo=${interval.appliesTo?.map(c=>c.text).join("+")}`,`category=${interval.category}`].join(":")}function getUnitString(unit){return unit&&(getCodeBySystem(unit,"http://unitsofmeasure.org")||unit.text)}function isEmptyInterval(interval){return interval.range?.low?.value===void 0&&interval.range?.high?.value===void 0}import{Button as Button24,Grid as Grid2,Text as Text52}from"@mantine/core";import{formatDateTime as formatDateTime7,getReferenceString as getReferenceString13}from"@medplum/core";import{useMedplum as useMedplum50,useResource as useResource17}from"@medplum/react-hooks";import{Fragment as Fragment59,useEffect as useEffect38,useState as useState92}from"react";import{jsx as jsx169,jsxs as jsxs114}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum50(),requestGroup=useResource17(props.value),[startedLoading,setStartedLoading]=useState92(!1),[responseBundle,setResponseBundle]=useState92();if(useEffect38(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx169(Grid2,{children:requestGroup.action?.map((action,index)=>{let task=action.resource&&findBundleEntry(action.resource),taskInput=task?.input?.[0]?.valueReference,taskOutput=task?.output?.[0]?.valueReference;return jsxs114(Fragment59,{children:[jsx169(Grid2.Col,{span:1,p:"md",children:task?.status==="completed"?jsx169(IconCheckbox,{}):jsx169(IconSquare,{color:"gray"})}),jsxs114(Grid2.Col,{span:9,p:"xs",children:[jsx169(Text52,{fw:500,children:action.title}),action.description&&jsx169("div",{children:action.description}),jsxs114("div",{children:["Last edited by\xA0",jsx169(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime7(task?.meta?.lastUpdated)]}),jsxs114("div",{children:["Status: ",jsx169(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs114(Grid2.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx169(Button24,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx169(Button24,{onClick:()=>props.onEdit(task,taskInput,taskOutput),children:"Edit"})]})]},`action-${index}`)})});function buildBatchRequest(request){let batchEntries=[];if(request.action)for(let action of request.action)action.resource?.reference&&batchEntries.push({request:{method:"GET",url:action.resource.reference}});return{resourceType:"Bundle",type:"batch",entry:batchEntries}}function findBundleEntry(reference){for(let entry of responseBundle?.entry??[])if(entry.resource&&reference.reference===getReferenceString13(entry.resource))return entry.resource}}import{useMedplum as useMedplum51}from"@medplum/react-hooks";import{useEffect as useEffect39,useState as useState93}from"react";import{stringify as stringify4}from"@medplum/core";function diff(original,revised){let path=buildPath(original,revised);return buildRevisions(path,original,revised)}function buildPath(orig,rev){let N=orig.length,M=rev.length,MAX=N+M+1,size=1+2*MAX,middle=Math.trunc(size/2),diagonal=new Array(size);diagonal[middle+1]={i:0,j:-1,prev:void 0,snake:!0};for(let d=0;d<MAX;d++){for(let k=-d;k<=d;k+=2){let kmiddle=middle+k,kplus=kmiddle+1,kminus=kmiddle-1,kplusNode=diagonal[kplus],kminusNode=diagonal[kminus],prev,i=0;k===-d||k!==d&&kminusNode.i<kplusNode.i?(i=kplusNode.i,prev=kplusNode):(i=kminusNode.i+1,prev=kminusNode),diagonal[kminus]=void 0;let j=i-k,node={i,j,prev:previousSnake(prev),snake:!1};for(;i<N&&j<M&&orig[i]===rev[j];)i++,j++;if(i>node.i&&(node={i,j,prev:node,snake:!0}),diagonal[kmiddle]=node,i>=N&&j>=M)return diagonal[kmiddle]}diagonal[middle+d-1]=void 0}}function buildRevisions(startNode,orig,rev){let deltas=[],path=startNode;for(path.snake&&(path=path.prev);path?.prev&&path.prev.j>=0;){let i=path.i,j=path.j;path=path.prev;let ianchor=path.i,janchor=path.j,original={position:ianchor,lines:orig.slice(ianchor,i)},revised={position:janchor,lines:rev.slice(janchor,j)},type;original.lines.length===0&&revised.lines.length>0?type="insert":original.lines.length>0&&revised.lines.length===0?type="delete":type="change",deltas.push({original,revised,type}),path.snake&&(path=path.prev)}return deltas}function previousSnake(node){return node&&!node.snake&&node.prev?node.prev:node}function blame(history){let versions=(history.entry??[]).filter(entry=>!!entry.resource).map(entry=>({meta:entry.resource?.meta,lines:stringify4(entry.resource,!0).match(/[^\r\n]+/g)})).sort((a,b)=>a.meta.lastUpdated.localeCompare(b.meta.lastUpdated));if(!versions.length)return[];let table=versions[0].lines.map(line=>({id:versions[0].meta.versionId,meta:versions[0].meta,value:line,span:1}));return compareVersions(table,versions),combineSpans(table),table}function compareVersions(table,versions){for(let i=1;i<versions.length;i++){let revisions=diff(versions[i-1].lines,versions[i].lines);for(let revision of revisions){let position=revision.original.position,oldLines=revision.original.lines,newLines=revision.revised.lines;if((revision.type==="delete"||revision.type==="change")&&table.splice(position,oldLines.length),revision.type==="insert"||revision.type==="change")for(let k=0;k<revision.revised.lines.length;k++)table.splice(position+k,0,{id:versions[i].meta.versionId,meta:versions[i].meta,value:newLines[k],span:1})}}}function combineSpans(table){let start=0;for(;start<table.length;){let curr=start;for(;curr<table.length&&table[curr].id===table[start].id;)table[curr].span=-1,curr++;table[start].span=curr-start,start=curr}}var ResourceBlame_default={container:"ResourceBlame_container",root:"ResourceBlame_root",startRow:"ResourceBlame_startRow",normalRow:"ResourceBlame_normalRow",author:"ResourceBlame_author",onBehalfOf:"ResourceBlame_onBehalfOf",dateTime:"ResourceBlame_dateTime",lineNumber:"ResourceBlame_lineNumber",line:"ResourceBlame_line",pre:"ResourceBlame_pre"};function getVersionUrl(resource,versionId){return`/${resource.resourceType}/${resource.id}/_history/${versionId}`}function getTimeString(lastUpdated){let seconds=Math.floor((Date.now()-Date.parse(lastUpdated))/1e3),years=Math.floor(seconds/31536e3);if(years>0)return pluralizeTime(years,"year");let months=Math.floor(seconds/2592e3);if(months>0)return pluralizeTime(months,"month");let days=Math.floor(seconds/86400);if(days>0)return pluralizeTime(days,"day");let hours=Math.floor(seconds/3600);if(hours>0)return pluralizeTime(hours,"hour");let minutes=Math.floor(seconds/60);return minutes>0?pluralizeTime(minutes,"minute"):pluralizeTime(seconds,"second")}function pluralizeTime(count,noun){return`${count} ${count===1?noun:noun+"s"} ago`}import{Fragment as Fragment60,jsx as jsx170,jsxs as jsxs115}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum51(),[value,setValue]=useState93(props.history);if(useEffect39(()=>{!props.history&&props.resourceType&&props.id&&medplum.readHistory(props.resourceType,props.id).then(setValue).catch(console.log)},[medplum,props.history,props.resourceType,props.id]),!value)return jsx170("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx170("div",{className:ResourceBlame_default.container,children:jsx170("table",{className:ResourceBlame_default.root,children:jsx170("tbody",{children:table.map((row,index)=>jsxs115("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs115(Fragment60,{children:[jsxs115("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:[jsx170(ResourceName,{value:row.meta.author,link:!0,fz:"xs"}),row.meta.onBehalfOf&&jsxs115("div",{className:ResourceBlame_default.onBehalfOf,children:["on behalf of ",jsx170(ResourceName,{value:row.meta.onBehalfOf,link:!0,fz:"xs",c:"dimmed"})]})]}),jsx170("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx170(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),fz:"xs",children:getTimeString(row.meta.lastUpdated)})})]}),jsx170("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx170("td",{className:ResourceBlame_default.line,children:jsx170("pre",{className:ResourceBlame_default.pre,children:row.value})})]},"row-"+index))})})})}import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT3}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate7,useResourceBoard}from"@medplum/react-hooks";import{jsx as jsx171}from"react/jsx-runtime";function ResourceBoard(props){let{search,selectedId,loadItems,resolveSelected,reloadKey,tabs,activeTab,headerActions,renderItem,emptyList,skeleton,listWidth,renderDetail,emptyDetail,onChange,onSelectFirst,onLoad,onError}=props,navigate=useMedplumNavigate7(),{items,total,loading,selected,search:memoizedSearch,refresh}=useResourceBoard({search,selectedId,loadItems,resolveSelected,reloadKey,onSelectFirst,onLoad,onError}),count=memoizedSearch.count??DEFAULT_SEARCH_COUNT3,offset=memoizedSearch.offset??0,currentPage=Math.floor(offset/count)+1,pageCount=total!==void 0?Math.ceil(total/count):0,selectedKey=selected?.id??selectedId;return jsx171(ListWithDetailPane,{items,loading,selectedKey,renderItem,emptyList,skeleton,listWidth,tabs,activeTab,onTabChange:value=>{let tab=tabs?.find(t=>t.value===value);tab&&navigate(tab.uri)},headerActions,selected,renderDetail,emptyDetail,refresh,page:currentPage,pageCount,onPageChange:onChange?page=>{onChange?.({...memoizedSearch,offset:(page-1)*count})}:void 0})}import{stringify as stringify5}from"@medplum/core";var ResourceDiff_default={removed:"ResourceDiff_removed",added:"ResourceDiff_added"};import{Fragment as Fragment61,jsx as jsx172,jsxs as jsxs116}from"react/jsx-runtime";function ResourceDiff(props){let originalResource=props.original,revisedResource=props.revised;props.ignoreMeta&&(originalResource={...originalResource,meta:void 0},revisedResource={...revisedResource,meta:void 0});let original=stringify5(originalResource,!0).match(/[^\r\n]+/g)??["{","}"],revised=stringify5(revisedResource,!0).match(/[^\r\n]+/g)??["{","}"],deltas=diff(original,revised);return jsx172("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx172(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs116(Fragment61,{children:["...",jsx172("br",{}),props.delta.original.lines.length>0&&jsx172("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
|
|
110
|
+
`)}),props.delta.revised.lines.length>0&&jsx172("div",{className:ResourceDiff_default.added,children:props.delta.revised.lines.join(`
|
|
111
|
+
`)}),"...",jsx172("br",{})]})}import{ActionIcon as ActionIcon21,Alert as Alert6,Button as Button25,Group as Group66,Menu as Menu9,Stack as Stack48,TextInput as TextInput32,useMantineTheme}from"@mantine/core";import{AccessPolicyInteraction as AccessPolicyInteraction2,applyDefaultValuesToResource,canWriteResourceType,isPopulated as isPopulated11,satisfiedAccessPolicy as satisfiedAccessPolicy2,tryGetProfile as tryGetProfile5}from"@medplum/core";import{useMedplum as useMedplum52,useResource as useResource18}from"@medplum/react-hooks";import{useEffect as useEffect40,useMemo as useMemo40,useState as useState94}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx173,jsxs as jsxs117}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum52(),defaultValue2=useResource18(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState94(!1),[value,setValue]=useState94(),accessPolicy=medplum.getAccessPolicy(),theme=useMantineTheme();useEffect40(()=>{if(defaultValue2)if(props.profileUrl){let profileUrl=props.profileUrl;medplum.requestProfileSchema(props.profileUrl,{expandProfile:!0}).then(()=>{let profile=tryGetProfile5(profileUrl);if(profile){setSchemaLoaded(!0);let modifiedDefaultValue=applyDefaultValuesToResource(defaultValue2,profile);setValue(modifiedDefaultValue)}else console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)})}else medplum.requestSchema(resourceType).then(()=>{setValue(defaultValue2),setSchemaLoaded(!0)}).catch(console.log)},[medplum,defaultValue2,resourceType,props.profileUrl]);let accessPolicyResource=useMemo40(()=>defaultValue2&&satisfiedAccessPolicy2(defaultValue2,AccessPolicyInteraction2.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=useMemo40(()=>medplum.isSuperAdmin()||!accessPolicy||!isPopulated11(value?.resourceType)?!0:canWriteResourceType(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?jsx173("div",{children:"Loading..."}):canWrite?jsxs117("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs117(Stack48,{mb:"xl",children:[jsx173(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx173(TextInput32,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx173(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx173(TextInput32,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx173(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:resourceType,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl,accessPolicyResource}),jsxs117(Group66,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx173(Button25,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs117(Menu9,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx173(Menu9.Target,{children:jsx173(ActionIcon21,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx173(IconChevronDown,{size:14,stroke:1.5})})}),jsxs117(Menu9.Dropdown,{children:[props.onPatch&&jsx173(Menu9.Item,{leftSection:jsx173(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx173(Menu9.Item,{color:"red",leftSection:jsx173(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs117(Alert6,{color:"red",title:"Permission denied",icon:jsx173(IconAlertCircle,{}),children:["Your access level prevents you from editing and creating ",value.resourceType," resources."]})}import{Table as Table6}from"@mantine/core";import{formatDateTime as formatDateTime8,normalizeErrorString as normalizeErrorString16}from"@medplum/core";import{useMedplum as useMedplum53}from"@medplum/react-hooks";import{useEffect as useEffect41,useState as useState95}from"react";import{jsx as jsx174,jsxs as jsxs118}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum53(),[value,setValue]=useState95(props.history);return useEffect41(()=>{!props.history&&props.resourceType&&props.id&&medplum.readHistory(props.resourceType,props.id).then(setValue).catch(console.log)},[medplum,props.history,props.resourceType,props.id]),value?jsxs118(Table6,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx174(Table6.Thead,{children:jsxs118(Table6.Tr,{children:[jsx174(Table6.Th,{children:"Author"}),jsx174(Table6.Th,{children:"On Behalf Of"}),jsx174(Table6.Th,{children:"Date"}),jsx174(Table6.Th,{children:"Version"})]})}),jsx174(Table6.Tbody,{children:value.entry?.map((entry,index)=>jsx174(HistoryRow,{entry},"entry-"+index))})]}):jsx174("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs118(Table6.Tr,{children:[jsx174(Table6.Td,{children:jsx174(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx174(Table6.Td,{children:resource.meta?.onBehalfOf&&jsx174(ResourceBadge,{value:resource.meta.onBehalfOf,link:!0})}),jsx174(Table6.Td,{children:formatDateTime8(resource.meta?.lastUpdated)}),jsx174(Table6.Td,{children:jsx174(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx174(Table6.Tr,{children:jsx174(Table6.Td,{colSpan:4,children:normalizeErrorString16(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button26,Loader as Loader12,Stack as Stack49,Text as Text53}from"@mantine/core";import{showNotification as showNotification12}from"@mantine/notifications";import{arrayify as arrayify2,getReferenceString as getReferenceString14,isDefined,isReference as isReference4,isResource as isResource3,normalizeErrorString as normalizeErrorString17}from"@medplum/core";import{useMedplum as useMedplum54}from"@medplum/react-hooks";import{useCallback as useCallback32,useEffect as useEffect42,useMemo as useMemo41,useState as useState96}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx175,jsxs as jsxs119}from"react/jsx-runtime";function BaseScheduler(props){let[month,setMonth]=useState96(getStartMonth),[date,setDate]=useState96(),[options,setOptions]=useState96(),[selectedOption,setSelectedOption]=useState96(),{fetchOptions,onSelectOption}=props;useEffect42(()=>{let active=!0;async function doSearch(){let start=getStart2(month),end=getEnd2(month),options2=await fetchOptions({start,end});active&&setOptions(options2)}return doSearch().catch(console.error),()=>{active=!1}},[fetchOptions,month]);let handleSelectOption=useCallback32(option=>{setSelectedOption(option),onSelectOption?.(...option)},[onSelectOption]),filteredOptions=useMemo41(()=>{if(!date||!options)return[];let start=date.getTime(),end=start+1440*60*1e3,seen=new Set;return options.filter(([_,optionDate])=>{let optionTime=optionDate.getTime();return seen.has(optionTime)?!1:(seen.add(optionTime),start<=optionTime&&optionTime<end)})},[date,options]);return options?jsxs119("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs119("div",{className:Scheduler_default.info,children:[props.actor&&jsx175(ResourceAvatar,{value:props.actor,size:"xl"}),props.actor&&jsx175(Text53,{size:"xl",fw:500,children:jsx175(ResourceName,{value:props.actor})}),jsx175("p",{children:"1 hour"}),date&&jsx175("p",{children:date.toLocaleDateString()}),selectedOption&&jsx175("p",{children:formatTime(selectedOption[1])})]}),jsxs119("div",{className:Scheduler_default.selection,children:[!date&&jsxs119("div",{children:[jsx175("h3",{children:"Select date"}),jsx175(CalendarDateInput,{availableDates:options.map(opt=>opt[1]),onChangeMonth:setMonth,onClick:setDate})]}),date&&!selectedOption&&jsxs119("div",{children:[jsx175("h3",{children:"Select time"}),jsx175(Stack49,{children:filteredOptions.map(option=>jsx175("div",{children:jsx175(Button26,{variant:"outline",style:{width:150},onClick:()=>handleSelectOption(option),children:formatTime(option[1])})},option[1].toISOString()))})]}),props.children]})]}):jsx175("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:jsx175(Loader12,{})})}function onlyPractitioner(schedule){let refs=schedule.actor.filter(ref=>isReference4(ref,"Practitioner"));if(refs.length===1)return refs[0]}function Scheduler(props){let medplum=useMedplum54(),{fetchSlots,schedule}=props,[actor,setActor]=useState96(),fetchOptions=useCallback32(async period=>{if(fetchSlots)return(await fetchSlots(period)).map(slot=>[slot,new Date(slot.start)]);let scheduleRefs=arrayify2(schedule??[]).map(getReferenceString14).filter(isDefined),slotSearchParams=new URLSearchParams([["_count","720"],["schedule",scheduleRefs.join(",")],["start","gt"+period.start],["start","lt"+period.end]]);return(await medplum.searchResources("Slot",slotSearchParams)).map(slot=>[slot,new Date(slot.start)])},[medplum,fetchSlots,schedule]);return useEffect42(()=>{let schedules=arrayify2(props.schedule);if(schedules?.length!==1)return;let schedule2=schedules[0];isResource3(schedule2)?setActor(onlyPractitioner(schedule2)):medplum.readReference(schedule2).then(schedule3=>{setActor(onlyPractitioner(schedule3))}).catch(error=>{showNotification12({color:"red",title:"Error",message:normalizeErrorString17(error)})})},[medplum,props.schedule]),jsx175(BaseScheduler,{fetchOptions,onSelectOption:props.onSelectSlot,actor,children:props.children})}function getStart2(month){return formatSlotInstant(month.getTime())}function getEnd2(month){return formatSlotInstant(month.getTime()+744*60*60*1e3)}function formatSlotInstant(time){let date=new Date(Math.max(Date.now(),time));return date.setHours(0,0,0,0),date.toISOString()}function formatTime(date){return date.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})}import{useEffect as useEffect43}from"react";var dist_exports={};__export(dist_exports,{HydratedRouter:()=>HydratedRouter,RouterProvider:()=>RouterProvider});__reExport(dist_exports,react_router_star);import{HydratedRouter,RouterProvider}from"react-router/dom";import*as react_router_star from"react-router";function ScrollToTop(){let{pathname}=(0,dist_exports.useLocation)();return useEffect43(()=>{window.scrollTo(0,0)},[pathname]),null}import{createReference as createReference17}from"@medplum/core";import{jsx as jsx176}from"react/jsx-runtime";function ServiceRequestTimeline(props){let{serviceRequest,...rest}=props;return jsx176(ResourceTimeline,{value:serviceRequest,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("ServiceRequest",id),medplum.search("Communication",{"based-on":ref,_count}),medplum.search("DiagnosticReport",{"based-on":ref,_count}),medplum.search("Media",{"based-on":ref,_count}),medplum.search("DocumentReference",{related:ref,_count}),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count})])},createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",basedOn:[createReference17(resource)],subject:resource.subject,sender:createReference17(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference17(resource)],subject:resource.subject,operator:createReference17(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor14}from"@mantine/core";import{showNotification as showNotification13}from"@mantine/notifications";import{ensureTrailingSlash,normalizeErrorString as normalizeErrorString18}from"@medplum/core";import{useMedplum as useMedplum55,useResource as useResource19}from"@medplum/react-hooks";import{jsx as jsx177}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum55(),{client,patient,encounter,children,...rest}=props,patientResource=useResource19(patient),encounterResource=useResource19(encounter);function launchApp(){let patientRef=patient,encounterRef=encounter;if(client.launchIdentifierSystems?.length){let patientIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Patient");if(patientRef&&patientResource&&patientIdentifierConfig?.system){let identifier=patientResource.identifier?.find(i=>i.system===patientIdentifierConfig.system);identifier&&(patientRef={...patient,identifier})}let encounterIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Encounter");if(encounterRef&&encounterResource&&encounterIdentifierConfig?.system){let identifier=encounterResource.identifier?.find(i=>i.system===encounterIdentifierConfig.system);identifier&&(encounterRef={...encounter,identifier})}}medplum.createResource({resourceType:"SmartAppLaunch",patient:patientRef,encounter:encounterRef,fhirContext:props.fhirContext}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",ensureTrailingSlash(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),window.open(url.toString(),"_blank")}).catch(err=>showNotification13({color:"red",message:normalizeErrorString18(err),autoClose:!1}))}return jsx177(Anchor14,{onClick:()=>launchApp(),...rest,children})}export{AIRealTimeQuestionnaireForm,AddressDisplay,AddressInput,AllergiesSection,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,BaseScheduler,CalendarDateInput,CalendarInput,ChangePasswordForm,ChatModal,CheckboxFormSection,ChooseScopeForm,CodeInput,CodeableConceptDisplay,CodeableConceptInput,CodingDisplay,CodingInput,ContactDetailDisplay,ContactDetailInput,ContactPointDisplay,ContactPointInput,Container,DateTimeInput,DefaultResourceItemComponent,DefaultResourceTimeline,DemographicsSection,DescriptionList,DescriptionListEntry,DiagnosticReportDisplay,Document,ElementDefinitionInputSelector,ElementDefinitionTypeInput,EncounterTimeline,ErrorBoundary,FhirPathTable,Form,FormSection,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,InfoBar,InsuranceSection,LabsSection,LinkTabs,ListWithDetailPane,Loading,Logo,MeasureReportDisplay,MedicationsSection,MedplumLink,MemoizedFhirPathTable,MfaForm,MoneyDisplay,MoneyInput,MultiResourceInput,Navbar,NewTopicDialog,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,Panel,ParticipantFilter,PatientAccountsForm,PatientExportForm,PatientHeader,PatientSummary,PatientTimeline,Pharmacies,PharmaciesSection,PharmacyDialog,PlanDefinitionBuilder,ProblemListSection,QuantityDisplay,QuantityInput,QuestionnaireBuilder,QuestionnaireForm,QuestionnaireResponseDisplay,RangeDisplay,RangeInput,RatioInput,ReferenceDisplay,ReferenceInput,ReferenceRangeEditor,ReferenceRangeGroupEditor,RegisterForm,RequestGroupDisplay,ResetPasswordForm,ResourceArrayDisplay,ResourceArrayInput,ResourceAvatar,ResourceBadge,ResourceBlame,ResourceBoard,ResourceDiff,ResourceDiffTable,ResourceForm,ResourceHistoryTable,ResourceInput,ResourceName,ResourcePropertyDisplay,ResourcePropertyInput,ResourceTable,ResourceTimeline,Scheduler,ScrollToTop,SearchChangeEvent,SearchClickEvent,SearchControl,SearchFieldEditor,SearchFilterEditor,SearchLoadEvent,ServiceRequestTimeline,SetPasswordForm,SexualOrientationSection,SignInForm,SignatureInput,SmartAppLaunchLink,SmokingStatusSection,Spotlight,StatusBadge,SubmitButton,ThreadChat,ThreadInbox,Timeline,TimelineItem,TimingInput,ValueSetAutocomplete,VitalsSection,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNext24HoursFilter,addNextMonthFilter,addPreferredPharmacyToPatient,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,clearFilters,clearFiltersOnField,codingToValueSetElement,convertIsoToLocal,convertLocalToIso,createLabsSection,createPharmaciesSection,createPreferredPharmacyExtension,createScriptTag,deleteFilter,exportJsonFile,getAppName,getDefaultSections,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getOpString,getPaginationControlProps,getPreferredPharmaciesFromPatient,getRecaptcha,getSearchOperators,getSortField,getValuePath,initRecaptcha,isAddPharmacyResponse,isAuxClick,isCheckboxCell,isOrganizationArray,isSortDescending,isSupportedProfileStructureDefinition,killEvent,parseForm,removePreferredPharmacyFromPatient,renderValue,sendCommand,setFilters,setOffset,setPage,setPropertyValue,setSort,sortByDateAndPriority,summaryResourceListSection,toggleSort,valueSetElementToCoding};
|
|
112
112
|
/*! Bundled license information:
|
|
113
113
|
|
|
114
114
|
@tabler/icons-react/dist/esm/defaultAttributes.mjs:
|