@medplum/react 5.0.11 → 5.0.12

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.
@@ -106,7 +106,7 @@ 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 Group23,Stack as Stack12,Text as Text15}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useMedplum as useMedplum19}from"@medplum/react-hooks";import{useContext as useContext19,useEffect as useEffect11,useState as useState41}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group22,Stack as Stack11,Text as Text14}from"@mantine/core";import{buildElementsContext as buildElementsContext3,getPropertyDisplayName,isEmpty as isEmpty5,isPopulated as isPopulated10}from"@medplum/core";import{useContext as useContext18,useMemo as useMemo18,useState as useState40}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon4,Button as Button4}from"@mantine/core";import{jsx as jsx76}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx76(Button4,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx76(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx76(ActionIcon4,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx76(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon5}from"@mantine/core";import{jsx as jsx77}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx77(ActionIcon5,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx77(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx78,jsxs as jsxs42}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState40(props.defaultValue),sliceElements=slice.typeSchema?.elements??slice.elements,parentElementsContextValue=useContext18(ElementsContext),contextValue=useMemo18(()=>{if(isPopulated10(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,jsx78(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx78(Text14,{c:"dimmed",children:"(empty)"}):jsxs42(Stack11,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs42(Group22,{wrap:"nowrap",children:[jsx78("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx78(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&&jsx78(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&&jsx78(Group22,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx78(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx79,jsxs as jsxs43}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum19(),[loading,setLoading]=useState41(!0),[slices,setSlices]=useState41([]),[defaultValue2]=useState41(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState41(()=>[defaultValue2]),ctx=useContext19(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect11(()=>{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 jsx79("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 jsxs43(Stack12,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx79(Text15,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx79(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)=>jsxs43(Group23,{wrap:"nowrap",style:{flexGrow:1},children:[jsx79("div",{style:{flexGrow:1},children:jsx79(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&&jsx79(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&&jsx79(Group23,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx79(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 Flex7,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification4}from"@mantine/notifications";import{useRef as useRef11,useState as useState42}from"react";import{jsx as jsx80,jsxs as jsxs44}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState42(!1),clipboard=useClipboard(),ref=useRef11(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs44(Flex7,{gap:"xs",children:[jsx80(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx80(ActionIcon6,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification4({color:"green",message:"Copied"})},children:jsx80(IconCopy,{})})]})}import{Box as Box6,Button as Button5,Chip,Group as Group24,Modal as Modal2,NativeSelect as NativeSelect8,Stack as Stack13,Switch,TextInput as TextInput16}from"@mantine/core";import{formatTiming as formatTiming2}from"@medplum/core";import{useContext as useContext20,useMemo as useMemo19,useRef as useRef12,useState as useState43}from"react";import{Fragment as Fragment27,jsx as jsx81,jsxs as jsxs45}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState43(props.defaultValue),[open,setOpen]=useState43(!props.disabled&&(props.defaultModalOpen??!1));return jsxs45(Fragment27,{children:[jsxs45(Group24,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81("span",{"data-testid":"timinginput-display",children:formatTiming2(value)||"No repeat"}),jsx81(Button5,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx81(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]=useState43(props.defaultValue||defaultValue),[timeOfDayItems,setTimeOfDayItems]=useState43(()=>(props.defaultValue?.repeat?.timeOfDay??[]).map((v,i)=>({id:i,value:v}))),nextTimeOfDayId=useRef12(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 jsx81(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs45(Stack13,{gap:"md",children:[jsx81(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx81(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx81(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs45(Fragment27,{children:[jsx81(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs45(Group24,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81(TextInput16,{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)}),jsx81(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"&&jsx81(FormSection,{title:"Repeat on",children:jsx81(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,value:value.repeat?.dayOfWeek,children:jsx81(Group24,{justify:"space-between",mt:"xs",gap:"xs",children:daysOfWeek.map(day=>jsx81(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,checked:(value.repeat?.dayOfWeek??[]).includes(day),children:day.charAt(0).toUpperCase()},day))})})}),jsx81(FormSection,{title:"At times",children:jsxs45(Stack13,{mt:"xs",children:[timeOfDayItems.map((item,idx)=>jsxs45(Group24,{children:[jsx81(TextInput16,{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}}),jsx81(ArrayRemoveButton,{testId:`timing-repeat-timeOfDay-remove-${idx}`,onClick:()=>setTimeOfDay(items=>items.toSpliced(idx,1))})]},item.id)),jsx81(Box6,{children:jsx81(ArrayAddButton,{propertyDisplayName:"Time of Day",onClick:()=>setTimeOfDay(items=>{let id=nextTimeOfDayId.current++;return items.concat({id,value:"00:00:00"})})})})]})})]}),jsx81(Group24,{justify:"flex-end",children:jsx81(Button5,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx82,jsxs as jsxs46}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 jsx82(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx82(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx82(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx82(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]=useState44(initialPropertyType);return jsxs46(Group25,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx82(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}))}),jsx82(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 isPopulated11(withDefaults)?withDefaults:props.defaultValue},[propertyType,elementsContext.path,elementsContext.elements,props.path,props.defaultValue]);if(!propertyType)return jsx82("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]"?jsx82(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx82(TextInput17,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx82(TextInput17,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.time:return jsx82(TextInput17,{...getPrimitiveInputProps(),type:"time",step:1,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx82(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx82(TextInput17,{...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 jsx82(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx82(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:case PropertyType2.xhtml:return jsx82(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx82(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx82(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx82(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx82(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx82(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx82(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx82(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx82(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx82(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx82(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx82(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx82(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx82(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx82(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx82(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx82(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx82(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx82(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 jsx83}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState45(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 jsx83(Stack14,{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=jsx83(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"?jsx83(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx83(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 jsx84,jsxs as jsxs47}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState46(()=>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 jsxs47("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx84(Box7,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:jsx84(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}import{Button as Button6,Group as Group26}from"@mantine/core";import{useMemo as useMemo23,useState as useState47}from"react";var CalendarInput_default={table:"CalendarInput_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 jsx85,jsxs as jsxs48}from"react/jsx-runtime";function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState47(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth.getTime());return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=useMemo23(()=>buildGrid(month,props.slots),[month,props.slots]);return jsxs48("div",{children:[jsxs48(Group26,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx85("p",{style:{flex:1},children:getMonthString(month)}),jsxs48(Group26,{justify:"flex-end",gap:"xs",children:[jsx85(Button6,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx85(Button6,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs48("table",{className:CalendarInput_default.table,children:[jsx85("thead",{children:jsxs48("tr",{children:[jsx85("th",{children:"SUN"}),jsx85("th",{children:"MON"}),jsx85("th",{children:"TUE"}),jsx85("th",{children:"WED"}),jsx85("th",{children:"THU"}),jsx85("th",{children:"FRI"}),jsx85("th",{children:"SAT"})]})}),jsx85("tbody",{children:grid.map((week,weekIndex)=>jsx85("tr",{children:week.map((day,dayIndex)=>jsx85("td",{children:day&&jsx85(Button6,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,slots){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.getTime()),available:isDayAvailable(d,slots)}),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,slots){for(let slot of slots){let slotStart=new Date(slot.start);if(slotStart.getFullYear()===day.getFullYear()&&slotStart.getMonth()===day.getMonth()&&slotStart.getDate()===day.getDate())return!0}return!1}import{ActionIcon as ActionIcon7,Group as Group27,LoadingOverlay,Paper as Paper2,ScrollArea as ScrollArea2,Skeleton,Stack as Stack15,Text as Text16,TextInput as TextInput18,Title as Title5}from"@mantine/core";import{useResizeObserver}from"@mantine/hooks";import{showNotification as showNotification5}from"@mantine/notifications";import{getDisplayString as getDisplayString4,getReferenceString as getReferenceString4,normalizeErrorString as normalizeErrorString6}from"@medplum/core";import{useMedplum as useMedplum20,useResource as useResource3,useSubscription}from"@medplum/react-hooks";import{useCallback as useCallback10,useEffect as useEffect12,useMemo as useMemo24,useRef as useRef13,useState as useState48}from"react";var BaseChat_default={chatPaper:"BaseChat_chatPaper",chatTitle:"BaseChat_chatTitle",chatBody:"BaseChat_chatBody",chatScrollArea:"BaseChat_chatScrollArea",chatInputContainer:"BaseChat_chatInputContainer",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble",chatBubbleNameRight:"BaseChat_chatBubbleNameRight"};import{jsx as jsx86,jsxs as jsxs49}from"react/jsx-runtime";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,...paperProps}=props,medplum=useMedplum20(),inputRef=useRef13(null),scrollAreaRef=useRef13(null),firstScrollRef=useRef13(!0),initialLoadRef=useRef13(!0),[profile,setProfile]=useState48(medplum.getProfile()),[reconnecting,setReconnecting]=useState48(!1),[loading,setLoading]=useState48(!0);loading||(initialLoadRef.current=!1);let profileRefStr=useMemo24(()=>profile?getReferenceString4(medplum.getProfile()):"",[profile,medplum]),searchMessages=useCallback10(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]);useEffect12(()=>{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),getReferenceString4(communication.sender)!==profileRefStr&&(communicationsRef.current.find(c=>c.id===communication.id)?onMessageUpdated?.(communication):onMessageReceived?.(communication))},{onWebSocketClose:useCallback10(()=>{reconnecting||setReconnecting(!0),showNotification5({color:"red",message:"Live chat disconnected. Attempting to reconnect..."})},[reconnecting]),onWebSocketOpen:useCallback10(()=>{reconnecting&&showNotification5({color:"green",message:"Live chat reconnected."})},[reconnecting]),onSubscriptionConnect:useCallback10(()=>{reconnecting&&(searchMessages().catch(err=>showNotification5({color:"red",message:normalizeErrorString6(err)})),setReconnecting(!1))},[reconnecting,searchMessages]),onError:useCallback10(err=>{onError?onError(err):showError(normalizeErrorString6(err))},[onError])});let sendMessageInternal=useCallback10(formData=>{inputDisabled||(inputRef.current&&(inputRef.current.value=""),sendMessage(formData.message),scrollToBottomRef.current=!0)},[inputDisabled,sendMessage]);useEffect12(()=>{let latestProfile=medplum.getProfile();profile?.id!==latestProfile?.id&&(setProfile(latestProfile),setCommunications([]))});let[parentRef,parentRect]=useResizeObserver(),communicationsRef=useRef13(communications);communicationsRef.current=communications;let prevCommunicationsRef=useRef13(communications),scrollToBottomRef=useRef13(!0);useEffect12(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),useEffect12(()=>{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=useMemo24(()=>{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?jsxs49(Paper2,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[!excludeHeader&&jsx86(Title5,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx86("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs49(Stack15,{align:"stretch",mt:"lg",children:[jsxs49(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(Skeleton,{height:38,circle:!0,ml:"md"}),jsx86(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs49(Group27,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx86(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs49(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(Skeleton,{height:38,circle:!0,ml:"md"}),jsx86(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs49(ScrollArea2,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx86(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;return jsxs49(Stack15,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx86(Text16,{fz:"xs",ta:"center",children:currCommTime}),c.sender?.reference===profileRefStr?jsxs49(Group27,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(ChatBubble,{alignment:"right",communication:c,showDelivered}),jsx86(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender,mb:showDelivered?void 0:"sm"})]}):jsxs49(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),jsx86(ChatBubble,{alignment:"left",communication:c})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsx86("div",{className:BaseChat_default.chatInputContainer,children:jsx86(Form,{onSubmit:sendMessageInternal,children:jsx86(TextInput18,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",rightSectionWidth:42,disabled:inputDisabled,rightSection:inputDisabled?void 0:jsx86(ActionIcon7,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx86(IconArrowRight,{size:"1rem",stroke:1.5})})})})})]}):null}function ChatBubble(props){let{communication,alignment,showDelivered}=props,content=communication.payload?.[0]?.contentString||"",sentTime=new Date(communication.sent??-1),seenTime=new Date(communication.received??-1),senderResource=useResource3(communication.sender);return jsxs49("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsxs49(Text16,{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",jsx86(Text16,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),jsx86("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx86("div",{className:BaseChat_default.chatBubble,children:content})}),showDelivered&&jsxs49("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs49("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx86("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx86("div",{style:{position:"relative"},children:jsx86(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx86("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx86("div",{className:BaseChat_default.chatBubble,children:jsx86(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 useEffect13,useState as useState49}from"react";var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};import{Fragment as Fragment28,jsx as jsx87,jsxs as jsxs50}from"react/jsx-runtime";function ChatModal(props){let{open,children}=props,profile=useMedplumProfile5(),[opened,setOpened]=useState49(open??!1);return useEffect13(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?jsxs50(Fragment28,{children:[opened&&jsx87("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx87("div",{className:ChatModal_default.iconContainer,children:jsx87(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx87(IconChevronDown,{size:"1.625rem"})})}):jsx87("div",{className:ChatModal_default.iconContainer,children:jsx87(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx87(IconChevronUp,{size:"1.625rem"})})})]}):null}import{createReference as createReference3,formatCodeableConcept as formatCodeableConcept2,getReferenceString as getReferenceString5}from"@medplum/core";import{useMedplum as useMedplum21,useMedplumProfile as useMedplumProfile6,usePrevious}from"@medplum/react-hooks";import{useCallback as useCallback11,useEffect as useEffect14,useMemo as useMemo25,useState as useState50}from"react";import{jsx as jsx88}from"react/jsx-runtime";function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,excludeHeader,onError}=props,medplum=useMedplum21(),profile=useMedplumProfile6(),prevThreadId=usePrevious(thread?.id),[communications,setCommunications]=useState50([]),profileRef=useMemo25(()=>profile?createReference3(profile):void 0,[profile]),threadRef=useMemo25(()=>createReference3(thread),[thread]);useEffect14(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=useCallback11(message=>{let profileRefStr=profileRef?getReferenceString5(profileRef):void 0;profileRefStr&&medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>getReferenceString5(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload:[{contentString:message}],partOf:[threadRef]}).then(communication=>{setCommunications([...communications,communication]),onMessageSent?.(communication)}).catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent]),onMessageReceived=useMemo25(()=>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?jsx88(BaseChat,{title:title??(thread?.topic?formatCodeableConcept2(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled,excludeHeader,onError}):null}import{ActionIcon as ActionIcon10,Button as Button8,Center as Center3,Group as Group31,Loader as Loader3,ScrollArea as ScrollArea3,TextInput as TextInput19}from"@mantine/core";import{showNotification as showNotification6,updateNotification}from"@mantine/notifications";import{createReference as createReference4,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useMedplum as useMedplum25,useResource as useResource7}from"@medplum/react-hooks";import{useCallback as useCallback12,useEffect as useEffect18,useRef as useRef14,useState as useState56}from"react";import{Group as Group29,List,Stack as Stack17,Text as Text18,Title as Title6}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime2,formatObservationValue,isReference as isReference2}from"@medplum/core";import{useMedplum as useMedplum22,useResource as useResource5}from"@medplum/react-hooks";import{useEffect as useEffect15,useState as useState52}from"react";import{Blockquote,Stack as Stack16}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx89}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx89(Stack16,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx89(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 Group28}from"@mantine/core";import{Text as Text17}from"@mantine/core";import{getDisplayString as getDisplayString5,isOk,normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useResource as useResource4}from"@medplum/react-hooks";import{useState as useState51}from"react";import{jsx as jsx90}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState51(),resource=useResource4(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString7(outcome)}]`;else if(resource)text=getDisplayString5(resource);else return null;return link?jsx90(MedplumLink,{to:value,...rest,children:text}):jsx90(Text17,{component:"span",...rest,children:text})}import{jsx as jsx91,jsxs as jsxs51}from"react/jsx-runtime";function ResourceBadge(props){return jsxs51(Group28,{gap:"xs",children:[jsx91(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx91(ResourceName,{value:props.value,link:props.link})]})}import{Badge}from"@mantine/core";import{jsx as jsx92}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 jsx92(Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment29,jsx as jsx93,jsxs as jsxs52}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum22(),diagnosticReport=useResource5(props.value),[specimens,setSpecimens]=useState52();if(useEffect15(()=>{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 jsxs52(Stack17,{children:[jsx93(Title6,{children:"Diagnostic Report"}),jsx93(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx93(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx93(NoteDisplay,{value:specimenNotes})]})}function DiagnosticReportHeader({value,hideSubject=!1}){return jsxs52(Group29,{mt:"md",gap:30,children:[value.subject&&!hideSubject&&jsxs52("div",{children:[jsx93(Text18,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx93(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs52("div",{children:[jsx93(Text18,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx93(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs52("div",{children:[jsx93(Text18,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx93(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs52("div",{children:[jsx93(Text18,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx93(Text18,{children:formatDateTime2(value.issued)})]}),value.status&&jsxs52("div",{children:[jsx93(Text18,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx93(StatusBadge,{status:value.status})]})]})}function SpecimenInfo(specimens){return jsxs52(Stack17,{gap:"xs",children:[jsx93(Title6,{order:2,size:"h6",children:"Specimens"}),jsx93(List,{type:"ordered",children:specimens?.map(specimen=>jsx93(List.Item,{ml:"sm",children:jsxs52(Group29,{gap:20,children:[jsxs52(Group29,{gap:5,children:[jsx93(Text18,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs52(Group29,{gap:5,children:[jsx93(Text18,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs52("table",{className:DiagnosticReportDisplay_default.table,children:[jsx93("thead",{children:jsxs52("tr",{children:[jsx93("th",{children:"Test"}),jsx93("th",{children:"Value"}),jsx93("th",{children:"Reference Range"}),jsx93("th",{children:"Interpretation"}),jsx93("th",{children:"Category"}),jsx93("th",{children:"Performer"}),jsx93("th",{children:"Status"})]})}),jsx93("tbody",{children:jsx93(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx93(Fragment29,{children:props.value?.map(observation=>jsx93(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference2(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource5(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs52(Fragment29,{children:[jsxs52("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx93("td",{rowSpan:displayNotes?2:1,children:jsx93(MedplumLink,{to:observation,children:jsx93(CodeableConceptDisplay,{value:observation.code})})}),jsx93("td",{children:jsx93(ObservationValueDisplay,{value:observation})}),jsx93("td",{children:jsx93(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx93("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx93(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx93("td",{children:observation.category&&observation.category.length>0&&jsx93(Fragment29,{children:observation.category.map(concept=>jsx93("div",{children:jsx93(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx93("td",{children:observation.performer?.map(performer=>jsx93(ReferenceDisplay,{value:performer},performer.reference))}),jsx93("td",{children:observation.status&&jsx93(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx93(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx93("tr",{children:jsx93("td",{colSpan:6,children:jsx93(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx93(Fragment29,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx93(Fragment29,{children:range.text}):jsx93(RangeDisplay,{value:range}):null}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;return code==="AA"||code==="LL"||code==="HH"||code==="A"}var import_rfc6902=__toESM(require_rfc6902(),1);import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize3,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum23}from"@medplum/react-hooks";import{useEffect as useEffect16,useMemo as useMemo26,useState as useState54}from"react";import{Button as Button7,Table}from"@mantine/core";import{useState as useState53}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment30,jsx as jsx94,jsxs as jsxs53}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState53(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx94(Fragment30,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx94(Fragment30,{children:jsxs53(Table.Tr,{children:[jsx94(Table.Td,{children:name}),jsx94(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx94(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx94(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx94(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs53(Table.Tr,{children:[jsx94(Table.Td,{children:name}),jsx94(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx94(Button7,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx95,jsxs as jsxs54}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum23(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState54(!1);useEffect16(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo26(()=>{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:`${capitalize3(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?jsxs54(Table2,{className:ResourceDiffTable_default.root,children:[jsx95(Table2.Thead,{children:jsxs54(Table2.Tr,{children:[jsx95(Table2.Th,{}),jsx95(Table2.Th,{children:"Before"}),jsx95(Table2.Th,{children:"After"})]})}),jsx95(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx95(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 useMedplum24,useResource as useResource6}from"@medplum/react-hooks";import{useEffect as useEffect17,useMemo as useMemo27,useState as useState55}from"react";import{jsx as jsx96}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum24(),accessPolicy=medplum.getAccessPolicy(),value=useResource6(props.value),[schemaLoaded,setSchemaLoaded]=useState55(!1);useEffect17(()=>{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=useMemo27(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx96(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon9,Group as Group30,Menu as Menu4,Text as Text19}from"@mantine/core";import{formatDateTime as formatDateTime3,getReferenceString as getReferenceString6}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx97,jsxs as jsxs55}from"react/jsx-runtime";function Timeline(props){return jsx97(Container,{children:props.children})}function TimelineItem(props){let{resource,profile,padding,popupMenuItems,...others}=props,author=profile??resource.meta?.author,dateTime=props.dateTime??resource.meta?.lastUpdated;return jsxs55(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs55(Group30,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx97(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs55("div",{style:{flex:1},children:[jsx97(Text19,{size:"sm",children:jsx97(ResourceName,{c:"dark",fw:500,value:author,link:!0})}),jsxs55(Text19,{size:"xs",children:[jsx97(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime3(dateTime)}),jsx97(Text19,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx97(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs55(Menu4,{position:"bottom-end",shadow:"md",width:200,children:[jsx97(Menu4.Target,{children:jsx97(ActionIcon9,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString6(props.resource)}`,children:jsx97(IconDots,{})})}),popupMenuItems]})]}),jsx97(ErrorBoundary,{children:jsx97("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 jsx98,jsxs as jsxs56}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum25(),sender=medplum.getProfile(),inputRef=useRef14(null),resource=useResource7(props.value),[history,setHistory]=useState56(),[items,setItems]=useState56([]),[countToShow,setCountToShow]=useState56(10),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef14(items);itemsRef.current=items;let sortAndSetItems=useCallback12(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback12(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=useCallback12(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback12(()=>{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]);useEffect18(()=>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:jsx98(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString8(reason),icon:jsx98(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification6({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:normalizeErrorString8(outcome),icon:jsx98(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return jsx98(Center3,{style:{width:"100%",height:"100%"},children:jsx98(Loader3,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return jsxs56(Timeline,{children:[props.createCommunication&&jsx98(Panel,{children:jsx98(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs56(Group31,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx98(ResourceAvatar,{value:sender}),jsx98(TextInput19,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx98(ActionIcon10,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx98(IconMessage,{size:16})}),jsx98(AttachmentButton,{securityContext:createReference4(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx98(ActionIcon10,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx98(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 jsx98(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx98(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx98(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx98(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx98(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx98(TimelineItem,{resource:item,padding:!0,children:jsx98(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&jsx98(Group31,{justify:"center",pb:"lg",children:jsx98(Button8,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx98(TimelineItem,{resource,padding:!0,...rest,children:jsx98(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs56(TimelineItem,{resource,padding:!0,...rest,children:[jsx98("h3",{children:"Created"}),jsx98(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 jsx98(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx98("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 jsx98(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx98(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx98(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx98(ScrollArea3,{children:jsx98("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx98(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx98(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 jsx99}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx99(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 createReference5}from"@medplum/core";import{jsx as jsx100}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx100(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:createReference5(resource),subject:resource.subject,sender:createReference5(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference5(resource),subject:resource.subject,operator:createReference5(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button13,Loader as Loader5,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome8}from"@medplum/core";import{useMedplum as useMedplum27}from"@medplum/react-hooks";import{memo,useEffect as useEffect22,useRef as useRef18,useState as useState61}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx101}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 jsx101(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon12,Button as Button12,Center as Center4,Group as Group34,Loader as Loader4,Menu as Menu6,Pagination,Table as Table3,Text as Text21,UnstyledButton as UnstyledButton3}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome7}from"@medplum/core";import{useMedplum as useMedplum26}from"@medplum/react-hooks";import{useCallback as useCallback13,useEffect as useEffect21,useRef as useRef17,useState as useState60}from"react";import{Box as Box8,Button as Button9,Modal as Modal3,Text as Text20}from"@mantine/core";import{jsx as jsx102,jsxs as jsxs57}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs57(Modal3,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs57(Box8,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx102(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx102(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx102(Text20,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx102(Button9,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button10,Group as Group32,Modal as Modal4,MultiSelect,Stack as Stack18}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify2}from"@medplum/core";import{useEffect as useEffect19,useMemo as useMemo28,useRef as useRef15,useState as useState57}from"react";import{capitalize as capitalize4,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime4,Operator}from"@medplum/core";import{Fragment as Fragment31,jsx as jsx103}from"react/jsx-runtime";var searchParamToOperators={string:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],fulltext:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],token:[Operator.EQUALS,Operator.NOT],reference:[Operator.EQUALS,Operator.NOT],numeric:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],quantity:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],date:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],datetime:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],uri:[Operator.EQUALS,Operator.NOT,Operator.ABOVE,Operator.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,Operator.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator.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,Operator.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(capitalize4).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?jsx103(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children:resource.id}):key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?formatDateTime4(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?jsx103(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:jsx103(Fragment31,{children:value.map((v,index)=>jsx103(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx104,jsxs as jsxs58}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef15(!1),[state,setState]=useState57({search:JSON.parse(stringify2(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState57(!1);useEffect19(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo28(()=>{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 jsx104(Modal4,{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:jsx104("div",{"data-testid":"overlay-child"})},children:jsxs58(Stack18,{children:[jsx104(MultiSelect,{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}),jsx104(Group32,{justify:"flex-end",children:jsx104(Button10,{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 ActionIcon11,Group as Group33,Modal as Modal5,NativeSelect as NativeSelect10}from"@mantine/core";import{Operator as Operator2,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect20,useRef as useRef16,useState as useState58}from"react";import{Checkbox as Checkbox5,TextInput as TextInput20}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx105}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 jsx105(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 jsx105(Checkbox5,{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 jsx105(TextInput20,{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 jsx105(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx105(TextInput20,{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 jsx105(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx105(TextInput20,{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 jsx106,jsxs as jsxs59}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState58(deepClone2(props.search)),searchRef=useRef16(search);searchRef.current=search,useEffect20(()=>{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 jsx106(Modal5,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs59(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs59("div",{children:[jsxs59("table",{children:[jsxs59("colgroup",{children:[jsx106("col",{style:{width:200}}),jsx106("col",{style:{width:200}}),jsx106("col",{style:{width:380}}),jsx106("col",{style:{width:40}})]}),jsx106("thead",{children:jsxs59("tr",{children:[jsx106("th",{children:"Field"}),jsx106("th",{children:"Operation"}),jsx106("th",{children:"Value"}),jsx106("th",{})]})}),jsx106("tbody",{children:filters.map((filter,index)=>jsx106(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`))})]}),jsx106(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx106(Group33,{justify:"flex-end",mt:"xl",children:jsx106(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value,valueRef=useRef16(value);valueRef.current=value;function setFilterCode(newCode){valueRef.current.code=newCode,valueRef.current.operator=Operator2.EQUALS,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterOperator(newOperator){valueRef.current.operator=newOperator,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterValue(newFilterValue){valueRef.current.value=newFilterValue,props.onChange(valueRef.current)}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return jsxs59("tr",{children:[jsx106("td",{children:jsx106(NativeSelect10,{"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)}))]})}),jsx106("td",{children:operators&&jsx106(NativeSelect10,{"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}`)}),jsx106("td",{children:searchParam&&value.operator&&jsx106(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}`)}),jsx106("td",{children:props.onDelete&&jsx106(ActionIcon11,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx106(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button11,Grid,Modal as Modal6}from"@mantine/core";import{useState as useState59}from"react";import{jsx as jsx107,jsxs as jsxs60}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState59(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx107(Modal6,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx107(Form,{onSubmit:onOk,children:jsxs60(Grid,{children:[jsx107(Grid.Col,{span:10,children:jsx107(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx107(Grid.Col,{span:2,children:jsx107(Button11,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime5,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator3,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment32,jsx as jsx108}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===Operator3.EQUALS||filter.operator===Operator3.NOT_EQUALS))return jsx108(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx108(Fragment32,{children:formatDateTime5(filter.value)})}return jsx108(Fragment32,{children:filter.value})}import{Menu as Menu5}from"@mantine/core";import{Operator as Operator4}from"@medplum/core";import{Fragment as Fragment33,jsx as jsx109,jsxs as jsxs61}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?jsx109(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx109(Menu5.Dropdown,{children:props.searchParams.map(searchParam=>jsx109(Menu5.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx109(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx109(NumericFilterSubMenu,{...props});case"reference":return jsx109(ReferenceFilterSubMenu,{...props});case"string":return jsx109(TextFilterSubMenu,{...props});case"token":case"uri":return jsx109(TokenFilterSubMenu,{...props});default:return jsxs61(Fragment33,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs61(Menu5.Dropdown,{children:[jsx109(Menu5.Item,{leftSection:jsx109(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx109(Menu5.Item,{leftSection:jsx109(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.ENDS_BEFORE),children:"Before..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.STARTS_AFTER),children:"After..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Between..."}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx109(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs61(Menu5.Dropdown,{children:[jsx109(Menu5.Item,{leftSection:jsx109(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx109(Menu5.Item,{leftSection:jsx109(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN),children:"Greater than..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN),children:"Less than..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx109(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs61(Menu5.Dropdown,{children:[jsx109(Menu5.Item,{leftSection:jsx109(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx109(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs61(Menu5.Dropdown,{children:[jsx109(Menu5.Item,{leftSection:jsx109(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx109(Menu5.Item,{leftSection:jsx109(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.CONTAINS),children:"Contains..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Does not contain..."}),jsx109(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs61(Menu5.Dropdown,{children:[jsx109(Menu5.Item,{leftSection:jsx109(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx109(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs61(Fragment33,{children:[jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx109(Menu5.Item,{leftSection:jsx109(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(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,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=getElementDefinition(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 Fragment34,jsx as jsx110,jsxs as jsxs62}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=useMedplum26(),[outcome,setOutcome]=useState60(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState60(search);deepEquals(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState60({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef17(state);stateRef.current=state;let total=memoizedSearch.total??"accurate",loadResults=useCallback13(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(normalizeOperationOutcome7(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback13(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect21(()=>{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(){let state2=stateRef.current;if(!state2.searchResponse?.entry||state2.searchResponse.entry.length===0)return!1;for(let e of state2.searchResponse.entry)if(e.resource?.id&&!state2.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 jsx110(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx110(Center4,{style:{width:"100%",height:"100%"},children:jsx110(Loader4,{})});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 jsxs62("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs62(Group34,{justify:"space-between",mb:"xl",children:[jsxs62(Group34,{gap:2,children:[jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs62(Group34,{gap:2,children:[lastResult&&jsxs62(Text21,{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()}`]}),jsx110(ActionIcon12,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx110(IconRefresh,{size:iconSize})})]})]}),jsxs62(Table3,{className:SearchControl_default.table,children:[jsxs62(Table3.Thead,{children:[jsxs62(Table3.Tr,{children:[checkboxColumn&&jsx110(Table3.Th,{children:jsx110("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx110(Table3.Th,{children:jsxs62(Menu6,{shadow:"md",width:240,position:"bottom-end",children:[jsx110(Menu6.Target,{children:jsx110(UnstyledButton3,{className:SearchControl_default.control,p:2,children:jsxs62(Group34,{justify:"space-between",wrap:"nowrap",children:[jsx110(Text21,{fw:500,children:buildFieldNameString(field.name)}),jsx110(Center4,{className:SearchControl_default.icon,children:jsx110(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx110(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&&jsxs62(Table3.Tr,{children:[checkboxColumn&&jsx110(Table3.Th,{}),fields.map(field=>jsx110(Table3.Th,{children:field.searchParams&&jsx110(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),jsx110(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs62(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx110(Table3.Td,{children:jsx110("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=>jsx110(Table3.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&jsx110(Container,{children:jsx110(Center4,{style:{height:150},children:jsx110(Text21,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx110(Center4,{m:"md",p:"md",children:jsx110(Pagination,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),jsx110(SearchFieldEditor,{search:memoizedSearch,visible:stateRef.current.fieldEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,fieldEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,fieldEditorVisible:!1})}},`search-field-editor-${state.dialogOpenTime}`),jsx110(SearchFilterEditor,{search:memoizedSearch,visible:stateRef.current.filterEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,filterEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterEditorVisible:!1})}},`search-filter-editor-${state.dialogOpenTime}`),jsx110(SearchExportDialog,{visible:stateRef.current.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx110(SearchFilterValueDialog,{visible:stateRef.current.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?jsx110("span",{children:"no filters"}):jsx110(Fragment34,{children:filters.map(filter=>jsxs62("div",{children:[getOpString(filter.operator),"\xA0",jsx110(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 jsx111,jsxs as jsxs63}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum27(),[schemaLoaded,setSchemaLoaded]=useState61(!1),[outcome,setOutcome]=useState61(),{query,fields}=props,[response,setResponse]=useState61(),[selected,setSelected]=useState61({}),responseRef=useRef18(response);responseRef.current=response;let selectedRef=useRef18({});selectedRef.current=selected,useEffect22(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome8(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selectedRef.current};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=responseRef.current?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=responseRef.current?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selectedRef.current[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(useEffect22(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx111(Loader5,{});let checkboxColumn=props.checkboxesEnabled;return jsxs63("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs63(Table4,{children:[jsx111(Table4.Thead,{children:jsxs63(Table4.Tr,{children:[checkboxColumn&&jsx111(Table4.Th,{children:jsx111("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx111(Table4.Th,{children:field.name},field.name))]})}),jsx111(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs63(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx111(Table4.Td,{children:jsx111("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=>jsx111(Table4.Td,{children:jsx111(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx111("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx111("div",{"data-testid":"search-error",children:jsx111("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx111(Button13,{onClick:()=>props.onBulk(Object.keys(selectedRef.current)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo(FhirPathTable);import{ScrollArea as ScrollArea4}from"@mantine/core";var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};import{jsx as jsx112}from"react/jsx-runtime";function InfoBar(props){return jsx112(ScrollArea4,{children:jsx112("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx112("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx112("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx112("div",{className:InfoBar_default.value,children:props.children})};import{Anchor as Anchor7,Tabs}from"@mantine/core";import{isString,locationUtils as locationUtils5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate5}from"@medplum/react-hooks";import{useState as useState62}from"react";var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};import{jsx as jsx113,jsxs as jsxs64}from"react/jsx-runtime";function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=useMedplumNavigate5(),[currentTab,setCurrentTab]=useState62(()=>{let tab=locationUtils5.getPathname().split("/").pop();return tab&&tabs.some(t=>t.value===tab)?tab:tabs[0].value});function onTabChange(newTabName){newTabName=newTabName||tabs[0].value,setCurrentTab(newTabName),navigate(`${baseUrl}/${newTabName}`)}return jsxs64(Tabs,{value:currentTab.toLowerCase(),onChange:onTabChange,...rest,children:[jsx113(Tabs.List,{className:LinkTabs_default.list,children:tabs.map(t=>jsx113(Tabs.Tab,{value:t.value,children:jsx113(Anchor7,{className:LinkTabs_default.link,href:`${baseUrl}/${t.value}`,onClick:onLinkClick,children:t.label})},t.value))}),children]})}function normalizeTabDefinitions(tabs){return tabs.map(t=>isString(t)?{label:t,value:t.toLowerCase()}:t)}function onLinkClick(e){isAuxClick(e)||e.preventDefault()}import{Box as Box10,SimpleGrid}from"@mantine/core";import{useResource as useResource8,useSearchOne}from"@medplum/react-hooks";import{Box as Box9,Flex as Flex8,Group as Group35,Paper as Paper3,RingProgress,Text as Text22,Title as Title7}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept4}from"@medplum/core";import{Fragment as Fragment35,jsx as jsx114,jsxs as jsxs65}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx114(Paper3,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs65(Group35,{children:[group.measureScore&&jsx114(MeasureScore,{group}),!group.measureScore&&jsx114(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs65(Fragment35,{children:[jsx114(Text22,{fz:"md",fw:500,mb:8,children:measure.title}),jsx114(Text22,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept4(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept4(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs65(Box9,{children:[jsx114(Title7,{order:3,children:"Not Applicable"}),jsx114(Text22,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs65(Box9,{children:[jsx114(Title7,{order:3,children:"Insufficient Data"}),jsx114(Text22,{children:`Numerator: ${numeratorCount}`}),jsx114(Text22,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx114(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx114(Flex8,{justify:"center",children:jsxs65(Text22,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx114(Fragment35,{children:unit==="%"?jsx114(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx114(Flex8,{justify:"center",children:jsx114(Text22,{fw:700,fz:18,children:jsx114(QuantityDisplay,{value:group.measureScore})})})}):jsx114(Flex8,{h:120,align:"center",children:jsx114(Title7,{order:3,children:jsx114(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 jsx115,jsxs as jsxs66}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource8(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs66(Box10,{children:[measure&&jsx115(MeasureTitle,{measure}),jsx115(SimpleGrid,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx115(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon13,Indicator,Tooltip as Tooltip4}from"@mantine/core";import{useMedplum as useMedplum28,useSubscription as useSubscription2}from"@medplum/react-hooks";import{useCallback as useCallback14,useEffect as useEffect23,useState as useState63}from"react";import{jsx as jsx116}from"react/jsx-runtime";function NotificationIcon(props){let medplum=useMedplum28(),{resourceType,countCriteria,subscriptionCriteria}=props,[unreadCount,setUnreadCount]=useState63(0),updateCount=useCallback14(cache=>{medplum.search(resourceType,countCriteria,{cache}).then(result2=>setUnreadCount(result2.total)).catch(console.error)},[medplum,resourceType,countCriteria]);useEffect23(()=>{updateCount("default")},[updateCount]),useSubscription2(subscriptionCriteria,()=>{updateCount("reload")});let result=props.iconComponent;return props.onClick&&(result=jsx116(ActionIcon13,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=jsx116(Tooltip4,{label:props.tooltip,children:result})),unreadCount>0&&(result=jsx116(Indicator,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}import{Group as Group36,SegmentedControl as SegmentedControl2,Stack as Stack19}from"@mantine/core";import{notifications}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString9,resolveId}from"@medplum/core";import{useMedplum as useMedplum29}from"@medplum/react-hooks";import{useCallback as useCallback15}from"react";import{jsx as jsx117,jsxs as jsxs67}from"react/jsx-runtime";var NOTIFICATION_ID="patient-export",NOTIFICATION_TITLE="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=useMedplum29(),{patient}=props,handleSubmit=useCallback15(async data2=>{let patientId=resolveId(patient),format=data2.format,{operation,type,contentType,extension}=formats[format],url=medplum.fhirUrl("Patient",patientId,operation),params={};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),notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,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),notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"green",message:"Done",icon:jsx117(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString9(err),icon:jsx117(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient]);return jsx117(Form,{onSubmit:handleSubmit,children:jsxs67(Stack19,{children:[jsx117(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx117(SegmentedControl2,{name:"format",data:[{label:"FHIR Everything",value:"everything"},{label:"Patient Summary",value:"summary"},{label:"C-CDA",value:"ccda"},{label:"C-CDA Referral",value:"ccdaReferral"}],fullWidth:!0})}),jsx117(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx117(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx117(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx117(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx117(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:jsx117(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx117(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:jsx117(DateTimeInput,{name:"endDate",placeholder:"End date"})}),jsx117(Group36,{justify:"right",children:jsx117(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}from"@medplum/core";import{useResource as useResource9}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment36,jsx as jsx118,jsxs as jsxs68}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource9(props.patient);return patient?jsxs68(InfoBar,{children:[jsx118(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:"Name"}),jsx118(InfoBar.Value,{children:jsx118(MedplumLink,{to:patient,fw:500,children:patient.name?jsx118(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs68(Fragment36,{children:[jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:"DoB"}),jsx118(InfoBar.Value,{children:patient.birthDate})]}),jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:"Age"}),jsx118(InfoBar.Value,{children:calculateAgeString(patient.birthDate)})]})]}),patient.gender&&jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:"Gender"}),jsx118(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:"State"}),jsx118(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:identifier?.system}),jsx118(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Divider as Divider4,Flex as Flex15,Group as Group50,Stack as Stack26,Text as Text33,Tooltip as Tooltip6}from"@mantine/core";import{calculateAgeString as calculateAgeString2,formatAddress as formatAddress2,formatHumanName as formatHumanName6,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum36,useResource as useResource11}from"@medplum/react-hooks";import{useEffect as useEffect24,useState as useState75}from"react";import{Box as Box13,Flex as Flex9,Group as Group39,Modal as Modal7,Text as Text24}from"@mantine/core";import{useDisclosure}from"@mantine/hooks";import{getDisplayString as getDisplayString6}from"@medplum/core";import{useMedplum as useMedplum30}from"@medplum/react-hooks";import{useCallback as useCallback17,useMemo as useMemo29,useState as useState66}from"react";import{Group as Group37,Stack as Stack20,TextInput as TextInput21}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG2,addProfileToResource,createReference as createReference6}from"@medplum/core";import{useCallback as useCallback16,useState as useState64}from"react";import{jsx as jsx119,jsxs as jsxs69}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG2+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState64(allergy?.code),[clinicalStatus,setClinicalStatus]=useState64(allergy?.clinicalStatus),handleSubmit=useCallback16(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference6(patient),encounter:encounter?createReference6(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 jsx119(Form,{onSubmit:handleSubmit,children:jsxs69(Stack20,{children:[jsx119(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}),jsx119(TextInput21,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx119(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG2+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx119(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx119(Group37,{justify:"flex-end",gap:4,mt:"md",children:jsx119(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon14,Box as Box11,Collapse,Group as Group38,Text as Text23}from"@mantine/core";import{useState as useState65}from"react";var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title",addButton:"CollapsibleSection_addButton"};import{jsx as jsx120,jsxs as jsxs70}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState65(!1);return jsxs70(Box11,{className:CollapsibleSection_default.root,children:[jsxs70(Group38,{justify:"space-between",className:CollapsibleSection_default.header,children:[jsxs70(Group38,{gap:8,children:[jsx120(ActionIcon14,{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:jsx120(IconChevronDown,{size:20})}),jsx120(Text23,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx120(ActionIcon14,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx120(IconPlus,{size:18})})]}),jsx120(Collapse,{in:!collapsed,children:jsx120(Box11,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}import{ActionIcon as ActionIcon15,Box as Box12}from"@mantine/core";var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};import{jsx as jsx121,jsxs as jsxs71}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs71(Box12,{className:SummaryItem_default.item,onClick,children:[children,jsx121("div",{className:SummaryItem_default.gradient}),jsx121("div",{className:SummaryItem_default.container,children:jsx121(ActionIcon15,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx121(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment37,jsx as jsx122,jsxs as jsxs72}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum30(),{patient,encounter}=props,[allergies,setAllergies]=useState66(props.allergies),[opened,{open,close}]=useDisclosure(!1),[editAllergy,setEditAllergy]=useState66(),sortedAllergies=useMemo29(()=>[...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:getDisplayString6(a).localeCompare(getDisplayString6(b))}),[allergies]),handleSubmit=useCallback17(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 jsxs72(Fragment37,{children:[jsx122(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx122(Box13,{children:jsx122(Flex9,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx122(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs72(Box13,{children:[jsx122(Text24,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString6(allergy)}),jsx122(Group39,{mt:2,gap:4,children:status&&jsx122(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx122(Text24,{children:"(none)"})}),jsx122(Modal7,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx122(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 Box14,Flex as Flex10,Group as Group40,Text as Text25}from"@mantine/core";import{formatDate}from"@medplum/core";import{useResource as useResource10}from"@medplum/react-hooks";var PatientSummary_default={panel:"PatientSummary_panel",patientSummaryBadge:"PatientSummary_patientSummaryBadge",patientSummaryAddButton:"PatientSummary_patientSummaryAddButton",patientSummaryHeader:"PatientSummary_patientSummaryHeader",patientSummaryCollapseIcon:"PatientSummary_patientSummaryCollapseIcon",collapsed:"PatientSummary_collapsed"};import{jsx as jsx123,jsxs as jsxs73}from"react/jsx-runtime";function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=useResource10(coverage),organizationResource=useResource10(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 jsx123(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs73(Box14,{children:[jsx123(Text25,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx123(Text25,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs73(Group40,{mt:2,gap:4,children:[jsx123(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs73(Text25,{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");return jsx123(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx123(Flex10,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx123(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx123(Text25,{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 Box15,Flex as Flex11,Group as Group41,Modal as Modal8,Text as Text26}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{formatDate as formatDate2,getDisplayString as getDisplayString7}from"@medplum/core";import{useState as useState67}from"react";import{Fragment as Fragment38,jsx as jsx124,jsxs as jsxs74}from"react/jsx-runtime";function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=useState67(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=useDisclosure2(!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 jsxs74(Fragment38,{children:[jsx124(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:jsxs74(Flex11,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>jsx124(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:jsxs74(Box15,{children:[jsx124(Text26,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(serviceRequest)}),jsxs74(Group41,{mt:2,gap:4,children:[serviceRequest.status&&jsx124(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),jsx124(Text26,{size:"xs",fw:500,c:"dimmed",children:formatDate2(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>jsx124(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:jsxs74(Box15,{children:[jsx124(Text26,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(report)}),jsxs74(Group41,{mt:2,gap:4,children:[report.status&&jsx124(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),jsx124(Text26,{size:"xs",fw:500,c:"dimmed",children:formatDate2(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&jsx124(Text26,{children:"(none)"})]})}),jsx124(Modal8,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&jsx124(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 Box16,Flex as Flex12,Group as Group43,Modal as Modal9,Text as Text27}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{getDisplayString as getDisplayString8}from"@medplum/core";import{useMedplum as useMedplum31}from"@medplum/react-hooks";import{useCallback as useCallback19,useState as useState69}from"react";import{Alert as Alert4,Group as Group42,Radio,Stack as Stack21}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG3,addProfileToResource as addProfileToResource2,createReference as createReference7}from"@medplum/core";import{useMedplumProfile as useMedplumProfile7}from"@medplum/react-hooks";import{useCallback as useCallback18,useState as useState68}from"react";import{jsx as jsx125,jsxs as jsxs75}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile7(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState68(medication?.medicationCodeableConcept),handleSubmit=useCallback18(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&&createReference7(encounter)),requester:medication?.requester??createReference7(me),medicationCodeableConcept:code,subject:createReference7(patient)},HTTP_HL7_ORG3+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx125(Form,{onSubmit:handleSubmit,children:jsxs75(Stack21,{children:[jsx125(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}),jsx125(Radio.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx125(Radio,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx125(Group42,{justify:"flex-end",gap:4,children:jsx125(SubmitButton,{children:"Save"})})]})}):jsx125(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment39,jsx as jsx126,jsxs as jsxs76}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum31(),[medicationRequests,setMedicationRequests]=useState69(props.medicationRequests),[editMedication,setEditMedication]=useState69(),[opened,{open,close}]=useDisclosure3(!1),handleSubmit=useCallback19(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 jsxs76(Fragment39,{children:[jsx126(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medicationRequests.length>0?jsx126(Flex12,{direction:"column",gap:8,children:medicationRequests.map(medication=>jsx126(SummaryItem,{onClick:()=>{setEditMedication(medication),open()},children:jsxs76(Box16,{children:[jsx126(Text27,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(medication)}),jsx126(Group43,{mt:2,gap:4,children:medication.status&&jsx126(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},medication.id))}):jsx126(Text27,{children:"(none)"})}),jsx126(Modal9,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx126(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 Box17,Group as Group44,Text as Text28,Tooltip as Tooltip5}from"@mantine/core";import{jsx as jsx127,jsxs as jsxs77}from"react/jsx-runtime";var PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return jsx127(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx127(Box17,{className:PatientSummary_default.patientSummaryListItem,children:jsx127(Tooltip5,{label,position:"top-start",openDelay:650,children:jsxs77(Group44,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,jsx127(Text28,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};import{capitalize as capitalize5,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG4}from"@medplum/core";function getGenderIdentity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/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?capitalize5(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 Box18,Flex as Flex13,Group as Group46,Modal as Modal10,Text as Text29}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{formatDate as formatDate3,getDisplayString as getDisplayString9}from"@medplum/core";import{useMedplum as useMedplum32}from"@medplum/react-hooks";import{useCallback as useCallback21,useState as useState71}from"react";import{Group as Group45,Stack as Stack22}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback20,useState as useState70}from"react";import{jsx as jsx128,jsxs as jsxs78}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState70(condition?.code),[clinicalStatus,setClinicalStatus]=useState70(condition?.clinicalStatus),handleSubmit=useCallback20(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:createReference8(patient),encounter:encounter&&createReference8(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG5+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx128(Form,{onSubmit:handleSubmit,children:jsxs78(Stack22,{children:[jsx128(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG5+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx128(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG5+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx128(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx128(Group45,{justify:"flex-end",gap:4,mt:"md",children:jsx128(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment40,jsx as jsx129,jsxs as jsxs79}from"react/jsx-runtime";function ProblemList(props){let medplum=useMedplum32(),{patient,encounter}=props,[problems,setProblems]=useState71(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=useState71(),[opened,{open,close}]=useDisclosure4(!1),handleSubmit=useCallback21(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:[jsx129(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx129(Flex13,{direction:"column",gap:8,children:problems.map(problem=>jsx129(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs79(Box18,{children:[jsx129(Text29,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString9(problem)}),jsxs79(Group46,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx129(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx129(Text29,{size:"xs",fw:500,c:"dimmed",children:formatDate3(problem.onsetDateTime)})]})]})},problem.id))}):jsx129(Text29,{children:"(none)"})}),jsx129(Modal10,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx129(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 Flex14,Group as Group47,Modal as Modal11,Radio as Radio2,Stack as Stack23,Text as Text30,UnstyledButton as UnstyledButton4}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{createReference as createReference9,HTTP_HL7_ORG as HTTP_HL7_ORG6,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState72}from"react";import{Fragment as Fragment41,jsx as jsx130,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=useMedplum33(),[sexualOrientation,setSexualOrientation]=useState72(props.sexualOrientation),[opened,{open,close}]=useDisclosure5(!1),[hoverIndex,setHoverIndex]=useState72(null),handleSubmit=useCallback22(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG6+"/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:createReference9(patient),encounter:encounter?createReference9(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:[jsx130(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx130(Flex14,{direction:"column",gap:8,children:jsx130(Box19,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx130(UnstyledButton4,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx130(Box19,{pr:hoverIndex===0?24:0,children:jsx130(Text30,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx130(Text30,{children:"(none)"})}),jsx130(Modal11,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx130(Form,{onSubmit:handleSubmit,children:jsxs80(Stack23,{children:[jsx130(Radio2.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx130(Radio2,{value:code,label:text,my:"xs"},code))}),jsx130(Group47,{justify:"flex-end",gap:4,mt:"md",children:jsx130(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group48,Modal as Modal12,Radio as Radio3,Stack as Stack24,Text as Text31,UnstyledButton as UnstyledButton5}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG7,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference10,formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{useMedplum as useMedplum34}from"@medplum/react-hooks";import{useCallback as useCallback23,useState as useState73}from"react";import{Fragment as Fragment42,jsx as jsx131,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=useMedplum34(),[smokingStatus,setSmokingStatus]=useState73(props.smokingStatus),[opened,{open,close}]=useDisclosure6(!1),handleSubmit=useCallback23(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG7+"/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:createReference10(props.patient),encounter:props.encounter?createReference10(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:[jsx131(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx131(UnstyledButton5,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx131(Text31,{children:formatCodeableConcept5(smokingStatus.valueCodeableConcept)})}):jsx131(Text31,{children:"(none)"})}),jsx131(Modal12,{opened,onClose:close,title:"Set Smoking Status",children:jsx131(Form,{onSubmit:handleSubmit,children:jsxs81(Stack24,{children:[jsx131(Radio3.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx131(Radio3,{value:code,label:text,my:"xs"},code))}),jsx131(Group48,{justify:"flex-end",gap:4,mt:"md",children:jsx131(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group49,Modal as Modal13,SimpleGrid as SimpleGrid2,Stack as Stack25,Text as Text32,Textarea as Textarea3,TextInput as TextInput22}from"@mantine/core";import{useDisclosure as useDisclosure7}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{useCallback as useCallback24,useState as useState74}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference11}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:createReference11(patient),encounter:encounter?createReference11(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 jsx132,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=useMedplum35(),{patient,encounter}=props,[vitals,setVitals]=useState74(props.vitals),[opened,{open,close}]=useDisclosure7(!1),handleSubmit=useCallback24(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:[jsx132(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx132(Stack25,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs82(Group49,{align:"center",children:[jsx132(Text32,{c:"dimmed",children:meta.short}),obs&&jsx132(Text32,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx132(Modal13,{opened,onClose:close,title:"Add Vitals",children:jsxs82(Form,{onSubmit:handleSubmit,children:[jsx132(SimpleGrid2,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx132(TextInput22,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx132(Textarea3,{name:"notes",label:"Notes"}),jsx132(Group49,{justify:"flex-end",gap:4,mt:"md",children:jsx132(SubmitButton,{children:"Save"})})]})})]})}import{Fragment as Fragment44,jsx as jsx133,jsxs as jsxs83}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum36(),{patient:propsPatient,onClickResource,onRequestLabs}=props,patient=useResource11(propsPatient),[medicalData,setMedicalData]=useState75(),[createdDate,setCreatedDate]=useState75();useEffect24(()=>{let ref=`Patient/${resolveId2(propsPatient)}`,searchMeta={_count:100,_sort:"-_lastUpdated"};Promise.all([medplum.searchResources("AllergyIntolerance",{patient:ref,...searchMeta}),medplum.searchResources("Condition",{patient:ref,...searchMeta}),medplum.searchResources("MedicationRequest",{subject:ref,...searchMeta}),medplum.searchResources("Observation",{subject:ref,...searchMeta}),medplum.searchResources("Appointment",{patient:ref,...searchMeta}),medplum.searchResources("Encounter",{subject:ref,...searchMeta}),medplum.searchResources("Coverage",{beneficiary:ref,...searchMeta}),medplum.searchResources("Immunization",{patient:ref,...searchMeta}),medplum.searchResources("Procedure",{subject:ref,...searchMeta}),medplum.searchResources("Device",{patient:ref,...searchMeta}),medplum.searchResources("Goal",{subject:ref,...searchMeta}),medplum.searchResources("ServiceRequest",{subject:ref,...searchMeta}),medplum.searchResources("DiagnosticReport",{subject:ref,...searchMeta})]).then(results=>{let observations=results[3];setMedicalData({allergies:results[0],problems:results[1],medicationRequests:results[2],sexualOrientation:observations.find(obs=>obs.code?.coding?.[0].code==="76690-7"),smokingStatus:observations.find(obs=>obs.code?.coding?.[0].code==="72166-2"),vitals:observations.filter(obs=>obs.category?.[0]?.coding?.[0].code==="vital-signs"),appointments:results[4],encounters:results[5],coverages:results[6],immunizations:results[7],procedures:results[8],devices:results[9],goals:results[10],serviceRequests:results[11],diagnosticReports:results[12]})}).catch(console.error)},[medplum,propsPatient]),useEffect24(()=>{patient?.id&&medplum.readHistory("Patient",patient.id).then(history=>{let lastUpdated=history.entry?.[history.entry.length-1]?.resource?.meta?.lastUpdated;setCreatedDate(typeof lastUpdated=="string"?lastUpdated:"")}).catch(()=>{})},[patient?.id,medplum]);let languageDisplay=patient?getPreferredLanguage(patient):void 0;return patient?jsxs83(Flex15,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs83(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs83(Group50,{align:"center",gap:"sm",p:16,children:[jsx133(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs83(Stack26,{gap:0,style:{flex:1,minWidth:0},children:[jsx133(Tooltip6,{label:formatHumanName6(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx133(Text33,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:formatHumanName6(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return jsxs83(Text33,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx133(Divider4,{})]}),jsx133(Stack26,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:medicalData&&jsxs83(Fragment44,{children:[jsxs83(Stack26,{gap:"xs",py:8,children:[jsx133(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${calculateAgeString2(patient.birthDate)})`:void 0,icon:jsx133(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),jsx133(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:jsx133(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),jsx133(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:jsx133(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),jsx133(PatientInfoItem,{patient,value:patient.address?.[0]?formatAddress2(patient.address[0]):void 0,icon:jsx133(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),jsx133(PatientInfoItem,{patient,value:languageDisplay,icon:jsx133(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),jsx133(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:jsx133(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add General Practitioner",label:"General Practitioner",onClickResource})]}),jsx133(Divider4,{}),jsx133(Insurance,{coverages:medicalData.coverages||[],onClickResource}),jsx133(Divider4,{}),jsx133(Allergies,{patient,allergies:medicalData.allergies,onClickResource}),jsx133(Divider4,{}),jsx133(ProblemList,{patient,problems:medicalData.problems,onClickResource}),jsx133(Divider4,{}),jsx133(Medications,{patient,medicationRequests:medicalData.medicationRequests,onClickResource}),jsx133(Divider4,{}),jsx133(Labs,{patient,serviceRequests:medicalData.serviceRequests,diagnosticReports:medicalData.diagnosticReports,onClickResource,onRequestLabs}),jsx133(Divider4,{}),jsx133(SexualOrientation,{patient,sexualOrientation:medicalData.sexualOrientation,onClickResource}),jsx133(Divider4,{}),jsx133(SmokingStatus,{patient,smokingStatus:medicalData.smokingStatus,onClickResource}),jsx133(Divider4,{}),jsx133(Vitals,{patient,vitals:medicalData.vitals,onClickResource}),jsx133(Divider4,{})]})})]}):null}import{createReference as createReference12}from"@medplum/core";import{useCallback as useCallback25}from"react";import{jsx as jsx134}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback25((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),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 jsx134(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference12(resource),sender:createReference12(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference12(resource),operator:createReference12(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor8,Box as Box20,Button as Button14,CloseButton,Flex as Flex16,Group as Group51,Loader as Loader6,NativeSelect as NativeSelect11,Paper as Paper4,Stack as Stack27,Text as Text34,TextInput as TextInput23}from"@mantine/core";import{getReferenceString as getReferenceString7}from"@medplum/core";import{useMedplum as useMedplum37,useResource as useResource12}from"@medplum/react-hooks";import{useEffect as useEffect25,useRef as useRef19,useState as useState76}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx135,jsxs as jsxs84}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum37(),defaultValue2=useResource12(props.value),[schemaLoaded,setSchemaLoaded]=useState76(!1),[selectedKey,setSelectedKey]=useState76(),[hoverKey,setHoverKey]=useState76(),[value,setValue]=useState76();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}let valueRef=useRef19(value);if(valueRef.current=value,useEffect25(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect25(()=>(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({...valueRef.current,[property]:newValue})}return jsx135("div",{children:jsxs84(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx135(TextInput23,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx135(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx135(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){let actionsRef=useRef19(props.actions);actionsRef.current=props.actions;function changeAction(changedAction){props.onChange(actionsRef.current.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...actionsRef.current,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(actionsRef.current.filter(i=>i!==removedAction))}return jsxs84(Stack27,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx135(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx135("div",{children:jsx135(Button14,{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 jsx135("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx135(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState76(),medplum=useMedplum37(),[loading,setLoading]=useState76(!1),[resource,setResource]=useState76(),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 useEffect25(()=>{(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?jsx135(Loader6,{}):jsxs84(Paper4,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs84(Flex16,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx135(TextInput23,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx135(CloseButton,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs84(Stack27,{gap:"xl",p:"md",children:[jsx135(Box20,{children:jsx135(TextInput23,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx135(Box20,{children:jsx135(NativeSelect11,{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"&&jsxs84(Stack27,{gap:0,children:[jsxs84(Group51,{gap:0,mb:"xs",children:[jsx135(Text34,{fw:600,children:"Select questionnaire"}),jsx135(Text34,{c:"red",children:"*"})]}),jsxs84(Text34,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx135(Anchor8,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx135(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&jsxs84(Stack27,{gap:0,children:[jsxs84(Group51,{gap:0,mb:"xs",children:[jsx135(Text34,{fw:600,children:"Select activity definition"}),jsx135(Text34,{c:"red",children:"*"})]}),jsxs84(Text34,{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"," ",jsx135(Anchor8,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx135(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return jsx135(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:getReferenceString7(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 Anchor9,Box as Box21,Group as Group53,NativeSelect as NativeSelect13,Space,Textarea as Textarea5,TextInput as TextInput25,Title as Title8}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 QuestionnaireItemType2,setQuestionnaireItemReferenceTargetTypes,useMedplum as useMedplum39,useResource as useResource13}from"@medplum/react-hooks";import{useEffect as useEffect27,useRef as useRef20,useState as useState78}from"react";import{Checkbox as Checkbox6,Group as Group52,MultiSelect as MultiSelect2,NativeSelect as NativeSelect12,Radio as Radio4,Text as Text35,Textarea as Textarea4,TextInput as TextInput24}from"@mantine/core";import{capitalize as capitalize6,deepEquals as deepEquals2,formatCoding as formatCoding2,getElementDefinition as getElementDefinition2,getExtension as getExtension2,HTTP_HL7_ORG as HTTP_HL7_ORG8,stringify as stringify3,typedValueToString}from"@medplum/core";import{getItemAnswerOptionValue,getItemInitialValue,getNewMultiSelectValues,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,QUESTIONNAIRE_ITEM_CONTROL_URL,QuestionnaireItemType,useMedplum as useMedplum38}from"@medplum/react-hooks";import{useEffect as useEffect26,useState as useState77}from"react";import{Fragment as Fragment45,jsx as jsx136,jsxs as jsxs85}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=getExtension2(response,`${HTTP_HL7_ORG8}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx136("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx136(CheckboxFormSection,{title:props.item.text,htmlFor:inputId,children:jsx136(Checkbox6,{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=jsx136(TextInput24,{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=jsx136(TextInput24,{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=jsx136(TextInput24,{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=jsx136(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case QuestionnaireItemType.time:formComponent=jsx136(TextInput24,{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=jsx136(TextInput24,{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=jsx136(Textarea4,{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=jsx136(Group52,{py:4,children:jsx136(AttachmentInput,{path:"",name:inputId,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case QuestionnaireItemType.reference:formComponent=jsx136(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=jsx136(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:isCheckboxChoice(item)?formComponent=jsx136(QuestionnaireCheckboxInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):isDropdownChoice(item)||item.answerValueSet&&!isRadiobuttonChoice(item)?formComponent=jsx136(QuestionnaireDropdownInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):formComponent=jsx136(QuestionnaireRadioButtonInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)});break;default:return null}return jsxs85(Fragment45,{children:[formComponent,validationError?.valueString&&jsx136(Text35,{c:"red",size:"lg",mt:4,children:validationError.valueString})]})}function QuestionnaireDropdownInput(props){let{name,item,required,initial,onChangeAnswer,response}=props;if(!item.answerOption?.length&&!item.answerValueSet)return jsx136(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||isMultiSelectChoice(item);if(item.answerValueSet)return jsx136(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 jsx136(MultiSelect2,{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 jsx136(NativeSelect12,{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"+capitalize6(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=useMedplum38(),[valueSetOptions,setValueSetOptions]=useState77([]),[isLoading,setIsLoading]=useState77(!1);return useEffect26(()=>{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=getElementDefinition2("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&&stringify3(optionValue)===stringify3(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return jsx136(Text35,{children:"Loading options..."});if(options.length===0)return jsx136(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs85(Fragment45,{children:[jsx136(Radio4.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+capitalize6(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>jsx136(Radio4,{id:optionName,value:optionName,py:4,required,label:jsx136(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)&&jsxs85(Text35,{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=getElementDefinition2("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]=useState77(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 jsx136(Text35,{children:"Loading options..."});if(options.length===0)return jsx136(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=>!deepEquals2(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"+capitalize6(optionValue.type),item);onChangeAnswer(values)}}};return jsxs85(Group52,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=typedValueToString(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>deepEquals2(coding,optionValue.value)):selectedValues.includes(optionValueStr);return jsx136(Checkbox6,{id:optionName,label:jsx136(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)&&jsxs85(Text35,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx136(TextInput24,{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=>deepEquals2(option[1].value,defaultAnswer?.value))?.[0]}function hasChoiceType(item,type){return!!item.extension?.some(e=>e.url===QUESTIONNAIRE_ITEM_CONTROL_URL&&e.valueCodeableConcept?.coding?.[0]?.code===type)}function isDropdownChoice(item){return hasChoiceType(item,"drop-down")}function isCheckboxChoice(item){return hasChoiceType(item,"check-box")}function isRadiobuttonChoice(item){return hasChoiceType(item,"radio-button")}function isMultiSelectChoice(item){return hasChoiceType(item,"multi-select")}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize6(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}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 Fragment46,jsx as jsx137,jsxs as jsxs86}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum39(),defaultValue2=useResource13(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState78(!1),[value,setValue]=useState78(),[selectedKey,setSelectedKey]=useState78(),[hoverKey,setHoverKey]=useState78();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect27(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect27(()=>(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=(questionnaire,disableSubmit)=>{setValue(questionnaire),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire)};return!schemaLoaded||!value?null:jsx137("div",{children:jsxs86(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx137(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx137(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource2=isResourceType(props.item),isContainer=isResource2||item.type===QuestionnaireItemType2.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef20(props.item);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 jsxs86("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx137("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs86(Fragment46,{children:[isResource2&&jsx137(TextInput25,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource2&&jsx137(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx137(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx137(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs86(Fragment46,{children:[resource.title&&jsx137(Title8,{children:resource.title}),item.text&&jsx137("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx137(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx137("div",{children:jsx137(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&&jsx137("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs86(Fragment46,{children:[jsx137(TextInput25,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx137(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"}]})]}):jsx137("div",{children:linkId})}),!isResource2&&jsx137(Box21,{className:QuestionnaireBuilder_default.movementActions,children:jsxs86(Box21,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx137(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx137(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs86("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs86(Fragment46,{children:[jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource2&&jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource2&&jsxs86(Fragment46,{children:[jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx137(Anchor9,{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 jsxs86("div",{children:[props.item.answerValueSet!==void 0?jsx137(TextInput25,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx137(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs86(Box21,{display:"flex",children:[jsx137(Anchor9,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),jsx137(Space,{w:"lg"}),jsx137(Anchor9,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx137("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs86("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx137("div",{children:jsx137(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)}),jsx137("div",{children:jsx137(Anchor9,{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 jsxs86(Fragment46,{children:[targetTypes.map((targetType,index)=>jsxs86(Group53,{children:[jsx137(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx137(Anchor9,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx137(Anchor9,{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(questionnaire){return{...questionnaire,id:questionnaire.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire.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{Group as Group55,Stack as Stack30,Text as Text36,Title as Title10}from"@mantine/core";import{createReference as createReference14,getExtension as getExtension3,getReferenceString as getReferenceString8}from"@medplum/core";import{QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,useMedplum as useMedplum41,useQuestionnaireForm}from"@medplum/react-hooks";import{useCallback as useCallback26,useMemo as useMemo30,useRef as useRef22,useState as useState79}from"react";import{Button as Button15,Paper as Paper5}from"@mantine/core";import{createReference as createReference13,HTTP_HL7_ORG as HTTP_HL7_ORG9}from"@medplum/core";import{useMedplum as useMedplum40}from"@medplum/react-hooks";import{useEffect as useEffect28,useRef as useRef21}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 jsx138,jsxs as jsxs87}from"react/jsx-runtime";function SignatureInput(props){let medplum=useMedplum40(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=useRef21(null),signaturePadRef=useRef21(null),onChangeRef=useRef21(onChange);return onChangeRef.current=onChange,useEffect28(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:HTTP_HL7_ORG9+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??createReference13(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]),jsxs87(Paper5,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[jsx138("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),jsx138(Button15,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:jsx138(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}import{Stack as Stack29}from"@mantine/core";import{isQuestionEnabled,QuestionnaireItemType as QuestionnaireItemType4}from"@medplum/react-hooks";import{Title as Title9}from"@mantine/core";import{jsx as jsx139,jsxs as jsxs88}from"react/jsx-runtime";function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return jsxs88("div",{children:[props.item.text&&jsx139(Title9,{order:3,mb:"md",children:props.item.text}),jsx139(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}import{Anchor as Anchor10}from"@mantine/core";import{Fragment as Fragment47,jsx as jsx140,jsxs as jsxs89}from"react/jsx-runtime";function QuestionnaireFormRepeatableGroup(props){return jsxs89(Fragment47,{children:[props.responseItems.map(response=>jsx140(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),jsx140(Anchor10,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}import{Anchor as Anchor11,Stack as Stack28}from"@mantine/core";import{QuestionnaireItemType as QuestionnaireItemType3}from"@medplum/react-hooks";import{jsx as jsx141,jsxs as jsxs90}from"react/jsx-runtime";function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,showAddButton=item.type!==QuestionnaireItemType3.choice&&item.type!==QuestionnaireItemType3.openChoice,answers=responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return jsxs90(FormSection,{title:props.item.text,withAsterisk:props.item.required,children:[jsx141(Stack28,{gap:"xs",children:answers?.map((_,index)=>jsx141(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&jsx141(Anchor11,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}import{jsx as jsx142}from"react/jsx-runtime";function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props;return jsx142(Stack29,{children:items.map((item,index)=>{if(!isQuestionEnabled(item,formState.questionnaireResponse))return null;if(item.type===QuestionnaireItemType4.display)return jsx142("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===QuestionnaireItemType4.group&&item.repeats?jsx142(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems},`repeating-group-${item.id}-${index}`):item.type===QuestionnaireItemType4.group?jsx142(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]},`group-${item.id}-${index}`):item.type===QuestionnaireItemType4.boolean?jsx142(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?jsx142(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):jsx142(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:jsx142(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}import{Button as Button16,Group as Group54,Stepper}from"@mantine/core";import{Fragment as Fragment48,jsx as jsx143,jsxs as jsxs91}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 jsxs91(Fragment48,{children:[jsx143(Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>jsx143(Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&jsxs91(Group54,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx143(Button16,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&jsx143(Button16,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&jsx143(SubmitButton,{children:submitButtonText??"Submit"})]})]})}import{Fragment as Fragment49,jsx as jsx144,jsxs as jsxs92}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum41(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=useState79(!1),propsRef=useRef22(props);propsRef.current=props;let onFormChange=useCallback26(response=>{setSignatureRequiredSubmitted(!1),propsRef.current.onChange?.(response)},[]),formState=useQuestionnaireForm({questionnaire:props.questionnaire,defaultValue:props.questionnaireResponse,subject:props.subject,encounter:props.encounter,source:props.source,disablePagination:props.disablePagination,onChange:onFormChange}),formStateRef=useRef22(formState);formStateRef.current=formState;let isSignatureRequired=useMemo30(()=>formState.loading?!1:!!getExtension3(formState.questionnaire,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=useMemo30(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=useCallback26(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=createReference14(profile))}onSubmit({...response,questionnaire:questionnaire.url??getReferenceString8(questionnaire),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:jsxs92(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&jsx144(Title10,{children:formState.questionnaire.title}),formState.pagination?jsx144(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:jsx144(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):jsxs92(Fragment49,{children:[jsx144(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&jsxs92(Stack30,{mt:"md",gap:0,children:[jsx144(Text36,{size:"sm",fw:500,children:"Signature"}),jsx144(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&jsx144(Text36,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&jsx144(Group55,{justify:"flex-end",mt:"xl",gap:"xs",children:jsx144(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}import{Stack as Stack32}from"@mantine/core";import{useResource as useResource14}from"@medplum/react-hooks";import{Stack as Stack31,Text as Text37}from"@mantine/core";import{formatDate as formatDate4}from"@medplum/core";import{useMemo as useMemo31}from"react";import{Fragment as Fragment50,jsx as jsx145,jsxs as jsxs93}from"react/jsx-runtime";function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=useMemo31(()=>answer&&answer.length>0?jsx145(Fragment50,{children:answer.map((ans,index)=>jsx145(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?jsx145(Fragment50,{children:nestedAnswers.map((nestedAnswer,index)=>jsx145(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):jsx145(Text37,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return jsxs93(Stack31,{gap:0,pb:"xs",children:[jsx145(Text37,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return jsx145(Text37,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return jsx145(Text37,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return jsx145(Text37,{children:value});case"valueQuantity":return jsx145(QuantityDisplay,{value});case"valueString":return jsx145(Text37,{children:value});case"valueCoding":return jsx145(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return jsx145(RangeDisplay,{value});case"valueDateTime":return jsx145(Text37,{children:formatDate4(value)});case"valueBoolean":return jsx145(Text37,{children:value?"True":"False"});case"valueReference":return jsx145(Text37,{children:value.display??value.reference});default:return jsx145(Text37,{children:value.toString()})}}import{jsx as jsx146}from"react/jsx-runtime";function QuestionnaireResponseDisplay(props){let questionnaireResponse=useResource14(props.questionnaireResponse);return jsx146(Stack32,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>jsx146(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}import{ActionIcon as ActionIcon16,Divider as Divider5,Group as Group56,NativeSelect as NativeSelect14,Stack as Stack33,Text as Text38,TextInput as TextInput26}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect29,useState as useState80}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx147,jsxs as jsxs94}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]=useState80([]),[groupId,setGroupId]=useState80(1),[intervalId,setIntervalId]=useState80(1);return useEffect29(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs94(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx147(Stack33,{children:intervalGroups.map(intervalGroup=>jsx147(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx147(ActionIcon16,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx147(IconCirclePlus,{})}),jsx147(Group56,{justify:"flex-end",children:jsx147(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&&currentGroup?.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 jsx147(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs94(Stack33,{gap:"lg",children:[jsx147(Group56,{justify:"flex-end",children:jsx147(ActionIcon16,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx147(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx147(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx147(Divider5,{}),intervalGroup.intervals.map(interval=>jsxs94(Stack33,{gap:"xs",children:[jsxs94(Group56,{children:[jsx147(TextInput26,{"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}`),jsx147(ActionIcon16,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx147(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx147(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx147(ActionIcon16,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx147(IconCirclePlus,{})})]})})}function ReferenceRangeGroupFilters(props){let{intervalGroup,onChange}=props;intervalGroup.filters.age||(intervalGroup.filters.age={});for(let key of["low","high"])intervalGroup.filters.age[key]?.unit||(intervalGroup.filters.age[key]={...intervalGroup.filters.age[key],unit:"years",system:"http://unitsofmeasure.org"});return jsxs94(Stack33,{style:{maxWidth:"50%"},children:[jsx147(Group56,{children:jsx147(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})}}})}),jsxs94(Group56,{gap:"xs",children:[jsx147(Text38,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx147("div",{id:`div-age-${intervalGroup.id}`,children:jsx147(RangeInput,{path:"",name:`age-${intervalGroup.id}`,defaultValue:intervalGroup.filters.age,onChange:ageRange=>{for(let interval of intervalGroup.intervals)onChange(intervalGroup.id,{...interval,age:ageRange})}},`age-${intervalGroup.id}`)})]}),jsx147(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"}]}})}}}),jsx147(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 Button17,Grid as Grid2,Text as Text39}from"@mantine/core";import{formatDateTime as formatDateTime6,getReferenceString as getReferenceString9}from"@medplum/core";import{useMedplum as useMedplum42,useResource as useResource15}from"@medplum/react-hooks";import{Fragment as Fragment51,useEffect as useEffect30,useState as useState81}from"react";import{jsx as jsx148,jsxs as jsxs95}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum42(),requestGroup=useResource15(props.value),[startedLoading,setStartedLoading]=useState81(!1),[responseBundle,setResponseBundle]=useState81();if(useEffect30(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx148(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 jsxs95(Fragment51,{children:[jsx148(Grid2.Col,{span:1,p:"md",children:task?.status==="completed"?jsx148(IconCheckbox,{}):jsx148(IconSquare,{color:"gray"})}),jsxs95(Grid2.Col,{span:9,p:"xs",children:[jsx148(Text39,{fw:500,children:action.title}),action.description&&jsx148("div",{children:action.description}),jsxs95("div",{children:["Last edited by\xA0",jsx148(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime6(task?.meta?.lastUpdated)]}),jsxs95("div",{children:["Status: ",jsx148(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs95(Grid2.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx148(Button17,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx148(Button17,{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===getReferenceString9(entry.resource))return entry.resource}}import{useMedplum as useMedplum43}from"@medplum/react-hooks";import{useEffect as useEffect31,useState as useState82}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",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 Fragment52,jsx as jsx149,jsxs as jsxs96}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum43(),[value,setValue]=useState82(props.history);if(useEffect31(()=>{!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 jsx149("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx149("div",{className:ResourceBlame_default.container,children:jsx149("table",{className:ResourceBlame_default.root,children:jsx149("tbody",{children:table.map((row,index)=>jsxs96("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs96(Fragment52,{children:[jsx149("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:jsx149(ResourceName,{value:row.meta.author,link:!0,fz:"xs"})}),jsx149("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx149(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),fz:"xs",children:getTimeString(row.meta.lastUpdated)})})]}),jsx149("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx149("td",{className:ResourceBlame_default.line,children:jsx149("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 Fragment53,jsx as jsx150,jsxs as jsxs97}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 jsx150("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx150(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs97(Fragment53,{children:["...",jsx150("br",{}),props.delta.original.lines.length>0&&jsx150("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
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 Group23,Stack as Stack12,Text as Text15}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useMedplum as useMedplum19}from"@medplum/react-hooks";import{useContext as useContext19,useEffect as useEffect11,useState as useState41}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group22,Stack as Stack11,Text as Text14}from"@mantine/core";import{buildElementsContext as buildElementsContext3,getPropertyDisplayName,isEmpty as isEmpty5,isPopulated as isPopulated10}from"@medplum/core";import{useContext as useContext18,useMemo as useMemo18,useState as useState40}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon4,Button as Button4}from"@mantine/core";import{jsx as jsx76}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx76(Button4,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx76(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx76(ActionIcon4,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx76(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon5}from"@mantine/core";import{jsx as jsx77}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx77(ActionIcon5,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx77(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx78,jsxs as jsxs42}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState40(props.defaultValue),sliceElements=slice.typeSchema?.elements??slice.elements,parentElementsContextValue=useContext18(ElementsContext),contextValue=useMemo18(()=>{if(isPopulated10(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,jsx78(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx78(Text14,{c:"dimmed",children:"(empty)"}):jsxs42(Stack11,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs42(Group22,{wrap:"nowrap",children:[jsx78("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx78(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&&jsx78(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&&jsx78(Group22,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx78(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx79,jsxs as jsxs43}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum19(),[loading,setLoading]=useState41(!0),[slices,setSlices]=useState41([]),[defaultValue2]=useState41(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState41(()=>[defaultValue2]),ctx=useContext19(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect11(()=>{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 jsx79("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 jsxs43(Stack12,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx79(Text15,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx79(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)=>jsxs43(Group23,{wrap:"nowrap",style:{flexGrow:1},children:[jsx79("div",{style:{flexGrow:1},children:jsx79(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&&jsx79(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&&jsx79(Group23,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx79(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 Flex7,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification4}from"@mantine/notifications";import{useRef as useRef11,useState as useState42}from"react";import{jsx as jsx80,jsxs as jsxs44}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState42(!1),clipboard=useClipboard(),ref=useRef11(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs44(Flex7,{gap:"xs",children:[jsx80(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx80(ActionIcon6,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification4({color:"green",message:"Copied"})},children:jsx80(IconCopy,{})})]})}import{Box as Box6,Button as Button5,Chip,Group as Group24,Modal as Modal2,NativeSelect as NativeSelect8,Stack as Stack13,Switch,TextInput as TextInput16}from"@mantine/core";import{formatTiming as formatTiming2}from"@medplum/core";import{useContext as useContext20,useMemo as useMemo19,useRef as useRef12,useState as useState43}from"react";import{Fragment as Fragment27,jsx as jsx81,jsxs as jsxs45}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState43(props.defaultValue),[open,setOpen]=useState43(!props.disabled&&(props.defaultModalOpen??!1));return jsxs45(Fragment27,{children:[jsxs45(Group24,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81("span",{"data-testid":"timinginput-display",children:formatTiming2(value)||"No repeat"}),jsx81(Button5,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx81(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]=useState43(props.defaultValue||defaultValue),[timeOfDayItems,setTimeOfDayItems]=useState43(()=>(props.defaultValue?.repeat?.timeOfDay??[]).map((v,i)=>({id:i,value:v}))),nextTimeOfDayId=useRef12(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 jsx81(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs45(Stack13,{gap:"md",children:[jsx81(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx81(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx81(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs45(Fragment27,{children:[jsx81(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs45(Group24,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81(TextInput16,{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)}),jsx81(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"&&jsx81(FormSection,{title:"Repeat on",children:jsx81(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,value:value.repeat?.dayOfWeek,children:jsx81(Group24,{justify:"space-between",mt:"xs",gap:"xs",children:daysOfWeek.map(day=>jsx81(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,checked:(value.repeat?.dayOfWeek??[]).includes(day),children:day.charAt(0).toUpperCase()},day))})})}),jsx81(FormSection,{title:"At times",children:jsxs45(Stack13,{mt:"xs",children:[timeOfDayItems.map((item,idx)=>jsxs45(Group24,{children:[jsx81(TextInput16,{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}}),jsx81(ArrayRemoveButton,{testId:`timing-repeat-timeOfDay-remove-${idx}`,onClick:()=>setTimeOfDay(items=>items.toSpliced(idx,1))})]},item.id)),jsx81(Box6,{children:jsx81(ArrayAddButton,{propertyDisplayName:"Time of Day",onClick:()=>setTimeOfDay(items=>{let id=nextTimeOfDayId.current++;return items.concat({id,value:"00:00:00"})})})})]})})]}),jsx81(Group24,{justify:"flex-end",children:jsx81(Button5,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx82,jsxs as jsxs46}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 jsx82(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx82(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx82(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx82(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]=useState44(initialPropertyType);return jsxs46(Group25,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx82(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}))}),jsx82(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 isPopulated11(withDefaults)?withDefaults:props.defaultValue},[propertyType,elementsContext.path,elementsContext.elements,props.path,props.defaultValue]);if(!propertyType)return jsx82("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]"?jsx82(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx82(TextInput17,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx82(TextInput17,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.time:return jsx82(TextInput17,{...getPrimitiveInputProps(),type:"time",step:1,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx82(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx82(TextInput17,{...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 jsx82(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx82(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:case PropertyType2.xhtml:return jsx82(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx82(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx82(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx82(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx82(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx82(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx82(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx82(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx82(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx82(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx82(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx82(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx82(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx82(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx82(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx82(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx82(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx82(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx82(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 jsx83}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState45(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 jsx83(Stack14,{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=jsx83(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"?jsx83(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx83(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 jsx84,jsxs as jsxs47}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState46(()=>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 jsxs47("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx84(Box7,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:jsx84(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}import{Button as Button6,Group as Group26}from"@mantine/core";import{useMemo as useMemo23,useState as useState47}from"react";var CalendarInput_default={table:"CalendarInput_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 jsx85,jsxs as jsxs48}from"react/jsx-runtime";function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState47(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth.getTime());return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=useMemo23(()=>buildGrid(month,props.slots),[month,props.slots]);return jsxs48("div",{children:[jsxs48(Group26,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx85("p",{style:{flex:1},children:getMonthString(month)}),jsxs48(Group26,{justify:"flex-end",gap:"xs",children:[jsx85(Button6,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx85(Button6,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs48("table",{className:CalendarInput_default.table,children:[jsx85("thead",{children:jsxs48("tr",{children:[jsx85("th",{children:"SUN"}),jsx85("th",{children:"MON"}),jsx85("th",{children:"TUE"}),jsx85("th",{children:"WED"}),jsx85("th",{children:"THU"}),jsx85("th",{children:"FRI"}),jsx85("th",{children:"SAT"})]})}),jsx85("tbody",{children:grid.map((week,weekIndex)=>jsx85("tr",{children:week.map((day,dayIndex)=>jsx85("td",{children:day&&jsx85(Button6,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,slots){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.getTime()),available:isDayAvailable(d,slots)}),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,slots){for(let slot of slots){let slotStart=new Date(slot.start);if(slotStart.getFullYear()===day.getFullYear()&&slotStart.getMonth()===day.getMonth()&&slotStart.getDate()===day.getDate())return!0}return!1}import{ActionIcon as ActionIcon7,Group as Group27,LoadingOverlay,Paper as Paper2,ScrollArea as ScrollArea2,Skeleton,Stack as Stack15,Text as Text16,TextInput as TextInput18,Title as Title5}from"@mantine/core";import{useResizeObserver}from"@mantine/hooks";import{showNotification as showNotification5}from"@mantine/notifications";import{getDisplayString as getDisplayString4,getReferenceString as getReferenceString4,normalizeErrorString as normalizeErrorString6}from"@medplum/core";import{useMedplum as useMedplum20,useResource as useResource3,useSubscription}from"@medplum/react-hooks";import{useCallback as useCallback10,useEffect as useEffect12,useMemo as useMemo24,useRef as useRef13,useState as useState48}from"react";var BaseChat_default={chatPaper:"BaseChat_chatPaper",chatTitle:"BaseChat_chatTitle",chatBody:"BaseChat_chatBody",chatScrollArea:"BaseChat_chatScrollArea",chatInputContainer:"BaseChat_chatInputContainer",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble",chatBubbleNameRight:"BaseChat_chatBubbleNameRight"};import{jsx as jsx86,jsxs as jsxs49}from"react/jsx-runtime";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,...paperProps}=props,medplum=useMedplum20(),inputRef=useRef13(null),scrollAreaRef=useRef13(null),firstScrollRef=useRef13(!0),initialLoadRef=useRef13(!0),[profile,setProfile]=useState48(medplum.getProfile()),[reconnecting,setReconnecting]=useState48(!1),[loading,setLoading]=useState48(!0);loading||(initialLoadRef.current=!1);let profileRefStr=useMemo24(()=>profile?getReferenceString4(medplum.getProfile()):"",[profile,medplum]),searchMessages=useCallback10(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]);useEffect12(()=>{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),getReferenceString4(communication.sender)!==profileRefStr&&(communicationsRef.current.find(c=>c.id===communication.id)?onMessageUpdated?.(communication):onMessageReceived?.(communication))},{onWebSocketClose:useCallback10(()=>{reconnecting||setReconnecting(!0),showNotification5({color:"red",message:"Live chat disconnected. Attempting to reconnect..."})},[reconnecting]),onWebSocketOpen:useCallback10(()=>{reconnecting&&showNotification5({color:"green",message:"Live chat reconnected."})},[reconnecting]),onSubscriptionConnect:useCallback10(()=>{reconnecting&&(searchMessages().catch(err=>showNotification5({color:"red",message:normalizeErrorString6(err)})),setReconnecting(!1))},[reconnecting,searchMessages]),onError:useCallback10(err=>{onError?onError(err):showError(normalizeErrorString6(err))},[onError])});let sendMessageInternal=useCallback10(formData=>{inputDisabled||(inputRef.current&&(inputRef.current.value=""),sendMessage(formData.message),scrollToBottomRef.current=!0)},[inputDisabled,sendMessage]);useEffect12(()=>{let latestProfile=medplum.getProfile();profile?.id!==latestProfile?.id&&(setProfile(latestProfile),setCommunications([]))});let[parentRef,parentRect]=useResizeObserver(),communicationsRef=useRef13(communications);communicationsRef.current=communications;let prevCommunicationsRef=useRef13(communications),scrollToBottomRef=useRef13(!0);useEffect12(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),useEffect12(()=>{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=useMemo24(()=>{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?jsxs49(Paper2,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[!excludeHeader&&jsx86(Title5,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx86("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs49(Stack15,{align:"stretch",mt:"lg",children:[jsxs49(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(Skeleton,{height:38,circle:!0,ml:"md"}),jsx86(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs49(Group27,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx86(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs49(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(Skeleton,{height:38,circle:!0,ml:"md"}),jsx86(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs49(ScrollArea2,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx86(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;return jsxs49(Stack15,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx86(Text16,{fz:"xs",ta:"center",children:currCommTime}),c.sender?.reference===profileRefStr?jsxs49(Group27,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(ChatBubble,{alignment:"right",communication:c,showDelivered}),jsx86(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender,mb:showDelivered?void 0:"sm"})]}):jsxs49(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),jsx86(ChatBubble,{alignment:"left",communication:c})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsx86("div",{className:BaseChat_default.chatInputContainer,children:jsx86(Form,{onSubmit:sendMessageInternal,children:jsx86(TextInput18,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",rightSectionWidth:42,disabled:inputDisabled,rightSection:inputDisabled?void 0:jsx86(ActionIcon7,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx86(IconArrowRight,{size:"1rem",stroke:1.5})})})})})]}):null}function ChatBubble(props){let{communication,alignment,showDelivered}=props,content=communication.payload?.[0]?.contentString||"",sentTime=new Date(communication.sent??-1),seenTime=new Date(communication.received??-1),senderResource=useResource3(communication.sender);return jsxs49("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsxs49(Text16,{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",jsx86(Text16,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),jsx86("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx86("div",{className:BaseChat_default.chatBubble,children:content})}),showDelivered&&jsxs49("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs49("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx86("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx86("div",{style:{position:"relative"},children:jsx86(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx86("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx86("div",{className:BaseChat_default.chatBubble,children:jsx86(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 useEffect13,useState as useState49}from"react";var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};import{Fragment as Fragment28,jsx as jsx87,jsxs as jsxs50}from"react/jsx-runtime";function ChatModal(props){let{open,children}=props,profile=useMedplumProfile5(),[opened,setOpened]=useState49(open??!1);return useEffect13(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?jsxs50(Fragment28,{children:[opened&&jsx87("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx87("div",{className:ChatModal_default.iconContainer,children:jsx87(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx87(IconChevronDown,{size:"1.625rem"})})}):jsx87("div",{className:ChatModal_default.iconContainer,children:jsx87(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx87(IconChevronUp,{size:"1.625rem"})})})]}):null}import{createReference as createReference3,formatCodeableConcept as formatCodeableConcept2,getReferenceString as getReferenceString5}from"@medplum/core";import{useMedplum as useMedplum21,useMedplumProfile as useMedplumProfile6,usePrevious}from"@medplum/react-hooks";import{useCallback as useCallback11,useEffect as useEffect14,useMemo as useMemo25,useState as useState50}from"react";import{jsx as jsx88}from"react/jsx-runtime";function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,excludeHeader,onError}=props,medplum=useMedplum21(),profile=useMedplumProfile6(),prevThreadId=usePrevious(thread?.id),[communications,setCommunications]=useState50([]),profileRef=useMemo25(()=>profile?createReference3(profile):void 0,[profile]),threadRef=useMemo25(()=>createReference3(thread),[thread]);useEffect14(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=useCallback11(message=>{let profileRefStr=profileRef?getReferenceString5(profileRef):void 0;profileRefStr&&medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>getReferenceString5(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload:[{contentString:message}],partOf:[threadRef]}).then(communication=>{setCommunications([...communications,communication]),onMessageSent?.(communication)}).catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent]),onMessageReceived=useMemo25(()=>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?jsx88(BaseChat,{title:title??(thread?.topic?formatCodeableConcept2(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled,excludeHeader,onError}):null}import{ActionIcon as ActionIcon10,Button as Button8,Center as Center3,Group as Group31,Loader as Loader3,ScrollArea as ScrollArea3,TextInput as TextInput19}from"@mantine/core";import{showNotification as showNotification6,updateNotification}from"@mantine/notifications";import{createReference as createReference4,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useMedplum as useMedplum25,useResource as useResource7}from"@medplum/react-hooks";import{useCallback as useCallback12,useEffect as useEffect18,useRef as useRef14,useState as useState56}from"react";import{Group as Group29,List,Stack as Stack17,Text as Text18,Title as Title6}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime2,formatObservationValue,isReference as isReference2}from"@medplum/core";import{useMedplum as useMedplum22,useResource as useResource5}from"@medplum/react-hooks";import{useEffect as useEffect15,useState as useState52}from"react";import{Blockquote,Stack as Stack16}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx89}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx89(Stack16,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx89(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 Group28}from"@mantine/core";import{Text as Text17}from"@mantine/core";import{getDisplayString as getDisplayString5,isOk,normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useResource as useResource4}from"@medplum/react-hooks";import{useState as useState51}from"react";import{jsx as jsx90}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState51(),resource=useResource4(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString7(outcome)}]`;else if(resource)text=getDisplayString5(resource);else return null;return link?jsx90(MedplumLink,{to:value,...rest,children:text}):jsx90(Text17,{component:"span",...rest,children:text})}import{jsx as jsx91,jsxs as jsxs51}from"react/jsx-runtime";function ResourceBadge(props){return jsxs51(Group28,{gap:"xs",children:[jsx91(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx91(ResourceName,{value:props.value,link:props.link})]})}import{Badge}from"@mantine/core";import{jsx as jsx92}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 jsx92(Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment29,jsx as jsx93,jsxs as jsxs52}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum22(),diagnosticReport=useResource5(props.value),[specimens,setSpecimens]=useState52();if(useEffect15(()=>{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 jsxs52(Stack17,{children:[jsx93(Title6,{children:"Diagnostic Report"}),jsx93(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx93(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx93(NoteDisplay,{value:specimenNotes})]})}function DiagnosticReportHeader({value,hideSubject=!1}){return jsxs52(Group29,{mt:"md",gap:30,children:[value.subject&&!hideSubject&&jsxs52("div",{children:[jsx93(Text18,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx93(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs52("div",{children:[jsx93(Text18,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx93(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs52("div",{children:[jsx93(Text18,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx93(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs52("div",{children:[jsx93(Text18,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx93(Text18,{children:formatDateTime2(value.issued)})]}),value.status&&jsxs52("div",{children:[jsx93(Text18,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx93(StatusBadge,{status:value.status})]})]})}function SpecimenInfo(specimens){return jsxs52(Stack17,{gap:"xs",children:[jsx93(Title6,{order:2,size:"h6",children:"Specimens"}),jsx93(List,{type:"ordered",children:specimens?.map(specimen=>jsx93(List.Item,{ml:"sm",children:jsxs52(Group29,{gap:20,children:[jsxs52(Group29,{gap:5,children:[jsx93(Text18,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs52(Group29,{gap:5,children:[jsx93(Text18,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs52("table",{className:DiagnosticReportDisplay_default.table,children:[jsx93("thead",{children:jsxs52("tr",{children:[jsx93("th",{children:"Test"}),jsx93("th",{children:"Value"}),jsx93("th",{children:"Reference Range"}),jsx93("th",{children:"Interpretation"}),jsx93("th",{children:"Category"}),jsx93("th",{children:"Performer"}),jsx93("th",{children:"Status"})]})}),jsx93("tbody",{children:jsx93(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx93(Fragment29,{children:props.value?.map(observation=>jsx93(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference2(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource5(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs52(Fragment29,{children:[jsxs52("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx93("td",{rowSpan:displayNotes?2:1,children:jsx93(MedplumLink,{to:observation,children:jsx93(CodeableConceptDisplay,{value:observation.code})})}),jsx93("td",{children:jsx93(ObservationValueDisplay,{value:observation})}),jsx93("td",{children:jsx93(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx93("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx93(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx93("td",{children:observation.category&&observation.category.length>0&&jsx93(Fragment29,{children:observation.category.map(concept=>jsx93("div",{children:jsx93(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx93("td",{children:observation.performer?.map(performer=>jsx93(ReferenceDisplay,{value:performer},performer.reference))}),jsx93("td",{children:observation.status&&jsx93(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx93(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx93("tr",{children:jsx93("td",{colSpan:6,children:jsx93(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx93(Fragment29,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx93(Fragment29,{children:range.text}):jsx93(RangeDisplay,{value:range}):null}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;return code==="AA"||code==="LL"||code==="HH"||code==="A"}var import_rfc6902=__toESM(require_rfc6902(),1);import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize3,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum23}from"@medplum/react-hooks";import{useEffect as useEffect16,useMemo as useMemo26,useState as useState54}from"react";import{Button as Button7,Table}from"@mantine/core";import{useState as useState53}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment30,jsx as jsx94,jsxs as jsxs53}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState53(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx94(Fragment30,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx94(Fragment30,{children:jsxs53(Table.Tr,{children:[jsx94(Table.Td,{children:name}),jsx94(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx94(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx94(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx94(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs53(Table.Tr,{children:[jsx94(Table.Td,{children:name}),jsx94(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx94(Button7,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx95,jsxs as jsxs54}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum23(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState54(!1);useEffect16(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo26(()=>{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:`${capitalize3(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?jsxs54(Table2,{className:ResourceDiffTable_default.root,children:[jsx95(Table2.Thead,{children:jsxs54(Table2.Tr,{children:[jsx95(Table2.Th,{}),jsx95(Table2.Th,{children:"Before"}),jsx95(Table2.Th,{children:"After"})]})}),jsx95(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx95(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 useMedplum24,useResource as useResource6}from"@medplum/react-hooks";import{useEffect as useEffect17,useMemo as useMemo27,useState as useState55}from"react";import{jsx as jsx96}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum24(),accessPolicy=medplum.getAccessPolicy(),value=useResource6(props.value),[schemaLoaded,setSchemaLoaded]=useState55(!1);useEffect17(()=>{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=useMemo27(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx96(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon9,Group as Group30,Menu as Menu4,Text as Text19}from"@mantine/core";import{formatDateTime as formatDateTime3,getReferenceString as getReferenceString6}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx97,jsxs as jsxs55}from"react/jsx-runtime";function Timeline(props){return jsx97(Container,{children:props.children})}function TimelineItem(props){let{resource,profile,padding,popupMenuItems,...others}=props,author=profile??resource.meta?.author,dateTime=props.dateTime??resource.meta?.lastUpdated;return jsxs55(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs55(Group30,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx97(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs55("div",{style:{flex:1},children:[jsx97(Text19,{size:"sm",children:jsx97(ResourceName,{c:"inherit",fw:500,value:author,link:!0})}),jsxs55(Text19,{size:"xs",children:[jsx97(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime3(dateTime)}),jsx97(Text19,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx97(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs55(Menu4,{position:"bottom-end",shadow:"md",width:200,children:[jsx97(Menu4.Target,{children:jsx97(ActionIcon9,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString6(props.resource)}`,children:jsx97(IconDots,{})})}),popupMenuItems]})]}),jsx97(ErrorBoundary,{children:jsx97("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 jsx98,jsxs as jsxs56}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum25(),sender=medplum.getProfile(),inputRef=useRef14(null),resource=useResource7(props.value),[history,setHistory]=useState56(),[items,setItems]=useState56([]),[countToShow,setCountToShow]=useState56(10),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef14(items);itemsRef.current=items;let sortAndSetItems=useCallback12(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback12(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=useCallback12(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback12(()=>{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]);useEffect18(()=>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:jsx98(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString8(reason),icon:jsx98(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification6({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:normalizeErrorString8(outcome),icon:jsx98(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return jsx98(Center3,{style:{width:"100%",height:"100%"},children:jsx98(Loader3,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return jsxs56(Timeline,{children:[props.createCommunication&&jsx98(Panel,{children:jsx98(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs56(Group31,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx98(ResourceAvatar,{value:sender}),jsx98(TextInput19,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx98(ActionIcon10,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx98(IconMessage,{size:16})}),jsx98(AttachmentButton,{securityContext:createReference4(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx98(ActionIcon10,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx98(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 jsx98(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx98(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx98(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx98(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx98(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx98(TimelineItem,{resource:item,padding:!0,children:jsx98(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&jsx98(Group31,{justify:"center",pb:"lg",children:jsx98(Button8,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx98(TimelineItem,{resource,padding:!0,...rest,children:jsx98(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs56(TimelineItem,{resource,padding:!0,...rest,children:[jsx98("h3",{children:"Created"}),jsx98(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 jsx98(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx98("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 jsx98(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx98(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx98(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx98(ScrollArea3,{children:jsx98("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx98(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx98(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 jsx99}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx99(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 createReference5}from"@medplum/core";import{jsx as jsx100}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx100(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:createReference5(resource),subject:resource.subject,sender:createReference5(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference5(resource),subject:resource.subject,operator:createReference5(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button13,Loader as Loader5,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome8}from"@medplum/core";import{useMedplum as useMedplum27}from"@medplum/react-hooks";import{memo,useEffect as useEffect22,useRef as useRef18,useState as useState61}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx101}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 jsx101(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon12,Button as Button12,Center as Center4,Group as Group34,Loader as Loader4,Menu as Menu6,Pagination,Table as Table3,Text as Text21,UnstyledButton as UnstyledButton3}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome7}from"@medplum/core";import{useMedplum as useMedplum26}from"@medplum/react-hooks";import{useCallback as useCallback13,useEffect as useEffect21,useRef as useRef17,useState as useState60}from"react";import{Box as Box8,Button as Button9,Modal as Modal3,Text as Text20}from"@mantine/core";import{jsx as jsx102,jsxs as jsxs57}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs57(Modal3,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs57(Box8,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx102(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx102(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx102(Text20,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx102(Button9,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button10,Group as Group32,Modal as Modal4,MultiSelect,Stack as Stack18}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify2}from"@medplum/core";import{useEffect as useEffect19,useMemo as useMemo28,useRef as useRef15,useState as useState57}from"react";import{capitalize as capitalize4,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime4,Operator}from"@medplum/core";import{Fragment as Fragment31,jsx as jsx103}from"react/jsx-runtime";var searchParamToOperators={string:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],fulltext:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],token:[Operator.EQUALS,Operator.NOT],reference:[Operator.EQUALS,Operator.NOT],numeric:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],quantity:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],date:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],datetime:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],uri:[Operator.EQUALS,Operator.NOT,Operator.ABOVE,Operator.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,Operator.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator.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,Operator.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(capitalize4).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?jsx103(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children:resource.id}):key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?formatDateTime4(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?jsx103(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:jsx103(Fragment31,{children:value.map((v,index)=>jsx103(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx104,jsxs as jsxs58}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef15(!1),[state,setState]=useState57({search:JSON.parse(stringify2(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState57(!1);useEffect19(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo28(()=>{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 jsx104(Modal4,{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:jsx104("div",{"data-testid":"overlay-child"})},children:jsxs58(Stack18,{children:[jsx104(MultiSelect,{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}),jsx104(Group32,{justify:"flex-end",children:jsx104(Button10,{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 ActionIcon11,Group as Group33,Modal as Modal5,NativeSelect as NativeSelect10}from"@mantine/core";import{Operator as Operator2,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect20,useRef as useRef16,useState as useState58}from"react";import{Checkbox as Checkbox5,TextInput as TextInput20}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx105}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 jsx105(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 jsx105(Checkbox5,{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 jsx105(TextInput20,{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 jsx105(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx105(TextInput20,{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 jsx105(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx105(TextInput20,{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 jsx106,jsxs as jsxs59}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState58(deepClone2(props.search)),searchRef=useRef16(search);searchRef.current=search,useEffect20(()=>{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 jsx106(Modal5,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs59(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs59("div",{children:[jsxs59("table",{children:[jsxs59("colgroup",{children:[jsx106("col",{style:{width:200}}),jsx106("col",{style:{width:200}}),jsx106("col",{style:{width:380}}),jsx106("col",{style:{width:40}})]}),jsx106("thead",{children:jsxs59("tr",{children:[jsx106("th",{children:"Field"}),jsx106("th",{children:"Operation"}),jsx106("th",{children:"Value"}),jsx106("th",{})]})}),jsx106("tbody",{children:filters.map((filter,index)=>jsx106(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`))})]}),jsx106(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx106(Group33,{justify:"flex-end",mt:"xl",children:jsx106(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value,valueRef=useRef16(value);valueRef.current=value;function setFilterCode(newCode){valueRef.current.code=newCode,valueRef.current.operator=Operator2.EQUALS,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterOperator(newOperator){valueRef.current.operator=newOperator,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterValue(newFilterValue){valueRef.current.value=newFilterValue,props.onChange(valueRef.current)}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return jsxs59("tr",{children:[jsx106("td",{children:jsx106(NativeSelect10,{"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)}))]})}),jsx106("td",{children:operators&&jsx106(NativeSelect10,{"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}`)}),jsx106("td",{children:searchParam&&value.operator&&jsx106(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}`)}),jsx106("td",{children:props.onDelete&&jsx106(ActionIcon11,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx106(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button11,Grid,Modal as Modal6}from"@mantine/core";import{useState as useState59}from"react";import{jsx as jsx107,jsxs as jsxs60}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState59(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx107(Modal6,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx107(Form,{onSubmit:onOk,children:jsxs60(Grid,{children:[jsx107(Grid.Col,{span:10,children:jsx107(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx107(Grid.Col,{span:2,children:jsx107(Button11,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime5,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator3,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment32,jsx as jsx108}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===Operator3.EQUALS||filter.operator===Operator3.NOT_EQUALS))return jsx108(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx108(Fragment32,{children:formatDateTime5(filter.value)})}return jsx108(Fragment32,{children:filter.value})}import{Menu as Menu5}from"@mantine/core";import{Operator as Operator4}from"@medplum/core";import{Fragment as Fragment33,jsx as jsx109,jsxs as jsxs61}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?jsx109(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx109(Menu5.Dropdown,{children:props.searchParams.map(searchParam=>jsx109(Menu5.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx109(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx109(NumericFilterSubMenu,{...props});case"reference":return jsx109(ReferenceFilterSubMenu,{...props});case"string":return jsx109(TextFilterSubMenu,{...props});case"token":case"uri":return jsx109(TokenFilterSubMenu,{...props});default:return jsxs61(Fragment33,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs61(Menu5.Dropdown,{children:[jsx109(Menu5.Item,{leftSection:jsx109(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx109(Menu5.Item,{leftSection:jsx109(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.ENDS_BEFORE),children:"Before..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.STARTS_AFTER),children:"After..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Between..."}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx109(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs61(Menu5.Dropdown,{children:[jsx109(Menu5.Item,{leftSection:jsx109(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx109(Menu5.Item,{leftSection:jsx109(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN),children:"Greater than..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN),children:"Less than..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx109(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs61(Menu5.Dropdown,{children:[jsx109(Menu5.Item,{leftSection:jsx109(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx109(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs61(Menu5.Dropdown,{children:[jsx109(Menu5.Item,{leftSection:jsx109(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx109(Menu5.Item,{leftSection:jsx109(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.CONTAINS),children:"Contains..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Does not contain..."}),jsx109(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs61(Menu5.Dropdown,{children:[jsx109(Menu5.Item,{leftSection:jsx109(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx109(Menu5.Item,{leftSection:jsx109(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx109(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs61(Fragment33,{children:[jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx109(Menu5.Item,{leftSection:jsx109(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx109(Menu5.Divider,{}),jsx109(Menu5.Item,{leftSection:jsx109(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,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=getElementDefinition(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 Fragment34,jsx as jsx110,jsxs as jsxs62}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=useMedplum26(),[outcome,setOutcome]=useState60(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState60(search);deepEquals(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState60({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef17(state);stateRef.current=state;let total=memoizedSearch.total??"accurate",loadResults=useCallback13(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(normalizeOperationOutcome7(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback13(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect21(()=>{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(){let state2=stateRef.current;if(!state2.searchResponse?.entry||state2.searchResponse.entry.length===0)return!1;for(let e of state2.searchResponse.entry)if(e.resource?.id&&!state2.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 jsx110(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx110(Center4,{style:{width:"100%",height:"100%"},children:jsx110(Loader4,{})});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 jsxs62("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs62(Group34,{justify:"space-between",mb:"xl",children:[jsxs62(Group34,{gap:2,children:[jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx110(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx110(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs62(Group34,{gap:2,children:[lastResult&&jsxs62(Text21,{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()}`]}),jsx110(ActionIcon12,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx110(IconRefresh,{size:iconSize})})]})]}),jsxs62(Table3,{className:SearchControl_default.table,children:[jsxs62(Table3.Thead,{children:[jsxs62(Table3.Tr,{children:[checkboxColumn&&jsx110(Table3.Th,{children:jsx110("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx110(Table3.Th,{children:jsxs62(Menu6,{shadow:"md",width:240,position:"bottom-end",children:[jsx110(Menu6.Target,{children:jsx110(UnstyledButton3,{className:SearchControl_default.control,p:2,children:jsxs62(Group34,{justify:"space-between",wrap:"nowrap",children:[jsx110(Text21,{fw:500,children:buildFieldNameString(field.name)}),jsx110(Center4,{className:SearchControl_default.icon,children:jsx110(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx110(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&&jsxs62(Table3.Tr,{children:[checkboxColumn&&jsx110(Table3.Th,{}),fields.map(field=>jsx110(Table3.Th,{children:field.searchParams&&jsx110(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),jsx110(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs62(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx110(Table3.Td,{children:jsx110("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=>jsx110(Table3.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&jsx110(Container,{children:jsx110(Center4,{style:{height:150},children:jsx110(Text21,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx110(Center4,{m:"md",p:"md",children:jsx110(Pagination,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),jsx110(SearchFieldEditor,{search:memoizedSearch,visible:stateRef.current.fieldEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,fieldEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,fieldEditorVisible:!1})}},`search-field-editor-${state.dialogOpenTime}`),jsx110(SearchFilterEditor,{search:memoizedSearch,visible:stateRef.current.filterEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,filterEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterEditorVisible:!1})}},`search-filter-editor-${state.dialogOpenTime}`),jsx110(SearchExportDialog,{visible:stateRef.current.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx110(SearchFilterValueDialog,{visible:stateRef.current.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?jsx110("span",{children:"no filters"}):jsx110(Fragment34,{children:filters.map(filter=>jsxs62("div",{children:[getOpString(filter.operator),"\xA0",jsx110(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 jsx111,jsxs as jsxs63}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum27(),[schemaLoaded,setSchemaLoaded]=useState61(!1),[outcome,setOutcome]=useState61(),{query,fields}=props,[response,setResponse]=useState61(),[selected,setSelected]=useState61({}),responseRef=useRef18(response);responseRef.current=response;let selectedRef=useRef18({});selectedRef.current=selected,useEffect22(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome8(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selectedRef.current};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=responseRef.current?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=responseRef.current?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selectedRef.current[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(useEffect22(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx111(Loader5,{});let checkboxColumn=props.checkboxesEnabled;return jsxs63("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs63(Table4,{children:[jsx111(Table4.Thead,{children:jsxs63(Table4.Tr,{children:[checkboxColumn&&jsx111(Table4.Th,{children:jsx111("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx111(Table4.Th,{children:field.name},field.name))]})}),jsx111(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs63(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx111(Table4.Td,{children:jsx111("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=>jsx111(Table4.Td,{children:jsx111(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx111("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx111("div",{"data-testid":"search-error",children:jsx111("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx111(Button13,{onClick:()=>props.onBulk(Object.keys(selectedRef.current)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo(FhirPathTable);import{ScrollArea as ScrollArea4}from"@mantine/core";var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};import{jsx as jsx112}from"react/jsx-runtime";function InfoBar(props){return jsx112(ScrollArea4,{children:jsx112("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx112("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx112("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx112("div",{className:InfoBar_default.value,children:props.children})};import{Anchor as Anchor7,Tabs}from"@mantine/core";import{isString,locationUtils as locationUtils5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate5}from"@medplum/react-hooks";import{useState as useState62}from"react";var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};import{jsx as jsx113,jsxs as jsxs64}from"react/jsx-runtime";function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=useMedplumNavigate5(),[currentTab,setCurrentTab]=useState62(()=>{let tab=locationUtils5.getPathname().split("/").pop();return tab&&tabs.some(t=>t.value===tab)?tab:tabs[0].value});function onTabChange(newTabName){newTabName=newTabName||tabs[0].value,setCurrentTab(newTabName),navigate(`${baseUrl}/${newTabName}`)}return jsxs64(Tabs,{value:currentTab.toLowerCase(),onChange:onTabChange,...rest,children:[jsx113(Tabs.List,{className:LinkTabs_default.list,children:tabs.map(t=>jsx113(Tabs.Tab,{value:t.value,children:jsx113(Anchor7,{className:LinkTabs_default.link,href:`${baseUrl}/${t.value}`,onClick:onLinkClick,children:t.label})},t.value))}),children]})}function normalizeTabDefinitions(tabs){return tabs.map(t=>isString(t)?{label:t,value:t.toLowerCase()}:t)}function onLinkClick(e){isAuxClick(e)||e.preventDefault()}import{Box as Box10,SimpleGrid}from"@mantine/core";import{useResource as useResource8,useSearchOne}from"@medplum/react-hooks";import{Box as Box9,Flex as Flex8,Group as Group35,Paper as Paper3,RingProgress,Text as Text22,Title as Title7}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept4}from"@medplum/core";import{Fragment as Fragment35,jsx as jsx114,jsxs as jsxs65}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx114(Paper3,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs65(Group35,{children:[group.measureScore&&jsx114(MeasureScore,{group}),!group.measureScore&&jsx114(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs65(Fragment35,{children:[jsx114(Text22,{fz:"md",fw:500,mb:8,children:measure.title}),jsx114(Text22,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept4(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept4(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs65(Box9,{children:[jsx114(Title7,{order:3,children:"Not Applicable"}),jsx114(Text22,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs65(Box9,{children:[jsx114(Title7,{order:3,children:"Insufficient Data"}),jsx114(Text22,{children:`Numerator: ${numeratorCount}`}),jsx114(Text22,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx114(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx114(Flex8,{justify:"center",children:jsxs65(Text22,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx114(Fragment35,{children:unit==="%"?jsx114(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx114(Flex8,{justify:"center",children:jsx114(Text22,{fw:700,fz:18,children:jsx114(QuantityDisplay,{value:group.measureScore})})})}):jsx114(Flex8,{h:120,align:"center",children:jsx114(Title7,{order:3,children:jsx114(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 jsx115,jsxs as jsxs66}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource8(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs66(Box10,{children:[measure&&jsx115(MeasureTitle,{measure}),jsx115(SimpleGrid,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx115(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon13,Indicator,Tooltip as Tooltip4}from"@mantine/core";import{useMedplum as useMedplum28,useSubscription as useSubscription2}from"@medplum/react-hooks";import{useCallback as useCallback14,useEffect as useEffect23,useState as useState63}from"react";import{jsx as jsx116}from"react/jsx-runtime";function NotificationIcon(props){let medplum=useMedplum28(),{resourceType,countCriteria,subscriptionCriteria}=props,[unreadCount,setUnreadCount]=useState63(0),updateCount=useCallback14(cache=>{medplum.search(resourceType,countCriteria,{cache}).then(result2=>setUnreadCount(result2.total)).catch(console.error)},[medplum,resourceType,countCriteria]);useEffect23(()=>{updateCount("default")},[updateCount]),useSubscription2(subscriptionCriteria,()=>{updateCount("reload")});let result=props.iconComponent;return props.onClick&&(result=jsx116(ActionIcon13,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=jsx116(Tooltip4,{label:props.tooltip,children:result})),unreadCount>0&&(result=jsx116(Indicator,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}import{Group as Group36,SegmentedControl as SegmentedControl2,Stack as Stack19}from"@mantine/core";import{notifications}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString9,resolveId}from"@medplum/core";import{useMedplum as useMedplum29}from"@medplum/react-hooks";import{useCallback as useCallback15}from"react";import{jsx as jsx117,jsxs as jsxs67}from"react/jsx-runtime";var NOTIFICATION_ID="patient-export",NOTIFICATION_TITLE="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=useMedplum29(),{patient}=props,handleSubmit=useCallback15(async data2=>{let patientId=resolveId(patient),format=data2.format,{operation,type,contentType,extension}=formats[format],url=medplum.fhirUrl("Patient",patientId,operation),params={};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),notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,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),notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"green",message:"Done",icon:jsx117(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString9(err),icon:jsx117(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient]);return jsx117(Form,{onSubmit:handleSubmit,children:jsxs67(Stack19,{children:[jsx117(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx117(SegmentedControl2,{name:"format",data:[{label:"FHIR Everything",value:"everything"},{label:"Patient Summary",value:"summary"},{label:"C-CDA",value:"ccda"},{label:"C-CDA Referral",value:"ccdaReferral"}],fullWidth:!0})}),jsx117(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx117(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx117(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx117(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx117(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:jsx117(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx117(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:jsx117(DateTimeInput,{name:"endDate",placeholder:"End date"})}),jsx117(Group36,{justify:"right",children:jsx117(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}from"@medplum/core";import{useResource as useResource9}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment36,jsx as jsx118,jsxs as jsxs68}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource9(props.patient);return patient?jsxs68(InfoBar,{children:[jsx118(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:"Name"}),jsx118(InfoBar.Value,{children:jsx118(MedplumLink,{to:patient,fw:500,children:patient.name?jsx118(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs68(Fragment36,{children:[jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:"DoB"}),jsx118(InfoBar.Value,{children:patient.birthDate})]}),jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:"Age"}),jsx118(InfoBar.Value,{children:calculateAgeString(patient.birthDate)})]})]}),patient.gender&&jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:"Gender"}),jsx118(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:"State"}),jsx118(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs68(InfoBar.Entry,{children:[jsx118(InfoBar.Key,{children:identifier?.system}),jsx118(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Divider as Divider4,Flex as Flex15,Group as Group50,Stack as Stack26,Text as Text33,Tooltip as Tooltip6}from"@mantine/core";import{calculateAgeString as calculateAgeString2,formatAddress as formatAddress2,formatHumanName as formatHumanName6,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum36,useResource as useResource11}from"@medplum/react-hooks";import{useEffect as useEffect24,useState as useState75}from"react";import{Box as Box13,Flex as Flex9,Group as Group39,Modal as Modal7,Text as Text24}from"@mantine/core";import{useDisclosure}from"@mantine/hooks";import{getDisplayString as getDisplayString6}from"@medplum/core";import{useMedplum as useMedplum30}from"@medplum/react-hooks";import{useCallback as useCallback17,useMemo as useMemo29,useState as useState66}from"react";import{Group as Group37,Stack as Stack20,TextInput as TextInput21}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG2,addProfileToResource,createReference as createReference6}from"@medplum/core";import{useCallback as useCallback16,useState as useState64}from"react";import{jsx as jsx119,jsxs as jsxs69}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG2+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState64(allergy?.code),[clinicalStatus,setClinicalStatus]=useState64(allergy?.clinicalStatus),handleSubmit=useCallback16(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference6(patient),encounter:encounter?createReference6(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 jsx119(Form,{onSubmit:handleSubmit,children:jsxs69(Stack20,{children:[jsx119(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}),jsx119(TextInput21,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx119(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG2+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx119(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx119(Group37,{justify:"flex-end",gap:4,mt:"md",children:jsx119(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon14,Box as Box11,Collapse,Group as Group38,Text as Text23}from"@mantine/core";import{useState as useState65}from"react";var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title",addButton:"CollapsibleSection_addButton"};import{jsx as jsx120,jsxs as jsxs70}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState65(!1);return jsxs70(Box11,{className:CollapsibleSection_default.root,children:[jsxs70(Group38,{justify:"space-between",className:CollapsibleSection_default.header,children:[jsxs70(Group38,{gap:8,children:[jsx120(ActionIcon14,{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:jsx120(IconChevronDown,{size:20})}),jsx120(Text23,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx120(ActionIcon14,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx120(IconPlus,{size:18})})]}),jsx120(Collapse,{in:!collapsed,children:jsx120(Box11,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}import{ActionIcon as ActionIcon15,Box as Box12}from"@mantine/core";var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};import{jsx as jsx121,jsxs as jsxs71}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs71(Box12,{className:SummaryItem_default.item,onClick,children:[children,jsx121("div",{className:SummaryItem_default.gradient}),jsx121("div",{className:SummaryItem_default.container,children:jsx121(ActionIcon15,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx121(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment37,jsx as jsx122,jsxs as jsxs72}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum30(),{patient,encounter}=props,[allergies,setAllergies]=useState66(props.allergies),[opened,{open,close}]=useDisclosure(!1),[editAllergy,setEditAllergy]=useState66(),sortedAllergies=useMemo29(()=>[...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:getDisplayString6(a).localeCompare(getDisplayString6(b))}),[allergies]),handleSubmit=useCallback17(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 jsxs72(Fragment37,{children:[jsx122(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx122(Box13,{children:jsx122(Flex9,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx122(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs72(Box13,{children:[jsx122(Text24,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString6(allergy)}),jsx122(Group39,{mt:2,gap:4,children:status&&jsx122(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx122(Text24,{children:"(none)"})}),jsx122(Modal7,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx122(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 Box14,Flex as Flex10,Group as Group40,Text as Text25}from"@mantine/core";import{formatDate}from"@medplum/core";import{useResource as useResource10}from"@medplum/react-hooks";var PatientSummary_default={panel:"PatientSummary_panel",patientSummaryBadge:"PatientSummary_patientSummaryBadge",patientSummaryAddButton:"PatientSummary_patientSummaryAddButton",patientSummaryHeader:"PatientSummary_patientSummaryHeader",patientSummaryCollapseIcon:"PatientSummary_patientSummaryCollapseIcon",collapsed:"PatientSummary_collapsed"};import{jsx as jsx123,jsxs as jsxs73}from"react/jsx-runtime";function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=useResource10(coverage),organizationResource=useResource10(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 jsx123(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs73(Box14,{children:[jsx123(Text25,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx123(Text25,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs73(Group40,{mt:2,gap:4,children:[jsx123(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs73(Text25,{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");return jsx123(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx123(Flex10,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx123(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx123(Text25,{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 Box15,Flex as Flex11,Group as Group41,Modal as Modal8,Text as Text26}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{formatDate as formatDate2,getDisplayString as getDisplayString7}from"@medplum/core";import{useState as useState67}from"react";import{Fragment as Fragment38,jsx as jsx124,jsxs as jsxs74}from"react/jsx-runtime";function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=useState67(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=useDisclosure2(!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 jsxs74(Fragment38,{children:[jsx124(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:jsxs74(Flex11,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>jsx124(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:jsxs74(Box15,{children:[jsx124(Text26,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(serviceRequest)}),jsxs74(Group41,{mt:2,gap:4,children:[serviceRequest.status&&jsx124(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),jsx124(Text26,{size:"xs",fw:500,c:"dimmed",children:formatDate2(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>jsx124(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:jsxs74(Box15,{children:[jsx124(Text26,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(report)}),jsxs74(Group41,{mt:2,gap:4,children:[report.status&&jsx124(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),jsx124(Text26,{size:"xs",fw:500,c:"dimmed",children:formatDate2(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&jsx124(Text26,{children:"(none)"})]})}),jsx124(Modal8,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&jsx124(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 Box16,Flex as Flex12,Group as Group43,Modal as Modal9,Text as Text27}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{getDisplayString as getDisplayString8}from"@medplum/core";import{useMedplum as useMedplum31}from"@medplum/react-hooks";import{useCallback as useCallback19,useState as useState69}from"react";import{Alert as Alert4,Group as Group42,Radio,Stack as Stack21}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG3,addProfileToResource as addProfileToResource2,createReference as createReference7}from"@medplum/core";import{useMedplumProfile as useMedplumProfile7}from"@medplum/react-hooks";import{useCallback as useCallback18,useState as useState68}from"react";import{jsx as jsx125,jsxs as jsxs75}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile7(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState68(medication?.medicationCodeableConcept),handleSubmit=useCallback18(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&&createReference7(encounter)),requester:medication?.requester??createReference7(me),medicationCodeableConcept:code,subject:createReference7(patient)},HTTP_HL7_ORG3+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx125(Form,{onSubmit:handleSubmit,children:jsxs75(Stack21,{children:[jsx125(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}),jsx125(Radio.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx125(Radio,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx125(Group42,{justify:"flex-end",gap:4,children:jsx125(SubmitButton,{children:"Save"})})]})}):jsx125(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment39,jsx as jsx126,jsxs as jsxs76}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum31(),[medicationRequests,setMedicationRequests]=useState69(props.medicationRequests),[editMedication,setEditMedication]=useState69(),[opened,{open,close}]=useDisclosure3(!1),handleSubmit=useCallback19(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 jsxs76(Fragment39,{children:[jsx126(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medicationRequests.length>0?jsx126(Flex12,{direction:"column",gap:8,children:medicationRequests.map(medication=>jsx126(SummaryItem,{onClick:()=>{setEditMedication(medication),open()},children:jsxs76(Box16,{children:[jsx126(Text27,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(medication)}),jsx126(Group43,{mt:2,gap:4,children:medication.status&&jsx126(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},medication.id))}):jsx126(Text27,{children:"(none)"})}),jsx126(Modal9,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx126(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 Box17,Group as Group44,Text as Text28,Tooltip as Tooltip5}from"@mantine/core";import{jsx as jsx127,jsxs as jsxs77}from"react/jsx-runtime";var PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return jsx127(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx127(Box17,{className:PatientSummary_default.patientSummaryListItem,children:jsx127(Tooltip5,{label,position:"top-start",openDelay:650,children:jsxs77(Group44,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,jsx127(Text28,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};import{capitalize as capitalize5,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG4}from"@medplum/core";function getGenderIdentity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/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?capitalize5(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 Box18,Flex as Flex13,Group as Group46,Modal as Modal10,Text as Text29}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{formatDate as formatDate3,getDisplayString as getDisplayString9}from"@medplum/core";import{useMedplum as useMedplum32}from"@medplum/react-hooks";import{useCallback as useCallback21,useState as useState71}from"react";import{Group as Group45,Stack as Stack22}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback20,useState as useState70}from"react";import{jsx as jsx128,jsxs as jsxs78}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState70(condition?.code),[clinicalStatus,setClinicalStatus]=useState70(condition?.clinicalStatus),handleSubmit=useCallback20(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:createReference8(patient),encounter:encounter&&createReference8(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG5+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx128(Form,{onSubmit:handleSubmit,children:jsxs78(Stack22,{children:[jsx128(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG5+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx128(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG5+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx128(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx128(Group45,{justify:"flex-end",gap:4,mt:"md",children:jsx128(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment40,jsx as jsx129,jsxs as jsxs79}from"react/jsx-runtime";function ProblemList(props){let medplum=useMedplum32(),{patient,encounter}=props,[problems,setProblems]=useState71(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=useState71(),[opened,{open,close}]=useDisclosure4(!1),handleSubmit=useCallback21(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:[jsx129(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx129(Flex13,{direction:"column",gap:8,children:problems.map(problem=>jsx129(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs79(Box18,{children:[jsx129(Text29,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString9(problem)}),jsxs79(Group46,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx129(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx129(Text29,{size:"xs",fw:500,c:"dimmed",children:formatDate3(problem.onsetDateTime)})]})]})},problem.id))}):jsx129(Text29,{children:"(none)"})}),jsx129(Modal10,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx129(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 Flex14,Group as Group47,Modal as Modal11,Radio as Radio2,Stack as Stack23,Text as Text30,UnstyledButton as UnstyledButton4}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{createReference as createReference9,HTTP_HL7_ORG as HTTP_HL7_ORG6,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState72}from"react";import{Fragment as Fragment41,jsx as jsx130,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=useMedplum33(),[sexualOrientation,setSexualOrientation]=useState72(props.sexualOrientation),[opened,{open,close}]=useDisclosure5(!1),[hoverIndex,setHoverIndex]=useState72(null),handleSubmit=useCallback22(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG6+"/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:createReference9(patient),encounter:encounter?createReference9(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:[jsx130(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx130(Flex14,{direction:"column",gap:8,children:jsx130(Box19,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx130(UnstyledButton4,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx130(Box19,{pr:hoverIndex===0?24:0,children:jsx130(Text30,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx130(Text30,{children:"(none)"})}),jsx130(Modal11,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx130(Form,{onSubmit:handleSubmit,children:jsxs80(Stack23,{children:[jsx130(Radio2.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx130(Radio2,{value:code,label:text,my:"xs"},code))}),jsx130(Group47,{justify:"flex-end",gap:4,mt:"md",children:jsx130(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group48,Modal as Modal12,Radio as Radio3,Stack as Stack24,Text as Text31,UnstyledButton as UnstyledButton5}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG7,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference10,formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{useMedplum as useMedplum34}from"@medplum/react-hooks";import{useCallback as useCallback23,useState as useState73}from"react";import{Fragment as Fragment42,jsx as jsx131,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=useMedplum34(),[smokingStatus,setSmokingStatus]=useState73(props.smokingStatus),[opened,{open,close}]=useDisclosure6(!1),handleSubmit=useCallback23(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG7+"/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:createReference10(props.patient),encounter:props.encounter?createReference10(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:[jsx131(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx131(UnstyledButton5,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx131(Text31,{children:formatCodeableConcept5(smokingStatus.valueCodeableConcept)})}):jsx131(Text31,{children:"(none)"})}),jsx131(Modal12,{opened,onClose:close,title:"Set Smoking Status",children:jsx131(Form,{onSubmit:handleSubmit,children:jsxs81(Stack24,{children:[jsx131(Radio3.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx131(Radio3,{value:code,label:text,my:"xs"},code))}),jsx131(Group48,{justify:"flex-end",gap:4,mt:"md",children:jsx131(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group49,Modal as Modal13,SimpleGrid as SimpleGrid2,Stack as Stack25,Text as Text32,Textarea as Textarea3,TextInput as TextInput22}from"@mantine/core";import{useDisclosure as useDisclosure7}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{useCallback as useCallback24,useState as useState74}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference11}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:createReference11(patient),encounter:encounter?createReference11(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 jsx132,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=useMedplum35(),{patient,encounter}=props,[vitals,setVitals]=useState74(props.vitals),[opened,{open,close}]=useDisclosure7(!1),handleSubmit=useCallback24(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:[jsx132(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx132(Stack25,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs82(Group49,{align:"center",children:[jsx132(Text32,{c:"dimmed",children:meta.short}),obs&&jsx132(Text32,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx132(Modal13,{opened,onClose:close,title:"Add Vitals",children:jsxs82(Form,{onSubmit:handleSubmit,children:[jsx132(SimpleGrid2,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx132(TextInput22,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx132(Textarea3,{name:"notes",label:"Notes"}),jsx132(Group49,{justify:"flex-end",gap:4,mt:"md",children:jsx132(SubmitButton,{children:"Save"})})]})})]})}import{Fragment as Fragment44,jsx as jsx133,jsxs as jsxs83}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum36(),{patient:propsPatient,onClickResource,onRequestLabs}=props,patient=useResource11(propsPatient),[medicalData,setMedicalData]=useState75(),[createdDate,setCreatedDate]=useState75();useEffect24(()=>{let ref=`Patient/${resolveId2(propsPatient)}`,searchMeta={_count:100,_sort:"-_lastUpdated"};Promise.all([medplum.searchResources("AllergyIntolerance",{patient:ref,...searchMeta}),medplum.searchResources("Condition",{patient:ref,...searchMeta}),medplum.searchResources("MedicationRequest",{subject:ref,...searchMeta}),medplum.searchResources("Observation",{subject:ref,...searchMeta}),medplum.searchResources("Appointment",{patient:ref,...searchMeta}),medplum.searchResources("Encounter",{subject:ref,...searchMeta}),medplum.searchResources("Coverage",{beneficiary:ref,...searchMeta}),medplum.searchResources("Immunization",{patient:ref,...searchMeta}),medplum.searchResources("Procedure",{subject:ref,...searchMeta}),medplum.searchResources("Device",{patient:ref,...searchMeta}),medplum.searchResources("Goal",{subject:ref,...searchMeta}),medplum.searchResources("ServiceRequest",{subject:ref,...searchMeta}),medplum.searchResources("DiagnosticReport",{subject:ref,...searchMeta})]).then(results=>{let observations=results[3];setMedicalData({allergies:results[0],problems:results[1],medicationRequests:results[2],sexualOrientation:observations.find(obs=>obs.code?.coding?.[0].code==="76690-7"),smokingStatus:observations.find(obs=>obs.code?.coding?.[0].code==="72166-2"),vitals:observations.filter(obs=>obs.category?.[0]?.coding?.[0].code==="vital-signs"),appointments:results[4],encounters:results[5],coverages:results[6],immunizations:results[7],procedures:results[8],devices:results[9],goals:results[10],serviceRequests:results[11],diagnosticReports:results[12]})}).catch(console.error)},[medplum,propsPatient]),useEffect24(()=>{patient?.id&&medplum.readHistory("Patient",patient.id).then(history=>{let lastUpdated=history.entry?.[history.entry.length-1]?.resource?.meta?.lastUpdated;setCreatedDate(typeof lastUpdated=="string"?lastUpdated:"")}).catch(()=>{})},[patient?.id,medplum]);let languageDisplay=patient?getPreferredLanguage(patient):void 0;return patient?jsxs83(Flex15,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs83(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs83(Group50,{align:"center",gap:"sm",p:16,children:[jsx133(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs83(Stack26,{gap:0,style:{flex:1,minWidth:0},children:[jsx133(Tooltip6,{label:formatHumanName6(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx133(Text33,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:formatHumanName6(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return jsxs83(Text33,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx133(Divider4,{})]}),jsx133(Stack26,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:medicalData&&jsxs83(Fragment44,{children:[jsxs83(Stack26,{gap:"xs",py:8,children:[jsx133(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${calculateAgeString2(patient.birthDate)})`:void 0,icon:jsx133(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),jsx133(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:jsx133(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),jsx133(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:jsx133(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),jsx133(PatientInfoItem,{patient,value:patient.address?.[0]?formatAddress2(patient.address[0]):void 0,icon:jsx133(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),jsx133(PatientInfoItem,{patient,value:languageDisplay,icon:jsx133(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),jsx133(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:jsx133(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add General Practitioner",label:"General Practitioner",onClickResource})]}),jsx133(Divider4,{}),jsx133(Insurance,{coverages:medicalData.coverages||[],onClickResource}),jsx133(Divider4,{}),jsx133(Allergies,{patient,allergies:medicalData.allergies,onClickResource}),jsx133(Divider4,{}),jsx133(ProblemList,{patient,problems:medicalData.problems,onClickResource}),jsx133(Divider4,{}),jsx133(Medications,{patient,medicationRequests:medicalData.medicationRequests,onClickResource}),jsx133(Divider4,{}),jsx133(Labs,{patient,serviceRequests:medicalData.serviceRequests,diagnosticReports:medicalData.diagnosticReports,onClickResource,onRequestLabs}),jsx133(Divider4,{}),jsx133(SexualOrientation,{patient,sexualOrientation:medicalData.sexualOrientation,onClickResource}),jsx133(Divider4,{}),jsx133(SmokingStatus,{patient,smokingStatus:medicalData.smokingStatus,onClickResource}),jsx133(Divider4,{}),jsx133(Vitals,{patient,vitals:medicalData.vitals,onClickResource}),jsx133(Divider4,{})]})})]}):null}import{createReference as createReference12}from"@medplum/core";import{useCallback as useCallback25}from"react";import{jsx as jsx134}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback25((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),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 jsx134(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference12(resource),sender:createReference12(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference12(resource),operator:createReference12(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor8,Box as Box20,Button as Button14,CloseButton,Flex as Flex16,Group as Group51,Loader as Loader6,NativeSelect as NativeSelect11,Paper as Paper4,Stack as Stack27,Text as Text34,TextInput as TextInput23}from"@mantine/core";import{getReferenceString as getReferenceString7}from"@medplum/core";import{useMedplum as useMedplum37,useResource as useResource12}from"@medplum/react-hooks";import{useEffect as useEffect25,useRef as useRef19,useState as useState76}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx135,jsxs as jsxs84}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum37(),defaultValue2=useResource12(props.value),[schemaLoaded,setSchemaLoaded]=useState76(!1),[selectedKey,setSelectedKey]=useState76(),[hoverKey,setHoverKey]=useState76(),[value,setValue]=useState76();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}let valueRef=useRef19(value);if(valueRef.current=value,useEffect25(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect25(()=>(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({...valueRef.current,[property]:newValue})}return jsx135("div",{children:jsxs84(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx135(TextInput23,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx135(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx135(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){let actionsRef=useRef19(props.actions);actionsRef.current=props.actions;function changeAction(changedAction){props.onChange(actionsRef.current.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...actionsRef.current,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(actionsRef.current.filter(i=>i!==removedAction))}return jsxs84(Stack27,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx135(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx135("div",{children:jsx135(Button14,{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 jsx135("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx135(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState76(),medplum=useMedplum37(),[loading,setLoading]=useState76(!1),[resource,setResource]=useState76(),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 useEffect25(()=>{(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?jsx135(Loader6,{}):jsxs84(Paper4,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs84(Flex16,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx135(TextInput23,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx135(CloseButton,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs84(Stack27,{gap:"xl",p:"md",children:[jsx135(Box20,{children:jsx135(TextInput23,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx135(Box20,{children:jsx135(NativeSelect11,{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"&&jsxs84(Stack27,{gap:0,children:[jsxs84(Group51,{gap:0,mb:"xs",children:[jsx135(Text34,{fw:600,children:"Select questionnaire"}),jsx135(Text34,{c:"red",children:"*"})]}),jsxs84(Text34,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx135(Anchor8,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx135(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&jsxs84(Stack27,{gap:0,children:[jsxs84(Group51,{gap:0,mb:"xs",children:[jsx135(Text34,{fw:600,children:"Select activity definition"}),jsx135(Text34,{c:"red",children:"*"})]}),jsxs84(Text34,{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"," ",jsx135(Anchor8,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx135(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return jsx135(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:getReferenceString7(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 Anchor9,Box as Box21,Group as Group53,NativeSelect as NativeSelect13,Space,Textarea as Textarea5,TextInput as TextInput25,Title as Title8}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 QuestionnaireItemType2,setQuestionnaireItemReferenceTargetTypes,useMedplum as useMedplum39,useResource as useResource13}from"@medplum/react-hooks";import{useEffect as useEffect27,useRef as useRef20,useState as useState78}from"react";import{Checkbox as Checkbox6,Group as Group52,MultiSelect as MultiSelect2,NativeSelect as NativeSelect12,Radio as Radio4,Text as Text35,Textarea as Textarea4,TextInput as TextInput24}from"@mantine/core";import{capitalize as capitalize6,deepEquals as deepEquals2,formatCoding as formatCoding2,getElementDefinition as getElementDefinition2,getExtension as getExtension2,HTTP_HL7_ORG as HTTP_HL7_ORG8,stringify as stringify3,typedValueToString}from"@medplum/core";import{getItemAnswerOptionValue,getItemInitialValue,getNewMultiSelectValues,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,QUESTIONNAIRE_ITEM_CONTROL_URL,QuestionnaireItemType,useMedplum as useMedplum38}from"@medplum/react-hooks";import{useEffect as useEffect26,useState as useState77}from"react";import{Fragment as Fragment45,jsx as jsx136,jsxs as jsxs85}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=getExtension2(response,`${HTTP_HL7_ORG8}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx136("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx136(CheckboxFormSection,{title:props.item.text,htmlFor:inputId,children:jsx136(Checkbox6,{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=jsx136(TextInput24,{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=jsx136(TextInput24,{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=jsx136(TextInput24,{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=jsx136(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case QuestionnaireItemType.time:formComponent=jsx136(TextInput24,{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=jsx136(TextInput24,{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=jsx136(Textarea4,{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=jsx136(Group52,{py:4,children:jsx136(AttachmentInput,{path:"",name:inputId,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case QuestionnaireItemType.reference:formComponent=jsx136(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=jsx136(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:isCheckboxChoice(item)?formComponent=jsx136(QuestionnaireCheckboxInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):isDropdownChoice(item)||item.answerValueSet&&!isRadiobuttonChoice(item)?formComponent=jsx136(QuestionnaireDropdownInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):formComponent=jsx136(QuestionnaireRadioButtonInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)});break;default:return null}return jsxs85(Fragment45,{children:[formComponent,validationError?.valueString&&jsx136(Text35,{c:"red",size:"lg",mt:4,children:validationError.valueString})]})}function QuestionnaireDropdownInput(props){let{name,item,required,initial,onChangeAnswer,response}=props;if(!item.answerOption?.length&&!item.answerValueSet)return jsx136(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||isMultiSelectChoice(item);if(item.answerValueSet)return jsx136(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 jsx136(MultiSelect2,{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 jsx136(NativeSelect12,{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"+capitalize6(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=useMedplum38(),[valueSetOptions,setValueSetOptions]=useState77([]),[isLoading,setIsLoading]=useState77(!1);return useEffect26(()=>{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=getElementDefinition2("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&&stringify3(optionValue)===stringify3(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return jsx136(Text35,{children:"Loading options..."});if(options.length===0)return jsx136(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs85(Fragment45,{children:[jsx136(Radio4.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+capitalize6(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>jsx136(Radio4,{id:optionName,value:optionName,py:4,required,label:jsx136(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)&&jsxs85(Text35,{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=getElementDefinition2("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]=useState77(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 jsx136(Text35,{children:"Loading options..."});if(options.length===0)return jsx136(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=>!deepEquals2(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"+capitalize6(optionValue.type),item);onChangeAnswer(values)}}};return jsxs85(Group52,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=typedValueToString(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>deepEquals2(coding,optionValue.value)):selectedValues.includes(optionValueStr);return jsx136(Checkbox6,{id:optionName,label:jsx136(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)&&jsxs85(Text35,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx136(TextInput24,{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=>deepEquals2(option[1].value,defaultAnswer?.value))?.[0]}function hasChoiceType(item,type){return!!item.extension?.some(e=>e.url===QUESTIONNAIRE_ITEM_CONTROL_URL&&e.valueCodeableConcept?.coding?.[0]?.code===type)}function isDropdownChoice(item){return hasChoiceType(item,"drop-down")}function isCheckboxChoice(item){return hasChoiceType(item,"check-box")}function isRadiobuttonChoice(item){return hasChoiceType(item,"radio-button")}function isMultiSelectChoice(item){return hasChoiceType(item,"multi-select")}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize6(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}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 Fragment46,jsx as jsx137,jsxs as jsxs86}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum39(),defaultValue2=useResource13(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState78(!1),[value,setValue]=useState78(),[selectedKey,setSelectedKey]=useState78(),[hoverKey,setHoverKey]=useState78();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect27(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect27(()=>(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=(questionnaire,disableSubmit)=>{setValue(questionnaire),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire)};return!schemaLoaded||!value?null:jsx137("div",{children:jsxs86(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx137(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx137(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource2=isResourceType(props.item),isContainer=isResource2||item.type===QuestionnaireItemType2.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef20(props.item);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 jsxs86("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx137("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs86(Fragment46,{children:[isResource2&&jsx137(TextInput25,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource2&&jsx137(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx137(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx137(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs86(Fragment46,{children:[resource.title&&jsx137(Title8,{children:resource.title}),item.text&&jsx137("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx137(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx137("div",{children:jsx137(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&&jsx137("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs86(Fragment46,{children:[jsx137(TextInput25,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx137(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"}]})]}):jsx137("div",{children:linkId})}),!isResource2&&jsx137(Box21,{className:QuestionnaireBuilder_default.movementActions,children:jsxs86(Box21,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx137(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx137(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs86("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs86(Fragment46,{children:[jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource2&&jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource2&&jsxs86(Fragment46,{children:[jsx137(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx137(Anchor9,{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 jsxs86("div",{children:[props.item.answerValueSet!==void 0?jsx137(TextInput25,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx137(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs86(Box21,{display:"flex",children:[jsx137(Anchor9,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),jsx137(Space,{w:"lg"}),jsx137(Anchor9,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx137("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs86("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx137("div",{children:jsx137(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)}),jsx137("div",{children:jsx137(Anchor9,{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 jsxs86(Fragment46,{children:[targetTypes.map((targetType,index)=>jsxs86(Group53,{children:[jsx137(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx137(Anchor9,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx137(Anchor9,{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(questionnaire){return{...questionnaire,id:questionnaire.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire.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{Group as Group55,Stack as Stack30,Text as Text36,Title as Title10}from"@mantine/core";import{createReference as createReference14,getExtension as getExtension3,getReferenceString as getReferenceString8}from"@medplum/core";import{QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,useMedplum as useMedplum41,useQuestionnaireForm}from"@medplum/react-hooks";import{useCallback as useCallback26,useMemo as useMemo30,useRef as useRef22,useState as useState79}from"react";import{Button as Button15,Paper as Paper5}from"@mantine/core";import{createReference as createReference13,HTTP_HL7_ORG as HTTP_HL7_ORG9}from"@medplum/core";import{useMedplum as useMedplum40}from"@medplum/react-hooks";import{useEffect as useEffect28,useRef as useRef21}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 jsx138,jsxs as jsxs87}from"react/jsx-runtime";function SignatureInput(props){let medplum=useMedplum40(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=useRef21(null),signaturePadRef=useRef21(null),onChangeRef=useRef21(onChange);return onChangeRef.current=onChange,useEffect28(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:HTTP_HL7_ORG9+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??createReference13(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]),jsxs87(Paper5,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[jsx138("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),jsx138(Button15,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:jsx138(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}import{Stack as Stack29}from"@mantine/core";import{isQuestionEnabled,QuestionnaireItemType as QuestionnaireItemType4}from"@medplum/react-hooks";import{Title as Title9}from"@mantine/core";import{jsx as jsx139,jsxs as jsxs88}from"react/jsx-runtime";function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return jsxs88("div",{children:[props.item.text&&jsx139(Title9,{order:3,mb:"md",children:props.item.text}),jsx139(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}import{Anchor as Anchor10}from"@mantine/core";import{Fragment as Fragment47,jsx as jsx140,jsxs as jsxs89}from"react/jsx-runtime";function QuestionnaireFormRepeatableGroup(props){return jsxs89(Fragment47,{children:[props.responseItems.map(response=>jsx140(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),jsx140(Anchor10,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}import{Anchor as Anchor11,Stack as Stack28}from"@mantine/core";import{QuestionnaireItemType as QuestionnaireItemType3}from"@medplum/react-hooks";import{jsx as jsx141,jsxs as jsxs90}from"react/jsx-runtime";function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,showAddButton=item.type!==QuestionnaireItemType3.choice&&item.type!==QuestionnaireItemType3.openChoice,answers=responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return jsxs90(FormSection,{title:props.item.text,withAsterisk:props.item.required,children:[jsx141(Stack28,{gap:"xs",children:answers?.map((_,index)=>jsx141(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&jsx141(Anchor11,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}import{jsx as jsx142}from"react/jsx-runtime";function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props;return jsx142(Stack29,{children:items.map((item,index)=>{if(!isQuestionEnabled(item,formState.questionnaireResponse))return null;if(item.type===QuestionnaireItemType4.display)return jsx142("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===QuestionnaireItemType4.group&&item.repeats?jsx142(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems},`repeating-group-${item.id}-${index}`):item.type===QuestionnaireItemType4.group?jsx142(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]},`group-${item.id}-${index}`):item.type===QuestionnaireItemType4.boolean?jsx142(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?jsx142(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):jsx142(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:jsx142(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}import{Button as Button16,Group as Group54,Stepper}from"@mantine/core";import{Fragment as Fragment48,jsx as jsx143,jsxs as jsxs91}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 jsxs91(Fragment48,{children:[jsx143(Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>jsx143(Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&jsxs91(Group54,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx143(Button16,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&jsx143(Button16,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&jsx143(SubmitButton,{children:submitButtonText??"Submit"})]})]})}import{Fragment as Fragment49,jsx as jsx144,jsxs as jsxs92}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum41(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=useState79(!1),propsRef=useRef22(props);propsRef.current=props;let onFormChange=useCallback26(response=>{setSignatureRequiredSubmitted(!1),propsRef.current.onChange?.(response)},[]),formState=useQuestionnaireForm({questionnaire:props.questionnaire,defaultValue:props.questionnaireResponse,subject:props.subject,encounter:props.encounter,source:props.source,disablePagination:props.disablePagination,onChange:onFormChange}),formStateRef=useRef22(formState);formStateRef.current=formState;let isSignatureRequired=useMemo30(()=>formState.loading?!1:!!getExtension3(formState.questionnaire,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=useMemo30(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=useCallback26(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=createReference14(profile))}onSubmit({...response,questionnaire:questionnaire.url??getReferenceString8(questionnaire),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:jsxs92(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&jsx144(Title10,{children:formState.questionnaire.title}),formState.pagination?jsx144(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:jsx144(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):jsxs92(Fragment49,{children:[jsx144(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&jsxs92(Stack30,{mt:"md",gap:0,children:[jsx144(Text36,{size:"sm",fw:500,children:"Signature"}),jsx144(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&jsx144(Text36,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&jsx144(Group55,{justify:"flex-end",mt:"xl",gap:"xs",children:jsx144(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}import{Stack as Stack32}from"@mantine/core";import{useResource as useResource14}from"@medplum/react-hooks";import{Stack as Stack31,Text as Text37}from"@mantine/core";import{formatDate as formatDate4}from"@medplum/core";import{useMemo as useMemo31}from"react";import{Fragment as Fragment50,jsx as jsx145,jsxs as jsxs93}from"react/jsx-runtime";function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=useMemo31(()=>answer&&answer.length>0?jsx145(Fragment50,{children:answer.map((ans,index)=>jsx145(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?jsx145(Fragment50,{children:nestedAnswers.map((nestedAnswer,index)=>jsx145(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):jsx145(Text37,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return jsxs93(Stack31,{gap:0,pb:"xs",children:[jsx145(Text37,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return jsx145(Text37,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return jsx145(Text37,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return jsx145(Text37,{children:value});case"valueQuantity":return jsx145(QuantityDisplay,{value});case"valueString":return jsx145(Text37,{children:value});case"valueCoding":return jsx145(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return jsx145(RangeDisplay,{value});case"valueDateTime":return jsx145(Text37,{children:formatDate4(value)});case"valueBoolean":return jsx145(Text37,{children:value?"True":"False"});case"valueReference":return jsx145(Text37,{children:value.display??value.reference});default:return jsx145(Text37,{children:value.toString()})}}import{jsx as jsx146}from"react/jsx-runtime";function QuestionnaireResponseDisplay(props){let questionnaireResponse=useResource14(props.questionnaireResponse);return jsx146(Stack32,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>jsx146(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}import{ActionIcon as ActionIcon16,Divider as Divider5,Group as Group56,NativeSelect as NativeSelect14,Stack as Stack33,Text as Text38,TextInput as TextInput26}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect29,useState as useState80}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx147,jsxs as jsxs94}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]=useState80([]),[groupId,setGroupId]=useState80(1),[intervalId,setIntervalId]=useState80(1);return useEffect29(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs94(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx147(Stack33,{children:intervalGroups.map(intervalGroup=>jsx147(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx147(ActionIcon16,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx147(IconCirclePlus,{})}),jsx147(Group56,{justify:"flex-end",children:jsx147(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&&currentGroup?.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 jsx147(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs94(Stack33,{gap:"lg",children:[jsx147(Group56,{justify:"flex-end",children:jsx147(ActionIcon16,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx147(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx147(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx147(Divider5,{}),intervalGroup.intervals.map(interval=>jsxs94(Stack33,{gap:"xs",children:[jsxs94(Group56,{children:[jsx147(TextInput26,{"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}`),jsx147(ActionIcon16,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx147(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx147(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx147(ActionIcon16,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx147(IconCirclePlus,{})})]})})}function ReferenceRangeGroupFilters(props){let{intervalGroup,onChange}=props;intervalGroup.filters.age||(intervalGroup.filters.age={});for(let key of["low","high"])intervalGroup.filters.age[key]?.unit||(intervalGroup.filters.age[key]={...intervalGroup.filters.age[key],unit:"years",system:"http://unitsofmeasure.org"});return jsxs94(Stack33,{style:{maxWidth:"50%"},children:[jsx147(Group56,{children:jsx147(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})}}})}),jsxs94(Group56,{gap:"xs",children:[jsx147(Text38,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx147("div",{id:`div-age-${intervalGroup.id}`,children:jsx147(RangeInput,{path:"",name:`age-${intervalGroup.id}`,defaultValue:intervalGroup.filters.age,onChange:ageRange=>{for(let interval of intervalGroup.intervals)onChange(intervalGroup.id,{...interval,age:ageRange})}},`age-${intervalGroup.id}`)})]}),jsx147(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"}]}})}}}),jsx147(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 Button17,Grid as Grid2,Text as Text39}from"@mantine/core";import{formatDateTime as formatDateTime6,getReferenceString as getReferenceString9}from"@medplum/core";import{useMedplum as useMedplum42,useResource as useResource15}from"@medplum/react-hooks";import{Fragment as Fragment51,useEffect as useEffect30,useState as useState81}from"react";import{jsx as jsx148,jsxs as jsxs95}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum42(),requestGroup=useResource15(props.value),[startedLoading,setStartedLoading]=useState81(!1),[responseBundle,setResponseBundle]=useState81();if(useEffect30(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx148(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 jsxs95(Fragment51,{children:[jsx148(Grid2.Col,{span:1,p:"md",children:task?.status==="completed"?jsx148(IconCheckbox,{}):jsx148(IconSquare,{color:"gray"})}),jsxs95(Grid2.Col,{span:9,p:"xs",children:[jsx148(Text39,{fw:500,children:action.title}),action.description&&jsx148("div",{children:action.description}),jsxs95("div",{children:["Last edited by\xA0",jsx148(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime6(task?.meta?.lastUpdated)]}),jsxs95("div",{children:["Status: ",jsx148(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs95(Grid2.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx148(Button17,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx148(Button17,{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===getReferenceString9(entry.resource))return entry.resource}}import{useMedplum as useMedplum43}from"@medplum/react-hooks";import{useEffect as useEffect31,useState as useState82}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",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 Fragment52,jsx as jsx149,jsxs as jsxs96}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum43(),[value,setValue]=useState82(props.history);if(useEffect31(()=>{!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 jsx149("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx149("div",{className:ResourceBlame_default.container,children:jsx149("table",{className:ResourceBlame_default.root,children:jsx149("tbody",{children:table.map((row,index)=>jsxs96("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs96(Fragment52,{children:[jsx149("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:jsx149(ResourceName,{value:row.meta.author,link:!0,fz:"xs"})}),jsx149("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx149(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),fz:"xs",children:getTimeString(row.meta.lastUpdated)})})]}),jsx149("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx149("td",{className:ResourceBlame_default.line,children:jsx149("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 Fragment53,jsx as jsx150,jsxs as jsxs97}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 jsx150("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx150(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs97(Fragment53,{children:["...",jsx150("br",{}),props.delta.original.lines.length>0&&jsx150("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
110
110
  `)}),props.delta.revised.lines.length>0&&jsx150("div",{className:ResourceDiff_default.added,children:props.delta.revised.lines.join(`
111
111
  `)}),"...",jsx150("br",{})]})}import{ActionIcon as ActionIcon17,Alert as Alert5,Button as Button18,Group as Group57,Menu as Menu7,Stack as Stack34,TextInput as TextInput27,useMantineTheme}from"@mantine/core";import{AccessPolicyInteraction as AccessPolicyInteraction2,applyDefaultValuesToResource,canWriteResourceType,isPopulated as isPopulated12,satisfiedAccessPolicy as satisfiedAccessPolicy2,tryGetProfile as tryGetProfile5}from"@medplum/core";import{useMedplum as useMedplum44,useResource as useResource16}from"@medplum/react-hooks";import{useEffect as useEffect32,useMemo as useMemo32,useState as useState83}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx151,jsxs as jsxs98}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum44(),defaultValue2=useResource16(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState83(!1),[value,setValue]=useState83(),accessPolicy=medplum.getAccessPolicy(),theme=useMantineTheme();useEffect32(()=>{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=useMemo32(()=>defaultValue2&&satisfiedAccessPolicy2(defaultValue2,AccessPolicyInteraction2.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=useMemo32(()=>medplum.isSuperAdmin()||!accessPolicy||!isPopulated12(value?.resourceType)?!0:canWriteResourceType(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?jsx151("div",{children:"Loading..."}):canWrite?jsxs98("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs98(Stack34,{mb:"xl",children:[jsx151(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx151(TextInput27,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx151(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx151(TextInput27,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx151(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:resourceType,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl,accessPolicyResource}),jsxs98(Group57,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx151(Button18,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs98(Menu7,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx151(Menu7.Target,{children:jsx151(ActionIcon17,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx151(IconChevronDown,{size:14,stroke:1.5})})}),jsxs98(Menu7.Dropdown,{children:[props.onPatch&&jsx151(Menu7.Item,{leftSection:jsx151(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx151(Menu7.Item,{color:"red",leftSection:jsx151(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs98(Alert5,{color:"red",title:"Permission denied",icon:jsx151(IconAlertCircle,{}),children:["Your access level prevents you from editing and creating ",value.resourceType," resources."]})}import{Table as Table5}from"@mantine/core";import{formatDateTime as formatDateTime7,normalizeErrorString as normalizeErrorString10}from"@medplum/core";import{useMedplum as useMedplum45}from"@medplum/react-hooks";import{useEffect as useEffect33,useState as useState84}from"react";import{jsx as jsx152,jsxs as jsxs99}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum45(),[value,setValue]=useState84(props.history);return useEffect33(()=>{!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?jsxs99(Table5,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx152(Table5.Thead,{children:jsxs99(Table5.Tr,{children:[jsx152(Table5.Th,{children:"Author"}),jsx152(Table5.Th,{children:"Date"}),jsx152(Table5.Th,{children:"Version"})]})}),jsx152(Table5.Tbody,{children:value.entry?.map((entry,index)=>jsx152(HistoryRow,{entry},"entry-"+index))})]}):jsx152("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs99(Table5.Tr,{children:[jsx152(Table5.Td,{children:jsx152(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx152(Table5.Td,{children:formatDateTime7(resource.meta?.lastUpdated)}),jsx152(Table5.Td,{children:jsx152(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx152(Table5.Tr,{children:jsx152(Table5.Td,{colSpan:3,children:normalizeErrorString10(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button19,Stack as Stack35,Text as Text40}from"@mantine/core";import{getReferenceString as getReferenceString10,isReference as isReference3}from"@medplum/core";import{useMedplum as useMedplum46,useResource as useResource17}from"@medplum/react-hooks";import{useEffect as useEffect34,useMemo as useMemo33,useState as useState85}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx153,jsxs as jsxs100}from"react/jsx-runtime";function Scheduler(props){let medplum=useMedplum46(),questionnaire=useResource17(props.questionnaire),[month,setMonth]=useState85(getStartMonth()),[date,setDate]=useState85(),[response,setResponse]=useState85(),[actor,setActor]=useState85(),[slots,setSlots]=useState85(),[selectedSlot,setSelectedSlot]=useState85();useEffect34(()=>{props.schedule||setSlots([]);let fetchSlots;typeof props.schedule=="function"?fetchSlots=props.schedule:(fetchSlots=async period=>{let scheduleArray=[];if(!Array.isArray(props.schedule))scheduleArray.push(isReference3(props.schedule,"Schedule")?props.schedule.reference:getReferenceString10(props.schedule));else for(let schedule of props.schedule)if(isReference3(schedule))scheduleArray.push(schedule.reference);else{let scheduleRef=getReferenceString10(schedule);scheduleArray.push(scheduleRef)}let slotSearchParams=new URLSearchParams([["_count","720"],["schedule",scheduleArray.join(",")],["start","gt"+period.start],["start","lt"+period.end]]);return medplum.searchResources("Slot",slotSearchParams)},props.schedule&&!Array.isArray(props.schedule)&&(isReference3(props.schedule)?medplum.readReference(props.schedule).then(schedule=>{let actorRef=schedule.actor?.[0];setActor(actorRef)}).catch(console.error):setActor(props.schedule.actor?.[0]))),fetchSlots({start:getStart2(month),end:getEnd2(month)}).then(setSlots).catch(console.error)},[medplum,props.schedule,month]);let startTimeToSlotMap=useMemo33(()=>{if(!date)return null;let sortedSlots=(slots||[]).filter(slot=>new Date(slot.start).getTime()>date.getTime()&&new Date(slot.start).getTime()<date.getTime()+24*3600*1e3).sort((a,b)=>new Date(a.start).getTime()-new Date(b.start).getTime()),startTimeToSlotMap2=new Map;for(let slot of sortedSlots)startTimeToSlotMap2.set(formatTime(new Date(slot.start)),slot);return startTimeToSlotMap2},[slots,date]);return!slots||!questionnaire?null:jsxs100("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs100("div",{className:Scheduler_default.info,children:[actor&&jsx153(ResourceAvatar,{value:actor,size:"xl"}),actor&&jsx153(Text40,{size:"xl",fw:500,children:jsx153(ResourceName,{value:actor})}),jsx153("p",{children:"1 hour"}),date&&jsx153("p",{children:date.toLocaleDateString()}),selectedSlot&&jsx153("p",{children:formatTime(new Date(selectedSlot.start))})]}),jsxs100("div",{className:Scheduler_default.selection,children:[!date&&jsxs100("div",{children:[jsx153("h3",{children:"Select date"}),jsx153(CalendarInput,{slots,onChangeMonth:setMonth,onClick:setDate})]}),date&&!selectedSlot&&jsxs100("div",{children:[jsx153("h3",{children:"Select time"}),jsx153(Stack35,{children:Array.from(startTimeToSlotMap?.entries()??[]).map(([startTime,slot])=>jsx153("div",{children:jsx153(Button19,{variant:"outline",style:{width:150},onClick:()=>setSelectedSlot(slot),children:startTime})},slot.id))})]}),date&&selectedSlot&&!response&&jsx153(QuestionnaireForm,{questionnaire,submitButtonText:"Next",onSubmit:setResponse}),date&&selectedSlot&&response&&jsxs100("div",{children:[jsx153("h3",{children:"You're all set!"}),jsx153("p",{children:"Check your email for a calendar invite."})]})]})]})}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{createReference as createReference15}from"@medplum/core";import{jsx as jsx154}from"react/jsx-runtime";function ServiceRequestTimeline(props){let{serviceRequest,...rest}=props;return jsx154(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:[createReference15(resource)],subject:resource.subject,sender:createReference15(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference15(resource)],subject:resource.subject,operator:createReference15(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor12}from"@mantine/core";import{showNotification as showNotification7}from"@mantine/notifications";import{ensureTrailingSlash,locationUtils as locationUtils6,normalizeErrorString as normalizeErrorString11}from"@medplum/core";import{useMedplum as useMedplum47}from"@medplum/react-hooks";import{jsx as jsx155}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum47(),{client,patient,encounter,children,...rest}=props;function launchApp(){medplum.createResource({resourceType:"SmartAppLaunch",patient,encounter}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",ensureTrailingSlash(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),locationUtils6.assign(url.toString())}).catch(err=>showNotification7({color:"red",message:normalizeErrorString11(err),autoClose:!1}))}return jsx155(Anchor12,{onClick:()=>launchApp(),...rest,children})}export{AddressDisplay,AddressInput,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,CalendarInput,ChatModal,CheckboxFormSection,CodeInput,CodeableConceptDisplay,CodeableConceptInput,CodingDisplay,CodingInput,ContactDetailDisplay,ContactDetailInput,ContactPointDisplay,ContactPointInput,Container,DateTimeInput,DefaultResourceTimeline,DescriptionList,DescriptionListEntry,DiagnosticReportDisplay,Document,ElementDefinitionInputSelector,ElementDefinitionTypeInput,EncounterTimeline,ErrorBoundary,FhirPathTable,Form,FormSection,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,InfoBar,LinkTabs,Loading,Logo,MeasureReportDisplay,MedplumLink,MemoizedFhirPathTable,MfaForm,MoneyDisplay,MoneyInput,Navbar,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,Panel,PatientExportForm,PatientHeader,PatientSummary,PatientTimeline,PlanDefinitionBuilder,QuantityDisplay,QuantityInput,QuestionnaireBuilder,QuestionnaireForm,QuestionnaireResponseDisplay,RangeDisplay,RangeInput,RatioInput,ReferenceDisplay,ReferenceInput,ReferenceRangeEditor,ReferenceRangeGroupEditor,RegisterForm,RequestGroupDisplay,ResourceArrayDisplay,ResourceArrayInput,ResourceAvatar,ResourceBadge,ResourceBlame,ResourceDiff,ResourceDiffTable,ResourceForm,ResourceHistoryTable,ResourceInput,ResourceName,ResourcePropertyDisplay,ResourcePropertyInput,ResourceTable,ResourceTimeline,Scheduler,SearchChangeEvent,SearchClickEvent,SearchControl,SearchFieldEditor,SearchFilterEditor,SearchLoadEvent,ServiceRequestTimeline,SignInForm,SignatureInput,SmartAppLaunchLink,Spotlight,StatusBadge,SubmitButton,ThreadChat,Timeline,TimelineItem,TimingInput,ValueSetAutocomplete,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNext24HoursFilter,addNextMonthFilter,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,clearFilters,clearFiltersOnField,convertIsoToLocal,convertLocalToIso,createScriptTag,deleteFilter,exportJsonFile,getAppName,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getOpString,getPaginationControlProps,getRecaptcha,getSearchOperators,getSortField,getValuePath,initRecaptcha,isAuxClick,isCheckboxCell,isSortDescending,isSupportedProfileStructureDefinition,killEvent,parseForm,renderValue,sendCommand,setFilters,setOffset,setPage,setPropertyValue,setSort,sortByDateAndPriority,toggleSort};
112
112
  /*! Bundled license information: