@medplum/react 5.1.10 → 5.1.11

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 @@
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&&(0,import_core99.isEmpty)(targetType.resourceType)}var import_core104=require("@mantine/core"),import_core105=require("@medplum/core"),import_react_hooks29=require("@medplum/react-hooks"),import_react57=require("react");function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}var import_core102=require("@mantine/core"),import_core103=require("@medplum/core"),import_react56=require("react");var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};var import_core100=require("@mantine/core");var import_jsx_runtime82=require("react/jsx-runtime");function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?(0,import_jsx_runtime82.jsx)(import_core100.Button,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:(0,import_jsx_runtime82.jsx)(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):(0,import_jsx_runtime82.jsx)(import_core100.ActionIcon,{title:text,color:"green.6","data-testid":testId,onClick,children:(0,import_jsx_runtime82.jsx)(IconCirclePlus,{size:"1.25rem"})})}var import_core101=require("@mantine/core");var import_jsx_runtime83=require("react/jsx-runtime");function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return(0,import_jsx_runtime83.jsx)(import_core101.ActionIcon,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:(0,import_jsx_runtime83.jsx)(IconCircleMinus,{size:"1.25rem"})})}var import_jsx_runtime84=require("react/jsx-runtime");function SliceInput(props){let{slice,property}=props,[values,setValues]=(0,import_react56.useState)(props.defaultValue),sliceElements=slice.typeSchema?.elements??slice.elements,parentElementsContextValue=(0,import_react56.useContext)(ElementsContext),contextValue=(0,import_react56.useMemo)(()=>{if((0,import_core103.isPopulated)(sliceElements))return(0,import_core103.buildElementsContext)({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=(0,import_core103.isEmpty)(slice.elements),propertyDisplayName=(0,import_core103.getPropertyDisplayName)(slice.name),showEmptyMessage=props.property.readonly&&values.length===0;return maybeWrapWithContext(ElementsContext.Provider,contextValue,(0,import_jsx_runtime84.jsx)(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?(0,import_jsx_runtime84.jsx)(import_core102.Text,{c:"dimmed",children:"(empty)"}):(0,import_jsx_runtime84.jsxs)(import_core102.Stack,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>(0,import_jsx_runtime84.jsxs)(import_core102.Group,{wrap:"nowrap",children:[(0,import_jsx_runtime84.jsx)("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:(0,import_jsx_runtime84.jsx)(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&&(0,import_jsx_runtime84.jsx)(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&&(0,import_jsx_runtime84.jsx)(import_core102.Group,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:(0,import_jsx_runtime84.jsx)(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}var import_jsx_runtime85=require("react/jsx-runtime");function ResourceArrayInput(props){let{property}=props,medplum=(0,import_react_hooks29.useMedplum)(),[loading,setLoading]=(0,import_react57.useState)(!0),[slices,setSlices]=(0,import_react57.useState)([]),[defaultValue2]=(0,import_react57.useState)(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=(0,import_react57.useState)(()=>[defaultValue2]),ctx=(0,import_react57.useContext)(ElementsContext),propertyTypeCode=property.type[0]?.code;(0,import_react57.useEffect)(()=>{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(0,import_jsx_runtime85.jsx)("div",{children:"Loading..."});let nonSliceIndex=slices.length,nonSliceValues=slicedValues[nonSliceIndex],showNonSliceValues=!(props.hideNonSliceValues??(propertyTypeCode==="Extension"&&slices.length>0)),propertyDisplayName=(0,import_core105.getPathDisplayName)(property.path),showEmptyMessage=props.property.readonly&&slices.length===0&&defaultValue2.length===0;return(0,import_jsx_runtime85.jsxs)(import_core104.Stack,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&(0,import_jsx_runtime85.jsx)(import_core104.Text,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>(0,import_jsx_runtime85.jsx)(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)=>(0,import_jsx_runtime85.jsxs)(import_core104.Group,{wrap:"nowrap",style:{flexGrow:1},children:[(0,import_jsx_runtime85.jsx)("div",{style:{flexGrow:1},children:(0,import_jsx_runtime85.jsx)(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&&(0,import_jsx_runtime85.jsx)(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&&(0,import_jsx_runtime85.jsx)(import_core104.Group,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:(0,import_jsx_runtime85.jsx)(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)}}var import_core106=require("@mantine/core"),import_hooks2=require("@mantine/hooks"),import_notifications4=require("@mantine/notifications");var import_react58=require("react"),import_jsx_runtime86=require("react/jsx-runtime");function SensitiveTextarea(props){let[revealed,setRevealed]=(0,import_react58.useState)(!1),clipboard=(0,import_hooks2.useClipboard)(),ref=(0,import_react58.useRef)(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),(0,import_jsx_runtime86.jsxs)(import_core106.Flex,{gap:"xs",children:[(0,import_jsx_runtime86.jsx)(import_core106.Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),(0,import_jsx_runtime86.jsx)(import_core106.ActionIcon,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),(0,import_notifications4.showNotification)({color:"green",message:"Copied"})},children:(0,import_jsx_runtime86.jsx)(IconCopy,{})})]})}var import_core107=require("@mantine/core"),import_core108=require("@medplum/core"),import_react59=require("react");var import_jsx_runtime87=require("react/jsx-runtime"),daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=(0,import_react59.useState)(props.defaultValue),[open,setOpen]=(0,import_react59.useState)(!props.disabled&&(props.defaultModalOpen??!1));return(0,import_jsx_runtime87.jsxs)(import_jsx_runtime87.Fragment,{children:[(0,import_jsx_runtime87.jsxs)(import_core107.Group,{gap:"xs",grow:!0,wrap:"nowrap",children:[(0,import_jsx_runtime87.jsx)("span",{"data-testid":"timinginput-display",children:(0,import_core108.formatTiming)(value)||"No repeat"}),(0,import_jsx_runtime87.jsx)(import_core107.Button,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&(0,import_jsx_runtime87.jsx)(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]=(0,import_react59.useState)(props.defaultValue||defaultValue),[timeOfDayItems,setTimeOfDayItems]=(0,import_react59.useState)(()=>(props.defaultValue?.repeat?.timeOfDay??[]).map((v,i)=>({id:i,value:v}))),nextTimeOfDayId=(0,import_react59.useRef)(timeOfDayItems.length),{getExtendedProps}=(0,import_react59.useContext)(ElementsContext),[eventProps,repeatProps,repeatPeriodProps,repeatPeriodUnitProps,repeatDayOfWeekProps,repeatTimeOfDayProps]=(0,import_react59.useMemo)(()=>["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(0,import_jsx_runtime87.jsx)(import_core107.Modal,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:(0,import_jsx_runtime87.jsxs)(import_core107.Stack,{gap:"md",children:[(0,import_jsx_runtime87.jsx)(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:(0,import_jsx_runtime87.jsx)(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),(0,import_jsx_runtime87.jsx)(import_core107.Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&(0,import_jsx_runtime87.jsxs)(import_jsx_runtime87.Fragment,{children:[(0,import_jsx_runtime87.jsx)(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:(0,import_jsx_runtime87.jsxs)(import_core107.Group,{gap:"xs",grow:!0,wrap:"nowrap",children:[(0,import_jsx_runtime87.jsx)(import_core107.TextInput,{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)}),(0,import_jsx_runtime87.jsx)(import_core107.NativeSelect,{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"&&(0,import_jsx_runtime87.jsx)(FormSection,{title:"Repeat on",children:(0,import_jsx_runtime87.jsx)(import_core107.Chip.Group,{multiple:!0,onChange:setDaysOfWeek,value:value.repeat?.dayOfWeek,children:(0,import_jsx_runtime87.jsx)(import_core107.Group,{justify:"space-between",mt:"xs",gap:"xs",children:daysOfWeek.map(day=>(0,import_jsx_runtime87.jsx)(import_core107.Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,checked:(value.repeat?.dayOfWeek??[]).includes(day),children:day.charAt(0).toUpperCase()},day))})})}),(0,import_jsx_runtime87.jsx)(FormSection,{title:"At times",children:(0,import_jsx_runtime87.jsxs)(import_core107.Stack,{mt:"xs",children:[timeOfDayItems.map((item,idx)=>(0,import_jsx_runtime87.jsxs)(import_core107.Group,{children:[(0,import_jsx_runtime87.jsx)(import_core107.TextInput,{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}}),(0,import_jsx_runtime87.jsx)(ArrayRemoveButton,{testId:`timing-repeat-timeOfDay-remove-${idx}`,onClick:()=>setTimeOfDay(items=>items.toSpliced(idx,1))})]},item.id)),(0,import_jsx_runtime87.jsx)(import_core107.Box,{children:(0,import_jsx_runtime87.jsx)(ArrayAddButton,{propertyDisplayName:"Time of Day",onClick:()=>setTimeOfDay(items=>{let id=nextTimeOfDayId.current++;return items.concat({id,value:"00:00:00"})})})})]})})]}),(0,import_jsx_runtime87.jsx)(import_core107.Group,{justify:"flex-end",children:(0,import_jsx_runtime87.jsx)(import_core107.Button,{onClick:()=>props.onOk(value),children:"OK"})})]})})}var import_jsx_runtime88=require("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===import_core110.PropertyType.Attachment)return(0,import_jsx_runtime88.jsx)(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==import_core110.PropertyType.Extension;return(0,import_jsx_runtime88.jsx)(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?(0,import_jsx_runtime88.jsx)(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):(0,import_jsx_runtime88.jsx)(ElementDefinitionTypeInput,{name,defaultValue:defaultValue2,onChange:newValue=>{if(props.onChange){let newPropName=props.name.replace("[x]",(0,import_core110.capitalize)(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]=(0,import_react60.useState)(initialPropertyType);return(0,import_jsx_runtime88.jsxs)(import_core109.Group,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[(0,import_jsx_runtime88.jsx)(import_core109.NativeSelect,{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}))}),(0,import_jsx_runtime88.jsx)(ElementDefinitionTypeInput,{name:props.name,defaultValue:props.defaultValue,outcome:props.outcome,elementDefinitionType:selectedType,onChange:newValue=>{props.onChange&&props.onChange(newValue,props.name.replace("[x]",(0,import_core110.capitalize)(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=(0,import_react60.useContext)(ElementsContext),defaultValue2=(0,import_react60.useMemo)(()=>{if(!(0,import_core110.isComplexTypeCode)(propertyType)||!(0,import_core110.isEmpty)(props.defaultValue))return props.defaultValue;let withDefaults=Object.create(null);if(elementsContext.path===props.path)(0,import_core110.applyDefaultValuesToElement)(withDefaults,elementsContext.elements);else{let key=(0,import_core110.getPathDifference)(elementsContext.path,props.path);if(key===void 0)return props.defaultValue;(0,import_core110.applyDefaultValuesToElement)(withDefaults,elementsContext.elements,key)}return(0,import_core110.isPopulated)(withDefaults)?withDefaults:props.defaultValue},[propertyType,elementsContext.path,elementsContext.elements,props.path,props.defaultValue]);if(!propertyType)return(0,import_jsx_runtime88.jsx)("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 import_core110.PropertyType.SystemString:case import_core110.PropertyType.canonical:case import_core110.PropertyType.string:case import_core110.PropertyType.uri:case import_core110.PropertyType.url:return props.path==="Project.secret.value[x]"||props.path==="ClientApplication.certificateTrustStore"?(0,import_jsx_runtime88.jsx)(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):(0,import_jsx_runtime88.jsx)(import_core109.TextInput,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case import_core110.PropertyType.date:return(0,import_jsx_runtime88.jsx)(import_core109.TextInput,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case import_core110.PropertyType.time:return(0,import_jsx_runtime88.jsx)(import_core109.TextInput,{...getPrimitiveInputProps(),type:"time",step:1,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case import_core110.PropertyType.dateTime:case import_core110.PropertyType.instant:return(0,import_jsx_runtime88.jsx)(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case import_core110.PropertyType.decimal:case import_core110.PropertyType.integer:case import_core110.PropertyType.positiveInt:case import_core110.PropertyType.unsignedInt:return(0,import_jsx_runtime88.jsx)(import_core109.TextInput,{...getPrimitiveInputProps(),type:"number",step:propertyType===import_core110.PropertyType.decimal?"any":"1",onChange:e=>{if(onChange){let num=e.currentTarget.valueAsNumber;onChange(Number.isNaN(num)?void 0:num)}}});case import_core110.PropertyType.code:return(0,import_jsx_runtime88.jsx)(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case import_core110.PropertyType.boolean:return(0,import_jsx_runtime88.jsx)(import_core109.Checkbox,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case import_core110.PropertyType.base64Binary:case import_core110.PropertyType.markdown:case import_core110.PropertyType.xhtml:return(0,import_jsx_runtime88.jsx)(import_core109.Textarea,{...getPrimitiveInputProps(),spellCheck:propertyType!==import_core110.PropertyType.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case import_core110.PropertyType.Address:return(0,import_jsx_runtime88.jsx)(AddressInput,{...getComplexInputProps()});case import_core110.PropertyType.Annotation:return(0,import_jsx_runtime88.jsx)(AnnotationInput,{...getComplexInputProps()});case import_core110.PropertyType.Attachment:return(0,import_jsx_runtime88.jsx)(AttachmentInput,{...getComplexInputProps()});case import_core110.PropertyType.CodeableConcept:return(0,import_jsx_runtime88.jsx)(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case import_core110.PropertyType.Coding:return(0,import_jsx_runtime88.jsx)(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case import_core110.PropertyType.ContactDetail:return(0,import_jsx_runtime88.jsx)(ContactDetailInput,{...getComplexInputProps()});case import_core110.PropertyType.ContactPoint:return(0,import_jsx_runtime88.jsx)(ContactPointInput,{...getComplexInputProps()});case import_core110.PropertyType.Extension:return(0,import_jsx_runtime88.jsx)(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case import_core110.PropertyType.HumanName:return(0,import_jsx_runtime88.jsx)(HumanNameInput,{...getComplexInputProps()});case import_core110.PropertyType.Identifier:return(0,import_jsx_runtime88.jsx)(IdentifierInput,{...getComplexInputProps()});case import_core110.PropertyType.Money:return(0,import_jsx_runtime88.jsx)(MoneyInput,{...getComplexInputProps()});case import_core110.PropertyType.Period:return(0,import_jsx_runtime88.jsx)(PeriodInput,{...getComplexInputProps()});case import_core110.PropertyType.Duration:case import_core110.PropertyType.Quantity:return(0,import_jsx_runtime88.jsx)(QuantityInput,{...getComplexInputProps()});case import_core110.PropertyType.Range:return(0,import_jsx_runtime88.jsx)(RangeInput,{...getComplexInputProps()});case import_core110.PropertyType.Ratio:return(0,import_jsx_runtime88.jsx)(RatioInput,{...getComplexInputProps()});case import_core110.PropertyType.Reference:return(0,import_jsx_runtime88.jsx)(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case import_core110.PropertyType.Timing:return(0,import_jsx_runtime88.jsx)(TimingInput,{...getComplexInputProps()});case import_core110.PropertyType.Dosage:case import_core110.PropertyType.UsageContext:default:return(0,import_jsx_runtime88.jsx)(BackboneElementInput,{...getComplexInputProps(),typeName:propertyType})}}var RESOURCE_TYPE_URL_PREFIXES=[`${import_core110.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})}var import_jsx_runtime89=require("react/jsx-runtime");function ElementsInput(props){let[value,setValue]=(0,import_react61.useState)(props.defaultValue??{}),elementsContext=(0,import_react61.useContext)(ElementsContext),elementsToRender=(0,import_react61.useMemo)(()=>getElementsToRender(elementsContext.elements),[elementsContext.elements]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let typedValue={type:props.type,value};return(0,import_jsx_runtime89.jsx)(import_core111.Stack,{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=(0,import_jsx_runtime89.jsx)(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"?(0,import_jsx_runtime89.jsx)(CheckboxFormSection,{title:(0,import_core112.getPathDisplayName)(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):(0,import_jsx_runtime89.jsx)(FormSection,{title:(0,import_core112.getPathDisplayName)(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"};var import_jsx_runtime90=require("react/jsx-runtime");function BackboneElementInput(props){let[defaultValue2]=(0,import_react62.useState)(()=>props.defaultValue??{}),parentElementsContext=(0,import_react62.useContext)(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=(0,import_react62.useMemo)(()=>(0,import_core114.tryGetDataType)(props.typeName,profileUrl),[props.typeName,profileUrl]),type=typeSchema?.type??props.typeName,contextValue=(0,import_react62.useMemo)(()=>{if(typeSchema)return(0,import_core114.buildElementsContext)({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);if(!typeSchema)return(0,import_jsx_runtime90.jsxs)("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,(0,import_jsx_runtime90.jsx)(import_core113.Box,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:(0,import_jsx_runtime90.jsx)(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}var import_core115=require("@mantine/core"),import_react63=require("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}var import_jsx_runtime91=require("react/jsx-runtime");function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=(0,import_react63.useState)(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth.getTime());return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=(0,import_react63.useMemo)(()=>buildGrid(month,props.slots),[month,props.slots]);return(0,import_jsx_runtime91.jsxs)("div",{children:[(0,import_jsx_runtime91.jsxs)(import_core115.Group,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[(0,import_jsx_runtime91.jsx)("p",{style:{flex:1},children:getMonthString(month)}),(0,import_jsx_runtime91.jsxs)(import_core115.Group,{justify:"flex-end",gap:"xs",children:[(0,import_jsx_runtime91.jsx)(import_core115.Button,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),(0,import_jsx_runtime91.jsx)(import_core115.Button,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),(0,import_jsx_runtime91.jsxs)("table",{className:CalendarInput_default.table,children:[(0,import_jsx_runtime91.jsx)("thead",{children:(0,import_jsx_runtime91.jsxs)("tr",{children:[(0,import_jsx_runtime91.jsx)("th",{children:"SUN"}),(0,import_jsx_runtime91.jsx)("th",{children:"MON"}),(0,import_jsx_runtime91.jsx)("th",{children:"TUE"}),(0,import_jsx_runtime91.jsx)("th",{children:"WED"}),(0,import_jsx_runtime91.jsx)("th",{children:"THU"}),(0,import_jsx_runtime91.jsx)("th",{children:"FRI"}),(0,import_jsx_runtime91.jsx)("th",{children:"SAT"})]})}),(0,import_jsx_runtime91.jsx)("tbody",{children:grid.map((week,weekIndex)=>(0,import_jsx_runtime91.jsx)("tr",{children:week.map((day,dayIndex)=>(0,import_jsx_runtime91.jsx)("td",{children:day&&(0,import_jsx_runtime91.jsx)(import_core115.Button,{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}var import_core118=require("@mantine/core"),import_hooks4=require("@mantine/hooks"),import_notifications5=require("@mantine/notifications"),import_core119=require("@medplum/core"),import_react_hooks31=require("@medplum/react-hooks");var import_react65=require("react");var BaseChat_default={chatPaper:"BaseChat_chatPaper",chatTitle:"BaseChat_chatTitle",chatBody:"BaseChat_chatBody",chatScrollArea:"BaseChat_chatScrollArea",chatInputContainer:"BaseChat_chatInputContainer",chatPendingFile:"BaseChat_chatPendingFile",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble",chatBubbleNameRight:"BaseChat_chatBubbleNameRight",chatBubbleAttachmentWithText:"BaseChat_chatBubbleAttachmentWithText",chatBubbleAttachmentIcon:"BaseChat_chatBubbleAttachmentIcon",chatBubbleMenu:"BaseChat_chatBubbleMenu"};var import_core116=require("@mantine/core"),import_hooks3=require("@mantine/hooks"),import_core117=require("@medplum/core"),import_react_hooks30=require("@medplum/react-hooks");var import_react64=require("react"),import_jsx_runtime92=require("react/jsx-runtime");function DocumentPicker({subjectRef,onSelect,onUpload}){let medplum=(0,import_react_hooks30.useMedplum)(),[search,setSearch]=(0,import_react64.useState)(""),[docs,setDocs]=(0,import_react64.useState)([]),[loading,setLoading]=(0,import_react64.useState)(!0),subjectRefStr=subjectRef?(0,import_core117.getReferenceString)(subjectRef):void 0,fetchDocs=(0,import_hooks3.useDebouncedCallback)(async query=>{setLoading(!0);try{let params=new URLSearchParams;subjectRefStr&&params.set("subject",subjectRefStr),query.trim()&&params.set("description:contains",query.trim()),params.set("_sort","-date"),params.set("_count","5");let results=await medplum.searchResources("DocumentReference",params);setDocs([...results])}catch(err){console.error(err)}finally{setLoading(!1)}},300);(0,import_react64.useEffect)(()=>{fetchDocs(search)},[fetchDocs,search]);let getDocName=doc=>doc.description??doc.content?.[0]?.attachment?.title??"Untitled";return(0,import_jsx_runtime92.jsxs)(import_core116.Stack,{gap:0,w:280,children:[(0,import_jsx_runtime92.jsx)(import_core116.Text,{fw:500,fz:"sm",px:"sm",pt:"sm",pb:"xs",children:"Attachments"}),(0,import_jsx_runtime92.jsx)(import_core116.Box,{px:"sm",pb:"xs",children:(0,import_jsx_runtime92.jsx)(import_core116.TextInput,{placeholder:"Search for a Document...",size:"xs",value:search,onChange:e=>setSearch(e.currentTarget.value)})}),(0,import_jsx_runtime92.jsx)(import_core116.Divider,{}),loading?(0,import_jsx_runtime92.jsx)(import_core116.Box,{py:"sm",style:{display:"flex",justifyContent:"center"},children:(0,import_jsx_runtime92.jsx)(import_core116.Loader,{size:"xs"})}):(0,import_jsx_runtime92.jsxs)(import_core116.Stack,{gap:0,children:[docs.map(doc=>(0,import_jsx_runtime92.jsxs)(import_core116.UnstyledButton,{px:"sm",py:"xs",onClick:()=>onSelect(doc),style:{display:"flex",alignItems:"center",gap:8},children:[(0,import_jsx_runtime92.jsx)(IconFileText,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-blue-6)"}}),(0,import_jsx_runtime92.jsx)(import_core116.Text,{fz:"sm",truncate:!0,children:getDocName(doc)})]},doc.id)),docs.length===0&&(0,import_jsx_runtime92.jsx)(import_core116.Text,{fz:"xs",c:"dimmed",px:"sm",py:"xs",children:"No documents found"})]}),(0,import_jsx_runtime92.jsx)(import_core116.Divider,{}),(0,import_jsx_runtime92.jsxs)(import_core116.UnstyledButton,{px:"sm",py:"xs",onClick:onUpload,style:{display:"flex",alignItems:"center",gap:8},children:[(0,import_jsx_runtime92.jsx)(IconPaperclip,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-gray-6)"}}),(0,import_jsx_runtime92.jsx)(import_core116.Text,{fz:"sm",c:"dimmed",children:"Upload an image, pdf, etc."})]})]})}var import_jsx_runtime93=require("react/jsx-runtime");function toSafeUrl(url){if(url)try{let{protocol}=new URL(url);return protocol==="https:"||protocol==="http:"||protocol==="blob:"?url:void 0}catch{return}}function showError(message){(0,import_notifications5.showNotification)({color:"red",title:"Error",message,autoClose:!1})}function parseSentTime(communication){return new Date(communication.sent??0).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function upsertCommunications(communications,received,setCommunications){let newCommunications=[...communications],foundNew=!1;for(let comm of received){let existingIdx=newCommunications.findIndex(c=>c.id===comm.id);existingIdx!==-1?newCommunications[existingIdx]=comm:(newCommunications.push(comm),foundNew=!0)}foundNew&&newCommunications.sort((a,b)=>!a.sent&&!b.sent?0:a.sent?b.sent?a.sent.localeCompare(b.sent):1:-1),setCommunications(newCommunications)}function BaseChat(props){let{title,communications,setCommunications,query,sendMessage,onMessageReceived,onMessageUpdated,inputDisabled,onError,excludeHeader=!1,uploadEnabled=!1,attachmentSubjectRef,onViewInDocuments,...paperProps}=props,medplum=(0,import_react_hooks31.useMedplum)(),inputRef=(0,import_react65.useRef)(null),scrollAreaRef=(0,import_react65.useRef)(null),firstScrollRef=(0,import_react65.useRef)(!0),initialLoadRef=(0,import_react65.useRef)(!0),[profile,setProfile]=(0,import_react65.useState)(medplum.getProfile()),[reconnecting,setReconnecting]=(0,import_react65.useState)(!1),[loading,setLoading]=(0,import_react65.useState)(!0),[pendingFile,setPendingFile]=(0,import_react65.useState)(void 0),[pendingDocRef,setPendingDocRef]=(0,import_react65.useState)(void 0),[pickerOpen,setPickerOpen]=(0,import_react65.useState)(!1),fileInputRef=(0,import_react65.useRef)(null);loading||(initialLoadRef.current=!1);let profileRefStr=(0,import_react65.useMemo)(()=>profile?(0,import_core119.getReferenceString)(medplum.getProfile()):"",[profile,medplum]),searchMessages=(0,import_react65.useCallback)(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]);(0,import_react65.useEffect)(()=>{searchMessages().catch(err=>(0,import_notifications5.showNotification)({color:"red",message:(0,import_core119.normalizeErrorString)(err)}))},[searchMessages]),(0,import_react_hooks31.useSubscription)(`Communication?${query}`,bundle=>{let communication=bundle.entry?.[1]?.resource;upsertCommunications(communicationsRef.current,[communication],setCommunications),(0,import_core119.getReferenceString)(communication.sender)!==profileRefStr&&(communicationsRef.current.find(c=>c.id===communication.id)?onMessageUpdated?.(communication):onMessageReceived?.(communication))},{onWebSocketClose:(0,import_react65.useCallback)(()=>{reconnecting||setReconnecting(!0),(0,import_notifications5.showNotification)({color:"red",message:"Live chat disconnected. Attempting to reconnect..."})},[reconnecting]),onWebSocketOpen:(0,import_react65.useCallback)(()=>{reconnecting&&(0,import_notifications5.showNotification)({color:"green",message:"Live chat reconnected."})},[reconnecting]),onSubscriptionConnect:(0,import_react65.useCallback)(()=>{reconnecting&&(searchMessages().catch(err=>(0,import_notifications5.showNotification)({color:"red",message:(0,import_core119.normalizeErrorString)(err)})),setReconnecting(!1))},[reconnecting,searchMessages]),onError:(0,import_react65.useCallback)(err=>{onError?onError(err):showError((0,import_core119.normalizeErrorString)(err))},[onError])});let sendMessageInternal=(0,import_react65.useCallback)(formData=>{if(inputDisabled)return;let message=formData.message?.trim()??"";!message&&!pendingFile&&!pendingDocRef||(inputRef.current&&(inputRef.current.value=""),fileInputRef.current&&(fileInputRef.current.value=""),sendMessage(message,pendingFile,pendingDocRef),setPendingFile(void 0),setPendingDocRef(void 0),scrollToBottomRef.current=!0)},[inputDisabled,sendMessage,pendingFile,pendingDocRef]);(0,import_react65.useEffect)(()=>{let latestProfile=medplum.getProfile();profile?.id!==latestProfile?.id&&(setProfile(latestProfile),setCommunications([]))});let[parentRef,parentRect]=(0,import_hooks4.useResizeObserver)(),communicationsRef=(0,import_react65.useRef)(communications);communicationsRef.current=communications;let prevCommunicationsRef=(0,import_react65.useRef)(communications),scrollToBottomRef=(0,import_react65.useRef)(!0);(0,import_react65.useEffect)(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),(0,import_react65.useEffect)(()=>{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=(0,import_react65.useMemo)(()=>{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?(0,import_jsx_runtime93.jsxs)(import_core118.Paper,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[!excludeHeader&&(0,import_jsx_runtime93.jsx)(import_core118.Title,{order:2,className:BaseChat_default.chatTitle,children:title}),(0,import_jsx_runtime93.jsx)("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?(0,import_jsx_runtime93.jsxs)(import_core118.Stack,{align:"stretch",mt:"lg",children:[(0,import_jsx_runtime93.jsxs)(import_core118.Group,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[(0,import_jsx_runtime93.jsx)(import_core118.Skeleton,{height:38,circle:!0,ml:"md"}),(0,import_jsx_runtime93.jsx)(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),(0,import_jsx_runtime93.jsxs)(import_core118.Group,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[(0,import_jsx_runtime93.jsx)(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),(0,import_jsx_runtime93.jsx)(import_core118.Skeleton,{height:38,circle:!0,mr:"md"})]}),(0,import_jsx_runtime93.jsxs)(import_core118.Group,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[(0,import_jsx_runtime93.jsx)(import_core118.Skeleton,{height:38,circle:!0,ml:"md"}),(0,import_jsx_runtime93.jsx)(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):(0,import_jsx_runtime93.jsxs)(import_core118.ScrollArea,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[(0,import_jsx_runtime93.jsx)(import_core118.LoadingOverlay,{visible:loading||reconnecting,style:{width:parentRect.width,height:parentRect.height,position:"absolute",zIndex:1}}),communications.map((c,i)=>{let prevCommunication=i>0?communications[i-1]:void 0,prevCommTime=prevCommunication?parseSentTime(prevCommunication):void 0,currCommTime=parseSentTime(c),showDelivered=!!c.received&&c.id===myLastDeliveredId,payloads=c.payload??[],contentRef=payloads.find(p=>p.contentReference)?.contentReference,contentAttachment=payloads.find(p=>p.contentAttachment)?.contentAttachment,hasAttachment=!!(contentRef||contentAttachment),isSender=c.sender?.reference===profileRefStr,menu=hasAttachment?(0,import_jsx_runtime93.jsx)(ChatBubbleMenu,{contentRef,contentAttachment,onViewInDocuments}):null;return(0,import_jsx_runtime93.jsxs)(import_core118.Stack,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&(0,import_jsx_runtime93.jsx)(import_core118.Text,{fz:"xs",ta:"center",children:currCommTime}),isSender?(0,import_jsx_runtime93.jsxs)(import_core118.Group,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[(0,import_jsx_runtime93.jsx)("div",{className:BaseChat_default.chatBubbleMenu,children:menu}),(0,import_jsx_runtime93.jsx)(ChatBubble,{alignment:"right",communication:c,showDelivered}),(0,import_jsx_runtime93.jsx)(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender,mb:showDelivered?void 0:"sm"})]}):(0,import_jsx_runtime93.jsxs)(import_core118.Group,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[(0,import_jsx_runtime93.jsx)(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),(0,import_jsx_runtime93.jsx)(ChatBubble,{alignment:"left",communication:c}),(0,import_jsx_runtime93.jsx)("div",{className:BaseChat_default.chatBubbleMenu,children:menu})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),(0,import_jsx_runtime93.jsxs)("div",{className:BaseChat_default.chatInputContainer,children:[(pendingFile||pendingDocRef)&&(0,import_jsx_runtime93.jsxs)(import_core118.Group,{className:BaseChat_default.chatPendingFile,gap:4,align:"center",wrap:"nowrap",children:[pendingDocRef?(0,import_jsx_runtime93.jsx)(IconFileText,{size:"0.75rem"}):(0,import_jsx_runtime93.jsx)(IconPaperclip,{size:"0.75rem"}),(0,import_jsx_runtime93.jsx)(import_core118.Text,{fz:"xs",c:"dimmed",flex:1,truncate:!0,children:pendingDocRef?pendingDocRef.description??pendingDocRef.content?.[0]?.attachment?.title??"Document":pendingFile?.name}),(0,import_jsx_runtime93.jsx)(import_core118.ActionIcon,{size:"xs",variant:"subtle",color:"red",onClick:()=>{setPendingDocRef(void 0),setPendingFile(void 0),fileInputRef.current&&(fileInputRef.current.value="")},"aria-label":"Remove attachment",children:(0,import_jsx_runtime93.jsx)(IconX,{size:"0.75rem"})})]}),(0,import_jsx_runtime93.jsx)("input",{ref:fileInputRef,type:"file",style:{display:"none"},disabled:inputDisabled,onChange:e=>{let file=e.target.files?.[0];file&&(setPendingFile(file),setPendingDocRef(void 0))}}),(0,import_jsx_runtime93.jsx)(Form,{onSubmit:sendMessageInternal,children:(0,import_jsx_runtime93.jsx)(import_core118.TextInput,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",leftSectionWidth:42,rightSectionWidth:42,disabled:inputDisabled,leftSection:!inputDisabled&&uploadEnabled?(0,import_jsx_runtime93.jsxs)(import_core118.Popover,{opened:pickerOpen,onChange:setPickerOpen,position:"top-start",withArrow:!0,shadow:"md",withinPortal:!0,children:[(0,import_jsx_runtime93.jsx)(import_core118.Popover.Target,{children:(0,import_jsx_runtime93.jsx)(import_core118.ActionIcon,{onClick:()=>setPickerOpen(o=>!o),size:"1.5rem",radius:"xl",color:pendingFile||pendingDocRef?"blue":"gray",variant:pendingFile||pendingDocRef?"filled":"subtle","aria-label":"Attach file",children:(0,import_jsx_runtime93.jsx)(IconPaperclip,{size:"1rem",stroke:1.5})})}),(0,import_jsx_runtime93.jsx)(import_core118.Popover.Dropdown,{p:0,children:(0,import_jsx_runtime93.jsx)(DocumentPicker,{subjectRef:attachmentSubjectRef,onSelect:doc=>{setPendingDocRef(doc),setPendingFile(void 0),setPickerOpen(!1)},onUpload:()=>{setPickerOpen(!1),fileInputRef.current?.click()}})})]}):void 0,rightSection:inputDisabled?void 0:(0,import_jsx_runtime93.jsx)(import_core118.ActionIcon,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:(0,import_jsx_runtime93.jsx)(IconArrowRight,{size:"1rem",stroke:1.5})})})})]})]}):null}function ChatBubble(props){let{communication,alignment,showDelivered}=props,payloads=communication.payload??[],textContent=payloads.find(p=>p.contentString)?.contentString??"",contentRef=payloads.find(p=>p.contentReference)?.contentReference,attachment=payloads.find(p=>p.contentAttachment)?.contentAttachment,sentTime=new Date(communication.sent??-1),seenTime=new Date(communication.received??-1),senderResource=(0,import_react_hooks31.useResource)(communication.sender);return(0,import_jsx_runtime93.jsxs)("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[(0,import_jsx_runtime93.jsxs)(import_core118.Text,{fz:"xs",mb:"xs",fw:500,className:alignment==="right"?BaseChat_default.chatBubbleNameRight:void 0,"aria-label":"Sender name",children:[senderResource?(0,import_core119.getDisplayString)(senderResource):"[Unknown sender]","\xA0\xB7\xA0",(0,import_jsx_runtime93.jsx)(import_core118.Text,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),(0,import_jsx_runtime93.jsx)("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:(0,import_jsx_runtime93.jsxs)("div",{className:BaseChat_default.chatBubble,children:[textContent&&(0,import_jsx_runtime93.jsx)("span",{children:textContent}),contentRef&&(0,import_jsx_runtime93.jsx)(ChatBubbleDocumentReference,{reference:contentRef,hasText:!!textContent}),attachment&&(0,import_jsx_runtime93.jsx)(ChatBubbleAttachment,{attachment,hasText:!!textContent})]})}),showDelivered&&(0,import_jsx_runtime93.jsxs)("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleAttachment({attachment,hasText}){return(0,import_jsx_runtime93.jsx)("div",{className:hasText?BaseChat_default.chatBubbleAttachmentWithText:void 0,children:(0,import_jsx_runtime93.jsxs)(import_core118.Group,{gap:4,wrap:"nowrap",children:[(0,import_jsx_runtime93.jsx)("span",{className:BaseChat_default.chatBubbleAttachmentIcon,children:(0,import_jsx_runtime93.jsx)(IconPaperclip,{size:"0.75rem"})}),(0,import_jsx_runtime93.jsx)(import_core118.Text,{fz:"xs",truncate:!0,children:attachment.title??"File attached"})]})})}function ChatBubbleDocumentReference({reference,hasText}){let attachment=(0,import_react_hooks31.useResource)(reference)?.content?.[0]?.attachment;return attachment?(0,import_jsx_runtime93.jsx)(ChatBubbleAttachment,{attachment,hasText}):null}function ChatBubbleMenu({contentRef,contentAttachment,onViewInDocuments}){let docRef=(0,import_react_hooks31.useResource)(contentRef),attachment=contentRef?docRef?.content?.[0]?.attachment:contentAttachment,cachedUrl=(0,import_react_hooks31.useCachedBinaryUrl)(attachment?.url),handleDownload=()=>{let href=toSafeUrl(cachedUrl??attachment?.url);href&&window.open(href,"_blank","noopener,noreferrer")};return(0,import_jsx_runtime93.jsxs)(import_core118.Menu,{withinPortal:!0,position:"bottom-start",shadow:"md",children:[(0,import_jsx_runtime93.jsx)(import_core118.Menu.Target,{children:(0,import_jsx_runtime93.jsx)(import_core118.ActionIcon,{variant:"outline",color:"gray",radius:"xl",size:"sm","aria-label":"Attachment options",children:(0,import_jsx_runtime93.jsx)(IconDots,{size:"0.75rem"})})}),(0,import_jsx_runtime93.jsxs)(import_core118.Menu.Dropdown,{children:[contentRef&&onViewInDocuments&&(0,import_jsx_runtime93.jsx)(import_core118.Menu.Item,{leftSection:(0,import_jsx_runtime93.jsx)(IconFileExport,{size:"0.9rem"}),onClick:()=>onViewInDocuments(contentRef),children:"View in Documents"}),(0,import_jsx_runtime93.jsx)(import_core118.Menu.Item,{leftSection:(0,import_jsx_runtime93.jsx)(IconDownload,{size:"0.9rem"}),onClick:handleDownload,children:"Download"})]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return(0,import_jsx_runtime93.jsxs)("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[(0,import_jsx_runtime93.jsx)("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:(0,import_jsx_runtime93.jsx)("div",{style:{position:"relative"},children:(0,import_jsx_runtime93.jsx)(import_core118.Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),(0,import_jsx_runtime93.jsx)("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:(0,import_jsx_runtime93.jsx)("div",{className:BaseChat_default.chatBubble,children:(0,import_jsx_runtime93.jsx)(import_core118.Skeleton,{height:14,width:parentWidth*.5,radius:"l"})})})]})}var import_core120=require("@mantine/core"),import_react_hooks32=require("@medplum/react-hooks");var import_react66=require("react");var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};var import_jsx_runtime94=require("react/jsx-runtime");function ChatModal(props){let{open,children}=props,profile=(0,import_react_hooks32.useMedplumProfile)(),[opened,setOpened]=(0,import_react66.useState)(open??!1);return(0,import_react66.useEffect)(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[opened&&(0,import_jsx_runtime94.jsx)("div",{className:ChatModal_default.chatModalContainer,children}),opened?(0,import_jsx_runtime94.jsx)("div",{className:ChatModal_default.iconContainer,children:(0,import_jsx_runtime94.jsx)(import_core120.ActionIcon,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:(0,import_jsx_runtime94.jsx)(IconChevronDown,{size:"1.625rem"})})}):(0,import_jsx_runtime94.jsx)("div",{className:ChatModal_default.iconContainer,children:(0,import_jsx_runtime94.jsx)(import_core120.ActionIcon,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:(0,import_jsx_runtime94.jsx)(IconChevronUp,{size:"1.625rem"})})})]}):null}var import_core121=require("@medplum/core"),import_react_hooks33=require("@medplum/react-hooks"),import_react67=require("react");var import_jsx_runtime95=require("react/jsx-runtime");function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,excludeHeader,uploadEnabled,onError,onViewInDocuments}=props,medplum=(0,import_react_hooks33.useMedplum)(),profile=(0,import_react_hooks33.useMedplumProfile)(),prevThreadId=(0,import_react_hooks33.usePrevious)(thread?.id),[communications,setCommunications]=(0,import_react67.useState)([]),profileRef=(0,import_react67.useMemo)(()=>profile?(0,import_core121.createReference)(profile):void 0,[profile]),threadRef=(0,import_react67.useMemo)(()=>(0,import_core121.createReference)(thread),[thread]);(0,import_react67.useEffect)(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=(0,import_react67.useCallback)((message,file,existingDocRef)=>{let profileRefStr=profileRef?(0,import_core121.getReferenceString)(profileRef):void 0;if(!profileRefStr)return;(async()=>{let payload=[];if(message&&payload.push({contentString:message}),existingDocRef)payload.push({contentReference:(0,import_core121.createReference)(existingDocRef)});else if(file){let docRef=await medplum.createDocumentReference({data:file,contentType:file.type||"application/octet-stream",filename:file.name,additionalFields:{...thread.subject?{subject:thread.subject}:{},description:file.name}});payload.push({contentReference:(0,import_core121.createReference)(docRef)})}let communication=await medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>(0,import_core121.getReferenceString)(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload,partOf:[threadRef],subject:thread.subject});setCommunications([...communications,communication]),onMessageSent?.(communication)})().catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent]),onMessageReceived=(0,import_react67.useMemo)(()=>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?(0,import_jsx_runtime95.jsx)(BaseChat,{title:title??(thread?.topic?(0,import_core121.formatCodeableConcept)(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled,excludeHeader,uploadEnabled,onError,attachmentSubjectRef:thread.subject,onViewInDocuments}):null}var import_core124=require("@mantine/core"),import_react68=require("react");var import_core122=require("@mantine/core"),import_core123=require("@medplum/core"),import_react_hooks34=require("@medplum/react-hooks");var ChatListItem_default={content:"ChatListItem_content",contentContainer:"ChatListItem_contentContainer",selected:"ChatListItem_selected"};var import_jsx_runtime96=require("react/jsx-runtime"),ChatListItem=props=>{let{topic,lastCommunication,isSelected,getThreadUri}=props,patientResource=(0,import_react_hooks34.useResource)(topic.subject),patientName=(0,import_core123.formatHumanName)(patientResource?.name?.[0]),lastMsg=lastCommunication?.payload?.[0]?.contentString,trimmedMsg=lastMsg?.length&&lastMsg.length>100?lastMsg.slice(0,100)+"...":lastMsg,senderName=lastCommunication?.sender?.display?`${lastCommunication?.sender?.display}: `:"",content=trimmedMsg?`${senderName} ${trimmedMsg}`:"No messages available",topicName=topic.topic?.text??content;return(0,import_jsx_runtime96.jsx)(MedplumLink,{to:getThreadUri(topic),underline:"never",children:(0,import_jsx_runtime96.jsxs)(import_core122.Group,{p:"xs",align:"center",wrap:"nowrap",className:clsx_default(ChatListItem_default.contentContainer,{[ChatListItem_default.selected]:isSelected}),children:[(0,import_jsx_runtime96.jsx)(ResourceAvatar,{value:topic.subject,radius:"xl",size:36}),(0,import_jsx_runtime96.jsxs)(import_core122.Stack,{gap:0,children:[(0,import_jsx_runtime96.jsx)(import_core122.Text,{size:"sm",fw:700,truncate:"end",children:patientName}),(0,import_jsx_runtime96.jsx)(import_core122.Text,{size:"sm",fw:400,lineClamp:2,className:ChatListItem_default.content,children:topicName}),(0,import_jsx_runtime96.jsx)(import_core122.Text,{size:"xs",style:{marginTop:2},children:lastCommunication?(0,import_core123.formatDateTime)(lastCommunication.sent):""})]})]})})};var import_jsx_runtime97=require("react/jsx-runtime"),ChatList=props=>{let{threads,selectedCommunication,getThreadUri}=props;return(0,import_jsx_runtime97.jsx)(import_core124.Stack,{gap:0,children:threads.map(thread=>{let topicCommunication=thread[0],lastCommunication=thread[1],_isSelected=selectedCommunication?.id===topicCommunication.id;return(0,import_jsx_runtime97.jsxs)(import_react68.Fragment,{children:[(0,import_jsx_runtime97.jsx)(ChatListItem,{topic:topicCommunication,lastCommunication,isSelected:_isSelected,getThreadUri}),(0,import_jsx_runtime97.jsx)(import_core124.Divider,{})]},topicCommunication.id)})})};var import_core136=require("@mantine/core"),import_notifications6=require("@mantine/notifications"),import_core137=require("@medplum/core"),import_react_hooks40=require("@medplum/react-hooks"),import_react72=require("react");var import_core134=require("@mantine/core"),import_core135=require("@medplum/core"),import_react_hooks39=require("@medplum/react-hooks"),import_react71=require("react");var import_core125=require("@mantine/core"),import_core126=require("@medplum/core"),import_react_hooks35=require("@medplum/react-hooks");var import_react69=require("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}};var import_jsx_runtime98=require("react/jsx-runtime");function SignatureInput(props){let medplum=(0,import_react_hooks35.useMedplum)(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=(0,import_react69.useRef)(null),signaturePadRef=(0,import_react69.useRef)(null),onChangeRef=(0,import_react69.useRef)(onChange);return(0,import_react69.useLayoutEffect)(()=>{onChangeRef.current=onChange}),(0,import_react69.useEffect)(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:import_core126.HTTP_HL7_ORG+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??(0,import_core126.createReference)(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]),(0,import_jsx_runtime98.jsxs)(import_core125.Paper,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[(0,import_jsx_runtime98.jsx)("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),(0,import_jsx_runtime98.jsx)(import_core125.Button,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:(0,import_jsx_runtime98.jsx)(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}var import_core132=require("@mantine/core"),import_react_hooks38=require("@medplum/react-hooks");var import_core127=require("@mantine/core");var import_jsx_runtime99=require("react/jsx-runtime");function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return(0,import_jsx_runtime99.jsxs)("div",{children:[props.item.text&&(0,import_jsx_runtime99.jsx)(import_core127.Title,{order:3,mb:"md",children:props.item.text}),(0,import_jsx_runtime99.jsx)(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}var import_core128=require("@mantine/core"),import_core129=require("@medplum/core"),import_react_hooks36=require("@medplum/react-hooks"),import_react70=require("react");var import_jsx_runtime100=require("react/jsx-runtime"),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!==import_react_hooks36.QuestionnaireItemType.choice&&item.type!==import_react_hooks36.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!==import_react_hooks36.QuestionnaireItemType.choice&&item.type!==import_react_hooks36.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)??(0,import_react_hooks36.getItemInitialValue)(initial),validationError=(0,import_core129.getExtension)(response,`${import_core129.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case import_react_hooks36.QuestionnaireItemType.display:formComponent=(0,import_jsx_runtime100.jsx)("p",{children:props.item.text},props.item.linkId);break;case import_react_hooks36.QuestionnaireItemType.boolean:formComponent=(0,import_jsx_runtime100.jsx)(CheckboxFormSection,{title:props.item.text,htmlFor:inputId,children:(0,import_jsx_runtime100.jsx)(import_core128.Checkbox,{id:inputId,name,required:props.required??item.required,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueBoolean:e.currentTarget.checked}])})},props.item.linkId);break;case import_react_hooks36.QuestionnaireItemType.decimal:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{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 import_react_hooks36.QuestionnaireItemType.integer:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{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 import_react_hooks36.QuestionnaireItemType.date:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{type:"date",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueDate:e.currentTarget.value}])});break;case import_react_hooks36.QuestionnaireItemType.dateTime:formComponent=(0,import_jsx_runtime100.jsx)(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case import_react_hooks36.QuestionnaireItemType.time:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{type:"time",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueTime:e.currentTarget.value}])});break;case import_react_hooks36.QuestionnaireItemType.string:case import_react_hooks36.QuestionnaireItemType.url:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case import_react_hooks36.QuestionnaireItemType.text:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.Textarea,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case import_react_hooks36.QuestionnaireItemType.attachment:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.Group,{py:4,children:(0,import_jsx_runtime100.jsx)(AttachmentInput,{path:"",name:inputId,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case import_react_hooks36.QuestionnaireItemType.reference:formComponent=(0,import_jsx_runtime100.jsx)(ReferenceInput,{name:inputId,required:props.required??item.required,targetTypes:(0,import_react_hooks36.getQuestionnaireItemReferenceTargetTypes)(item),searchCriteria:(0,import_react_hooks36.getQuestionnaireItemReferenceFilter)(item,formState?.subject,formState?.encounter),defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueReference:newValue}])});break;case import_react_hooks36.QuestionnaireItemType.quantity:formComponent=(0,import_jsx_runtime100.jsx)(QuantityInput,{path:"",name:inputId,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueQuantity:newValue}]),disableWheel:!0});break;case import_react_hooks36.QuestionnaireItemType.choice:case import_react_hooks36.QuestionnaireItemType.openChoice:{let{widget,multiselect}=resolveChoiceControl(item),sharedProps={name:inputId,item,required:props.required??item.required,initial,response,multiselect,onChangeAnswer};widget==="check-box"?formComponent=(0,import_jsx_runtime100.jsx)(QuestionnaireCheckboxInput,{...sharedProps}):widget==="drop-down"?formComponent=(0,import_jsx_runtime100.jsx)(QuestionnaireDropdownInput,{...sharedProps}):formComponent=(0,import_jsx_runtime100.jsx)(QuestionnaireRadioButtonInput,{...sharedProps})}break;default:return null}return(0,import_jsx_runtime100.jsxs)(import_jsx_runtime100.Fragment,{children:[formComponent,validationError?.valueString&&(0,import_jsx_runtime100.jsx)(import_core128.Text,{c:"red",size:"lg",mt:4,children:validationError.valueString})]})}function QuestionnaireDropdownInput(props){let{name,item,required,initial,onChangeAnswer,response,multiselect}=props;if(!item.answerOption?.length&&!item.answerValueSet)return(0,import_jsx_runtime100.jsx)(NoAnswerDisplay,{});let initialValue=(0,import_react_hooks36.getItemInitialValue)(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||multiselect;if(item.answerValueSet)return(0,import_jsx_runtime100.jsx)(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(0,import_jsx_runtime100.jsx)(import_core128.MultiSelect,{data:data2,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[(0,import_core129.typedValueToString)(initialValue)],required,onChange:selected=>{if(selected.length===0)onChangeAnswer([{}]);else{let values=(0,import_react_hooks36.getNewMultiSelectValues)(selected,propertyName,item);onChangeAnswer(values)}}})}else{let data2=[""];if(item.answerOption)for(let option of item.answerOption){let optionValue=(0,import_react_hooks36.getItemAnswerOptionValue)(option);data2.push((0,import_core129.typedValueToString)(optionValue))}return(0,import_jsx_runtime100.jsx)(import_core128.NativeSelect,{id:name,name,required,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){onChangeAnswer([{}]);return}let option=item.answerOption[index-1],optionValue=(0,import_react_hooks36.getItemAnswerOptionValue)(option),propertyName="value"+(0,import_core129.capitalize)(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])},defaultValue:(0,import_core129.formatCoding)(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=(0,import_react_hooks36.useMedplum)(),[valueSetOptions,setValueSetOptions]=(0,import_react70.useState)([]),[isLoading,setIsLoading]=(0,import_react70.useState)(!1);return(0,import_react70.useEffect)(()=>{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=(0,import_core129.getElementDefinition)("QuestionnaireItemAnswerOption","value[x]"),initialValue=(0,import_react_hooks36.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=(0,import_react_hooks36.getItemAnswerOptionValue)(option);return optionValue?.value?(initialValue&&(0,import_core129.stringify)(optionValue)===(0,import_core129.stringify)(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return(0,import_jsx_runtime100.jsx)(import_core128.Text,{children:"Loading options..."});if(options.length===0)return(0,import_jsx_runtime100.jsx)(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return(0,import_jsx_runtime100.jsxs)(import_jsx_runtime100.Fragment,{children:[(0,import_jsx_runtime100.jsx)(import_core128.Radio.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+(0,import_core129.capitalize)(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>(0,import_jsx_runtime100.jsx)(import_core128.Radio,{id:optionName,value:optionName,py:4,required,label:(0,import_jsx_runtime100.jsx)(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)&&(0,import_jsx_runtime100.jsxs)(import_core128.Text,{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=(0,import_core129.getElementDefinition)("QuestionnaireItemAnswerOption","value[x]"),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),initialSelectedValues=item.answerValueSet?(response?.answer?.map(a=>a.valueCoding)||[]).filter(c=>c!==void 0):getCurrentMultiSelectAnswer(response),[selectedValues,setSelectedValues]=(0,import_react70.useState)(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=(0,import_react_hooks36.getItemAnswerOptionValue)(option);return optionValue?.value?[optionName,optionValue]:null}).filter(option=>option!==null);options.push(...mappedOptions)}if(isLoading)return(0,import_jsx_runtime100.jsx)(import_core128.Text,{children:"Loading options..."});if(options.length===0)return(0,import_jsx_runtime100.jsx)(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=>!(0,import_core129.deepEquals)(c,optionValue.value)),setSelectedValues(newCodings),newCodings.length===0?onChangeAnswer([{}]):onChangeAnswer(newCodings.map(coding=>({valueCoding:coding})))}else{let currentValues=selectedValues,optionValueStr=(0,import_core129.typedValueToString)(optionValue),newValues;if(selected?newValues=[...currentValues,optionValueStr]:newValues=currentValues.filter(v=>v!==optionValueStr),setSelectedValues(newValues),newValues.length===0)onChangeAnswer([{}]);else{let values=(0,import_react_hooks36.getNewMultiSelectValues)(newValues,"value"+(0,import_core129.capitalize)(optionValue.type),item);onChangeAnswer(values)}}};return(0,import_jsx_runtime100.jsxs)(import_core128.Group,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=(0,import_core129.typedValueToString)(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>(0,import_core129.deepEquals)(coding,optionValue.value)):selectedValues.includes(optionValueStr);return(0,import_jsx_runtime100.jsx)(import_core128.Checkbox,{id:optionName,label:(0,import_jsx_runtime100.jsx)(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)&&(0,import_jsx_runtime100.jsxs)(import_core128.Text,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){return(0,import_react_hooks36.getItemAnswerOptionValue)(response?.answer?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response?.answer;return results?results.map(a=>(0,import_react_hooks36.getItemAnswerOptionValue)(a)).map(type=>(0,import_core129.formatCoding)(type?.value)||type?.value).filter(Boolean):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>(0,import_core129.deepEquals)(option[1].value,defaultAnswer?.value))?.[0]}var choiceTypes=["drop-down","radio-button","check-box"];function resolveChoiceControl(item){let widget="radio-button",multiselect=!1;item.answerValueSet&&(widget="drop-down");for(let ext of item.extension??[]){if(ext.url!==import_react_hooks36.QUESTIONNAIRE_ITEM_CONTROL_URL)continue;let code=ext.valueCodeableConcept?.coding?.[0]?.code;choiceTypes.includes(code)&&(widget=code),code==="multi-select"&&(multiselect=!0)}return widget==="radio-button"&&multiselect&&(widget="check-box"),{widget,multiselect}}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=(0,import_react_hooks36.getItemAnswerOptionValue)(option),propertyName="value"+(0,import_core129.capitalize)(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=(0,import_react_hooks36.getItemAnswerOptionValue)(answerOption),answerOptionValueStr=(0,import_core129.typedValueToString)(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}var import_core130=require("@mantine/core");var import_jsx_runtime101=require("react/jsx-runtime");function QuestionnaireFormRepeatableGroup(props){return(0,import_jsx_runtime101.jsxs)(import_jsx_runtime101.Fragment,{children:[props.responseItems.map(response=>(0,import_jsx_runtime101.jsx)(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),(0,import_jsx_runtime101.jsx)(import_core130.Anchor,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}var import_core131=require("@mantine/core"),import_react_hooks37=require("@medplum/react-hooks");var import_jsx_runtime102=require("react/jsx-runtime");function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,isChoiceType=item.type===import_react_hooks37.QuestionnaireItemType.choice||item.type===import_react_hooks37.QuestionnaireItemType.openChoice,showAddButton=!isChoiceType,answers=!isChoiceType&&responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return(0,import_jsx_runtime102.jsxs)(FormSection,{title:props.item.text,withAsterisk:props.item.required,children:[(0,import_jsx_runtime102.jsx)(import_core131.Stack,{gap:"xs",children:answers?.map((_,index)=>(0,import_jsx_runtime102.jsx)(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&(0,import_jsx_runtime102.jsx)(import_core131.Anchor,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}var import_jsx_runtime103=require("react/jsx-runtime");function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props;return(0,import_jsx_runtime103.jsx)(import_core132.Stack,{children:items.map((item,index)=>{if(!(0,import_react_hooks38.isQuestionEnabled)(item,formState.questionnaireResponse))return null;if(item.type===import_react_hooks38.QuestionnaireItemType.display)return(0,import_jsx_runtime103.jsx)("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===import_react_hooks38.QuestionnaireItemType.group&&item.repeats?(0,import_jsx_runtime103.jsx)(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems},`repeating-group-${item.id}-${index}`):item.type===import_react_hooks38.QuestionnaireItemType.group?(0,import_jsx_runtime103.jsx)(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]},`group-${item.id}-${index}`):item.type===import_react_hooks38.QuestionnaireItemType.boolean?(0,import_jsx_runtime103.jsx)(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?(0,import_jsx_runtime103.jsx)(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):(0,import_jsx_runtime103.jsx)(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:(0,import_jsx_runtime103.jsx)(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}var import_core133=require("@mantine/core");var import_jsx_runtime104=require("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(0,import_jsx_runtime104.jsxs)(import_jsx_runtime104.Fragment,{children:[(0,import_jsx_runtime104.jsx)(import_core133.Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>(0,import_jsx_runtime104.jsx)(import_core133.Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&(0,import_jsx_runtime104.jsxs)(import_core133.Group,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&(0,import_jsx_runtime104.jsx)(import_core133.Button,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&(0,import_jsx_runtime104.jsx)(import_core133.Button,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&(0,import_jsx_runtime104.jsx)(SubmitButton,{children:submitButtonText??"Submit"})]})]})}var import_jsx_runtime105=require("react/jsx-runtime");function QuestionnaireForm(props){let medplum=(0,import_react_hooks39.useMedplum)(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=(0,import_react71.useState)(!1),propsRef=(0,import_react71.useRef)(props),pendingChangeRef=(0,import_react71.useRef)(void 0);(0,import_react71.useLayoutEffect)(()=>{propsRef.current=props});let onFormChange=(0,import_react71.useCallback)(response=>{pendingChangeRef.current=response},[]),formState=(0,import_react_hooks39.useQuestionnaireForm)({questionnaire:props.questionnaire,defaultValue:props.questionnaireResponse,subject:props.subject,encounter:props.encounter,source:props.source,disablePagination:props.disablePagination,onChange:onFormChange}),formStateRef=(0,import_react71.useRef)(formState);(0,import_react71.useLayoutEffect)(()=>{formStateRef.current=formState}),(0,import_react71.useEffect)(()=>{let pendingChange=pendingChangeRef.current;pendingChange&&(pendingChangeRef.current=void 0,setSignatureRequiredSubmitted(!1),propsRef.current.onChange?.(pendingChange))});let isSignatureRequired=(0,import_react71.useMemo)(()=>formState.loading?!1:!!(0,import_core135.getExtension)(formState.questionnaire,import_react_hooks39.QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=(0,import_react71.useMemo)(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===import_react_hooks39.QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=(0,import_react71.useCallback)(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire2=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=(0,import_core135.createReference)(profile))}onSubmit({...response,questionnaire:questionnaire2.url??(0,import_core135.getReferenceString)(questionnaire2),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:(0,import_jsx_runtime105.jsxs)(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&(0,import_jsx_runtime105.jsx)(import_core134.Title,{children:formState.questionnaire.title}),formState.pagination?(0,import_jsx_runtime105.jsx)(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:(0,import_jsx_runtime105.jsx)(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):(0,import_jsx_runtime105.jsxs)(import_jsx_runtime105.Fragment,{children:[(0,import_jsx_runtime105.jsx)(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&(0,import_jsx_runtime105.jsxs)(import_core134.Stack,{mt:"md",gap:0,children:[(0,import_jsx_runtime105.jsx)(import_core134.Text,{size:"sm",fw:500,children:"Signature"}),(0,import_jsx_runtime105.jsx)(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&(0,import_jsx_runtime105.jsx)(import_core134.Text,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&(0,import_jsx_runtime105.jsx)(import_core134.Group,{justify:"flex-end",mt:"xl",gap:"xs",children:(0,import_jsx_runtime105.jsx)(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}var import_jsx_runtime106=require("react/jsx-runtime"),NewTopicDialog=props=>{let{subject,opened,onClose,onSubmit,allowPatientSelection=!1}=props,medplum=(0,import_react_hooks40.useMedplum)(),profile=(0,import_react_hooks40.useMedplumProfile)(),profileRef=(0,import_react72.useMemo)(()=>profile?(0,import_core137.createReference)(profile):void 0,[profile]),[topic,setTopic]=(0,import_react72.useState)(""),[practitioners,setPractitioners]=(0,import_react72.useState)(profile?.resourceType==="Practitioner"?[(0,import_core137.createReference)(profile)]:[]),[patient,setPatient]=(0,import_react72.useState)(subject?(0,import_core137.createReference)(subject):void 0),initialResponse=(0,import_react72.useMemo)(()=>{if(profile?.resourceType==="Practitioner")return{resourceType:"QuestionnaireResponse",status:"in-progress",item:[{linkId:"q1",answer:[{valueReference:(0,import_core137.createReference)(profile)}]}]}},[profile]);return(0,import_jsx_runtime106.jsx)(import_core136.Modal,{opened,onClose,title:"New Message",size:"md",children:(0,import_jsx_runtime106.jsxs)(import_core136.Stack,{gap:"xl",children:[(0,import_jsx_runtime106.jsxs)(import_core136.Stack,{gap:0,children:[(0,import_jsx_runtime106.jsx)(import_core136.Text,{fw:500,children:"Patient"}),allowPatientSelection&&(0,import_jsx_runtime106.jsx)(import_core136.Text,{c:"dimmed",children:"Select a patient"}),(0,import_jsx_runtime106.jsx)(ResourceInput,{resourceType:"Patient",name:"patient",required:!0,defaultValue:patient,disabled:!allowPatientSelection&&!!patient,onChange:value=>{setPatient(value?(0,import_core137.createReference)(value):void 0)}})]}),(0,import_jsx_runtime106.jsxs)(import_core136.Stack,{gap:0,children:[(0,import_jsx_runtime106.jsx)(import_core136.Text,{fw:500,children:"Practitioner (optional)"}),(0,import_jsx_runtime106.jsx)(import_core136.Text,{c:"dimmed",children:"Select one or more practitioners"}),(0,import_jsx_runtime106.jsx)(QuestionnaireForm,{questionnaire,questionnaireResponse:initialResponse,excludeButtons:!0,onChange:value=>{let references=value.item?.[0].answer?.map(item=>item.valueReference).filter(ref=>ref!==void 0)??[];setPractitioners(references)}})]}),(0,import_jsx_runtime106.jsxs)(import_core136.Stack,{gap:0,children:[(0,import_jsx_runtime106.jsx)(import_core136.Text,{fw:500,children:"Topic (optional)"}),(0,import_jsx_runtime106.jsx)(import_core136.Text,{c:"dimmed",children:"Enter a topic for the message"}),(0,import_jsx_runtime106.jsx)(import_core136.TextInput,{placeholder:"Enter your topic",value:topic,onChange:e=>setTopic(e.target.value)})]}),(0,import_jsx_runtime106.jsx)(import_core136.Button,{onClick:async()=>{if(!patient){(0,import_notifications6.showNotification)({title:"Error",message:"Please select a patient",color:"red"});return}let communication={resourceType:"Communication",status:"in-progress",subject:patient,sender:profileRef,recipient:[patient,...practitioners.map(practitioner=>({reference:practitioner.reference}))],topic:{text:topic}};try{let createdCommunication=await medplum.createResource(communication);onSubmit?.(createdCommunication),onClose()}catch(error){(0,import_notifications6.showNotification)({title:"Error",message:(0,import_core137.normalizeErrorString)(error),color:"red"})}},children:"Next"})]})})},questionnaire={resourceType:"Questionnaire",status:"active",item:[{linkId:"q1",type:"reference",repeats:!0,extension:[{url:`${import_core137.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-referenceResource`,valueCodeableConcept:{coding:[{system:`${import_core137.HTTP_HL7_ORG}/fhir/fhir-types`,display:"Practitioner",code:"Practitioner"}]}}]}]};var import_core138=require("@mantine/core"),import_hooks5=require("@mantine/hooks"),import_notifications7=require("@mantine/notifications"),import_core139=require("@medplum/core"),import_react_hooks41=require("@medplum/react-hooks");var import_react73=require("react");var ParticipantFilter_default={participantItem:"ParticipantFilter_participantItem"};var import_jsx_runtime107=require("react/jsx-runtime");function ParticipantFilter(props){let{selectedParticipants,onFilterChange}=props,[opened,{open,close}]=(0,import_hooks5.useDisclosure)(!1),[searchQuery,setSearchQuery]=(0,import_react73.useState)(""),[searchResults,setSearchResults]=(0,import_react73.useState)([]),[isSearching,setIsSearching]=(0,import_react73.useState)(!1),medplum=(0,import_react_hooks41.useMedplum)(),profile=(0,import_react_hooks41.useMedplumProfile)(),currentUserParticipant=(0,import_react73.useMemo)(()=>{if(profile)return(0,import_core139.createReference)(profile)},[profile]),additionalParticipants=(0,import_react73.useMemo)(()=>{let currentUserRef=currentUserParticipant?.reference;return selectedParticipants.filter(p=>p.reference!==currentUserRef)},[selectedParticipants,currentUserParticipant]),debouncedSearch=(0,import_hooks5.useDebouncedCallback)(async query=>{if(!query.trim()){setSearchResults([]);return}setIsSearching(!0);try{let bundle=await medplum.search("Patient",{_type:"Patient,Practitioner",name:query,_count:"10"}),currentUserRef=currentUserParticipant?.reference,results=(bundle.entry??[]).map(entry=>entry.resource).filter(resource=>{if(!resource)return!1;let refString=(0,import_core139.getReferenceString)(resource);return!!refString&&refString!==currentUserRef}).map(resource=>(0,import_core139.createReference)(resource));setSearchResults(results)}catch(error){(0,import_notifications7.showNotification)({title:"Error",message:(0,import_core139.normalizeErrorString)(error),color:"red"}),setSearchResults([])}finally{setIsSearching(!1)}},300);(0,import_react73.useEffect)(()=>(debouncedSearch(searchQuery),debouncedSearch.cancel),[searchQuery,debouncedSearch]);let isSelected=participant=>selectedParticipants.some(p=>p.reference===participant.reference),toggleParticipant=participant=>{let newParticipants=isSelected(participant)?selectedParticipants.filter(p=>p.reference!==participant.reference):[...selectedParticipants,participant];onFilterChange(newParticipants)},removeParticipant=participant=>{let newParticipants=selectedParticipants.filter(p=>p.reference!==participant.reference);onFilterChange(newParticipants)},displayParticipants=(0,import_react73.useMemo)(()=>{let result=[];for(let p of additionalParticipants)result.some(r2=>r2.reference===p.reference)||result.push(p);if(searchQuery.trim()&&searchResults.length>0)for(let p of searchResults)currentUserParticipant?.reference!==p.reference&&(result.some(r2=>r2.reference===p.reference)||result.push(p));return result},[additionalParticipants,searchQuery,searchResults,currentUserParticipant]),hasActiveFilter=selectedParticipants.length>0;return(0,import_jsx_runtime107.jsxs)(import_core138.Popover,{opened,onChange:o=>!o&&close(),position:"bottom-start",width:360,shadow:"md",radius:"md",withinPortal:!0,children:[(0,import_jsx_runtime107.jsx)(import_core138.Popover.Target,{children:(0,import_jsx_runtime107.jsx)(import_core138.Tooltip,{label:"Message Participants",position:"bottom",openDelay:500,disabled:opened,children:(0,import_jsx_runtime107.jsx)(import_core138.Indicator,{disabled:!hasActiveFilter,color:"blue",size:8,offset:4,children:(0,import_jsx_runtime107.jsx)(import_core138.ActionIcon,{variant:"transparent",onClick:opened?close:open,radius:"xl",size:32,className:"outline-icon-button","data-opened":opened||void 0,children:(0,import_jsx_runtime107.jsx)(IconUsers,{size:16})})})})}),(0,import_jsx_runtime107.jsx)(import_core138.Popover.Dropdown,{p:"md",children:(0,import_jsx_runtime107.jsxs)(import_core138.Stack,{gap:"md",children:[(0,import_jsx_runtime107.jsx)(import_core138.Text,{size:"xs",c:"dimmed",fw:500,children:"Message Participants"}),(0,import_jsx_runtime107.jsx)(import_core138.TextInput,{placeholder:"Search for a Patient or Practitioner...",value:searchQuery,autoFocus:!0,onChange:e=>setSearchQuery(e.target.value),rightSection:searchQuery?(0,import_jsx_runtime107.jsx)(import_core138.CloseButton,{size:"sm",onClick:()=>setSearchQuery("")}):null}),(0,import_jsx_runtime107.jsxs)(import_core138.Stack,{gap:"xs",mah:250,style:{overflowY:"auto"},children:[currentUserParticipant&&(0,import_jsx_runtime107.jsx)(ParticipantItem,{participant:currentUserParticipant,isSelected:isSelected(currentUserParticipant),isCurrentUser:!0,onToggle:()=>toggleParticipant(currentUserParticipant)}),displayParticipants.map(participant=>(0,import_jsx_runtime107.jsx)(ParticipantItem,{participant,isSelected:isSelected(participant),isCurrentUser:!1,onToggle:()=>toggleParticipant(participant),onRemove:isSelected(participant)?()=>removeParticipant(participant):void 0},participant.reference)),isSearching&&(0,import_jsx_runtime107.jsx)(import_core138.Text,{size:"sm",c:"dimmed",ta:"center",children:"Searching..."}),searchQuery.trim()&&!isSearching&&searchResults.length===0&&(0,import_jsx_runtime107.jsx)(import_core138.Text,{size:"sm",c:"dimmed",ta:"center",children:"No results found"})]})]})})]})}function ParticipantItem(props){let{participant,isSelected,isCurrentUser,onToggle,onRemove}=props,patientResource=(0,import_react_hooks41.useResource)(participant);return patientResource?(0,import_jsx_runtime107.jsxs)(import_core138.Group,{justify:"space-between",wrap:"nowrap",className:ParticipantFilter_default.participantItem,children:[(0,import_jsx_runtime107.jsxs)(import_core138.Group,{gap:"sm",wrap:"nowrap",style:{flex:1,minWidth:0},children:[(0,import_jsx_runtime107.jsx)(import_core138.Checkbox,{checked:isSelected,onChange:onToggle}),(0,import_jsx_runtime107.jsx)(ResourceAvatar,{value:participant,radius:"xl",size:32}),(0,import_jsx_runtime107.jsxs)(import_core138.Text,{size:"sm",truncate:!0,style:{flex:1},children:[(0,import_core139.formatHumanName)(patientResource?.name?.[0]??{}),isCurrentUser&&(0,import_jsx_runtime107.jsxs)(import_core138.Text,{component:"span",c:"dimmed",size:"sm",children:[" ","(you)"]})]})]}),onRemove&&(0,import_jsx_runtime107.jsx)(import_core138.CloseButton,{size:"sm",onClick:onRemove})]}):null}var import_core181=require("@mantine/core"),import_hooks14=require("@mantine/hooks"),import_notifications8=require("@mantine/notifications"),import_core182=require("@medplum/core"),import_react_hooks54=require("@medplum/react-hooks");var import_react89=require("react");var import_core179=require("@mantine/core"),import_core180=require("@medplum/core"),import_react_hooks53=require("@medplum/react-hooks"),import_react88=require("react");var PatientSummary_default={panel:"PatientSummary_panel",patientSummaryBadge:"PatientSummary_patientSummaryBadge",patientSummaryAddButton:"PatientSummary_patientSummaryAddButton",patientSummaryHeader:"PatientSummary_patientSummaryHeader",patientSummaryCollapseIcon:"PatientSummary_patientSummaryCollapseIcon",collapsed:"PatientSummary_collapsed"};var import_core177=require("@mantine/core"),import_core178=require("@medplum/core");var import_core145=require("@mantine/core"),import_hooks6=require("@mantine/hooks"),import_core146=require("@medplum/core"),import_react_hooks42=require("@medplum/react-hooks"),import_react76=require("react");var import_core140=require("@mantine/core"),import_jsx_runtime108=require("react/jsx-runtime"),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(0,import_jsx_runtime108.jsx)(import_core140.Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}var import_core141=require("@mantine/core"),import_core142=require("@medplum/core"),import_react74=require("react");var import_jsx_runtime109=require("react/jsx-runtime"),HTTP="http://",PATIENT_ALLERGY_PROFILE=import_core142.HTTP_HL7_ORG+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=(0,import_react74.useState)(allergy?.code),[clinicalStatus,setClinicalStatus]=(0,import_react74.useState)(allergy?.clinicalStatus),handleSubmit=(0,import_react74.useCallback)(formData=>{onSubmit((0,import_core142.addProfileToResource)({...allergy,resourceType:"AllergyIntolerance",patient:(0,import_core142.createReference)(patient),encounter:encounter?(0,import_core142.createReference)(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(0,import_jsx_runtime109.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime109.jsxs)(import_core141.Stack,{children:[(0,import_jsx_runtime109.jsx)(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}),(0,import_jsx_runtime109.jsx)(import_core141.TextInput,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),(0,import_jsx_runtime109.jsx)(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:import_core142.HTTP_HL7_ORG+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),(0,import_jsx_runtime109.jsx)(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),(0,import_jsx_runtime109.jsx)(import_core141.Group,{justify:"flex-end",gap:4,mt:"md",children:(0,import_jsx_runtime109.jsx)(SubmitButton,{children:"Save"})})]})},allergy?.id)}var import_core143=require("@mantine/core");var import_react75=require("react");var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title",addButton:"CollapsibleSection_addButton"};var import_jsx_runtime110=require("react/jsx-runtime");function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=(0,import_react75.useState)(!1);return(0,import_jsx_runtime110.jsxs)(import_core143.Box,{className:CollapsibleSection_default.root,children:[(0,import_jsx_runtime110.jsxs)(import_core143.Group,{justify:"space-between",className:CollapsibleSection_default.header,children:[(0,import_jsx_runtime110.jsxs)(import_core143.Group,{gap:8,children:[(0,import_jsx_runtime110.jsx)(import_core143.ActionIcon,{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:(0,import_jsx_runtime110.jsx)(IconChevronDown,{size:20})}),(0,import_jsx_runtime110.jsx)(import_core143.Text,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&(0,import_jsx_runtime110.jsx)(import_core143.ActionIcon,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:(0,import_jsx_runtime110.jsx)(IconPlus,{size:18})})]}),(0,import_jsx_runtime110.jsx)(import_core143.Collapse,{in:!collapsed,children:(0,import_jsx_runtime110.jsx)(import_core143.Box,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}var import_core144=require("@mantine/core");var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};var import_jsx_runtime111=require("react/jsx-runtime");function SummaryItem(props){let{children,onClick}=props;return(0,import_jsx_runtime111.jsxs)(import_core144.Box,{className:SummaryItem_default.item,onClick,children:[children,(0,import_jsx_runtime111.jsx)("div",{className:SummaryItem_default.gradient}),(0,import_jsx_runtime111.jsx)("div",{className:SummaryItem_default.container,children:(0,import_jsx_runtime111.jsx)(import_core144.ActionIcon,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:(0,import_jsx_runtime111.jsx)(IconChevronRight,{size:16,stroke:2.5})})})]})}var import_jsx_runtime112=require("react/jsx-runtime");function Allergies(props){let medplum=(0,import_react_hooks42.useMedplum)(),{patient,encounter}=props,[allergies,setAllergies]=(0,import_react76.useState)(props.allergies),[opened,{open,close}]=(0,import_hooks6.useDisclosure)(!1),[editAllergy,setEditAllergy]=(0,import_react76.useState)(),sortedAllergies=(0,import_react76.useMemo)(()=>[...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:(0,import_core146.getDisplayString)(a).localeCompare((0,import_core146.getDisplayString)(b))}),[allergies]),handleSubmit=(0,import_react76.useCallback)(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(0,import_jsx_runtime112.jsxs)(import_jsx_runtime112.Fragment,{children:[(0,import_jsx_runtime112.jsx)(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?(0,import_jsx_runtime112.jsx)(import_core145.Box,{children:(0,import_jsx_runtime112.jsx)(import_core145.Flex,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return(0,import_jsx_runtime112.jsx)(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:(0,import_jsx_runtime112.jsxs)(import_core145.Box,{children:[(0,import_jsx_runtime112.jsx)(import_core145.Text,{fw:500,className:SummaryItem_default.itemText,children:(0,import_core146.getDisplayString)(allergy)}),(0,import_jsx_runtime112.jsx)(import_core145.Group,{mt:2,gap:4,children:status&&(0,import_jsx_runtime112.jsx)(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):(0,import_jsx_runtime112.jsx)(import_core145.Text,{children:"(none)"})}),(0,import_jsx_runtime112.jsx)(import_core145.Modal,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:(0,import_jsx_runtime112.jsx)(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"}}var import_core147=require("@mantine/core"),import_core148=require("@medplum/core"),import_react_hooks43=require("@medplum/react-hooks");var import_jsx_runtime113=require("react/jsx-runtime");function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=(0,import_react_hooks43.useResource)(coverage),organizationResource=(0,import_react_hooks43.useResource)(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(0,import_jsx_runtime113.jsx)(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:(0,import_jsx_runtime113.jsxs)(import_core147.Box,{children:[(0,import_jsx_runtime113.jsx)(import_core147.Text,{fw:500,className:PatientSummary_default.itemText,children:payorName}),(0,import_jsx_runtime113.jsx)(import_core147.Text,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),(0,import_jsx_runtime113.jsxs)(import_core147.Group,{mt:2,gap:4,children:[(0,import_jsx_runtime113.jsx)(StatusBadge,{color:"green",variant:"light",status:"Active"}),(0,import_jsx_runtime113.jsxs)(import_core147.Text,{size:"xs",fw:500,color:"gray.6",children:["Ends ",(0,import_core148.formatDate)(coverageResource?.period?.end)]})]})]})})}function Insurance(props){let{coverages,onClickResource}=props,activeCoverages=coverages.filter(coverage=>coverage.status==="active");return(0,import_jsx_runtime113.jsx)(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?(0,import_jsx_runtime113.jsx)(import_core147.Flex,{direction:"column",gap:8,children:activeCoverages.map(coverage=>(0,import_jsx_runtime113.jsx)(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):(0,import_jsx_runtime113.jsx)(import_core147.Text,{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 ")??"":""}var import_core155=require("@mantine/core"),import_hooks7=require("@mantine/hooks"),import_core156=require("@medplum/core"),import_react79=require("react");var import_core153=require("@mantine/core"),import_core154=require("@medplum/core"),import_react_hooks45=require("@medplum/react-hooks");var import_react78=require("react");var import_core149=require("@mantine/core");var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};var import_jsx_runtime114=require("react/jsx-runtime");function NoteDisplay({value}){return value?(0,import_jsx_runtime114.jsx)(import_core149.Stack,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&(0,import_jsx_runtime114.jsx)(import_core149.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}var import_core152=require("@mantine/core");var import_core150=require("@mantine/core"),import_core151=require("@medplum/core"),import_react_hooks44=require("@medplum/react-hooks"),import_react77=require("react");var import_jsx_runtime115=require("react/jsx-runtime");function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=(0,import_react77.useState)(),resource=(0,import_react_hooks44.useResource)(value,setOutcome),text;if(outcome&&!(0,import_core151.isOk)(outcome))text=`[${(0,import_core151.normalizeErrorString)(outcome)}]`;else if(resource)text=(0,import_core151.getDisplayString)(resource);else return null;return link?(0,import_jsx_runtime115.jsx)(MedplumLink,{to:value,...rest,children:text}):(0,import_jsx_runtime115.jsx)(import_core150.Text,{component:"span",...rest,children:text})}var import_jsx_runtime116=require("react/jsx-runtime");function ResourceBadge(props){return(0,import_jsx_runtime116.jsxs)(import_core152.Group,{gap:"xs",children:[(0,import_jsx_runtime116.jsx)(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),(0,import_jsx_runtime116.jsx)(ResourceName,{value:props.value,link:props.link})]})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};var import_jsx_runtime117=require("react/jsx-runtime");DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=(0,import_react_hooks45.useMedplum)(),diagnosticReport=(0,import_react_hooks45.useResource)(props.value),[specimens,setSpecimens]=(0,import_react78.useState)();if((0,import_react78.useEffect)(()=>{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(0,import_jsx_runtime117.jsxs)(import_core153.Stack,{children:[(0,import_jsx_runtime117.jsx)(import_core153.Title,{children:"Diagnostic Report"}),(0,import_jsx_runtime117.jsx)(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&(0,import_jsx_runtime117.jsx)(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&(0,import_jsx_runtime117.jsx)(NoteDisplay,{value:specimenNotes}),diagnosticReport.conclusion&&(0,import_jsx_runtime117.jsxs)(import_core153.Stack,{mt:"md",children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{fw:500,size:"sm",c:"dimmed",children:"Conclusion"}),(0,import_jsx_runtime117.jsx)(import_core153.Text,{children:diagnosticReport.conclusion})]})]})}function DiagnosticReportHeader({value,hideSubject=!1}){return(0,import_jsx_runtime117.jsxs)(import_core153.Group,{mt:"md",gap:30,children:[value.subject&&!hideSubject&&(0,import_jsx_runtime117.jsxs)("div",{children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),(0,import_jsx_runtime117.jsx)(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>(0,import_jsx_runtime117.jsxs)("div",{children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),(0,import_jsx_runtime117.jsx)(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>(0,import_jsx_runtime117.jsxs)("div",{children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),(0,import_jsx_runtime117.jsx)(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&(0,import_jsx_runtime117.jsxs)("div",{children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),(0,import_jsx_runtime117.jsx)(import_core153.Text,{children:(0,import_core154.formatDateTime)(value.issued)})]}),value.status&&(0,import_jsx_runtime117.jsxs)("div",{children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),(0,import_jsx_runtime117.jsx)(StatusBadge,{status:value.status})]})]})}function SpecimenInfo(specimens){return(0,import_jsx_runtime117.jsxs)(import_core153.Stack,{gap:"xs",children:[(0,import_jsx_runtime117.jsx)(import_core153.Title,{order:2,size:"h6",children:"Specimens"}),(0,import_jsx_runtime117.jsx)(import_core153.List,{type:"ordered",children:specimens?.map(specimen=>(0,import_jsx_runtime117.jsx)(import_core153.List.Item,{ml:"sm",children:(0,import_jsx_runtime117.jsxs)(import_core153.Group,{gap:20,children:[(0,import_jsx_runtime117.jsxs)(import_core153.Group,{gap:5,children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{fw:500,children:"Collected:"})," ",(0,import_core154.formatDateTime)(specimen.collection?.collectedDateTime)]}),(0,import_jsx_runtime117.jsxs)(import_core153.Group,{gap:5,children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{fw:500,children:"Received:"})," ",(0,import_core154.formatDateTime)(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return(0,import_jsx_runtime117.jsxs)("table",{className:DiagnosticReportDisplay_default.table,children:[(0,import_jsx_runtime117.jsx)("thead",{children:(0,import_jsx_runtime117.jsxs)("tr",{children:[(0,import_jsx_runtime117.jsx)("th",{children:"Test"}),(0,import_jsx_runtime117.jsx)("th",{children:"Value"}),(0,import_jsx_runtime117.jsx)("th",{children:"Reference Range"}),(0,import_jsx_runtime117.jsx)("th",{children:"Interpretation"}),(0,import_jsx_runtime117.jsx)("th",{children:"Category"}),(0,import_jsx_runtime117.jsx)("th",{children:"Performer"}),(0,import_jsx_runtime117.jsx)("th",{children:"Status"})]})}),(0,import_jsx_runtime117.jsx)("tbody",{children:(0,import_jsx_runtime117.jsx)(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return(0,import_jsx_runtime117.jsx)(import_jsx_runtime117.Fragment,{children:props.value?.map(observation=>(0,import_jsx_runtime117.jsx)(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${(0,import_core154.isReference)(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=(0,import_react_hooks45.useResource)(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return(0,import_jsx_runtime117.jsxs)(import_jsx_runtime117.Fragment,{children:[(0,import_jsx_runtime117.jsxs)("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[(0,import_jsx_runtime117.jsx)("td",{rowSpan:displayNotes?2:1,children:(0,import_jsx_runtime117.jsx)(MedplumLink,{to:observation,children:(0,import_jsx_runtime117.jsx)(CodeableConceptDisplay,{value:observation.code})})}),(0,import_jsx_runtime117.jsx)("td",{children:(0,import_jsx_runtime117.jsx)(ObservationValueDisplay,{value:observation})}),(0,import_jsx_runtime117.jsx)("td",{children:(0,import_jsx_runtime117.jsx)(ReferenceRangeDisplay,{value:observation.referenceRange})}),(0,import_jsx_runtime117.jsx)("td",{children:observation.interpretation&&observation.interpretation.length>0&&(0,import_jsx_runtime117.jsx)(CodeableConceptDisplay,{value:observation.interpretation[0]})}),(0,import_jsx_runtime117.jsx)("td",{children:observation.category&&observation.category.length>0&&(0,import_jsx_runtime117.jsx)(import_jsx_runtime117.Fragment,{children:observation.category.map(concept=>(0,import_jsx_runtime117.jsx)("div",{children:(0,import_jsx_runtime117.jsx)(CodeableConceptDisplay,{value:concept})},`category-${(0,import_core154.formatCodeableConcept)(concept)}`))})}),(0,import_jsx_runtime117.jsx)("td",{children:observation.performer?.map(performer=>(0,import_jsx_runtime117.jsx)(ReferenceDisplay,{value:performer},performer.reference))}),(0,import_jsx_runtime117.jsx)("td",{children:observation.status&&(0,import_jsx_runtime117.jsx)(StatusBadge,{status:observation.status})})]}),observation.hasMember&&(0,import_jsx_runtime117.jsx)(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&(0,import_jsx_runtime117.jsx)("tr",{children:(0,import_jsx_runtime117.jsx)("td",{colSpan:6,children:(0,import_jsx_runtime117.jsx)(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return(0,import_jsx_runtime117.jsx)(import_jsx_runtime117.Fragment,{children:(0,import_core154.formatObservationValue)(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?(0,import_jsx_runtime117.jsx)(import_jsx_runtime117.Fragment,{children:range.text}):(0,import_jsx_runtime117.jsx)(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_jsx_runtime118=require("react/jsx-runtime");function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=(0,import_react79.useState)(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=(0,import_hooks7.useDisclosure)(!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(0,import_jsx_runtime118.jsxs)(import_jsx_runtime118.Fragment,{children:[(0,import_jsx_runtime118.jsx)(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:(0,import_jsx_runtime118.jsxs)(import_core155.Flex,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>(0,import_jsx_runtime118.jsx)(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:(0,import_jsx_runtime118.jsxs)(import_core155.Box,{children:[(0,import_jsx_runtime118.jsx)(import_core155.Text,{fw:500,className:SummaryItem_default.itemText,children:(0,import_core156.getDisplayString)(serviceRequest)}),(0,import_jsx_runtime118.jsxs)(import_core155.Group,{mt:2,gap:4,children:[serviceRequest.status&&(0,import_jsx_runtime118.jsx)(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),(0,import_jsx_runtime118.jsx)(import_core155.Text,{size:"xs",fw:500,c:"dimmed",children:(0,import_core156.formatDate)(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>(0,import_jsx_runtime118.jsx)(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:(0,import_jsx_runtime118.jsxs)(import_core155.Box,{children:[(0,import_jsx_runtime118.jsx)(import_core155.Text,{fw:500,className:SummaryItem_default.itemText,children:(0,import_core156.getDisplayString)(report)}),(0,import_jsx_runtime118.jsxs)(import_core155.Group,{mt:2,gap:4,children:[report.status&&(0,import_jsx_runtime118.jsx)(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),(0,import_jsx_runtime118.jsx)(import_core155.Text,{size:"xs",fw:500,c:"dimmed",children:(0,import_core156.formatDate)(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&(0,import_jsx_runtime118.jsx)(import_core155.Text,{children:"(none)"})]})}),(0,import_jsx_runtime118.jsx)(import_core155.Modal,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&(0,import_jsx_runtime118.jsx)(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))}var import_core159=require("@mantine/core"),import_hooks8=require("@mantine/hooks"),import_core160=require("@medplum/core"),import_react_hooks47=require("@medplum/react-hooks"),import_react81=require("react");var import_core157=require("@mantine/core"),import_core158=require("@medplum/core"),import_react_hooks46=require("@medplum/react-hooks"),import_react80=require("react");var import_jsx_runtime119=require("react/jsx-runtime"),HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=(0,import_react_hooks46.useMedplumProfile)(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=(0,import_react80.useState)(medication?.medicationCodeableConcept),handleSubmit=(0,import_react80.useCallback)(formData=>{if(!me)throw new Error("Not signed in");onSubmit((0,import_core158.addProfileToResource)({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&(0,import_core158.createReference)(encounter)),requester:medication?.requester??(0,import_core158.createReference)(me),medicationCodeableConcept:code,subject:(0,import_core158.createReference)(patient)},import_core158.HTTP_HL7_ORG+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?(0,import_jsx_runtime119.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime119.jsxs)(import_core157.Stack,{children:[(0,import_jsx_runtime119.jsx)(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}),(0,import_jsx_runtime119.jsx)(import_core157.Radio.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>(0,import_jsx_runtime119.jsx)(import_core157.Radio,{value:sv,label:sv,my:"xs",required:!0},sv))}),(0,import_jsx_runtime119.jsx)(import_core157.Group,{justify:"flex-end",gap:4,children:(0,import_jsx_runtime119.jsx)(SubmitButton,{children:"Save"})})]})}):(0,import_jsx_runtime119.jsx)(import_core157.Alert,{color:"red",children:"Not signed in"})}var import_jsx_runtime120=require("react/jsx-runtime");function Medications(props){let medplum=(0,import_react_hooks47.useMedplum)(),[medicationRequests,setMedicationRequests]=(0,import_react81.useState)(props.medicationRequests),[editMedication,setEditMedication]=(0,import_react81.useState)(),[opened,{open,close}]=(0,import_hooks8.useDisclosure)(!1),handleSubmit=(0,import_react81.useCallback)(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(0,import_jsx_runtime120.jsxs)(import_jsx_runtime120.Fragment,{children:[(0,import_jsx_runtime120.jsx)(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medicationRequests.length>0?(0,import_jsx_runtime120.jsx)(import_core159.Flex,{direction:"column",gap:8,children:medicationRequests.map(medication=>(0,import_jsx_runtime120.jsx)(SummaryItem,{onClick:()=>{setEditMedication(medication),open()},children:(0,import_jsx_runtime120.jsxs)(import_core159.Box,{children:[(0,import_jsx_runtime120.jsx)(import_core159.Text,{fw:500,className:SummaryItem_default.itemText,children:(0,import_core160.getDisplayString)(medication)}),(0,import_jsx_runtime120.jsx)(import_core159.Group,{mt:2,gap:4,children:medication.status&&(0,import_jsx_runtime120.jsx)(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},medication.id))}):(0,import_jsx_runtime120.jsx)(import_core159.Text,{children:"(none)"})}),(0,import_jsx_runtime120.jsx)(import_core159.Modal,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:(0,import_jsx_runtime120.jsx)(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"}}var import_core161=require("@mantine/core");var import_jsx_runtime121=require("react/jsx-runtime"),PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return(0,import_jsx_runtime121.jsx)(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:(0,import_jsx_runtime121.jsx)(import_core161.Box,{className:PatientSummary_default.patientSummaryListItem,children:(0,import_jsx_runtime121.jsx)(import_core161.Tooltip,{label,position:"top-start",openDelay:650,children:(0,import_jsx_runtime121.jsxs)(import_core161.Group,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,(0,import_jsx_runtime121.jsx)(import_core161.Text,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};var import_core162=require("@medplum/core");function getGenderIdentity(patient){return(0,import_core162.getExtension)(patient,`${import_core162.HTTP_HL7_ORG}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return(0,import_core162.getExtension)(patient,`${import_core162.HTTP_HL7_ORG}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return(0,import_core162.getExtension)(patient,`${import_core162.HTTP_HL7_ORG}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return(0,import_core162.getExtension)(patient,`${import_core162.HTTP_HL7_ORG}/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?(0,import_core162.capitalize)(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};var import_core164=require("@mantine/core"),import_hooks9=require("@mantine/hooks"),import_core165=require("@medplum/core"),import_react_hooks48=require("@medplum/react-hooks"),import_react82=require("react");var import_core163=require("@medplum/core");var import_jsx_runtime122=require("react/jsx-runtime");function Pharmacies(props){let{patient:patientProp,onClickResource,pharmacyDialogComponent}=props,PharmacyDialogComponent=pharmacyDialogComponent,medplum=(0,import_react_hooks48.useMedplum)(),[opened,{open,close}]=(0,import_hooks9.useDisclosure)(!1),[resolvedPharmacies,setResolvedPharmacies]=(0,import_react82.useState)([]),[loadState,setLoadState]=(0,import_react82.useState)("loading"),patient=(0,import_react_hooks48.useResource)(patientProp),pharmacyRefs=(0,import_react82.useMemo)(()=>patient?(0,import_core163.getPreferredPharmaciesFromPatient)(patient):[],[patient]);(0,import_react82.useEffect)(()=>{let cancelled=!1;return(async()=>{if(props.pharmacies){cancelled||(setResolvedPharmacies(props.pharmacies),setLoadState("loaded"));return}if(pharmacyRefs.length===0){cancelled||(setResolvedPharmacies([]),setLoadState("loaded"));return}setLoadState("loading");try{let results=await Promise.all(pharmacyRefs.map(async pharmacyRef=>{try{return{...await medplum.readReference(pharmacyRef.organizationRef),isPrimary:pharmacyRef.isPrimary}}catch(error){return isNotFoundError(error),null}}));if(!cancelled){let validResults=results.filter(result=>result!==null);setResolvedPharmacies(validResults),setLoadState(validResults.length===0&&pharmacyRefs.length>0?"error":"loaded")}}catch{cancelled||setLoadState("error")}})().catch(()=>{}),()=>{cancelled=!0}},[medplum,pharmacyRefs,props.pharmacies]);let handleSubmit=(0,import_react82.useCallback)(async _pharmacy=>{patient?.id&&medplum.invalidateUrl((0,import_core165.getReferenceString)(patient)),close()},[medplum,patient,close]);return patient?(0,import_jsx_runtime122.jsxs)(import_jsx_runtime122.Fragment,{children:[(0,import_jsx_runtime122.jsx)(CollapsibleSection,{title:"Pharmacies",onAdd:pharmacyDialogComponent?open:void 0,children:loadState==="loading"?(0,import_jsx_runtime122.jsx)(import_core164.Loader,{size:"sm"}):loadState==="error"?(0,import_jsx_runtime122.jsx)(import_core164.Text,{c:"red",size:"sm",children:"Failed to load pharmacies"}):resolvedPharmacies.length===0?(0,import_jsx_runtime122.jsx)(import_core164.Text,{children:"(none)"}):(0,import_jsx_runtime122.jsx)(import_core164.Box,{children:(0,import_jsx_runtime122.jsx)(import_core164.Flex,{direction:"column",gap:8,children:resolvedPharmacies.map((pharmacy,index)=>(0,import_jsx_runtime122.jsx)(SummaryItem,{onClick:()=>onClickResource?.(pharmacy),children:(0,import_jsx_runtime122.jsxs)(import_core164.Box,{children:[(0,import_jsx_runtime122.jsx)(import_core164.Text,{fw:500,className:SummaryItem_default.itemText,children:pharmacy.name}),(0,import_jsx_runtime122.jsxs)(import_core164.Group,{mt:2,gap:4,children:[pharmacy.isPrimary&&(0,import_jsx_runtime122.jsx)(StatusBadge,{color:"blue",variant:"light",status:"primary"}),pharmacy.address?.[0]&&(0,import_jsx_runtime122.jsx)(import_core164.Text,{size:"xs",c:"dimmed",children:(0,import_core165.formatAddress)(pharmacy.address[0])})]})]})},pharmacy.id||index))})})}),PharmacyDialogComponent?(0,import_jsx_runtime122.jsx)(import_core164.Modal,{opened,onClose:close,title:"Add Pharmacy",size:"lg",children:(0,import_jsx_runtime122.jsx)(PharmacyDialogComponent,{patient,onSubmit:handleSubmit,onClose:close})}):null]}):(0,import_jsx_runtime122.jsx)(import_jsx_runtime122.Fragment,{})}function isNotFoundError(error){return error instanceof import_core165.OperationOutcomeError?error.outcome.issue?.some(issue=>issue.code==="not-found")??!1:!1}var import_core168=require("@mantine/core"),import_hooks10=require("@mantine/hooks"),import_core169=require("@medplum/core"),import_react_hooks49=require("@medplum/react-hooks"),import_react84=require("react");var import_core166=require("@mantine/core"),import_core167=require("@medplum/core"),import_react83=require("react");var import_jsx_runtime123=require("react/jsx-runtime");function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=(0,import_react83.useState)(condition?.code),[clinicalStatus,setClinicalStatus]=(0,import_react83.useState)(condition?.clinicalStatus),handleSubmit=(0,import_react83.useCallback)(formData=>{let updatedCondition=(0,import_core167.addProfileToResource)({...condition,resourceType:"Condition",category:[{coding:[{system:import_core167.HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:(0,import_core167.createReference)(patient),encounter:encounter&&(0,import_core167.createReference)(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},import_core167.HTTP_HL7_ORG+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return(0,import_jsx_runtime123.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime123.jsxs)(import_core166.Stack,{children:[(0,import_jsx_runtime123.jsx)(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:import_core167.HTTP_HL7_ORG+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),(0,import_jsx_runtime123.jsx)(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:import_core167.HTTP_HL7_ORG+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),(0,import_jsx_runtime123.jsx)(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),(0,import_jsx_runtime123.jsx)(import_core166.Group,{justify:"flex-end",gap:4,mt:"md",children:(0,import_jsx_runtime123.jsx)(SubmitButton,{children:"Save"})})]})},condition?.id)}var import_jsx_runtime124=require("react/jsx-runtime");function getCodeKey(condition){let coding=condition.code?.coding?.[0];return coding?.system&&coding?.code?`${coding.system}|${coding.code}`:coding?.code?coding.code:condition.code?.text??condition.id}function ProblemList(props){let medplum=(0,import_react_hooks49.useMedplum)(),{patient,encounter}=props,[problems,setProblems]=(0,import_react84.useState)(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=(0,import_react84.useState)(),[opened,{open,close}]=(0,import_hooks10.useDisclosure)(!1),[expandedGroups,setExpandedGroups]=(0,import_react84.useState)(()=>new Set),groupedProblems=(0,import_react84.useMemo)(()=>{let groups=new Map;for(let i=0;i<problems.length;i++){let problem=problems[i],key=getCodeKey(problem)??`ungrouped-${i}`,existing=groups.get(key);existing?existing.push(problem):groups.set(key,[problem])}return Array.from(groups.entries())},[problems]),toggleGroup=(0,import_react84.useCallback)(key=>{setExpandedGroups(prev=>{let next=new Set(prev);return next.has(key)?next.delete(key):next.add(key),next})},[]),handleSubmit=(0,import_react84.useCallback)(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(0,import_jsx_runtime124.jsxs)(import_jsx_runtime124.Fragment,{children:[(0,import_jsx_runtime124.jsx)(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?(0,import_jsx_runtime124.jsx)(import_core168.Flex,{direction:"column",gap:8,children:groupedProblems.map(([key,group],groupIndex)=>{let isExpanded=expandedGroups.has(key),displayProblems=isExpanded?group:[group[0]],groupContentId=`problem-group-content-${groupIndex}`;return(0,import_jsx_runtime124.jsxs)(import_core168.Box,{children:[(0,import_jsx_runtime124.jsx)(import_core168.Flex,{direction:"column",gap:4,id:groupContentId,children:displayProblems.map(problem=>(0,import_jsx_runtime124.jsx)(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:(0,import_jsx_runtime124.jsxs)(import_core168.Box,{children:[(0,import_jsx_runtime124.jsxs)(import_core168.Group,{gap:6,wrap:"nowrap",children:[(0,import_jsx_runtime124.jsx)(import_core168.Text,{fw:500,className:SummaryItem_default.itemText,children:(0,import_core169.getDisplayString)(problem)}),!isExpanded&&group.length>1&&(0,import_jsx_runtime124.jsxs)(import_core168.Badge,{size:"xs",color:"gray",variant:"light",style:{flexShrink:0},children:["+",group.length-1]})]}),(0,import_jsx_runtime124.jsxs)(import_core168.Group,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&(0,import_jsx_runtime124.jsx)(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),(0,import_jsx_runtime124.jsx)(import_core168.Text,{size:"xs",fw:500,c:"dimmed",children:(0,import_core169.formatDate)(problem.onsetDateTime)})]})]})},problem.id))}),group.length>1&&(0,import_jsx_runtime124.jsx)(import_core168.UnstyledButton,{onClick:()=>toggleGroup(key),"aria-expanded":isExpanded,"aria-controls":groupContentId,pl:4,pt:2,style:{fontSize:"var(--mantine-font-size-xs)",color:"var(--mantine-color-dimmed)"},children:isExpanded?"Show less":`Show all ${group.length} entries`})]},key)})}):(0,import_jsx_runtime124.jsx)(import_core168.Text,{children:"(none)"})}),(0,import_jsx_runtime124.jsx)(import_core168.Modal,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:(0,import_jsx_runtime124.jsx)(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"}};var import_core170=require("@mantine/core"),import_hooks11=require("@mantine/hooks"),import_core171=require("@medplum/core"),import_react_hooks50=require("@medplum/react-hooks"),import_react85=require("react");var import_jsx_runtime125=require("react/jsx-runtime"),NULLFLAVOR=import_core171.HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/v3-NullFlavor",CodesToText={38628009:"Homosexual",20430005:"Heterosexual",42035005:"Bisexual",OTH:"Other",UNK:"Unknown",ASKU:"Asked but no answer"},CodesToSystem={38628009:import_core171.SNOMED,20430005:import_core171.SNOMED,42035005:import_core171.SNOMED,OTH:NULLFLAVOR,UNK:NULLFLAVOR,ASKU:NULLFLAVOR};function SexualOrientation(props){let{patient,encounter}=props,medplum=(0,import_react_hooks50.useMedplum)(),[sexualOrientation,setSexualOrientation]=(0,import_react85.useState)(props.sexualOrientation),[opened,{open,close}]=(0,import_hooks11.useDisclosure)(!1),[hoverIndex,setHoverIndex]=(0,import_react85.useState)(null),handleSubmit=(0,import_react85.useCallback)(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[import_core171.HTTP_HL7_ORG+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:import_core171.HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:import_core171.LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:(0,import_core171.createReference)(patient),encounter:encounter?(0,import_core171.createReference)(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(0,import_jsx_runtime125.jsxs)(import_jsx_runtime125.Fragment,{children:[(0,import_jsx_runtime125.jsx)(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?(0,import_jsx_runtime125.jsx)(import_core170.Flex,{direction:"column",gap:8,children:(0,import_jsx_runtime125.jsx)(import_core170.Box,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:(0,import_jsx_runtime125.jsx)(import_core170.UnstyledButton,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:(0,import_jsx_runtime125.jsx)(import_core170.Box,{pr:hoverIndex===0?24:0,children:(0,import_jsx_runtime125.jsx)(import_core170.Text,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):(0,import_jsx_runtime125.jsx)(import_core170.Text,{children:"(none)"})}),(0,import_jsx_runtime125.jsx)(import_core170.Modal,{opened,onClose:close,title:"Set Sexual Orientation",children:(0,import_jsx_runtime125.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime125.jsxs)(import_core170.Stack,{children:[(0,import_jsx_runtime125.jsx)(import_core170.Radio.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>(0,import_jsx_runtime125.jsx)(import_core170.Radio,{value:code,label:text,my:"xs"},code))}),(0,import_jsx_runtime125.jsx)(import_core170.Group,{justify:"flex-end",gap:4,mt:"md",children:(0,import_jsx_runtime125.jsx)(SubmitButton,{children:"Save"})})]})})})]})}var import_core172=require("@mantine/core"),import_hooks12=require("@mantine/hooks"),import_core173=require("@medplum/core"),import_react_hooks51=require("@medplum/react-hooks"),import_react86=require("react");var import_jsx_runtime126=require("react/jsx-runtime"),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=(0,import_react_hooks51.useMedplum)(),[smokingStatus,setSmokingStatus]=(0,import_react86.useState)(props.smokingStatus),[opened,{open,close}]=(0,import_hooks12.useDisclosure)(!1),handleSubmit=(0,import_react86.useCallback)(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[import_core173.HTTP_HL7_ORG+"/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:import_core173.LOINC,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:(0,import_core173.createReference)(props.patient),encounter:props.encounter?(0,import_core173.createReference)(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:import_core173.SNOMED,version:import_core173.SNOMED+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return(0,import_jsx_runtime126.jsxs)(import_jsx_runtime126.Fragment,{children:[(0,import_jsx_runtime126.jsx)(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?(0,import_jsx_runtime126.jsx)(import_core172.UnstyledButton,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:(0,import_jsx_runtime126.jsx)(import_core172.Text,{children:(0,import_core173.formatCodeableConcept)(smokingStatus.valueCodeableConcept)})}):(0,import_jsx_runtime126.jsx)(import_core172.Text,{children:"(none)"})}),(0,import_jsx_runtime126.jsx)(import_core172.Modal,{opened,onClose:close,title:"Set Smoking Status",children:(0,import_jsx_runtime126.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime126.jsxs)(import_core172.Stack,{children:[(0,import_jsx_runtime126.jsx)(import_core172.Radio.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>(0,import_jsx_runtime126.jsx)(import_core172.Radio,{value:code,label:text,my:"xs"},code))}),(0,import_jsx_runtime126.jsx)(import_core172.Group,{justify:"flex-end",gap:4,mt:"md",children:(0,import_jsx_runtime126.jsx)(SubmitButton,{children:"Save"})})]})})})]})}var import_core175=require("@mantine/core"),import_hooks13=require("@mantine/hooks"),import_core176=require("@medplum/core"),import_react_hooks52=require("@medplum/react-hooks"),import_react87=require("react");var import_core174=require("@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:(0,import_core174.createReference)(patient),encounter:encounter?(0,import_core174.createReference)(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:import_core174.LOINC}],text:display}}function createQuantity(value,unit){return{value,system:import_core174.UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!Number.isNaN(value)&&Number.isFinite(value)}var import_jsx_runtime127=require("react/jsx-runtime"),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=(0,import_react_hooks52.useMedplum)(),{patient,encounter}=props,[vitals,setVitals]=(0,import_react87.useState)(props.vitals),[opened,{open,close}]=(0,import_hooks13.useDisclosure)(!1),handleSubmit=(0,import_react87.useCallback)(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(0,import_jsx_runtime127.jsxs)(import_jsx_runtime127.Fragment,{children:[(0,import_jsx_runtime127.jsx)(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:(0,import_jsx_runtime127.jsx)(import_core175.Stack,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return(0,import_jsx_runtime127.jsxs)(import_core175.Group,{align:"center",children:[(0,import_jsx_runtime127.jsx)(import_core175.Text,{c:"dimmed",children:meta.short}),obs&&(0,import_jsx_runtime127.jsx)(import_core175.Text,{children:(0,import_core176.formatQuantity)(getObservationValue(obs,meta.component))})]},meta.name)})})}),(0,import_jsx_runtime127.jsx)(import_core175.Modal,{opened,onClose:close,title:"Add Vitals",children:(0,import_jsx_runtime127.jsxs)(Form,{onSubmit:handleSubmit,children:[(0,import_jsx_runtime127.jsx)(import_core175.SimpleGrid,{cols:2,children:LOINC_CODES.map((meta,index)=>(0,import_jsx_runtime127.jsx)(import_core175.TextInput,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),(0,import_jsx_runtime127.jsx)(import_core175.Textarea,{name:"notes",label:"Notes"}),(0,import_jsx_runtime127.jsx)(import_core175.Group,{justify:"flex-end",gap:4,mt:"md",children:(0,import_jsx_runtime127.jsx)(SubmitButton,{children:"Save"})})]})})]})}var import_jsx_runtime128=require("react/jsx-runtime"),DemographicsSection={key:"demographics",title:"Demographics",component:({patient,onClickResource})=>{let languageDisplay=getPreferredLanguage(patient);return(0,import_jsx_runtime128.jsxs)(import_core177.Stack,{gap:"xs",py:8,children:[(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${(0,import_core178.calculateAgeString)(patient.birthDate)})`:void 0,icon:(0,import_jsx_runtime128.jsx)(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:(0,import_jsx_runtime128.jsx)(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:(0,import_jsx_runtime128.jsx)(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:patient.address?.[0]?(0,import_core178.formatAddress)(patient.address[0]):void 0,icon:(0,import_jsx_runtime128.jsx)(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:languageDisplay,icon:(0,import_jsx_runtime128.jsx)(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:(0,import_jsx_runtime128.jsx)(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add General Practitioner",label:"General Practitioner",onClickResource})]})}},InsuranceSection={key:"insurance",title:"Insurance",searches:[{key:"coverages",resourceType:"Coverage",patientParam:"beneficiary"}],component:({results,onClickResource})=>(0,import_jsx_runtime128.jsx)(Insurance,{coverages:results.coverages||[],onClickResource})},AllergiesSection={key:"allergies",title:"Allergies",searches:[{key:"allergies",resourceType:"AllergyIntolerance",patientParam:"patient"}],component:({results,patient,onClickResource})=>(0,import_jsx_runtime128.jsx)(Allergies,{patient,allergies:results.allergies||[],onClickResource})},ProblemListSection={key:"problemList",title:"Problems",searches:[{key:"conditions",resourceType:"Condition",patientParam:"patient"}],component:({results,patient,onClickResource})=>(0,import_jsx_runtime128.jsx)(ProblemList,{patient,problems:results.conditions||[],onClickResource})},MedicationsSection={key:"medications",title:"Medications",searches:[{key:"medications",resourceType:"MedicationRequest",patientParam:"subject"}],component:({results,patient,onClickResource})=>(0,import_jsx_runtime128.jsx)(Medications,{patient,medicationRequests:results.medications||[],onClickResource})};function createLabsSection(onRequestLabs){return{key:"labs",title:"Labs",searches:[{key:"serviceRequests",resourceType:"ServiceRequest",patientParam:"subject"},{key:"diagnosticReports",resourceType:"DiagnosticReport",patientParam:"subject"}],component:({results,patient,onClickResource})=>(0,import_jsx_runtime128.jsx)(Labs,{patient,serviceRequests:results.serviceRequests||[],diagnosticReports:results.diagnosticReports||[],onClickResource,onRequestLabs})}}var LabsSection=createLabsSection(),SexualOrientationSection={key:"sexualOrientation",title:"Sexual Orientation",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{code:"76690-7"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return(0,import_jsx_runtime128.jsx)(SexualOrientation,{patient,sexualOrientation:observations[0],onClickResource})}},SmokingStatusSection={key:"smokingStatus",title:"Smoking Status",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{code:"72166-2"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return(0,import_jsx_runtime128.jsx)(SmokingStatus,{patient,smokingStatus:observations[0],onClickResource})}},VitalsSection={key:"vitals",title:"Vitals",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{category:"vital-signs"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return(0,import_jsx_runtime128.jsx)(Vitals,{patient,vitals:observations,onClickResource})}};function createPharmaciesSection(pharmacyDialogComponent){return{key:"pharmacies",title:"Pharmacies",component:({patient,onClickResource})=>(0,import_jsx_runtime128.jsx)(Pharmacies,{patient,onClickResource,pharmacyDialogComponent})}}var PharmaciesSection=createPharmaciesSection();function getDefaultSections(onRequestLabs){return[DemographicsSection,InsuranceSection,AllergiesSection,ProblemListSection,MedicationsSection,createLabsSection(onRequestLabs),SexualOrientationSection,SmokingStatusSection,VitalsSection,PharmaciesSection]}var import_jsx_runtime129=require("react/jsx-runtime");function PatientSummary(props){let medplum=(0,import_react_hooks53.useMedplum)(),{patient:propsPatient,onClickResource,onRequestLabs}=props,patient=(0,import_react_hooks53.useResource)(propsPatient),[createdDate,setCreatedDate]=(0,import_react88.useState)(),defaultSections=(0,import_react88.useMemo)(()=>getDefaultSections(onRequestLabs),[onRequestLabs]),sections=props.sections??defaultSections,{sectionData,loading,error}=(0,import_react_hooks53.usePatientSummaryData)(propsPatient,sections);return(0,import_react88.useEffect)(()=>{let id=(0,import_core180.resolveId)(propsPatient);id&&medplum.readHistory("Patient",id).then(history=>{let lastUpdated=history.entry?.[history.entry.length-1]?.resource?.meta?.lastUpdated;setCreatedDate(typeof lastUpdated=="string"?lastUpdated:"")}).catch(()=>{})},[propsPatient,medplum]),patient?(0,import_jsx_runtime129.jsxs)(import_core179.Flex,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[(0,import_jsx_runtime129.jsxs)(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[(0,import_jsx_runtime129.jsxs)(import_core179.Group,{align:"center",gap:"sm",p:16,children:[(0,import_jsx_runtime129.jsx)(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),(0,import_jsx_runtime129.jsxs)(import_core179.Stack,{gap:0,style:{flex:1,minWidth:0},children:[(0,import_jsx_runtime129.jsx)(import_core179.Tooltip,{label:(0,import_core180.formatHumanName)(patient.name?.[0]),position:"top-start",openDelay:650,children:(0,import_jsx_runtime129.jsx)(import_core179.Text,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:(0,import_core180.formatHumanName)(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return(0,import_jsx_runtime129.jsxs)(import_core179.Text,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),(0,import_jsx_runtime129.jsx)(import_core179.Divider,{})]}),(0,import_jsx_runtime129.jsxs)(import_core179.Stack,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:[error&&(0,import_jsx_runtime129.jsxs)(import_core179.Text,{c:"red",fz:"sm",children:["Error loading patient summary: ",error.message]}),!loading&&sections.length>0&&(0,import_jsx_runtime129.jsx)(import_jsx_runtime129.Fragment,{children:sections.map((section,index)=>{let SectionComponent=section.component;return(0,import_jsx_runtime129.jsxs)("div",{children:[(0,import_jsx_runtime129.jsx)(SectionComponent,{patient,onClickResource,results:sectionData[index]??{}}),(0,import_jsx_runtime129.jsx)(import_core179.Divider,{})]},section.key)})})]})]}):null}var ThreadInbox_default={container:"ThreadInbox_container",rightBorder:"ThreadInbox_rightBorder"};var import_jsx_runtime130=require("react/jsx-runtime");function ThreadInbox(props){let{query,threadId,subject,showPatientSummary=!1,sections,onNew,getThreadUri,uploadEnabled,onViewInDocuments,onChange,inProgressUri,completedUri,allowPatientSelection=!1}=props,navigate=(0,import_react_hooks54.useMedplumNavigate)(),[modalOpened,{open:openModal,close:closeModal}]=(0,import_hooks14.useDisclosure)(!1),currentSearch=(0,import_react89.useMemo)(()=>(0,import_core182.parseSearchRequest)(`Communication?${query}`),[query]),searchParams=(0,import_react89.useMemo)(()=>new URLSearchParams(query),[query]),itemsPerPage=Number.parseInt(searchParams.get("_count")||"20",10),currentOffset=Number.parseInt(searchParams.get("_offset")||"0",10),currentPage=Math.floor(currentOffset/itemsPerPage)+1,status=searchParams.get("status")||"in-progress",selectedParticipants=(0,import_react89.useMemo)(()=>(currentSearch.filters?.filter(f=>f.code==="recipient")??[]).flatMap(f=>f.value.split(",").filter(Boolean).map(ref=>({reference:ref}))),[currentSearch]),{loading,error,threadMessages,selectedThread,total,handleThreadStatusChange,addThreadMessage,refreshThreadMessages}=(0,import_react_hooks54.useThreadInbox)({query,threadId}),handleParticipantsChange=(0,import_react89.useCallback)(participants=>{let otherFilters=currentSearch.filters?.filter(f=>f.code!=="recipient")??[],participantRefs=participants.map(p=>p.reference).filter(Boolean),newFilters=participantRefs.length>0?[...otherFilters,{code:"recipient",operator:import_core182.Operator.EQUALS,value:participantRefs.join(",")}]:otherFilters;onChange({...currentSearch,filters:newFilters,offset:0})},[currentSearch,onChange]),skeletonTitleWidths=[80,72,68,64],skeletonSubtitleWidths=[85,78,70,60];(0,import_react89.useEffect)(()=>{error&&(0,import_notifications8.showNotification)({title:"Error",message:(0,import_core182.normalizeErrorString)(error),color:"red"})},[error]);let handleTopicStatusChangeWithErrorHandling=async newStatus=>{handleThreadStatusChange(newStatus);try{await refreshThreadMessages()}catch(error2){(0,import_notifications8.showNotification)({title:"Error",message:(0,import_core182.normalizeErrorString)(error2),color:"red"})}},handleNewTopicCompletion=message=>{addThreadMessage(message),onNew(message)};return(0,import_jsx_runtime130.jsxs)(import_jsx_runtime130.Fragment,{children:[(0,import_jsx_runtime130.jsx)("div",{className:ThreadInbox_default.container,children:(0,import_jsx_runtime130.jsxs)(import_core181.Flex,{direction:"row",h:"100%",w:"100%",children:[(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",w:380,h:"100%",className:ThreadInbox_default.rightBorder,children:(0,import_jsx_runtime130.jsxs)(import_core181.Paper,{h:"100%",style:{display:"flex",flexDirection:"column"},children:[(0,import_jsx_runtime130.jsxs)(import_core181.ScrollArea,{style:{flex:1},scrollbarSize:10,type:"hover",scrollHideDelay:250,children:[(0,import_jsx_runtime130.jsxs)(import_core181.Flex,{h:64,align:"center",justify:"space-between",p:"md",children:[(0,import_jsx_runtime130.jsx)(import_core181.Tabs,{value:status,onChange:value=>{navigate(value==="in-progress"?inProgressUri:completedUri)},variant:"unstyled",className:"pill-tabs",children:(0,import_jsx_runtime130.jsxs)(import_core181.Tabs.List,{children:[(0,import_jsx_runtime130.jsx)(import_core181.Tabs.Tab,{value:"in-progress",children:"In Progress"}),(0,import_jsx_runtime130.jsx)(import_core181.Tabs.Tab,{value:"completed",children:"Completed"})]})}),(0,import_jsx_runtime130.jsxs)(import_core181.Group,{gap:"xs",children:[(0,import_jsx_runtime130.jsx)(ParticipantFilter,{selectedParticipants,onFilterChange:handleParticipantsChange}),(0,import_jsx_runtime130.jsx)(import_core181.Tooltip,{label:"New Message",position:"bottom",openDelay:500,children:(0,import_jsx_runtime130.jsx)(import_core181.ActionIcon,{radius:"xl",variant:"filled",color:"blue",size:32,onClick:openModal,children:(0,import_jsx_runtime130.jsx)(IconPlus,{size:16})})})]})]}),(0,import_jsx_runtime130.jsx)(import_core181.Divider,{}),loading?(0,import_jsx_runtime130.jsx)(import_core181.Stack,{gap:"md",p:"md",children:Array.from({length:10}).map((_,index)=>{let titleWidth=skeletonTitleWidths[index%skeletonTitleWidths.length],subtitleWidth=skeletonSubtitleWidths[index%skeletonSubtitleWidths.length];return(0,import_jsx_runtime130.jsxs)(import_core181.Flex,{gap:"sm",align:"flex-start",children:[(0,import_jsx_runtime130.jsx)(import_core181.Skeleton,{height:40,width:40,radius:"50%"}),(0,import_jsx_runtime130.jsx)(import_core181.Box,{style:{flex:1},children:(0,import_jsx_runtime130.jsxs)(import_core181.Flex,{direction:"column",gap:"xs",children:[(0,import_jsx_runtime130.jsx)(import_core181.Skeleton,{height:16,width:`${titleWidth}%`}),(0,import_jsx_runtime130.jsx)(import_core181.Skeleton,{height:14,width:`${subtitleWidth}%`})]})})]},index)})}):threadMessages.length>0&&(0,import_jsx_runtime130.jsx)(ChatList,{threads:threadMessages,selectedCommunication:selectedThread,getThreadUri}),threadMessages.length===0&&!loading&&(0,import_jsx_runtime130.jsx)(EmptyMessagesState,{})]}),!loading&&total!==void 0&&total>itemsPerPage&&(0,import_jsx_runtime130.jsx)(import_core181.Box,{p:"md",children:(0,import_jsx_runtime130.jsx)(import_core181.Center,{children:(0,import_jsx_runtime130.jsx)(import_core181.Pagination,{value:currentPage,total:Math.ceil(total/itemsPerPage),onChange:page=>{let offset=(page-1)*itemsPerPage;onChange({...currentSearch,offset})},size:"sm",siblings:1,boundaries:1})})})]})}),selectedThread?(0,import_jsx_runtime130.jsxs)(import_jsx_runtime130.Fragment,{children:[(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",style:{flex:1},h:"100%",className:ThreadInbox_default.rightBorder,children:(0,import_jsx_runtime130.jsx)(import_core181.Paper,{h:"100%",children:(0,import_jsx_runtime130.jsxs)(import_core181.Stack,{h:"100%",gap:0,children:[(0,import_jsx_runtime130.jsxs)(import_core181.Flex,{h:64,align:"center",justify:"space-between",p:"md",children:[(0,import_jsx_runtime130.jsx)(import_core181.Text,{fw:800,truncate:!0,fz:"lg",children:selectedThread.topic?.text??"Messages"}),(0,import_jsx_runtime130.jsxs)(import_core181.Menu,{position:"bottom-end",shadow:"md",children:[(0,import_jsx_runtime130.jsx)(import_core181.Menu.Target,{children:(0,import_jsx_runtime130.jsx)(import_core181.Button,{variant:"light",color:getStatusColor4(selectedThread.status),rightSection:selectedThread.status==="completed"?void 0:(0,import_jsx_runtime130.jsx)(IconChevronDown,{size:16}),radius:"xl",size:"sm",children:selectedThread.status.split("-").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")})}),selectedThread.status!=="completed"&&(0,import_jsx_runtime130.jsx)(import_core181.Menu.Dropdown,{children:(0,import_jsx_runtime130.jsx)(import_core181.Menu.Item,{onClick:()=>handleTopicStatusChangeWithErrorHandling("completed"),children:"Completed"})})]})]}),(0,import_jsx_runtime130.jsx)(import_core181.Divider,{}),(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",style:{flex:1},h:"100%",children:(0,import_jsx_runtime130.jsx)(ThreadChat,{title:"Messages",thread:selectedThread,excludeHeader:!0,uploadEnabled,onViewInDocuments},`${(0,import_core182.getReferenceString)(selectedThread)}`)})]})})}),selectedThread.subject&&showPatientSummary&&(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",w:300,h:"100%",children:(0,import_jsx_runtime130.jsx)(import_core181.ScrollArea,{p:0,h:"100%",scrollbarSize:10,type:"hover",scrollHideDelay:250,children:(0,import_jsx_runtime130.jsx)(PatientSummary,{patient:selectedThread.subject,sections},selectedThread.id)})})]}):(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",style:{flex:1},h:"100%",children:(0,import_jsx_runtime130.jsx)(NoMessages,{})})]})}),(0,import_jsx_runtime130.jsx)(NewTopicDialog,{subject,opened:modalOpened,onClose:closeModal,onSubmit:handleNewTopicCompletion,allowPatientSelection})]})}function NoMessages(){return(0,import_jsx_runtime130.jsx)(import_core181.Center,{h:"100%",w:"100%",children:(0,import_jsx_runtime130.jsxs)(import_core181.Stack,{align:"center",gap:"md",children:[(0,import_jsx_runtime130.jsx)(import_core181.ThemeIcon,{size:64,variant:"light",color:"gray",children:(0,import_jsx_runtime130.jsx)(IconMessageCircle,{size:32})}),(0,import_jsx_runtime130.jsx)(import_core181.Stack,{align:"center",gap:"xs",children:(0,import_jsx_runtime130.jsx)(import_core181.Text,{size:"sm",c:"dimmed",ta:"center",children:"Select a message from the list to view details"})})]})})}function getStatusColor4(status){return status==="completed"?"green":status==="stopped"?"red":"blue"}function EmptyMessagesState(){return(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",h:"100%",justify:"center",align:"center",children:(0,import_jsx_runtime130.jsxs)(import_core181.Stack,{align:"center",gap:"md",pt:"xl",children:[(0,import_jsx_runtime130.jsx)(IconMessageCircle,{size:64,color:"var(--mantine-color-gray-4)"}),(0,import_jsx_runtime130.jsx)(import_core181.Text,{size:"lg",c:"dimmed",fw:500,children:"No messages found"})]})})}var import_core189=require("@mantine/core"),import_notifications9=require("@mantine/notifications"),import_core190=require("@medplum/core"),import_react_hooks57=require("@medplum/react-hooks");var import_react93=require("react");var import_core184=require("@mantine/core"),import_core185=require("@medplum/core"),import_react_hooks55=require("@medplum/react-hooks"),import_react91=require("react"),import_rfc6902=__toESM(require_rfc6902(),1);var import_core183=require("@mantine/core"),import_react90=require("react");var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};var import_jsx_runtime131=require("react/jsx-runtime");function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=(0,import_react90.useState)(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return(0,import_jsx_runtime131.jsx)(import_jsx_runtime131.Fragment,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?(0,import_jsx_runtime131.jsx)(import_jsx_runtime131.Fragment,{children:(0,import_jsx_runtime131.jsxs)(import_core183.Table.Tr,{children:[(0,import_jsx_runtime131.jsx)(import_core183.Table.Td,{children:name}),(0,import_jsx_runtime131.jsx)(import_core183.Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&(0,import_jsx_runtime131.jsx)(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),(0,import_jsx_runtime131.jsx)(import_core183.Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&(0,import_jsx_runtime131.jsx)(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):(0,import_jsx_runtime131.jsxs)(import_core183.Table.Tr,{children:[(0,import_jsx_runtime131.jsx)(import_core183.Table.Td,{children:name}),(0,import_jsx_runtime131.jsx)(import_core183.Table.Td,{colSpan:2,style:{textAlign:"right"},children:(0,import_jsx_runtime131.jsx)(import_core183.Button,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};var import_jsx_runtime132=require("react/jsx-runtime");function ResourceDiffTable(props){let medplum=(0,import_react_hooks55.useMedplum)(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=(0,import_react91.useState)(!1);(0,import_react91.useEffect)(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=(0,import_react91.useMemo)(()=>{if(!schemaLoaded)return null;let typedOriginal=[(0,import_core185.toTypedValue)(original)],typedRevised=[(0,import_core185.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:(0,import_core185.evalFhirPathTyped)(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:(0,import_core185.evalFhirPathTyped)(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${(0,import_core185.capitalize)(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?(0,import_jsx_runtime132.jsxs)(import_core184.Table,{className:ResourceDiffTable_default.root,children:[(0,import_jsx_runtime132.jsx)(import_core184.Table.Thead,{children:(0,import_jsx_runtime132.jsxs)(import_core184.Table.Tr,{children:[(0,import_jsx_runtime132.jsx)(import_core184.Table.Th,{}),(0,import_jsx_runtime132.jsx)(import_core184.Table.Th,{children:"Before"}),(0,import_jsx_runtime132.jsx)(import_core184.Table.Th,{children:"After"})]})}),(0,import_jsx_runtime132.jsx)(import_core184.Table.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return(0,import_jsx_runtime132.jsx)(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(0,import_core185.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=(0,import_core185.arrayify)(input).flatMap(v=>v.value);return isArray?inputValue:inputValue[0]}var import_core186=require("@medplum/core"),import_react_hooks56=require("@medplum/react-hooks"),import_react92=require("react");var import_jsx_runtime133=require("react/jsx-runtime");function ResourceTable(props){let{profileUrl}=props,medplum=(0,import_react_hooks56.useMedplum)(),accessPolicy=medplum.getAccessPolicy(),value=(0,import_react_hooks56.useResource)(props.value),[schemaLoaded,setSchemaLoaded]=(0,import_react92.useState)(!1);(0,import_react92.useEffect)(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{(0,import_core186.tryGetProfile)(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=(0,import_react92.useMemo)(()=>value&&(0,import_core186.satisfiedAccessPolicy)(value,import_core186.AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:(0,import_jsx_runtime133.jsx)(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}var import_core187=require("@mantine/core"),import_core188=require("@medplum/core");var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};var import_jsx_runtime134=require("react/jsx-runtime");function Timeline(props){return(0,import_jsx_runtime134.jsx)(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(0,import_jsx_runtime134.jsxs)(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[(0,import_jsx_runtime134.jsxs)(import_core187.Group,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[(0,import_jsx_runtime134.jsx)(ResourceAvatar,{value:author,link:!0,size:"md"}),(0,import_jsx_runtime134.jsxs)("div",{style:{flex:1},children:[(0,import_jsx_runtime134.jsx)(import_core187.Text,{size:"sm",children:(0,import_jsx_runtime134.jsx)(ResourceName,{c:"inherit",fw:500,value:author,link:!0})}),(0,import_jsx_runtime134.jsxs)(import_core187.Text,{size:"xs",children:[(0,import_jsx_runtime134.jsx)(MedplumLink,{c:"dimmed",to:props.resource,children:(0,import_core188.formatDateTime)(dateTime)}),(0,import_jsx_runtime134.jsx)(import_core187.Text,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),(0,import_jsx_runtime134.jsx)(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&(0,import_jsx_runtime134.jsxs)(import_core187.Menu,{position:"bottom-end",shadow:"md",width:200,children:[(0,import_jsx_runtime134.jsx)(import_core187.Menu.Target,{children:(0,import_jsx_runtime134.jsx)(import_core187.ActionIcon,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${(0,import_core188.getReferenceString)(props.resource)}`,children:(0,import_jsx_runtime134.jsx)(IconDots,{})})}),popupMenuItems]})]}),(0,import_jsx_runtime134.jsx)(ErrorBoundary,{children:(0,import_jsx_runtime134.jsx)("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"};var import_jsx_runtime135=require("react/jsx-runtime");function ResourceTimeline(props){let medplum=(0,import_react_hooks57.useMedplum)(),sender=medplum.getProfile(),inputRef=(0,import_react93.useRef)(null),resource=(0,import_react_hooks57.useResource)(props.value),[history,setHistory]=(0,import_react93.useState)(),[items,setItems]=(0,import_react93.useState)([]),[countToShow,setCountToShow]=(0,import_react93.useState)(10),loadTimelineResources=props.loadTimelineResources,itemsRef=(0,import_react93.useRef)(items);(0,import_react93.useLayoutEffect)(()=>{itemsRef.current=items});let sortAndSetItems=(0,import_react93.useCallback)(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=(0,import_react93.useCallback)(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=(0,import_react93.useCallback)(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=(0,import_react93.useCallback)(()=>{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]);(0,import_react93.useEffect)(()=>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(()=>(0,import_notifications9.updateNotification)({id:"upload-notification",color:"teal",title:"Upload complete",message:"",icon:(0,import_jsx_runtime135.jsx)(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>(0,import_notifications9.updateNotification)({id:"upload-notification",color:"red",title:"Upload error",message:(0,import_core190.normalizeErrorString)(reason),icon:(0,import_jsx_runtime135.jsx)(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){(0,import_notifications9.showNotification)({id:"upload-notification",loading:!0,title:"Initializing upload...",message:"Please wait...",autoClose:!1,withCloseButton:!1})}function onUploadProgress(e){(0,import_notifications9.updateNotification)({id:"upload-notification",loading:!0,title:"Uploading...",message:getProgressMessage(e),autoClose:!1,withCloseButton:!1})}function onUploadError(outcome){(0,import_notifications9.updateNotification)({id:"upload-notification",color:"red",title:"Upload error",message:(0,import_core190.normalizeErrorString)(outcome),icon:(0,import_jsx_runtime135.jsx)(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return(0,import_jsx_runtime135.jsx)(import_core189.Center,{style:{width:"100%",height:"100%"},children:(0,import_jsx_runtime135.jsx)(import_core189.Loader,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return(0,import_jsx_runtime135.jsxs)(Timeline,{children:[props.createCommunication&&(0,import_jsx_runtime135.jsx)(Panel,{children:(0,import_jsx_runtime135.jsx)(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:(0,import_jsx_runtime135.jsxs)(import_core189.Group,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[(0,import_jsx_runtime135.jsx)(ResourceAvatar,{value:sender}),(0,import_jsx_runtime135.jsx)(import_core189.TextInput,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),(0,import_jsx_runtime135.jsx)(import_core189.ActionIcon,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:(0,import_jsx_runtime135.jsx)(IconMessage,{size:16})}),(0,import_jsx_runtime135.jsx)(AttachmentButton,{securityContext:(0,import_core190.createReference)(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>(0,import_jsx_runtime135.jsx)(import_core189.ActionIcon,{...props2,radius:"xl",color:"blue",variant:"filled",children:(0,import_jsx_runtime135.jsx)(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(0,import_jsx_runtime135.jsx)(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return(0,import_jsx_runtime135.jsx)(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return(0,import_jsx_runtime135.jsx)(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return(0,import_jsx_runtime135.jsx)(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return(0,import_jsx_runtime135.jsx)(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return(0,import_jsx_runtime135.jsx)(TimelineItem,{resource:item,padding:!0,children:(0,import_jsx_runtime135.jsx)(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&(0,import_jsx_runtime135.jsx)(import_core189.Group,{justify:"center",pb:"lg",children:(0,import_jsx_runtime135.jsx)(import_core189.Button,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?(0,import_jsx_runtime135.jsx)(TimelineItem,{resource,padding:!0,...rest,children:(0,import_jsx_runtime135.jsx)(ResourceDiffTable,{original:previous,revised:props.resource})}):(0,import_jsx_runtime135.jsxs)(TimelineItem,{resource,padding:!0,...rest,children:[(0,import_jsx_runtime135.jsx)("h3",{children:"Created"}),(0,import_jsx_runtime135.jsx)(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(0,import_jsx_runtime135.jsx)(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:(0,import_jsx_runtime135.jsx)("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(0,import_jsx_runtime135.jsx)(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:(0,import_jsx_runtime135.jsx)(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return(0,import_jsx_runtime135.jsx)(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:(0,import_jsx_runtime135.jsx)(import_core189.ScrollArea,{children:(0,import_jsx_runtime135.jsx)("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return(0,import_jsx_runtime135.jsx)(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:(0,import_jsx_runtime135.jsx)(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"}var import_jsx_runtime136=require("react/jsx-runtime");function DefaultResourceTimeline(props){let{resource,...rest}=props;return(0,import_jsx_runtime136.jsx)(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})}var import_core191=require("@medplum/core");var import_jsx_runtime137=require("react/jsx-runtime");function EncounterTimeline(props){let{encounter,...rest}=props;return(0,import_jsx_runtime137.jsx)(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:(0,import_core191.createReference)(resource),subject:resource.subject,sender:(0,import_core191.createReference)(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:(0,import_core191.createReference)(resource),subject:resource.subject,operator:(0,import_core191.createReference)(operator),issued:new Date().toISOString(),content}),...rest})}var import_core208=require("@mantine/core"),import_core209=require("@medplum/core"),import_react_hooks59=require("@medplum/react-hooks"),import_react98=require("react");var import_core192=require("@medplum/core");var import_jsx_runtime138=require("react/jsx-runtime");function FhirPathDisplay(props){let value;try{value=(0,import_core192.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(0,import_jsx_runtime138.jsx)(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}var import_core206=require("@mantine/core"),import_core207=require("@medplum/core"),import_react_hooks58=require("@medplum/react-hooks");var import_react97=require("react");var import_core193=require("@mantine/core"),import_jsx_runtime139=require("react/jsx-runtime");function SearchExportDialog(props){return(0,import_jsx_runtime139.jsxs)(import_core193.Modal,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[(0,import_jsx_runtime139.jsxs)(import_core193.Box,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&(0,import_jsx_runtime139.jsx)(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&(0,import_jsx_runtime139.jsx)(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),(0,import_jsx_runtime139.jsx)(import_core193.Text,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return(0,import_jsx_runtime139.jsx)(import_core193.Button,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}var import_core195=require("@mantine/core"),import_core196=require("@medplum/core"),import_react94=require("react");var import_core194=require("@medplum/core");var import_jsx_runtime140=require("react/jsx-runtime"),searchParamToOperators={string:[import_core194.Operator.EQUALS,import_core194.Operator.NOT,import_core194.Operator.CONTAINS,import_core194.Operator.EXACT],fulltext:[import_core194.Operator.EQUALS,import_core194.Operator.NOT,import_core194.Operator.CONTAINS,import_core194.Operator.EXACT],token:[import_core194.Operator.EQUALS,import_core194.Operator.NOT,import_core194.Operator.TEXT],reference:[import_core194.Operator.EQUALS,import_core194.Operator.NOT],numeric:[import_core194.Operator.EQUALS,import_core194.Operator.NOT_EQUALS,import_core194.Operator.GREATER_THAN,import_core194.Operator.LESS_THAN,import_core194.Operator.GREATER_THAN_OR_EQUALS,import_core194.Operator.LESS_THAN_OR_EQUALS],quantity:[import_core194.Operator.EQUALS,import_core194.Operator.NOT_EQUALS,import_core194.Operator.GREATER_THAN,import_core194.Operator.LESS_THAN,import_core194.Operator.GREATER_THAN_OR_EQUALS,import_core194.Operator.LESS_THAN_OR_EQUALS],date:[import_core194.Operator.EQUALS,import_core194.Operator.NOT_EQUALS,import_core194.Operator.GREATER_THAN,import_core194.Operator.LESS_THAN,import_core194.Operator.GREATER_THAN_OR_EQUALS,import_core194.Operator.LESS_THAN_OR_EQUALS,import_core194.Operator.STARTS_AFTER,import_core194.Operator.ENDS_BEFORE,import_core194.Operator.APPROXIMATELY],datetime:[import_core194.Operator.EQUALS,import_core194.Operator.NOT_EQUALS,import_core194.Operator.GREATER_THAN,import_core194.Operator.LESS_THAN,import_core194.Operator.GREATER_THAN_OR_EQUALS,import_core194.Operator.LESS_THAN_OR_EQUALS,import_core194.Operator.STARTS_AFTER,import_core194.Operator.ENDS_BEFORE,import_core194.Operator.APPROXIMATELY],uri:[import_core194.Operator.EQUALS,import_core194.Operator.NOT,import_core194.Operator.ABOVE,import_core194.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,import_core194.Operator.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,import_core194.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,import_core194.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??import_core194.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(import_core194.capitalize).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?(0,import_jsx_runtime140.jsx)(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children:resource.id}):key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?(0,import_core194.formatDateTime)(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?(0,import_jsx_runtime140.jsx)(ResourcePropertyDisplay,{path:elementDefinition.path,property:elementDefinition,propertyType,value,maxWidth:200,ignoreMissingValues:!0,link:!1}):null}function renderSearchParameterValue(resource,searchParam){let value=(0,import_core194.evalFhirPathTyped)(searchParam.expression,[{type:resource.resourceType,value:resource}]);return!value||value.length===0?null:(0,import_jsx_runtime140.jsx)(import_jsx_runtime140.Fragment,{children:value.map((v,index)=>(0,import_jsx_runtime140.jsx)(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}var import_jsx_runtime141=require("react/jsx-runtime");function SearchFieldEditor(props){let wasDropdownOpen=(0,import_react94.useRef)(!1),[state,setState]=(0,import_react94.useState)({search:JSON.parse((0,import_core196.stringify)(props.search))}),[isDropdownOpen,setIsDropdownOpen]=(0,import_react94.useState)(!1);(0,import_react94.useEffect)(()=>{setState({search:props.search})},[props.search]);let allFields=(0,import_react94.useMemo)(()=>{if(!props.visible)return[];let resourceType=props.search.resourceType,typeSchema=(0,import_core196.getDataType)(resourceType),searchParams=(0,import_core196.getSearchParameters)(resourceType);return(0,import_core196.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(0,import_jsx_runtime141.jsx)(import_core195.Modal,{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:(0,import_jsx_runtime141.jsx)("div",{"data-testid":"overlay-child"})},children:(0,import_jsx_runtime141.jsxs)(import_core195.Stack,{children:[(0,import_jsx_runtime141.jsx)(import_core195.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}),(0,import_jsx_runtime141.jsx)(import_core195.Group,{justify:"flex-end",children:(0,import_jsx_runtime141.jsx)(import_core195.Button,{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}var import_core199=require("@mantine/core"),import_core200=require("@medplum/core");var import_react95=require("react");var import_core197=require("@mantine/core"),import_core198=require("@medplum/core");var import_jsx_runtime142=require("react/jsx-runtime");function SearchFilterValueInput(props){let details=(0,import_core198.getSearchParameterDetails)(props.resourceType,props.searchParam),name=props.name??"filter-value";switch(details.type){case import_core198.SearchParameterType.REFERENCE:return(0,import_jsx_runtime142.jsx)(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 import_core198.SearchParameterType.BOOLEAN:return(0,import_jsx_runtime142.jsx)(import_core197.Checkbox,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case import_core198.SearchParameterType.DATE:return(0,import_jsx_runtime142.jsx)(import_core197.TextInput,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case import_core198.SearchParameterType.DATETIME:return(0,import_jsx_runtime142.jsx)(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case import_core198.SearchParameterType.NUMBER:return(0,import_jsx_runtime142.jsx)(import_core197.TextInput,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case import_core198.SearchParameterType.QUANTITY:return(0,import_jsx_runtime142.jsx)(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return(0,import_jsx_runtime142.jsx)(import_core197.TextInput,{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}}}var import_jsx_runtime143=require("react/jsx-runtime");function SearchFilterEditor(props){let[search,setSearch]=(0,import_react95.useState)((0,import_core200.deepClone)(props.search)),searchRef=(0,import_react95.useRef)(search);(0,import_react95.useLayoutEffect)(()=>{searchRef.current=search}),(0,import_react95.useEffect)(()=>{setSearch((0,import_core200.deepClone)(props.search))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}let resourceType=props.search.resourceType,searchParams=(0,import_core200.getSearchParameters)(resourceType)??{},filters=search.filters||[];return(0,import_jsx_runtime143.jsx)(import_core199.Modal,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:(0,import_jsx_runtime143.jsxs)(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[(0,import_jsx_runtime143.jsxs)("div",{children:[(0,import_jsx_runtime143.jsxs)("table",{children:[(0,import_jsx_runtime143.jsxs)("colgroup",{children:[(0,import_jsx_runtime143.jsx)("col",{style:{width:200}}),(0,import_jsx_runtime143.jsx)("col",{style:{width:200}}),(0,import_jsx_runtime143.jsx)("col",{style:{width:380}}),(0,import_jsx_runtime143.jsx)("col",{style:{width:40}})]}),(0,import_jsx_runtime143.jsx)("thead",{children:(0,import_jsx_runtime143.jsxs)("tr",{children:[(0,import_jsx_runtime143.jsx)("th",{children:"Field"}),(0,import_jsx_runtime143.jsx)("th",{children:"Operation"}),(0,import_jsx_runtime143.jsx)("th",{children:"Value"}),(0,import_jsx_runtime143.jsx)("th",{})]})}),(0,import_jsx_runtime143.jsx)("tbody",{children:filters.map((filter,index)=>(0,import_jsx_runtime143.jsx)(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`))})]}),(0,import_jsx_runtime143.jsx)(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),(0,import_jsx_runtime143.jsx)(import_core199.Group,{justify:"flex-end",mt:"xl",children:(0,import_jsx_runtime143.jsx)(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value;function setFilterCode(newCode){props.onChange({code:newCode,operator:import_core200.Operator.EQUALS,value:""})}function setFilterOperator(newOperator){props.onChange({code:value.code,operator:newOperator,value:""})}function setFilterValue(newFilterValue){props.onChange({code:value.code,operator:value.operator,value:newFilterValue})}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return(0,import_jsx_runtime143.jsxs)("tr",{children:[(0,import_jsx_runtime143.jsx)("td",{children:(0,import_jsx_runtime143.jsx)(import_core199.NativeSelect,{"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)}))]})}),(0,import_jsx_runtime143.jsx)("td",{children:operators&&(0,import_jsx_runtime143.jsx)(import_core199.NativeSelect,{"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}`)}),(0,import_jsx_runtime143.jsx)("td",{children:searchParam&&value.operator&&(0,import_jsx_runtime143.jsx)(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}`)}),(0,import_jsx_runtime143.jsx)("td",{children:props.onDelete&&(0,import_jsx_runtime143.jsx)(import_core199.ActionIcon,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:(0,import_jsx_runtime143.jsx)(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}var import_core201=require("@mantine/core"),import_react96=require("react");var import_jsx_runtime144=require("react/jsx-runtime");function SearchFilterValueDialog(props){let[value,setValue]=(0,import_react96.useState)(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return(0,import_jsx_runtime144.jsx)(import_core201.Modal,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:(0,import_jsx_runtime144.jsx)(Form,{onSubmit:onOk,children:(0,import_jsx_runtime144.jsxs)(import_core201.Grid,{children:[(0,import_jsx_runtime144.jsx)(import_core201.Grid.Col,{span:10,children:(0,import_jsx_runtime144.jsx)(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),(0,import_jsx_runtime144.jsx)(import_core201.Grid.Col,{span:2,children:(0,import_jsx_runtime144.jsx)(import_core201.Button,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}var import_core202=require("@medplum/core");var import_jsx_runtime145=require("react/jsx-runtime");function SearchFilterValueDisplay(props){let{resourceType,filter}=props,searchParam=import_core202.globalSchema.types[resourceType].searchParams?.[filter.code];if(searchParam){if(searchParam.type==="reference"&&(filter.operator===import_core202.Operator.EQUALS||filter.operator===import_core202.Operator.NOT_EQUALS))return(0,import_jsx_runtime145.jsx)(ResourceName,{value:{reference:filter.value}});let searchParamDetails=(0,import_core202.getSearchParameterDetails)(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===import_core202.SearchParameterType.DATETIME)return(0,import_jsx_runtime145.jsx)(import_jsx_runtime145.Fragment,{children:(0,import_core202.formatDateTime)(filter.value)})}return(0,import_jsx_runtime145.jsx)(import_jsx_runtime145.Fragment,{children:filter.value})}var import_core203=require("@mantine/core"),import_core204=require("@medplum/core");var import_jsx_runtime146=require("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?(0,import_jsx_runtime146.jsx)(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):(0,import_jsx_runtime146.jsx)(import_core203.Menu.Dropdown,{children:props.searchParams.map(searchParam=>(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return(0,import_jsx_runtime146.jsx)(DateFilterSubMenu,{...props});case"number":case"quantity":return(0,import_jsx_runtime146.jsx)(NumericFilterSubMenu,{...props});case"reference":return(0,import_jsx_runtime146.jsx)(ReferenceFilterSubMenu,{...props});case"string":return(0,import_jsx_runtime146.jsx)(TextFilterSubMenu,{...props});case"token":return(0,import_jsx_runtime146.jsx)(TokenFilterSubMenu,{...props});case"uri":return(0,import_jsx_runtime146.jsx)(UriFilterSubMenu,{...props});default:return(0,import_jsx_runtime146.jsxs)(import_jsx_runtime146.Fragment,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT_EQUALS),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.ENDS_BEFORE),children:"Before..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.STARTS_AFTER),children:"After..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Between..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT_EQUALS),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.GREATER_THAN),children:"Greater than..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.LESS_THAN),children:"Less than..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.CONTAINS),children:"Contains..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Does not contain..."}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.TEXT),children:"Text contains..."}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function UriFilterSubMenu(props){let{searchParam}=props;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return(0,import_jsx_runtime146.jsxs)(import_jsx_runtime146.Fragment,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(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"};var import_core205=require("@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=(0,import_core205.getElementDefinition)(resourceType,name),exactSearchParam=(0,import_core205.getSearchParameter)(resourceType,name.toLowerCase());if(exactElementDefinition&&exactSearchParam)return{name,elementDefinition:exactElementDefinition,searchParams:[exactSearchParam]};if(exactElementDefinition){let allSearchParams=(0,import_core205.getSearchParameters)(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=(0,import_core205.getSearchParameterDetails)(resourceType,exactSearchParam);return{name,elementDefinition:details.elementDefinitions?.[0],searchParams:[exactSearchParam]}}return{name}}var import_jsx_runtime147=require("react/jsx-runtime"),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=(0,import_react_hooks58.useMedplum)(),[outcome,setOutcome]=(0,import_react97.useState)(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=(0,import_react97.useState)(search);(0,import_core207.deepEquals)(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=(0,import_react97.useState)({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=(0,import_react97.useRef)(state);(0,import_react97.useLayoutEffect)(()=>{stateRef.current=state});let total=memoizedSearch.total??"accurate",loadResults=(0,import_react97.useCallback)(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,(0,import_core207.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((0,import_core207.normalizeOperationOutcome)(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=(0,import_react97.useCallback)(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);(0,import_react97.useEffect)(()=>{loadResults()},[loadResults]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...stateRef.current.selected};checked?newSelected[id]=!0:delete newSelected[id],setState({...stateRef.current,selected:newSelected})}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},searchResponse=stateRef.current.searchResponse;checked&&searchResponse?.entry&&searchResponse.entry.forEach(entry=>{entry.resource?.id&&(newSelected[entry.resource.id]=!0)}),setState({...stateRef.current,selected:newSelected})}function isAllSelected(){if(!state.searchResponse?.entry||state.searchResponse.entry.length===0)return!1;for(let e of state.searchResponse.entry)if(e.resource?.id&&!state.selected[e.resource.id])return!1;return!0}function emitSearchChange(newSearch){props.onChange&&props.onChange(new SearchChangeEvent(newSearch))}function handleRowClick(e,resource){if(isCheckboxCell(e.target)||e.button===2)return;killEvent(e);let isAux=isAuxClick(e);!isAux&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),isAux&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e))}function isExportPassed(){return!!(props.onExport??props.onExportCsv??props.onExportTransactionBundle)}if(outcome)return(0,import_jsx_runtime147.jsx)(OperationOutcomeAlert,{outcome});if(!(0,import_core207.isDataTypeLoaded)(memoizedSearch.resourceType))return(0,import_jsx_runtime147.jsx)(import_core206.Center,{style:{width:"100%",height:"100%"},children:(0,import_jsx_runtime147.jsx)(import_core206.Loader,{})});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(0,import_jsx_runtime147.jsxs)("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&(0,import_jsx_runtime147.jsxs)(import_core206.Group,{justify:"space-between",mb:"xl",children:[(0,import_jsx_runtime147.jsxs)(import_core206.Group,{gap:2,children:[(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),(0,import_jsx_runtime147.jsxs)(import_core206.Group,{gap:2,children:[lastResult&&(0,import_jsx_runtime147.jsxs)(import_core206.Text,{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()}`]}),(0,import_jsx_runtime147.jsx)(import_core206.ActionIcon,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:(0,import_jsx_runtime147.jsx)(IconRefresh,{size:iconSize})})]})]}),(0,import_jsx_runtime147.jsxs)(import_core206.Table,{className:SearchControl_default.table,children:[(0,import_jsx_runtime147.jsxs)(import_core206.Table.Thead,{children:[(0,import_jsx_runtime147.jsxs)(import_core206.Table.Tr,{children:[checkboxColumn&&(0,import_jsx_runtime147.jsx)(import_core206.Table.Th,{children:(0,import_jsx_runtime147.jsx)("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>(0,import_jsx_runtime147.jsx)(import_core206.Table.Th,{children:(0,import_jsx_runtime147.jsxs)(import_core206.Menu,{shadow:"md",width:240,position:"bottom-end",children:[(0,import_jsx_runtime147.jsx)(import_core206.Menu.Target,{children:(0,import_jsx_runtime147.jsx)(import_core206.UnstyledButton,{className:SearchControl_default.control,p:2,children:(0,import_jsx_runtime147.jsxs)(import_core206.Group,{justify:"space-between",wrap:"nowrap",children:[(0,import_jsx_runtime147.jsx)(import_core206.Text,{fw:500,children:buildFieldNameString(field.name)}),(0,import_jsx_runtime147.jsx)(import_core206.Center,{className:SearchControl_default.icon,children:(0,import_jsx_runtime147.jsx)(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),(0,import_jsx_runtime147.jsx)(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&&(0,import_jsx_runtime147.jsxs)(import_core206.Table.Tr,{children:[checkboxColumn&&(0,import_jsx_runtime147.jsx)(import_core206.Table.Th,{}),fields.map(field=>(0,import_jsx_runtime147.jsx)(import_core206.Table.Th,{children:field.searchParams&&(0,import_jsx_runtime147.jsx)(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),(0,import_jsx_runtime147.jsx)(import_core206.Table.Tbody,{children:resources?.map(resource=>resource&&(0,import_jsx_runtime147.jsxs)(import_core206.Table.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&(0,import_jsx_runtime147.jsx)(import_core206.Table.Td,{children:(0,import_jsx_runtime147.jsx)("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=>(0,import_jsx_runtime147.jsx)(import_core206.Table.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&(0,import_jsx_runtime147.jsx)(Container,{children:(0,import_jsx_runtime147.jsx)(import_core206.Center,{style:{height:150},children:(0,import_jsx_runtime147.jsx)(import_core206.Text,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&(0,import_jsx_runtime147.jsx)(import_core206.Center,{m:"md",p:"md",children:(0,import_jsx_runtime147.jsx)(import_core206.Pagination,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),(0,import_jsx_runtime147.jsx)(SearchFieldEditor,{search:memoizedSearch,visible:state.fieldEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,fieldEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,fieldEditorVisible:!1})}},`search-field-editor-${state.dialogOpenTime}`),(0,import_jsx_runtime147.jsx)(SearchFilterEditor,{search:memoizedSearch,visible:state.filterEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,filterEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterEditorVisible:!1})}},`search-filter-editor-${state.dialogOpenTime}`),(0,import_jsx_runtime147.jsx)(SearchExportDialog,{visible:state.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),(0,import_jsx_runtime147.jsx)(SearchFilterValueDialog,{visible:state.filterDialogVisible,title:state.filterDialogSearchParam?.code?buildFieldNameString(state.filterDialogSearchParam.code):"",resourceType,searchParam:state.filterDialogSearchParam,filter:state.filterDialogFilter,defaultValue:"",onOk:filter=>{emitSearchChange(addFilter(memoizedSearch,filter.code,filter.operator,filter.value)),setState({...stateRef.current,filterDialogVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterDialogVisible:!1})}},`search-filter-dialog-${state.dialogOpenTime}`)]})}function FilterDescription(props){let filters=(props.filters??[]).filter(f=>props.searchParams.find(p=>p.code===f.code));return filters.length===0?(0,import_jsx_runtime147.jsx)("span",{children:"no filters"}):(0,import_jsx_runtime147.jsx)(import_jsx_runtime147.Fragment,{children:filters.map(filter=>(0,import_jsx_runtime147.jsxs)("div",{children:[getOpString(filter.operator),"\xA0",(0,import_jsx_runtime147.jsx)(SearchFilterValueDisplay,{resourceType:props.resourceType,filter})]},`filter-${filter.code}-${filter.operator}-${filter.value}`))})}function getPage(search){return Math.floor((search.offset??0)/(search.count??import_core207.DEFAULT_SEARCH_COUNT))+1}function getTotalPages(search,lastResult){let pageSize=search.count??import_core207.DEFAULT_SEARCH_COUNT,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}var import_jsx_runtime148=require("react/jsx-runtime");function FhirPathTable(props){let medplum=(0,import_react_hooks59.useMedplum)(),[schemaLoaded,setSchemaLoaded]=(0,import_react98.useState)(!1),[outcome,setOutcome]=(0,import_react98.useState)(),{query,fields}=props,[response,setResponse]=(0,import_react98.useState)(),[selected,setSelected]=(0,import_react98.useState)({});(0,import_react98.useEffect)(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome((0,import_core209.normalizeOperationOutcome)(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selected};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=response?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=response?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selected[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if((0,import_react98.useEffect)(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return(0,import_jsx_runtime148.jsx)(import_core208.Loader,{});let checkboxColumn=props.checkboxesEnabled;return(0,import_jsx_runtime148.jsxs)("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[(0,import_jsx_runtime148.jsxs)(import_core208.Table,{children:[(0,import_jsx_runtime148.jsx)(import_core208.Table.Thead,{children:(0,import_jsx_runtime148.jsxs)(import_core208.Table.Tr,{children:[checkboxColumn&&(0,import_jsx_runtime148.jsx)(import_core208.Table.Th,{children:(0,import_jsx_runtime148.jsx)("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>(0,import_jsx_runtime148.jsx)(import_core208.Table.Th,{children:field.name},field.name))]})}),(0,import_jsx_runtime148.jsx)(import_core208.Table.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&(0,import_jsx_runtime148.jsxs)(import_core208.Table.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&(0,import_jsx_runtime148.jsx)(import_core208.Table.Td,{children:(0,import_jsx_runtime148.jsx)("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=>(0,import_jsx_runtime148.jsx)(import_core208.Table.Td,{children:(0,import_jsx_runtime148.jsx)(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&(0,import_jsx_runtime148.jsx)("div",{"data-testid":"empty-search",children:"No results"}),outcome&&(0,import_jsx_runtime148.jsx)("div",{"data-testid":"search-error",children:(0,import_jsx_runtime148.jsx)("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&(0,import_jsx_runtime148.jsx)(import_core208.Button,{onClick:()=>props.onBulk(Object.keys(selected)),children:"Bulk..."})]})}var MemoizedFhirPathTable=(0,import_react98.memo)(FhirPathTable);var import_core210=require("@mantine/core");var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};var import_jsx_runtime149=require("react/jsx-runtime");function InfoBar(props){return(0,import_jsx_runtime149.jsx)(import_core210.ScrollArea,{children:(0,import_jsx_runtime149.jsx)("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return(0,import_jsx_runtime149.jsx)("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return(0,import_jsx_runtime149.jsx)("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return(0,import_jsx_runtime149.jsx)("div",{className:InfoBar_default.value,children:props.children})};var import_core211=require("@mantine/core"),import_core212=require("@medplum/core"),import_react_hooks60=require("@medplum/react-hooks"),import_react99=require("react");var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};var import_jsx_runtime150=require("react/jsx-runtime");function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=(0,import_react_hooks60.useMedplumNavigate)(),[currentTab,setCurrentTab]=(0,import_react99.useState)(()=>{let tab=import_core212.locationUtils.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(0,import_jsx_runtime150.jsxs)(import_core211.Tabs,{value:currentTab.toLowerCase(),onChange:onTabChange,...rest,children:[(0,import_jsx_runtime150.jsx)(import_core211.Tabs.List,{className:LinkTabs_default.list,children:tabs.map(t=>(0,import_jsx_runtime150.jsx)(import_core211.Tabs.Tab,{value:t.value,children:(0,import_jsx_runtime150.jsx)(import_core211.Anchor,{className:LinkTabs_default.link,href:`${baseUrl}/${t.value}`,onClick:onLinkClick,children:t.label})},t.value))}),children]})}function normalizeTabDefinitions(tabs){return tabs.map(t=>(0,import_core212.isString)(t)?{label:t,value:t.toLowerCase()}:t)}function onLinkClick(e){isAuxClick(e)||e.preventDefault()}var import_core215=require("@mantine/core"),import_react_hooks61=require("@medplum/react-hooks");var import_core213=require("@mantine/core"),import_core214=require("@medplum/core");var import_jsx_runtime151=require("react/jsx-runtime");function MeasureReportGroupDisplay(props){let{group}=props;return(0,import_jsx_runtime151.jsx)(import_core213.Paper,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:(0,import_jsx_runtime151.jsxs)(import_core213.Group,{children:[group.measureScore&&(0,import_jsx_runtime151.jsx)(MeasureScore,{group}),!group.measureScore&&(0,import_jsx_runtime151.jsx)(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return(0,import_jsx_runtime151.jsxs)(import_jsx_runtime151.Fragment,{children:[(0,import_jsx_runtime151.jsx)(import_core213.Text,{fz:"md",fw:500,mb:8,children:measure.title}),(0,import_jsx_runtime151.jsx)(import_core213.Text,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>(0,import_core214.formatCodeableConcept)(p.code)==="numerator"),denominator=populations?.find(p=>(0,import_core214.formatCodeableConcept)(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return(0,import_jsx_runtime151.jsxs)(import_core213.Box,{children:[(0,import_jsx_runtime151.jsx)(import_core213.Title,{order:3,children:"Not Applicable"}),(0,import_jsx_runtime151.jsx)(import_core213.Text,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return(0,import_jsx_runtime151.jsxs)(import_core213.Box,{children:[(0,import_jsx_runtime151.jsx)(import_core213.Title,{order:3,children:"Insufficient Data"}),(0,import_jsx_runtime151.jsx)(import_core213.Text,{children:`Numerator: ${numeratorCount}`}),(0,import_jsx_runtime151.jsx)(import_core213.Text,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return(0,import_jsx_runtime151.jsx)(import_core213.RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:(0,import_jsx_runtime151.jsx)(import_core213.Flex,{justify:"center",children:(0,import_jsx_runtime151.jsxs)(import_core213.Text,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return(0,import_jsx_runtime151.jsx)(import_jsx_runtime151.Fragment,{children:unit==="%"?(0,import_jsx_runtime151.jsx)(import_core213.RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:(0,import_jsx_runtime151.jsx)(import_core213.Flex,{justify:"center",children:(0,import_jsx_runtime151.jsx)(import_core213.Text,{fw:700,fz:18,children:(0,import_jsx_runtime151.jsx)(QuantityDisplay,{value:group.measureScore})})})}):(0,import_jsx_runtime151.jsx)(import_core213.Flex,{h:120,align:"center",children:(0,import_jsx_runtime151.jsx)(import_core213.Title,{order:3,children:(0,import_jsx_runtime151.jsx)(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"}var import_jsx_runtime152=require("react/jsx-runtime");function MeasureReportDisplay(props){let report=(0,import_react_hooks61.useResource)(props.measureReport),[measure]=(0,import_react_hooks61.useSearchOne)("Measure",{url:report?.measure});return report?(0,import_jsx_runtime152.jsxs)(import_core215.Box,{children:[measure&&(0,import_jsx_runtime152.jsx)(MeasureTitle,{measure}),(0,import_jsx_runtime152.jsx)(import_core215.SimpleGrid,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>(0,import_jsx_runtime152.jsx)(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}var import_core216=require("@mantine/core"),import_react_hooks62=require("@medplum/react-hooks"),import_jsx_runtime153=require("react/jsx-runtime");function NotificationIcon(props){let{resourceType,countCriteria,subscriptionCriteria}=props,unreadCount=(0,import_react_hooks62.useNotificationCount)({resourceType,countCriteria,subscriptionCriteria}),result=props.iconComponent;return props.onClick&&(result=(0,import_jsx_runtime153.jsx)(import_core216.ActionIcon,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=(0,import_jsx_runtime153.jsx)(import_core216.Tooltip,{label:props.tooltip,children:result})),unreadCount>0&&(result=(0,import_jsx_runtime153.jsx)(import_core216.Indicator,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}var import_core217=require("@mantine/core"),import_notifications10=require("@mantine/notifications"),import_core218=require("@medplum/core"),import_react_hooks63=require("@medplum/react-hooks");var import_react100=require("react");var import_jsx_runtime154=require("react/jsx-runtime"),NOTIFICATION_ID="patient-accounts",NOTIFICATION_TITLE="Patient Accounts",ACCOUNT_TARGET_TYPES=["Organization","HealthcareService","CareTeam"];function PatientAccountsForm(props){let{patient}=props,medplum=(0,import_react_hooks63.useMedplum)(),isAdmin=medplum.isProjectAdmin()||medplum.isSuperAdmin(),originalAccounts=(0,import_react100.useMemo)(()=>(0,import_core218.extractAccountReferences)(patient.meta)??[],[patient.meta]),[pendingAccounts,setPendingAccounts]=(0,import_react100.useState)(originalAccounts),[confirmModalOpen,setConfirmModalOpen]=(0,import_react100.useState)(!1),[propagate,setPropagate]=(0,import_react100.useState)(!0),[saving,setSaving]=(0,import_react100.useState)(!1),changes=(0,import_react100.useMemo)(()=>{let result=[];for(let account of pendingAccounts)originalAccounts.some(o=>o.reference===account.reference)||result.push({reference:account,type:"addition"});for(let account of originalAccounts)pendingAccounts.some(p=>p.reference===account.reference)||result.push({reference:account,type:"removal"});return result},[originalAccounts,pendingAccounts]),hasChanges=changes.length>0,handleAddAccount=(0,import_react100.useCallback)(value=>{value?.reference&&(pendingAccounts.some(a=>a.reference===value.reference)||setPendingAccounts(prev=>[...prev,value]))},[pendingAccounts]),handleRemoveAccount=(0,import_react100.useCallback)(referenceString=>{setPendingAccounts(prev=>prev.filter(a=>a.reference!==referenceString))},[]),handleSave=(0,import_react100.useCallback)(async()=>{let patientId=patient.id;if(!patientId){import_notifications10.notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:"Cannot update accounts: Patient resource has no ID.",icon:(0,import_jsx_runtime154.jsx)(IconX,{size:"1rem"}),autoClose:!1,withCloseButton:!0});return}setSaving(!0),setConfirmModalOpen(!1);let url=medplum.fhirUrl("Patient",patientId,"$set-accounts"),parameters={resourceType:"Parameters",parameter:[...pendingAccounts.map(account=>({name:"accounts",valueReference:{reference:account.reference}})),{name:"propagate",valueBoolean:propagate}]};import_notifications10.notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,loading:!0,message:propagate?"Saving account changes and propagating to compartment...":"Saving account changes...",autoClose:!1,withCloseButton:!1});try{let headers={};propagate&&(headers.Prefer="respond-async"),await medplum.post(url,parameters,void 0,{headers}),medplum.invalidateUrl(medplum.fhirUrl("Patient",patientId)),import_notifications10.notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"green",message:propagate?"Account changes saved. Compartment updates are being applied.":"Account changes saved.",icon:(0,import_jsx_runtime154.jsx)(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0}),props.onSaved?.()}catch(err){import_notifications10.notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:(0,import_core218.normalizeErrorString)(err),icon:(0,import_jsx_runtime154.jsx)(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}finally{setSaving(!1)}},[medplum,patient,pendingAccounts,propagate,props]);return isAdmin?(0,import_jsx_runtime154.jsxs)(import_jsx_runtime154.Fragment,{children:[(0,import_jsx_runtime154.jsxs)(import_core217.Stack,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Title,{order:3,children:"Current Accounts"}),pendingAccounts.length===0?(0,import_jsx_runtime154.jsx)(import_core217.Text,{c:"dimmed",children:"No accounts assigned to this patient."}):(0,import_jsx_runtime154.jsxs)(import_core217.Table,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Table.Thead,{children:(0,import_jsx_runtime154.jsxs)(import_core217.Table.Tr,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Table.Th,{children:"Type"}),(0,import_jsx_runtime154.jsx)(import_core217.Table.Th,{children:"Account"}),(0,import_jsx_runtime154.jsx)(import_core217.Table.Th,{})]})}),(0,import_jsx_runtime154.jsx)(import_core217.Table.Tbody,{children:pendingAccounts.map(account=>(0,import_jsx_runtime154.jsxs)(import_core217.Table.Tr,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Table.Td,{children:(0,import_jsx_runtime154.jsx)(AccountTypeBadge,{reference:account})}),(0,import_jsx_runtime154.jsx)(import_core217.Table.Td,{children:(0,import_jsx_runtime154.jsx)(ResourceBadge,{value:account,link:!0})}),(0,import_jsx_runtime154.jsx)(import_core217.Table.Td,{children:(0,import_jsx_runtime154.jsx)(import_core217.ActionIcon,{variant:"subtle",color:"red","aria-label":`Remove ${account.reference}`,onClick:()=>handleRemoveAccount(account.reference),children:(0,import_jsx_runtime154.jsx)(IconX,{size:16})})})]},account.reference))})]}),(0,import_jsx_runtime154.jsx)(import_core217.Divider,{}),(0,import_jsx_runtime154.jsx)(import_core217.Title,{order:4,children:"Add Account"}),(0,import_jsx_runtime154.jsx)(ReferenceInput,{name:"newAccount",placeholder:"Search for Organization, HealthcareService, or CareTeam...",targetTypes:ACCOUNT_TARGET_TYPES,onChange:value=>{value&&handleAddAccount(value)}}),hasChanges&&(0,import_jsx_runtime154.jsxs)(import_jsx_runtime154.Fragment,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Divider,{}),(0,import_jsx_runtime154.jsx)(import_core217.Title,{order:4,children:"Pending Changes"}),(0,import_jsx_runtime154.jsx)(import_core217.Stack,{gap:"xs",children:changes.map(change=>(0,import_jsx_runtime154.jsxs)(import_core217.Group,{gap:"xs",children:[change.type==="addition"?(0,import_jsx_runtime154.jsx)(import_core217.Badge,{color:"green",variant:"light",leftSection:(0,import_jsx_runtime154.jsx)(IconPlus,{size:12}),children:"Add"}):(0,import_jsx_runtime154.jsx)(import_core217.Badge,{color:"red",variant:"light",leftSection:(0,import_jsx_runtime154.jsx)(IconMinus,{size:12}),children:"Remove"}),(0,import_jsx_runtime154.jsx)(ResourceBadge,{value:change.reference,link:!0})]},`${change.type}-${change.reference.reference}`))})]}),(0,import_jsx_runtime154.jsx)(import_core217.Box,{children:(0,import_jsx_runtime154.jsx)(import_core217.Button,{disabled:!hasChanges||saving,onClick:()=>setConfirmModalOpen(!0),children:"Save Changes"})})]}),(0,import_jsx_runtime154.jsx)(import_core217.Modal,{opened:confirmModalOpen,onClose:()=>setConfirmModalOpen(!1),title:"Confirm Account Changes",size:"md",keepMounted:!0,children:(0,import_jsx_runtime154.jsxs)(import_core217.Stack,{children:[(0,import_jsx_runtime154.jsxs)(import_core217.Text,{children:["The following changes will be applied to Patient"," ",(0,import_jsx_runtime154.jsxs)("strong",{children:[patient.name?.[0]?.given?.join(" ")," ",patient.name?.[0]?.family]}),":"]}),changes.filter(c=>c.type==="addition").length>0&&(0,import_jsx_runtime154.jsxs)(import_core217.Box,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Text,{fw:600,c:"green",children:"Adding:"}),(0,import_jsx_runtime154.jsx)(import_core217.Stack,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="addition").map(c=>(0,import_jsx_runtime154.jsxs)(import_core217.Group,{gap:"xs",children:[(0,import_jsx_runtime154.jsx)(IconPlus,{size:14,color:"green"}),(0,import_jsx_runtime154.jsx)(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),changes.filter(c=>c.type==="removal").length>0&&(0,import_jsx_runtime154.jsxs)(import_core217.Box,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Text,{fw:600,c:"red",children:"Removing:"}),(0,import_jsx_runtime154.jsx)(import_core217.Stack,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="removal").map(c=>(0,import_jsx_runtime154.jsxs)(import_core217.Group,{gap:"xs",children:[(0,import_jsx_runtime154.jsx)(IconMinus,{size:14,color:"red"}),(0,import_jsx_runtime154.jsx)(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),(0,import_jsx_runtime154.jsx)(import_core217.Checkbox,{label:"Propagate changes to all resources in this patient's compartment",checked:propagate,onChange:event=>setPropagate(event.currentTarget.checked)}),(0,import_jsx_runtime154.jsxs)(import_core217.Group,{justify:"right",mt:"md",children:[(0,import_jsx_runtime154.jsx)(import_core217.Button,{variant:"default",onClick:()=>setConfirmModalOpen(!1),children:"Cancel"}),(0,import_jsx_runtime154.jsx)(import_core217.Button,{onClick:handleSave,loading:saving,children:"Confirm"})]})]})})]}):(0,import_jsx_runtime154.jsx)(import_core217.Alert,{color:"blue",title:"Admin access required",children:"You need project admin access to manage patient account assignments."})}function AccountTypeBadge({reference}){let type=reference.reference?.split("/")[0]??"Unknown";return(0,import_jsx_runtime154.jsx)(import_core217.Badge,{variant:"light",color:{Organization:"blue",HealthcareService:"teal",CareTeam:"violet"}[type]??"gray",size:"sm",children:type})}var import_core219=require("@mantine/core"),import_notifications11=require("@mantine/notifications"),import_core220=require("@medplum/core"),import_react_hooks64=require("@medplum/react-hooks");var import_react101=require("react");var import_jsx_runtime155=require("react/jsx-runtime"),NOTIFICATION_ID2="patient-export",NOTIFICATION_TITLE2="Patient Export",formats={everything:{operation:"$everything",extension:"json",contentType:import_core220.ContentType.FHIR_JSON},summary:{operation:"$summary",extension:"json",contentType:import_core220.ContentType.FHIR_JSON},ccda:{operation:"$ccda-export",extension:"xml",contentType:import_core220.ContentType.CDA_XML},ccdaReferral:{operation:"$ccda-export",type:"referral",extension:"xml",contentType:import_core220.ContentType.CDA_XML}};function PatientExportForm(props){let medplum=(0,import_react_hooks64.useMedplum)(),{patient}=props,handleSubmit=(0,import_react101.useCallback)(async data2=>{let patientId=(0,import_core220.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),import_notifications11.notifications.show({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,loading:!0,message:"Exporting...",autoClose:!1,withCloseButton:!1});try{let response=await medplum.post(url,params,void 0,{cache:"no-cache",headers:{Accept:contentType}}),fileName=`Patient-export-${patientId}-${new Date().toISOString().replaceAll(":","-")}.${extension}`;saveData(response,fileName,contentType),import_notifications11.notifications.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"green",message:"Done",icon:(0,import_jsx_runtime155.jsx)(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){import_notifications11.notifications.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"red",message:(0,import_core220.normalizeErrorString)(err),icon:(0,import_jsx_runtime155.jsx)(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient]);return(0,import_jsx_runtime155.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime155.jsxs)(import_core219.Stack,{children:[(0,import_jsx_runtime155.jsx)(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:(0,import_jsx_runtime155.jsx)(import_core219.SegmentedControl,{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})}),(0,import_jsx_runtime155.jsx)(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:(0,import_jsx_runtime155.jsx)(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),(0,import_jsx_runtime155.jsx)(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:(0,import_jsx_runtime155.jsx)(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),(0,import_jsx_runtime155.jsx)(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:(0,import_jsx_runtime155.jsx)(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),(0,import_jsx_runtime155.jsx)(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:(0,import_jsx_runtime155.jsx)(DateTimeInput,{name:"endDate",placeholder:"End date"})}),(0,import_jsx_runtime155.jsx)(import_core219.Group,{justify:"right",children:(0,import_jsx_runtime155.jsx)(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)}var import_core221=require("@medplum/core"),import_react_hooks65=require("@medplum/react-hooks");function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}var import_jsx_runtime156=require("react/jsx-runtime");function PatientHeader(props){let patient=(0,import_react_hooks65.useResource)(props.patient);return patient?(0,import_jsx_runtime156.jsxs)(InfoBar,{children:[(0,import_jsx_runtime156.jsx)(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:"Name"}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:(0,import_jsx_runtime156.jsx)(MedplumLink,{to:patient,fw:500,children:patient.name?(0,import_jsx_runtime156.jsx)(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&(0,import_jsx_runtime156.jsxs)(import_jsx_runtime156.Fragment,{children:[(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:"DoB"}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:patient.birthDate})]}),(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:"Age"}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:(0,import_core221.calculateAgeString)(patient.birthDate)})]})]}),patient.gender&&(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:"Gender"}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:patient.gender})]}),patient.address&&(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:"State"}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:identifier?.system}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}var import_core222=require("@mantine/core"),import_notifications12=require("@mantine/notifications"),import_core223=require("@medplum/core"),import_react102=require("react");var PharmacyDialog_default={pharmacyItem:"PharmacyDialog_pharmacyItem",pharmacyItemSelected:"PharmacyDialog_pharmacyItemSelected"};var import_jsx_runtime157=require("react/jsx-runtime");function getPharmacyKey(pharmacy,index){return pharmacy.identifier?.[0]?.value||`pharmacy-${index}`}function SearchForm({onSearch,searching}){return(0,import_jsx_runtime157.jsx)("form",{onSubmit:e=>{e.preventDefault();let formData=new FormData(e.currentTarget);onSearch(formData)},children:(0,import_jsx_runtime157.jsxs)(import_core222.Stack,{gap:"md",children:[(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"name",label:"Pharmacy Name",placeholder:"Enter pharmacy name (min 3 chars)"}),(0,import_jsx_runtime157.jsxs)(import_core222.Group,{grow:!0,children:[(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"city",label:"City",placeholder:"City (min 3 chars)"}),(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"state",label:"State",placeholder:"State (min 3 chars)"})]}),(0,import_jsx_runtime157.jsxs)(import_core222.Group,{grow:!0,children:[(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"zip",label:"Zip Code",placeholder:"Zip code (min 3 chars)"}),(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"phoneOrFax",label:"Phone or Fax",placeholder:"Phone or fax number"})]}),(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"address",label:"Address",placeholder:"Street address (min 3 chars)"}),(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"ncpdpID",label:"NCPDP ID",placeholder:"National Council for Prescription Drug Programs ID"}),(0,import_jsx_runtime157.jsx)(import_core222.Button,{type:"submit",loading:searching,children:"Search"})]})})}function PharmacyItem({pharmacy,pharmacyKey,isSelected,onSelect}){return(0,import_jsx_runtime157.jsx)(import_core222.Box,{p:"sm",className:isSelected?PharmacyDialog_default.pharmacyItemSelected:PharmacyDialog_default.pharmacyItem,onClick:onSelect,children:(0,import_jsx_runtime157.jsx)(import_core222.Radio,{value:pharmacyKey,label:(0,import_jsx_runtime157.jsxs)(import_core222.Box,{children:[(0,import_jsx_runtime157.jsx)(import_core222.Text,{fw:500,size:"sm",children:pharmacy.name}),pharmacy.address?.[0]&&(0,import_jsx_runtime157.jsx)(import_core222.Text,{size:"xs",c:"dimmed",children:(0,import_core223.formatAddress)(pharmacy.address[0])}),pharmacy.telecom?.find(t=>t.system==="phone")&&(0,import_jsx_runtime157.jsxs)(import_core222.Text,{size:"xs",c:"dimmed",children:["Phone: ",pharmacy.telecom.find(t=>t.system==="phone")?.value]}),pharmacy.telecom?.find(t=>t.system==="fax")&&(0,import_jsx_runtime157.jsxs)(import_core222.Text,{size:"xs",c:"dimmed",children:["Fax: ",pharmacy.telecom.find(t=>t.system==="fax")?.value]})]})})},pharmacyKey)}function SearchResults({searchResults,selectedPharmacy,onSelectPharmacy,setAsPrimary,onSetAsPrimary,onAddFavorite,onClose,adding}){return(0,import_jsx_runtime157.jsxs)(import_core222.Box,{mt:"xl",children:[(0,import_jsx_runtime157.jsxs)(import_core222.Text,{fw:600,mb:"md",children:["Search Results (",searchResults.length,")"]}),(0,import_jsx_runtime157.jsx)(import_core222.Radio.Group,{value:selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy)):"",onChange:value=>{let selected=searchResults.find((p,i)=>getPharmacyKey(p,i)===value);selected&&onSelectPharmacy(selected)},children:(0,import_jsx_runtime157.jsx)(import_core222.Stack,{gap:"sm",children:searchResults.map((pharmacy,index)=>{let pharmacyKey=getPharmacyKey(pharmacy,index),isSelected=selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy))===pharmacyKey:!1;return(0,import_jsx_runtime157.jsx)(PharmacyItem,{pharmacy,pharmacyKey,isSelected,onSelect:()=>onSelectPharmacy(pharmacy)},pharmacyKey)})})}),(0,import_jsx_runtime157.jsxs)(import_core222.Flex,{mt:"lg",gap:"md",align:"center",justify:"space-between",children:[(0,import_jsx_runtime157.jsx)(import_core222.Checkbox,{label:"Set as primary pharmacy",checked:setAsPrimary,onChange:e=>onSetAsPrimary(e.currentTarget.checked)}),(0,import_jsx_runtime157.jsxs)(import_core222.Group,{children:[(0,import_jsx_runtime157.jsx)(import_core222.Button,{variant:"subtle",onClick:onClose,children:"Cancel"}),(0,import_jsx_runtime157.jsx)(import_core222.Button,{onClick:onAddFavorite,disabled:!selectedPharmacy,loading:adding,children:"Add to Favorites"})]})]})]})}function PharmacyDialog(props){let{patient,onSubmit,onClose,onSearch,onAddToFavorites}=props,[searchResults,setSearchResults]=(0,import_react102.useState)([]),[searching,setSearching]=(0,import_react102.useState)(!1),[selectedPharmacy,setSelectedPharmacy]=(0,import_react102.useState)(),[setAsPrimary,setSetAsPrimary]=(0,import_react102.useState)(!1),[adding,setAdding]=(0,import_react102.useState)(!1),handleSearch=(0,import_react102.useCallback)(async formData=>{let searchParams={name:formData.get("name")||void 0,city:formData.get("city")||void 0,state:formData.get("state")||void 0,zip:formData.get("zip")||void 0,address:formData.get("address")||void 0,phoneOrFax:formData.get("phoneOrFax")||void 0,ncpdpID:formData.get("ncpdpID")||void 0},cleanParams=Object.fromEntries(Object.entries(searchParams).filter(([_,v])=>typeof v=="string"&&v.trim()!==""));if(Object.keys(cleanParams).length===0){(0,import_notifications12.showNotification)({color:"yellow",title:"Search Required",message:"Please enter at least one search criterion"});return}setSearching(!0),setSelectedPharmacy(void 0);try{let results=await onSearch(cleanParams);setSearchResults(results),results.length===0&&(0,import_notifications12.showNotification)({color:"blue",title:"No Results",message:"No pharmacies found matching your search criteria"})}catch(error){(0,import_notifications12.showNotification)({color:"red",title:"Search Error",message:(0,import_core223.normalizeErrorString)(error)})}finally{setSearching(!1)}},[onSearch]),handleAddFavorite=(0,import_react102.useCallback)(async()=>{if(!(!selectedPharmacy||!patient.id)){setAdding(!0);try{let response=await onAddToFavorites({patientId:patient.id,pharmacy:selectedPharmacy,setAsPrimary});response.success?((0,import_notifications12.showNotification)({color:"green",title:"Success",message:response.message}),onSubmit(response.organization||selectedPharmacy)):(0,import_notifications12.showNotification)({color:"red",title:"Error",message:response.message})}catch(error){(0,import_notifications12.showNotification)({color:"red",title:"Error",message:(0,import_core223.normalizeErrorString)(error)})}finally{setAdding(!1)}}},[selectedPharmacy,patient.id,setAsPrimary,onAddToFavorites,onSubmit]);return(0,import_jsx_runtime157.jsxs)(import_core222.Box,{children:[(0,import_jsx_runtime157.jsx)(SearchForm,{onSearch:formData=>handleSearch(formData).catch(console.error),searching}),searching&&(0,import_jsx_runtime157.jsx)(import_core222.Flex,{justify:"center",mt:"xl",children:(0,import_jsx_runtime157.jsx)(import_core222.Loader,{})}),searchResults.length>0&&!searching&&(0,import_jsx_runtime157.jsx)(SearchResults,{searchResults,selectedPharmacy,onSelectPharmacy:setSelectedPharmacy,setAsPrimary,onSetAsPrimary:setSetAsPrimary,onAddFavorite:handleAddFavorite,onClose,adding})]})}var import_core224=require("@mantine/core"),import_core225=require("@medplum/core");var import_jsx_runtime158=require("react/jsx-runtime");function summaryResourceListSection(options){return{key:options.key,title:options.title,searches:[{key:options.key,resourceType:options.search.resourceType,patientParam:options.search.patientParam,query:options.search.query}],component:context=>(0,import_jsx_runtime158.jsx)(ResourceListDisplay,{options,resources:context.results[options.key]??[],context})}}function ResourceListDisplay(props){let{options,context}=props,resources=[...props.resources];return options.filter&&(resources=resources.filter(options.filter)),options.sort&&resources.sort(options.sort),(0,import_jsx_runtime158.jsx)(CollapsibleSection,{title:options.title,onAdd:options.onAdd,children:resources.length>0?(0,import_jsx_runtime158.jsx)(import_core224.Flex,{direction:"column",gap:8,children:resources.map(resource=>{let displayString=options.getDisplayString?options.getDisplayString(resource):(0,import_core225.getDisplayString)(resource),status=options.getStatus?.(resource),secondaryText=options.getSecondaryText?.(resource);return(0,import_jsx_runtime158.jsx)(SummaryItem,{onClick:()=>context.onClickResource?.(resource),children:(0,import_jsx_runtime158.jsxs)(import_core224.Box,{children:[(0,import_jsx_runtime158.jsx)(import_core224.Text,{fw:500,className:SummaryItem_default.itemText,children:displayString}),(status||secondaryText)&&(0,import_jsx_runtime158.jsxs)(import_core224.Group,{mt:2,gap:4,children:[status&&(0,import_jsx_runtime158.jsx)(StatusBadge,{color:status.color,variant:"light",status:status.label}),secondaryText&&(0,import_jsx_runtime158.jsx)(import_core224.Text,{size:"xs",fw:500,c:"dimmed",children:secondaryText})]})]})},resource.id)})}):(0,import_jsx_runtime158.jsx)(import_core224.Text,{children:"(none)"})})}var import_core226=require("@medplum/core"),import_react103=require("react");var import_jsx_runtime159=require("react/jsx-runtime");function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=(0,import_react103.useCallback)((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(0,import_jsx_runtime159.jsx)(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:(0,import_core226.createReference)(resource),sender:(0,import_core226.createReference)(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:(0,import_core226.createReference)(resource),operator:(0,import_core226.createReference)(operator),issued:new Date().toISOString(),content}),...rest})}var import_core227=require("@mantine/core"),import_core228=require("@medplum/core"),import_react_hooks66=require("@medplum/react-hooks");var import_react104=require("react");var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};var import_jsx_runtime160=require("react/jsx-runtime");function PlanDefinitionBuilder(props){let medplum=(0,import_react_hooks66.useMedplum)(),defaultValue2=(0,import_react_hooks66.useResource)(props.value),[schemaLoaded,setSchemaLoaded]=(0,import_react104.useState)(!1),[selectedKey,setSelectedKey]=(0,import_react104.useState)(),[hoverKey,setHoverKey]=(0,import_react104.useState)(),[value,setValue]=(0,import_react104.useState)();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}if((0,import_react104.useEffect)(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),(0,import_react104.useEffect)(()=>(setValue(ensurePlanDefinitionKeys(defaultValue2??{resourceType:"PlanDefinition",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]),!schemaLoaded||!value)return null;function changeProperty(property,newValue){setValue(prevValue=>({...prevValue,[property]:newValue}))}return(0,import_jsx_runtime160.jsx)("div",{children:(0,import_jsx_runtime160.jsxs)(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[(0,import_jsx_runtime160.jsx)(import_core227.TextInput,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),(0,import_jsx_runtime160.jsx)(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),(0,import_jsx_runtime160.jsx)(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){function changeAction(changedAction){props.onChange(props.actions.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...props.actions,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(props.actions.filter(i=>i!==removedAction))}return(0,import_jsx_runtime160.jsxs)(import_core227.Stack,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>(0,import_jsx_runtime160.jsx)(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),(0,import_jsx_runtime160.jsx)("div",{children:(0,import_jsx_runtime160.jsx)(import_core227.Button,{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(0,import_jsx_runtime160.jsx)("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:(0,import_jsx_runtime160.jsx)(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=(0,import_react104.useState)(),medplum=(0,import_react_hooks66.useMedplum)(),[loading,setLoading]=(0,import_react104.useState)(!1),[resource,setResource]=(0,import_react104.useState)(),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(0,import_react104.useEffect)(()=>{(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?(0,import_jsx_runtime160.jsx)(import_core227.Loader,{}):(0,import_jsx_runtime160.jsxs)(import_core227.Paper,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[(0,import_jsx_runtime160.jsxs)(import_core227.Flex,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[(0,import_jsx_runtime160.jsx)(import_core227.TextInput,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),(0,import_jsx_runtime160.jsx)(import_core227.CloseButton,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&(0,import_jsx_runtime160.jsxs)(import_core227.Stack,{gap:"xl",p:"md",children:[(0,import_jsx_runtime160.jsx)(import_core227.Box,{children:(0,import_jsx_runtime160.jsx)(import_core227.TextInput,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),(0,import_jsx_runtime160.jsx)(import_core227.Box,{children:(0,import_jsx_runtime160.jsx)(import_core227.NativeSelect,{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"&&(0,import_jsx_runtime160.jsxs)(import_core227.Stack,{gap:0,children:[(0,import_jsx_runtime160.jsxs)(import_core227.Group,{gap:0,mb:"xs",children:[(0,import_jsx_runtime160.jsx)(import_core227.Text,{fw:600,children:"Select questionnaire"}),(0,import_jsx_runtime160.jsx)(import_core227.Text,{c:"red",children:"*"})]}),(0,import_jsx_runtime160.jsxs)(import_core227.Text,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",(0,import_jsx_runtime160.jsx)(import_core227.Anchor,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),(0,import_jsx_runtime160.jsx)(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&(0,import_jsx_runtime160.jsxs)(import_core227.Stack,{gap:0,children:[(0,import_jsx_runtime160.jsxs)(import_core227.Group,{gap:0,mb:"xs",children:[(0,import_jsx_runtime160.jsx)(import_core227.Text,{fw:600,children:"Select activity definition"}),(0,import_jsx_runtime160.jsx)(import_core227.Text,{c:"red",children:"*"})]}),(0,import_jsx_runtime160.jsxs)(import_core227.Text,{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"," ",(0,import_jsx_runtime160.jsx)(import_core227.Anchor,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),(0,import_jsx_runtime160.jsx)(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return(0,import_jsx_runtime160.jsx)(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:(0,import_core228.getReferenceString)(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)}))}var import_core229=require("@mantine/core"),import_core230=require("@medplum/core"),import_react_hooks67=require("@medplum/react-hooks");var import_react105=require("react");var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};var import_jsx_runtime161=require("react/jsx-runtime");function QuestionnaireBuilder(props){let medplum=(0,import_react_hooks67.useMedplum)(),defaultValue2=(0,import_react_hooks67.useResource)(props.questionnaire),[schemaLoaded,setSchemaLoaded]=(0,import_react105.useState)(!1),[value,setValue]=(0,import_react105.useState)(),[selectedKey,setSelectedKey]=(0,import_react105.useState)(),[hoverKey,setHoverKey]=(0,import_react105.useState)();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}(0,import_react105.useEffect)(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),(0,import_react105.useEffect)(()=>(setValue(ensureQuestionnaireKeys(defaultValue2??{resourceType:"Questionnaire",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]);let handleChange=(questionnaire2,disableSubmit)=>{setValue(questionnaire2),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire2)};return!schemaLoaded||!value?null:(0,import_jsx_runtime161.jsx)("div",{children:(0,import_jsx_runtime161.jsxs)(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[(0,import_jsx_runtime161.jsx)(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),(0,import_jsx_runtime161.jsx)(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource4=(0,import_core230.isResource)(props.item),isContainer=isResource4||item.type===import_react_hooks67.QuestionnaireItemType.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=(0,import_react105.useRef)(props.item);(0,import_react105.useLayoutEffect)(()=>{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(0,import_jsx_runtime161.jsxs)("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[(0,import_jsx_runtime161.jsx)("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[isResource4&&(0,import_jsx_runtime161.jsx)(import_core229.TextInput,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource4&&(0,import_jsx_runtime161.jsx)(import_core229.Textarea,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&(0,import_jsx_runtime161.jsx)(ReferenceProfiles,{item,onChange:updateItem}),(0,import_react_hooks67.isChoiceQuestion)(item)&&(0,import_jsx_runtime161.jsx)(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[resource.title&&(0,import_jsx_runtime161.jsx)(import_core229.Title,{children:resource.title}),item.text&&(0,import_jsx_runtime161.jsx)("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&(0,import_jsx_runtime161.jsx)(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>(0,import_jsx_runtime161.jsx)("div",{children:(0,import_jsx_runtime161.jsx)(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&&(0,import_jsx_runtime161.jsx)("div",{className:QuestionnaireBuilder_default.topActions,children:editing?(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[(0,import_jsx_runtime161.jsx)(import_core229.TextInput,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&(0,import_jsx_runtime161.jsx)(import_core229.NativeSelect,{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"}]})]}):(0,import_jsx_runtime161.jsx)("div",{children:linkId})}),!isResource4&&(0,import_jsx_runtime161.jsx)(import_core229.Box,{className:QuestionnaireBuilder_default.movementActions,children:(0,import_jsx_runtime161.jsxs)(import_core229.Box,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:(0,import_jsx_runtime161.jsx)(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:(0,import_jsx_runtime161.jsx)(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),(0,import_jsx_runtime161.jsxs)("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource4&&(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource4&&(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),props.onRemove&&props.onRemove()},children:"Remove"})]})]})]})}function AnswerBuilder(props){let property=(0,import_core230.getElementDefinition)("QuestionnaireItemAnswerOption","value[x]"),options=props.item.answerOption??[];return(0,import_jsx_runtime161.jsxs)("div",{children:[props.item.answerValueSet!==void 0?(0,import_jsx_runtime161.jsx)(import_core229.TextInput,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):(0,import_jsx_runtime161.jsx)(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),(0,import_jsx_runtime161.jsxs)(import_core229.Box,{display:"flex",children:[(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),(0,import_jsx_runtime161.jsx)(import_core229.Space,{w:"lg"}),(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return(0,import_jsx_runtime161.jsx)("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return(0,import_jsx_runtime161.jsxs)("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[(0,import_jsx_runtime161.jsx)("div",{children:(0,import_jsx_runtime161.jsx)(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)}),(0,import_jsx_runtime161.jsx)("div",{children:(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{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=(0,import_react_hooks67.getQuestionnaireItemReferenceTargetTypes)(props.item)??[];return(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[targetTypes.map((targetType,index)=>(0,import_jsx_runtime161.jsxs)(import_core229.Group,{children:[(0,import_jsx_runtime161.jsx)(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange((0,import_react_hooks67.setQuestionnaireItemReferenceTargetTypes)(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{killEvent(e),props.onChange((0,import_react_hooks67.setQuestionnaireItemReferenceTargetTypes)(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{killEvent(e),props.onChange((0,import_react_hooks67.setQuestionnaireItemReferenceTargetTypes)(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId2=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId2(){return"id-"+nextId2++}function ensureQuestionnaireKeys(questionnaire2){return{...questionnaire2,id:questionnaire2.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire2.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId2=Math.max(nextId2,Number.parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,Number.parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId2(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId2()}))}function createPage(){return{id:generateId2(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:import_react_hooks67.QUESTIONNAIRE_ITEM_CONTROL_URL,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}var import_core233=require("@mantine/core"),import_react_hooks68=require("@medplum/react-hooks");var import_core231=require("@mantine/core"),import_core232=require("@medplum/core"),import_react106=require("react");var import_jsx_runtime162=require("react/jsx-runtime");function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=(0,import_react106.useMemo)(()=>answer&&answer.length>0?(0,import_jsx_runtime162.jsx)(import_jsx_runtime162.Fragment,{children:answer.map((ans,index)=>(0,import_jsx_runtime162.jsx)(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?(0,import_jsx_runtime162.jsx)(import_jsx_runtime162.Fragment,{children:nestedAnswers.map((nestedAnswer,index)=>(0,import_jsx_runtime162.jsx)(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):(0,import_jsx_runtime162.jsx)(import_core231.Text,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return(0,import_jsx_runtime162.jsxs)(import_core231.Stack,{gap:0,pb:"xs",children:[(0,import_jsx_runtime162.jsx)(import_core231.Text,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return(0,import_jsx_runtime162.jsx)(import_core231.Text,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return(0,import_jsx_runtime162.jsx)(import_core231.Text,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:value});case"valueQuantity":return(0,import_jsx_runtime162.jsx)(QuantityDisplay,{value});case"valueString":return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:value});case"valueCoding":return(0,import_jsx_runtime162.jsx)(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return(0,import_jsx_runtime162.jsx)(RangeDisplay,{value});case"valueDateTime":return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:(0,import_core232.formatDate)(value)});case"valueBoolean":return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:value?"True":"False"});case"valueReference":return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:value.display??value.reference});default:return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:value.toString()})}}var import_jsx_runtime163=require("react/jsx-runtime");function QuestionnaireResponseDisplay(props){let questionnaireResponse=(0,import_react_hooks68.useResource)(props.questionnaireResponse);return(0,import_jsx_runtime163.jsx)(import_core233.Stack,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>(0,import_jsx_runtime163.jsx)(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}var import_core234=require("@mantine/core"),import_core235=require("@medplum/core");var import_react107=require("react");var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};var import_jsx_runtime164=require("react/jsx-runtime"),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]=(0,import_react107.useState)([]),[groupId,setGroupId]=(0,import_react107.useState)(1),[intervalId,setIntervalId]=(0,import_react107.useState)(1);return(0,import_react107.useEffect)(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),(0,import_jsx_runtime164.jsxs)(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[(0,import_jsx_runtime164.jsx)(import_core234.Stack,{children:intervalGroups.map(intervalGroup=>(0,import_jsx_runtime164.jsx)(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),(0,import_jsx_runtime164.jsx)(import_core234.ActionIcon,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:(0,import_jsx_runtime164.jsx)(IconCirclePlus,{})}),(0,import_jsx_runtime164.jsx)(import_core234.Group,{justify:"flex-end",children:(0,import_jsx_runtime164.jsx)(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(0,import_jsx_runtime164.jsx)(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:(0,import_jsx_runtime164.jsxs)(import_core234.Stack,{gap:"lg",children:[(0,import_jsx_runtime164.jsx)(import_core234.Group,{justify:"flex-end",children:(0,import_jsx_runtime164.jsx)(import_core234.ActionIcon,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:(0,import_jsx_runtime164.jsx)(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),(0,import_jsx_runtime164.jsx)(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),(0,import_jsx_runtime164.jsx)(import_core234.Divider,{}),intervalGroup.intervals.map(interval=>(0,import_jsx_runtime164.jsxs)(import_core234.Stack,{gap:"xs",children:[(0,import_jsx_runtime164.jsxs)(import_core234.Group,{children:[(0,import_jsx_runtime164.jsx)(import_core234.TextInput,{"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}`),(0,import_jsx_runtime164.jsx)(import_core234.ActionIcon,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:(0,import_jsx_runtime164.jsx)(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),(0,import_jsx_runtime164.jsx)(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),(0,import_jsx_runtime164.jsx)(import_core234.ActionIcon,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:(0,import_jsx_runtime164.jsx)(IconCirclePlus,{})})]})})}function ReferenceRangeGroupFilters(props){let{intervalGroup,onChange}=props,age=intervalGroup.filters.age??{},ageWithDefaults={low:age.low?.unit?age.low:{...age.low,unit:"years",system:"http://unitsofmeasure.org"},high:age.high?.unit?age.high:{...age.high,unit:"years",system:"http://unitsofmeasure.org"}};return(0,import_jsx_runtime164.jsxs)(import_core234.Stack,{style:{maxWidth:"50%"},children:[(0,import_jsx_runtime164.jsx)(import_core234.Group,{children:(0,import_jsx_runtime164.jsx)(import_core234.NativeSelect,{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})}}})}),(0,import_jsx_runtime164.jsxs)(import_core234.Group,{gap:"xs",children:[(0,import_jsx_runtime164.jsx)(import_core234.Text,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),(0,import_jsx_runtime164.jsx)("div",{id:`div-age-${intervalGroup.id}`,children:(0,import_jsx_runtime164.jsx)(RangeInput,{path:"",name:`age-${intervalGroup.id}`,defaultValue:ageWithDefaults,onChange:ageRange=>{for(let interval of intervalGroup.intervals)onChange(intervalGroup.id,{...interval,age:ageRange})}},`age-${intervalGroup.id}`)})]}),(0,import_jsx_runtime164.jsx)(import_core234.NativeSelect,{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"}]}})}}}),(0,import_jsx_runtime164.jsx)(import_core234.NativeSelect,{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=${(0,import_core235.formatRange)(interval.age)}`,`gestationalAge=${(0,import_core235.formatRange)(interval.gestationalAge)}`,`context=${interval.context?.text}`,`appliesTo=${interval.appliesTo?.map(c=>c.text).join("+")}`,`category=${interval.category}`].join(":")}function getUnitString(unit){return unit&&((0,import_core235.getCodeBySystem)(unit,"http://unitsofmeasure.org")||unit.text)}function isEmptyInterval(interval){return interval.range?.low?.value===void 0&&interval.range?.high?.value===void 0}var import_core236=require("@mantine/core"),import_core237=require("@medplum/core"),import_react_hooks69=require("@medplum/react-hooks");var import_react108=require("react");var import_jsx_runtime165=require("react/jsx-runtime");function RequestGroupDisplay(props){let medplum=(0,import_react_hooks69.useMedplum)(),requestGroup=(0,import_react_hooks69.useResource)(props.value),[startedLoading,setStartedLoading]=(0,import_react108.useState)(!1),[responseBundle,setResponseBundle]=(0,import_react108.useState)();if((0,import_react108.useEffect)(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return(0,import_jsx_runtime165.jsx)(import_core236.Grid,{children:requestGroup.action?.map((action,index)=>{let task=action.resource&&findBundleEntry(action.resource),taskInput=task?.input?.[0]?.valueReference,taskOutput=task?.output?.[0]?.valueReference;return(0,import_jsx_runtime165.jsxs)(import_react108.Fragment,{children:[(0,import_jsx_runtime165.jsx)(import_core236.Grid.Col,{span:1,p:"md",children:task?.status==="completed"?(0,import_jsx_runtime165.jsx)(IconCheckbox,{}):(0,import_jsx_runtime165.jsx)(IconSquare,{color:"gray"})}),(0,import_jsx_runtime165.jsxs)(import_core236.Grid.Col,{span:9,p:"xs",children:[(0,import_jsx_runtime165.jsx)(import_core236.Text,{fw:500,children:action.title}),action.description&&(0,import_jsx_runtime165.jsx)("div",{children:action.description}),(0,import_jsx_runtime165.jsxs)("div",{children:["Last edited by\xA0",(0,import_jsx_runtime165.jsx)(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",(0,import_core237.formatDateTime)(task?.meta?.lastUpdated)]}),(0,import_jsx_runtime165.jsxs)("div",{children:["Status: ",(0,import_jsx_runtime165.jsx)(StatusBadge,{status:task?.status||"unknown"})]})]}),(0,import_jsx_runtime165.jsxs)(import_core236.Grid.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&(0,import_jsx_runtime165.jsx)(import_core236.Button,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&(0,import_jsx_runtime165.jsx)(import_core236.Button,{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===(0,import_core237.getReferenceString)(entry.resource))return entry.resource}}var import_react_hooks70=require("@medplum/react-hooks"),import_react109=require("react");var import_core238=require("@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:(0,import_core238.stringify)(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`}var import_jsx_runtime166=require("react/jsx-runtime");function ResourceBlame(props){let medplum=(0,import_react_hooks70.useMedplum)(),[value,setValue]=(0,import_react109.useState)(props.history);if((0,import_react109.useEffect)(()=>{!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(0,import_jsx_runtime166.jsx)("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return(0,import_jsx_runtime166.jsx)("div",{className:ResourceBlame_default.container,children:(0,import_jsx_runtime166.jsx)("table",{className:ResourceBlame_default.root,children:(0,import_jsx_runtime166.jsx)("tbody",{children:table.map((row,index)=>(0,import_jsx_runtime166.jsxs)("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&(0,import_jsx_runtime166.jsxs)(import_jsx_runtime166.Fragment,{children:[(0,import_jsx_runtime166.jsx)("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:(0,import_jsx_runtime166.jsx)(ResourceName,{value:row.meta.author,link:!0,fz:"xs"})}),(0,import_jsx_runtime166.jsx)("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:(0,import_jsx_runtime166.jsx)(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),fz:"xs",children:getTimeString(row.meta.lastUpdated)})})]}),(0,import_jsx_runtime166.jsx)("td",{className:ResourceBlame_default.lineNumber,children:index+1}),(0,import_jsx_runtime166.jsx)("td",{className:ResourceBlame_default.line,children:(0,import_jsx_runtime166.jsx)("pre",{className:ResourceBlame_default.pre,children:row.value})})]},"row-"+index))})})})}var import_core239=require("@medplum/core");var ResourceDiff_default={removed:"ResourceDiff_removed",added:"ResourceDiff_added"};var import_jsx_runtime167=require("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=(0,import_core239.stringify)(originalResource,!0).match(/[^\r\n]+/g)??["{","}"],revised=(0,import_core239.stringify)(revisedResource,!0).match(/[^\r\n]+/g)??["{","}"],deltas=diff(original,revised);return(0,import_jsx_runtime167.jsx)("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>(0,import_jsx_runtime167.jsx)(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return(0,import_jsx_runtime167.jsxs)(import_jsx_runtime167.Fragment,{children:["...",(0,import_jsx_runtime167.jsx)("br",{}),props.delta.original.lines.length>0&&(0,import_jsx_runtime167.jsx)("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&&(0,import_core99.isEmpty)(targetType.resourceType)}var import_core104=require("@mantine/core"),import_core105=require("@medplum/core"),import_react_hooks29=require("@medplum/react-hooks"),import_react57=require("react");function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}var import_core102=require("@mantine/core"),import_core103=require("@medplum/core"),import_react56=require("react");var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};var import_core100=require("@mantine/core");var import_jsx_runtime82=require("react/jsx-runtime");function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?(0,import_jsx_runtime82.jsx)(import_core100.Button,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:(0,import_jsx_runtime82.jsx)(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):(0,import_jsx_runtime82.jsx)(import_core100.ActionIcon,{title:text,color:"green.6","data-testid":testId,onClick,children:(0,import_jsx_runtime82.jsx)(IconCirclePlus,{size:"1.25rem"})})}var import_core101=require("@mantine/core");var import_jsx_runtime83=require("react/jsx-runtime");function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return(0,import_jsx_runtime83.jsx)(import_core101.ActionIcon,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:(0,import_jsx_runtime83.jsx)(IconCircleMinus,{size:"1.25rem"})})}var import_jsx_runtime84=require("react/jsx-runtime");function SliceInput(props){let{slice,property}=props,[values,setValues]=(0,import_react56.useState)(props.defaultValue),sliceElements=slice.typeSchema?.elements??slice.elements,parentElementsContextValue=(0,import_react56.useContext)(ElementsContext),contextValue=(0,import_react56.useMemo)(()=>{if((0,import_core103.isPopulated)(sliceElements))return(0,import_core103.buildElementsContext)({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=(0,import_core103.isEmpty)(slice.elements),propertyDisplayName=(0,import_core103.getPropertyDisplayName)(slice.name),showEmptyMessage=props.property.readonly&&values.length===0;return maybeWrapWithContext(ElementsContext.Provider,contextValue,(0,import_jsx_runtime84.jsx)(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?(0,import_jsx_runtime84.jsx)(import_core102.Text,{c:"dimmed",children:"(empty)"}):(0,import_jsx_runtime84.jsxs)(import_core102.Stack,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>(0,import_jsx_runtime84.jsxs)(import_core102.Group,{wrap:"nowrap",children:[(0,import_jsx_runtime84.jsx)("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:(0,import_jsx_runtime84.jsx)(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&&(0,import_jsx_runtime84.jsx)(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&&(0,import_jsx_runtime84.jsx)(import_core102.Group,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:(0,import_jsx_runtime84.jsx)(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}var import_jsx_runtime85=require("react/jsx-runtime");function ResourceArrayInput(props){let{property}=props,medplum=(0,import_react_hooks29.useMedplum)(),[loading,setLoading]=(0,import_react57.useState)(!0),[slices,setSlices]=(0,import_react57.useState)([]),[defaultValue2]=(0,import_react57.useState)(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=(0,import_react57.useState)(()=>[defaultValue2]),ctx=(0,import_react57.useContext)(ElementsContext),propertyTypeCode=property.type[0]?.code;(0,import_react57.useEffect)(()=>{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(0,import_jsx_runtime85.jsx)("div",{children:"Loading..."});let nonSliceIndex=slices.length,nonSliceValues=slicedValues[nonSliceIndex],showNonSliceValues=!(props.hideNonSliceValues??(propertyTypeCode==="Extension"&&slices.length>0)),propertyDisplayName=(0,import_core105.getPathDisplayName)(property.path),showEmptyMessage=props.property.readonly&&slices.length===0&&defaultValue2.length===0;return(0,import_jsx_runtime85.jsxs)(import_core104.Stack,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&(0,import_jsx_runtime85.jsx)(import_core104.Text,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>(0,import_jsx_runtime85.jsx)(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)=>(0,import_jsx_runtime85.jsxs)(import_core104.Group,{wrap:"nowrap",style:{flexGrow:1},children:[(0,import_jsx_runtime85.jsx)("div",{style:{flexGrow:1},children:(0,import_jsx_runtime85.jsx)(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&&(0,import_jsx_runtime85.jsx)(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&&(0,import_jsx_runtime85.jsx)(import_core104.Group,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:(0,import_jsx_runtime85.jsx)(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)}}var import_core106=require("@mantine/core"),import_hooks2=require("@mantine/hooks"),import_notifications4=require("@mantine/notifications");var import_react58=require("react"),import_jsx_runtime86=require("react/jsx-runtime");function SensitiveTextarea(props){let[revealed,setRevealed]=(0,import_react58.useState)(!1),clipboard=(0,import_hooks2.useClipboard)(),ref=(0,import_react58.useRef)(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),(0,import_jsx_runtime86.jsxs)(import_core106.Flex,{gap:"xs",children:[(0,import_jsx_runtime86.jsx)(import_core106.Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),(0,import_jsx_runtime86.jsx)(import_core106.ActionIcon,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),(0,import_notifications4.showNotification)({color:"green",message:"Copied"})},children:(0,import_jsx_runtime86.jsx)(IconCopy,{})})]})}var import_core107=require("@mantine/core"),import_core108=require("@medplum/core"),import_react59=require("react");var import_jsx_runtime87=require("react/jsx-runtime"),daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=(0,import_react59.useState)(props.defaultValue),[open,setOpen]=(0,import_react59.useState)(!props.disabled&&(props.defaultModalOpen??!1));return(0,import_jsx_runtime87.jsxs)(import_jsx_runtime87.Fragment,{children:[(0,import_jsx_runtime87.jsxs)(import_core107.Group,{gap:"xs",grow:!0,wrap:"nowrap",children:[(0,import_jsx_runtime87.jsx)("span",{"data-testid":"timinginput-display",children:(0,import_core108.formatTiming)(value)||"No repeat"}),(0,import_jsx_runtime87.jsx)(import_core107.Button,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&(0,import_jsx_runtime87.jsx)(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]=(0,import_react59.useState)(props.defaultValue||defaultValue),[timeOfDayItems,setTimeOfDayItems]=(0,import_react59.useState)(()=>(props.defaultValue?.repeat?.timeOfDay??[]).map((v,i)=>({id:i,value:v}))),nextTimeOfDayId=(0,import_react59.useRef)(timeOfDayItems.length),{getExtendedProps}=(0,import_react59.useContext)(ElementsContext),[eventProps,repeatProps,repeatPeriodProps,repeatPeriodUnitProps,repeatDayOfWeekProps,repeatTimeOfDayProps]=(0,import_react59.useMemo)(()=>["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(0,import_jsx_runtime87.jsx)(import_core107.Modal,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:(0,import_jsx_runtime87.jsxs)(import_core107.Stack,{gap:"md",children:[(0,import_jsx_runtime87.jsx)(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:(0,import_jsx_runtime87.jsx)(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),(0,import_jsx_runtime87.jsx)(import_core107.Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&(0,import_jsx_runtime87.jsxs)(import_jsx_runtime87.Fragment,{children:[(0,import_jsx_runtime87.jsx)(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:(0,import_jsx_runtime87.jsxs)(import_core107.Group,{gap:"xs",grow:!0,wrap:"nowrap",children:[(0,import_jsx_runtime87.jsx)(import_core107.TextInput,{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)}),(0,import_jsx_runtime87.jsx)(import_core107.NativeSelect,{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"&&(0,import_jsx_runtime87.jsx)(FormSection,{title:"Repeat on",children:(0,import_jsx_runtime87.jsx)(import_core107.Chip.Group,{multiple:!0,onChange:setDaysOfWeek,value:value.repeat?.dayOfWeek,children:(0,import_jsx_runtime87.jsx)(import_core107.Group,{justify:"space-between",mt:"xs",gap:"xs",children:daysOfWeek.map(day=>(0,import_jsx_runtime87.jsx)(import_core107.Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,checked:(value.repeat?.dayOfWeek??[]).includes(day),children:day.charAt(0).toUpperCase()},day))})})}),(0,import_jsx_runtime87.jsx)(FormSection,{title:"At times",children:(0,import_jsx_runtime87.jsxs)(import_core107.Stack,{mt:"xs",children:[timeOfDayItems.map((item,idx)=>(0,import_jsx_runtime87.jsxs)(import_core107.Group,{children:[(0,import_jsx_runtime87.jsx)(import_core107.TextInput,{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}}),(0,import_jsx_runtime87.jsx)(ArrayRemoveButton,{testId:`timing-repeat-timeOfDay-remove-${idx}`,onClick:()=>setTimeOfDay(items=>items.toSpliced(idx,1))})]},item.id)),(0,import_jsx_runtime87.jsx)(import_core107.Box,{children:(0,import_jsx_runtime87.jsx)(ArrayAddButton,{propertyDisplayName:"Time of Day",onClick:()=>setTimeOfDay(items=>{let id=nextTimeOfDayId.current++;return items.concat({id,value:"00:00:00"})})})})]})})]}),(0,import_jsx_runtime87.jsx)(import_core107.Group,{justify:"flex-end",children:(0,import_jsx_runtime87.jsx)(import_core107.Button,{onClick:()=>props.onOk(value),children:"OK"})})]})})}var import_jsx_runtime88=require("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===import_core110.PropertyType.Attachment)return(0,import_jsx_runtime88.jsx)(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==import_core110.PropertyType.Extension;return(0,import_jsx_runtime88.jsx)(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?(0,import_jsx_runtime88.jsx)(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):(0,import_jsx_runtime88.jsx)(ElementDefinitionTypeInput,{name,defaultValue:defaultValue2,onChange:newValue=>{if(props.onChange){let newPropName=props.name.replace("[x]",(0,import_core110.capitalize)(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]=(0,import_react60.useState)(initialPropertyType);return(0,import_jsx_runtime88.jsxs)(import_core109.Group,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[(0,import_jsx_runtime88.jsx)(import_core109.NativeSelect,{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}))}),(0,import_jsx_runtime88.jsx)(ElementDefinitionTypeInput,{name:props.name,defaultValue:props.defaultValue,outcome:props.outcome,elementDefinitionType:selectedType,onChange:newValue=>{props.onChange&&props.onChange(newValue,props.name.replace("[x]",(0,import_core110.capitalize)(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=(0,import_react60.useContext)(ElementsContext),defaultValue2=(0,import_react60.useMemo)(()=>{if(!(0,import_core110.isComplexTypeCode)(propertyType)||!(0,import_core110.isEmpty)(props.defaultValue))return props.defaultValue;let withDefaults=Object.create(null);if(elementsContext.path===props.path)(0,import_core110.applyDefaultValuesToElement)(withDefaults,elementsContext.elements);else{let key=(0,import_core110.getPathDifference)(elementsContext.path,props.path);if(key===void 0)return props.defaultValue;(0,import_core110.applyDefaultValuesToElement)(withDefaults,elementsContext.elements,key)}return(0,import_core110.isPopulated)(withDefaults)?withDefaults:props.defaultValue},[propertyType,elementsContext.path,elementsContext.elements,props.path,props.defaultValue]);if(!propertyType)return(0,import_jsx_runtime88.jsx)("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 import_core110.PropertyType.SystemString:case import_core110.PropertyType.canonical:case import_core110.PropertyType.string:case import_core110.PropertyType.uri:case import_core110.PropertyType.url:return props.path==="Project.secret.value[x]"||props.path==="ClientApplication.certificateTrustStore"?(0,import_jsx_runtime88.jsx)(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):(0,import_jsx_runtime88.jsx)(import_core109.TextInput,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case import_core110.PropertyType.date:return(0,import_jsx_runtime88.jsx)(import_core109.TextInput,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case import_core110.PropertyType.time:return(0,import_jsx_runtime88.jsx)(import_core109.TextInput,{...getPrimitiveInputProps(),type:"time",step:1,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case import_core110.PropertyType.dateTime:case import_core110.PropertyType.instant:return(0,import_jsx_runtime88.jsx)(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case import_core110.PropertyType.decimal:case import_core110.PropertyType.integer:case import_core110.PropertyType.positiveInt:case import_core110.PropertyType.unsignedInt:return(0,import_jsx_runtime88.jsx)(import_core109.TextInput,{...getPrimitiveInputProps(),type:"number",step:propertyType===import_core110.PropertyType.decimal?"any":"1",onChange:e=>{if(onChange){let num=e.currentTarget.valueAsNumber;onChange(Number.isNaN(num)?void 0:num)}}});case import_core110.PropertyType.code:return(0,import_jsx_runtime88.jsx)(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case import_core110.PropertyType.boolean:return(0,import_jsx_runtime88.jsx)(import_core109.Checkbox,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case import_core110.PropertyType.base64Binary:case import_core110.PropertyType.markdown:case import_core110.PropertyType.xhtml:return(0,import_jsx_runtime88.jsx)(import_core109.Textarea,{...getPrimitiveInputProps(),spellCheck:propertyType!==import_core110.PropertyType.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case import_core110.PropertyType.Address:return(0,import_jsx_runtime88.jsx)(AddressInput,{...getComplexInputProps()});case import_core110.PropertyType.Annotation:return(0,import_jsx_runtime88.jsx)(AnnotationInput,{...getComplexInputProps()});case import_core110.PropertyType.Attachment:return(0,import_jsx_runtime88.jsx)(AttachmentInput,{...getComplexInputProps()});case import_core110.PropertyType.CodeableConcept:return(0,import_jsx_runtime88.jsx)(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case import_core110.PropertyType.Coding:return(0,import_jsx_runtime88.jsx)(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case import_core110.PropertyType.ContactDetail:return(0,import_jsx_runtime88.jsx)(ContactDetailInput,{...getComplexInputProps()});case import_core110.PropertyType.ContactPoint:return(0,import_jsx_runtime88.jsx)(ContactPointInput,{...getComplexInputProps()});case import_core110.PropertyType.Extension:return(0,import_jsx_runtime88.jsx)(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case import_core110.PropertyType.HumanName:return(0,import_jsx_runtime88.jsx)(HumanNameInput,{...getComplexInputProps()});case import_core110.PropertyType.Identifier:return(0,import_jsx_runtime88.jsx)(IdentifierInput,{...getComplexInputProps()});case import_core110.PropertyType.Money:return(0,import_jsx_runtime88.jsx)(MoneyInput,{...getComplexInputProps()});case import_core110.PropertyType.Period:return(0,import_jsx_runtime88.jsx)(PeriodInput,{...getComplexInputProps()});case import_core110.PropertyType.Duration:case import_core110.PropertyType.Quantity:return(0,import_jsx_runtime88.jsx)(QuantityInput,{...getComplexInputProps()});case import_core110.PropertyType.Range:return(0,import_jsx_runtime88.jsx)(RangeInput,{...getComplexInputProps()});case import_core110.PropertyType.Ratio:return(0,import_jsx_runtime88.jsx)(RatioInput,{...getComplexInputProps()});case import_core110.PropertyType.Reference:return(0,import_jsx_runtime88.jsx)(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case import_core110.PropertyType.Timing:return(0,import_jsx_runtime88.jsx)(TimingInput,{...getComplexInputProps()});case import_core110.PropertyType.Dosage:case import_core110.PropertyType.UsageContext:default:return(0,import_jsx_runtime88.jsx)(BackboneElementInput,{...getComplexInputProps(),typeName:propertyType})}}var RESOURCE_TYPE_URL_PREFIXES=[`${import_core110.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})}var import_jsx_runtime89=require("react/jsx-runtime");function ElementsInput(props){let[value,setValue]=(0,import_react61.useState)(props.defaultValue??{}),elementsContext=(0,import_react61.useContext)(ElementsContext),elementsToRender=(0,import_react61.useMemo)(()=>getElementsToRender(elementsContext.elements),[elementsContext.elements]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let typedValue={type:props.type,value};return(0,import_jsx_runtime89.jsx)(import_core111.Stack,{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=(0,import_jsx_runtime89.jsx)(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"?(0,import_jsx_runtime89.jsx)(CheckboxFormSection,{title:(0,import_core112.getPathDisplayName)(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):(0,import_jsx_runtime89.jsx)(FormSection,{title:(0,import_core112.getPathDisplayName)(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"};var import_jsx_runtime90=require("react/jsx-runtime");function BackboneElementInput(props){let[defaultValue2]=(0,import_react62.useState)(()=>props.defaultValue??{}),parentElementsContext=(0,import_react62.useContext)(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=(0,import_react62.useMemo)(()=>(0,import_core114.tryGetDataType)(props.typeName,profileUrl),[props.typeName,profileUrl]),type=typeSchema?.type??props.typeName,contextValue=(0,import_react62.useMemo)(()=>{if(typeSchema)return(0,import_core114.buildElementsContext)({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);if(!typeSchema)return(0,import_jsx_runtime90.jsxs)("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,(0,import_jsx_runtime90.jsx)(import_core113.Box,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:(0,import_jsx_runtime90.jsx)(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}var import_core115=require("@mantine/core"),import_react63=require("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}var import_jsx_runtime91=require("react/jsx-runtime");function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=(0,import_react63.useState)(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth.getTime());return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=(0,import_react63.useMemo)(()=>buildGrid(month,props.slots),[month,props.slots]);return(0,import_jsx_runtime91.jsxs)("div",{children:[(0,import_jsx_runtime91.jsxs)(import_core115.Group,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[(0,import_jsx_runtime91.jsx)("p",{style:{flex:1},children:getMonthString(month)}),(0,import_jsx_runtime91.jsxs)(import_core115.Group,{justify:"flex-end",gap:"xs",children:[(0,import_jsx_runtime91.jsx)(import_core115.Button,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),(0,import_jsx_runtime91.jsx)(import_core115.Button,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),(0,import_jsx_runtime91.jsxs)("table",{className:CalendarInput_default.table,children:[(0,import_jsx_runtime91.jsx)("thead",{children:(0,import_jsx_runtime91.jsxs)("tr",{children:[(0,import_jsx_runtime91.jsx)("th",{children:"SUN"}),(0,import_jsx_runtime91.jsx)("th",{children:"MON"}),(0,import_jsx_runtime91.jsx)("th",{children:"TUE"}),(0,import_jsx_runtime91.jsx)("th",{children:"WED"}),(0,import_jsx_runtime91.jsx)("th",{children:"THU"}),(0,import_jsx_runtime91.jsx)("th",{children:"FRI"}),(0,import_jsx_runtime91.jsx)("th",{children:"SAT"})]})}),(0,import_jsx_runtime91.jsx)("tbody",{children:grid.map((week,weekIndex)=>(0,import_jsx_runtime91.jsx)("tr",{children:week.map((day,dayIndex)=>(0,import_jsx_runtime91.jsx)("td",{children:day&&(0,import_jsx_runtime91.jsx)(import_core115.Button,{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}var import_core118=require("@mantine/core"),import_hooks4=require("@mantine/hooks"),import_notifications5=require("@mantine/notifications"),import_core119=require("@medplum/core"),import_react_hooks31=require("@medplum/react-hooks");var import_react65=require("react");var BaseChat_default={chatPaper:"BaseChat_chatPaper",chatTitle:"BaseChat_chatTitle",chatBody:"BaseChat_chatBody",chatScrollArea:"BaseChat_chatScrollArea",chatInputContainer:"BaseChat_chatInputContainer",chatPendingFile:"BaseChat_chatPendingFile",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble",chatBubbleNameRight:"BaseChat_chatBubbleNameRight",chatBubbleAttachmentWithText:"BaseChat_chatBubbleAttachmentWithText",chatBubbleAttachmentIcon:"BaseChat_chatBubbleAttachmentIcon",chatBubbleMenu:"BaseChat_chatBubbleMenu"};var import_core116=require("@mantine/core"),import_hooks3=require("@mantine/hooks"),import_core117=require("@medplum/core"),import_react_hooks30=require("@medplum/react-hooks");var import_react64=require("react"),import_jsx_runtime92=require("react/jsx-runtime");function DocumentPicker({subjectRef,onSelect,onUpload}){let medplum=(0,import_react_hooks30.useMedplum)(),[search,setSearch]=(0,import_react64.useState)(""),[docs,setDocs]=(0,import_react64.useState)([]),[loading,setLoading]=(0,import_react64.useState)(!0),subjectRefStr=subjectRef?(0,import_core117.getReferenceString)(subjectRef):void 0,fetchDocs=(0,import_hooks3.useDebouncedCallback)(async query=>{setLoading(!0);try{let params=new URLSearchParams;subjectRefStr&&params.set("subject",subjectRefStr),query.trim()&&params.set("description:contains",query.trim()),params.set("_sort","-date"),params.set("_count","5");let results=await medplum.searchResources("DocumentReference",params);setDocs([...results])}catch(err){console.error(err)}finally{setLoading(!1)}},300);(0,import_react64.useEffect)(()=>{fetchDocs(search)},[fetchDocs,search]);let getDocName=doc=>doc.description??doc.content?.[0]?.attachment?.title??"Untitled";return(0,import_jsx_runtime92.jsxs)(import_core116.Stack,{gap:0,w:280,children:[(0,import_jsx_runtime92.jsx)(import_core116.Text,{fw:500,fz:"sm",px:"sm",pt:"sm",pb:"xs",children:"Attachments"}),(0,import_jsx_runtime92.jsx)(import_core116.Box,{px:"sm",pb:"xs",children:(0,import_jsx_runtime92.jsx)(import_core116.TextInput,{placeholder:"Search for a Document...",size:"xs",value:search,onChange:e=>setSearch(e.currentTarget.value)})}),(0,import_jsx_runtime92.jsx)(import_core116.Divider,{}),loading?(0,import_jsx_runtime92.jsx)(import_core116.Box,{py:"sm",style:{display:"flex",justifyContent:"center"},children:(0,import_jsx_runtime92.jsx)(import_core116.Loader,{size:"xs"})}):(0,import_jsx_runtime92.jsxs)(import_core116.Stack,{gap:0,children:[docs.map(doc=>(0,import_jsx_runtime92.jsxs)(import_core116.UnstyledButton,{px:"sm",py:"xs",onClick:()=>onSelect(doc),style:{display:"flex",alignItems:"center",gap:8},children:[(0,import_jsx_runtime92.jsx)(IconFileText,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-blue-6)"}}),(0,import_jsx_runtime92.jsx)(import_core116.Text,{fz:"sm",truncate:!0,children:getDocName(doc)})]},doc.id)),docs.length===0&&(0,import_jsx_runtime92.jsx)(import_core116.Text,{fz:"xs",c:"dimmed",px:"sm",py:"xs",children:"No documents found"})]}),(0,import_jsx_runtime92.jsx)(import_core116.Divider,{}),(0,import_jsx_runtime92.jsxs)(import_core116.UnstyledButton,{px:"sm",py:"xs",onClick:onUpload,style:{display:"flex",alignItems:"center",gap:8},children:[(0,import_jsx_runtime92.jsx)(IconPaperclip,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-gray-6)"}}),(0,import_jsx_runtime92.jsx)(import_core116.Text,{fz:"sm",c:"dimmed",children:"Upload an image, pdf, etc."})]})]})}var import_jsx_runtime93=require("react/jsx-runtime");function toSafeUrl(url){if(url)try{let{protocol}=new URL(url);return protocol==="https:"||protocol==="http:"||protocol==="blob:"?url:void 0}catch{return}}function showError(message){(0,import_notifications5.showNotification)({color:"red",title:"Error",message,autoClose:!1})}function parseSentTime(communication){return new Date(communication.sent??0).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function upsertCommunications(communications,received,setCommunications){let newCommunications=[...communications],foundNew=!1;for(let comm of received){let existingIdx=newCommunications.findIndex(c=>c.id===comm.id);existingIdx!==-1?newCommunications[existingIdx]=comm:(newCommunications.push(comm),foundNew=!0)}foundNew&&newCommunications.sort((a,b)=>!a.sent&&!b.sent?0:a.sent?b.sent?a.sent.localeCompare(b.sent):1:-1),setCommunications(newCommunications)}function BaseChat(props){let{title,communications,setCommunications,query,sendMessage,onMessageReceived,onMessageUpdated,inputDisabled,onError,excludeHeader=!1,uploadEnabled=!1,attachmentSubjectRef,onViewInDocuments,...paperProps}=props,medplum=(0,import_react_hooks31.useMedplum)(),inputRef=(0,import_react65.useRef)(null),scrollAreaRef=(0,import_react65.useRef)(null),firstScrollRef=(0,import_react65.useRef)(!0),initialLoadRef=(0,import_react65.useRef)(!0),[profile,setProfile]=(0,import_react65.useState)(medplum.getProfile()),[reconnecting,setReconnecting]=(0,import_react65.useState)(!1),[loading,setLoading]=(0,import_react65.useState)(!0),[pendingFile,setPendingFile]=(0,import_react65.useState)(void 0),[pendingDocRef,setPendingDocRef]=(0,import_react65.useState)(void 0),[pickerOpen,setPickerOpen]=(0,import_react65.useState)(!1),fileInputRef=(0,import_react65.useRef)(null);loading||(initialLoadRef.current=!1);let profileRefStr=(0,import_react65.useMemo)(()=>profile?(0,import_core119.getReferenceString)(medplum.getProfile()):"",[profile,medplum]),searchMessages=(0,import_react65.useCallback)(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]);(0,import_react65.useEffect)(()=>{searchMessages().catch(err=>(0,import_notifications5.showNotification)({color:"red",message:(0,import_core119.normalizeErrorString)(err)}))},[searchMessages]),(0,import_react_hooks31.useSubscription)(`Communication?${query}`,bundle=>{let communication=bundle.entry?.[1]?.resource;upsertCommunications(communicationsRef.current,[communication],setCommunications),(0,import_core119.getReferenceString)(communication.sender)!==profileRefStr&&(communicationsRef.current.find(c=>c.id===communication.id)?onMessageUpdated?.(communication):onMessageReceived?.(communication))},{onWebSocketClose:(0,import_react65.useCallback)(()=>{reconnecting||setReconnecting(!0),(0,import_notifications5.showNotification)({color:"red",message:"Live chat disconnected. Attempting to reconnect..."})},[reconnecting]),onWebSocketOpen:(0,import_react65.useCallback)(()=>{reconnecting&&(0,import_notifications5.showNotification)({color:"green",message:"Live chat reconnected."})},[reconnecting]),onSubscriptionConnect:(0,import_react65.useCallback)(()=>{reconnecting&&(searchMessages().catch(err=>(0,import_notifications5.showNotification)({color:"red",message:(0,import_core119.normalizeErrorString)(err)})),setReconnecting(!1))},[reconnecting,searchMessages]),onError:(0,import_react65.useCallback)(err=>{onError?onError(err):showError((0,import_core119.normalizeErrorString)(err))},[onError])});let sendMessageInternal=(0,import_react65.useCallback)(formData=>{if(inputDisabled)return;let message=formData.message?.trim()??"";!message&&!pendingFile&&!pendingDocRef||(inputRef.current&&(inputRef.current.value=""),fileInputRef.current&&(fileInputRef.current.value=""),sendMessage(message,pendingFile,pendingDocRef),setPendingFile(void 0),setPendingDocRef(void 0),scrollToBottomRef.current=!0)},[inputDisabled,sendMessage,pendingFile,pendingDocRef]);(0,import_react65.useEffect)(()=>{let latestProfile=medplum.getProfile();profile?.id!==latestProfile?.id&&(setProfile(latestProfile),setCommunications([]))});let[parentRef,parentRect]=(0,import_hooks4.useResizeObserver)(),communicationsRef=(0,import_react65.useRef)(communications);communicationsRef.current=communications;let prevCommunicationsRef=(0,import_react65.useRef)(communications),scrollToBottomRef=(0,import_react65.useRef)(!0);(0,import_react65.useEffect)(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),(0,import_react65.useEffect)(()=>{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=(0,import_react65.useMemo)(()=>{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?(0,import_jsx_runtime93.jsxs)(import_core118.Paper,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[!excludeHeader&&(0,import_jsx_runtime93.jsx)(import_core118.Title,{order:2,className:BaseChat_default.chatTitle,children:title}),(0,import_jsx_runtime93.jsx)("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?(0,import_jsx_runtime93.jsxs)(import_core118.Stack,{align:"stretch",mt:"lg",children:[(0,import_jsx_runtime93.jsxs)(import_core118.Group,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[(0,import_jsx_runtime93.jsx)(import_core118.Skeleton,{height:38,circle:!0,ml:"md"}),(0,import_jsx_runtime93.jsx)(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),(0,import_jsx_runtime93.jsxs)(import_core118.Group,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[(0,import_jsx_runtime93.jsx)(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),(0,import_jsx_runtime93.jsx)(import_core118.Skeleton,{height:38,circle:!0,mr:"md"})]}),(0,import_jsx_runtime93.jsxs)(import_core118.Group,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[(0,import_jsx_runtime93.jsx)(import_core118.Skeleton,{height:38,circle:!0,ml:"md"}),(0,import_jsx_runtime93.jsx)(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):(0,import_jsx_runtime93.jsxs)(import_core118.ScrollArea,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[(0,import_jsx_runtime93.jsx)(import_core118.LoadingOverlay,{visible:loading||reconnecting,style:{width:parentRect.width,height:parentRect.height,position:"absolute",zIndex:1}}),communications.map((c,i)=>{let prevCommunication=i>0?communications[i-1]:void 0,prevCommTime=prevCommunication?parseSentTime(prevCommunication):void 0,currCommTime=parseSentTime(c),showDelivered=!!c.received&&c.id===myLastDeliveredId,payloads=c.payload??[],contentRef=payloads.find(p=>p.contentReference)?.contentReference,contentAttachment=payloads.find(p=>p.contentAttachment)?.contentAttachment,hasAttachment=!!(contentRef||contentAttachment),isSender=c.sender?.reference===profileRefStr,menu=hasAttachment?(0,import_jsx_runtime93.jsx)(ChatBubbleMenu,{contentRef,contentAttachment,onViewInDocuments}):null;return(0,import_jsx_runtime93.jsxs)(import_core118.Stack,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&(0,import_jsx_runtime93.jsx)(import_core118.Text,{fz:"xs",ta:"center",children:currCommTime}),isSender?(0,import_jsx_runtime93.jsxs)(import_core118.Group,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[(0,import_jsx_runtime93.jsx)("div",{className:BaseChat_default.chatBubbleMenu,children:menu}),(0,import_jsx_runtime93.jsx)(ChatBubble,{alignment:"right",communication:c,showDelivered}),(0,import_jsx_runtime93.jsx)(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender,mb:showDelivered?void 0:"sm"})]}):(0,import_jsx_runtime93.jsxs)(import_core118.Group,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[(0,import_jsx_runtime93.jsx)(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),(0,import_jsx_runtime93.jsx)(ChatBubble,{alignment:"left",communication:c}),(0,import_jsx_runtime93.jsx)("div",{className:BaseChat_default.chatBubbleMenu,children:menu})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),(0,import_jsx_runtime93.jsxs)("div",{className:BaseChat_default.chatInputContainer,children:[(pendingFile||pendingDocRef)&&(0,import_jsx_runtime93.jsxs)(import_core118.Group,{className:BaseChat_default.chatPendingFile,gap:4,align:"center",wrap:"nowrap",children:[pendingDocRef?(0,import_jsx_runtime93.jsx)(IconFileText,{size:"0.75rem"}):(0,import_jsx_runtime93.jsx)(IconPaperclip,{size:"0.75rem"}),(0,import_jsx_runtime93.jsx)(import_core118.Text,{fz:"xs",c:"dimmed",flex:1,truncate:!0,children:pendingDocRef?pendingDocRef.description??pendingDocRef.content?.[0]?.attachment?.title??"Document":pendingFile?.name}),(0,import_jsx_runtime93.jsx)(import_core118.ActionIcon,{size:"xs",variant:"subtle",color:"red",onClick:()=>{setPendingDocRef(void 0),setPendingFile(void 0),fileInputRef.current&&(fileInputRef.current.value="")},"aria-label":"Remove attachment",children:(0,import_jsx_runtime93.jsx)(IconX,{size:"0.75rem"})})]}),(0,import_jsx_runtime93.jsx)("input",{ref:fileInputRef,type:"file",style:{display:"none"},disabled:inputDisabled,onChange:e=>{let file=e.target.files?.[0];file&&(setPendingFile(file),setPendingDocRef(void 0))}}),(0,import_jsx_runtime93.jsx)(Form,{onSubmit:sendMessageInternal,children:(0,import_jsx_runtime93.jsx)(import_core118.TextInput,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",leftSectionWidth:42,rightSectionWidth:42,disabled:inputDisabled,leftSection:!inputDisabled&&uploadEnabled?(0,import_jsx_runtime93.jsxs)(import_core118.Popover,{opened:pickerOpen,onChange:setPickerOpen,position:"top-start",withArrow:!0,shadow:"md",withinPortal:!0,children:[(0,import_jsx_runtime93.jsx)(import_core118.Popover.Target,{children:(0,import_jsx_runtime93.jsx)(import_core118.ActionIcon,{onClick:()=>setPickerOpen(o=>!o),size:"1.5rem",radius:"xl",color:pendingFile||pendingDocRef?"blue":"gray",variant:pendingFile||pendingDocRef?"filled":"subtle","aria-label":"Attach file",children:(0,import_jsx_runtime93.jsx)(IconPaperclip,{size:"1rem",stroke:1.5})})}),(0,import_jsx_runtime93.jsx)(import_core118.Popover.Dropdown,{p:0,children:(0,import_jsx_runtime93.jsx)(DocumentPicker,{subjectRef:attachmentSubjectRef,onSelect:doc=>{setPendingDocRef(doc),setPendingFile(void 0),setPickerOpen(!1)},onUpload:()=>{setPickerOpen(!1),fileInputRef.current?.click()}})})]}):void 0,rightSection:inputDisabled?void 0:(0,import_jsx_runtime93.jsx)(import_core118.ActionIcon,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:(0,import_jsx_runtime93.jsx)(IconArrowRight,{size:"1rem",stroke:1.5})})})})]})]}):null}function ChatBubble(props){let{communication,alignment,showDelivered}=props,payloads=communication.payload??[],textContent=payloads.find(p=>p.contentString)?.contentString??"",contentRef=payloads.find(p=>p.contentReference)?.contentReference,attachment=payloads.find(p=>p.contentAttachment)?.contentAttachment,sentTime=new Date(communication.sent??-1),seenTime=new Date(communication.received??-1),senderResource=(0,import_react_hooks31.useResource)(communication.sender);return(0,import_jsx_runtime93.jsxs)("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[(0,import_jsx_runtime93.jsxs)(import_core118.Text,{fz:"xs",mb:"xs",fw:500,className:alignment==="right"?BaseChat_default.chatBubbleNameRight:void 0,"aria-label":"Sender name",children:[senderResource?(0,import_core119.getDisplayString)(senderResource):"[Unknown sender]","\xA0\xB7\xA0",(0,import_jsx_runtime93.jsx)(import_core118.Text,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),(0,import_jsx_runtime93.jsx)("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:(0,import_jsx_runtime93.jsxs)("div",{className:BaseChat_default.chatBubble,children:[textContent&&(0,import_jsx_runtime93.jsx)("span",{children:textContent}),contentRef&&(0,import_jsx_runtime93.jsx)(ChatBubbleDocumentReference,{reference:contentRef,hasText:!!textContent}),attachment&&(0,import_jsx_runtime93.jsx)(ChatBubbleAttachment,{attachment,hasText:!!textContent})]})}),showDelivered&&(0,import_jsx_runtime93.jsxs)("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleAttachment({attachment,hasText}){return(0,import_jsx_runtime93.jsx)("div",{className:hasText?BaseChat_default.chatBubbleAttachmentWithText:void 0,children:(0,import_jsx_runtime93.jsxs)(import_core118.Group,{gap:4,wrap:"nowrap",children:[(0,import_jsx_runtime93.jsx)("span",{className:BaseChat_default.chatBubbleAttachmentIcon,children:(0,import_jsx_runtime93.jsx)(IconPaperclip,{size:"0.75rem"})}),(0,import_jsx_runtime93.jsx)(import_core118.Text,{fz:"xs",truncate:!0,children:attachment.title??"File attached"})]})})}function ChatBubbleDocumentReference({reference,hasText}){let attachment=(0,import_react_hooks31.useResource)(reference)?.content?.[0]?.attachment;return attachment?(0,import_jsx_runtime93.jsx)(ChatBubbleAttachment,{attachment,hasText}):null}function ChatBubbleMenu({contentRef,contentAttachment,onViewInDocuments}){let docRef=(0,import_react_hooks31.useResource)(contentRef),attachment=contentRef?docRef?.content?.[0]?.attachment:contentAttachment,cachedUrl=(0,import_react_hooks31.useCachedBinaryUrl)(attachment?.url),handleDownload=()=>{let href=toSafeUrl(cachedUrl??attachment?.url);href&&window.open(href,"_blank","noopener,noreferrer")};return(0,import_jsx_runtime93.jsxs)(import_core118.Menu,{withinPortal:!0,position:"bottom-start",shadow:"md",children:[(0,import_jsx_runtime93.jsx)(import_core118.Menu.Target,{children:(0,import_jsx_runtime93.jsx)(import_core118.ActionIcon,{variant:"outline",color:"gray",radius:"xl",size:"sm","aria-label":"Attachment options",children:(0,import_jsx_runtime93.jsx)(IconDots,{size:"0.75rem"})})}),(0,import_jsx_runtime93.jsxs)(import_core118.Menu.Dropdown,{children:[contentRef&&onViewInDocuments&&(0,import_jsx_runtime93.jsx)(import_core118.Menu.Item,{leftSection:(0,import_jsx_runtime93.jsx)(IconFileExport,{size:"0.9rem"}),onClick:()=>onViewInDocuments(contentRef),children:"View in Documents"}),(0,import_jsx_runtime93.jsx)(import_core118.Menu.Item,{leftSection:(0,import_jsx_runtime93.jsx)(IconDownload,{size:"0.9rem"}),onClick:handleDownload,children:"Download"})]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return(0,import_jsx_runtime93.jsxs)("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[(0,import_jsx_runtime93.jsx)("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:(0,import_jsx_runtime93.jsx)("div",{style:{position:"relative"},children:(0,import_jsx_runtime93.jsx)(import_core118.Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),(0,import_jsx_runtime93.jsx)("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:(0,import_jsx_runtime93.jsx)("div",{className:BaseChat_default.chatBubble,children:(0,import_jsx_runtime93.jsx)(import_core118.Skeleton,{height:14,width:parentWidth*.5,radius:"l"})})})]})}var import_core120=require("@mantine/core"),import_react_hooks32=require("@medplum/react-hooks");var import_react66=require("react");var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};var import_jsx_runtime94=require("react/jsx-runtime");function ChatModal(props){let{open,children}=props,profile=(0,import_react_hooks32.useMedplumProfile)(),[opened,setOpened]=(0,import_react66.useState)(open??!1);return(0,import_react66.useEffect)(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[opened&&(0,import_jsx_runtime94.jsx)("div",{className:ChatModal_default.chatModalContainer,children}),opened?(0,import_jsx_runtime94.jsx)("div",{className:ChatModal_default.iconContainer,children:(0,import_jsx_runtime94.jsx)(import_core120.ActionIcon,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:(0,import_jsx_runtime94.jsx)(IconChevronDown,{size:"1.625rem"})})}):(0,import_jsx_runtime94.jsx)("div",{className:ChatModal_default.iconContainer,children:(0,import_jsx_runtime94.jsx)(import_core120.ActionIcon,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:(0,import_jsx_runtime94.jsx)(IconChevronUp,{size:"1.625rem"})})})]}):null}var import_core121=require("@medplum/core"),import_react_hooks33=require("@medplum/react-hooks"),import_react67=require("react");var import_jsx_runtime95=require("react/jsx-runtime");function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,excludeHeader,uploadEnabled,onError,onViewInDocuments}=props,medplum=(0,import_react_hooks33.useMedplum)(),profile=(0,import_react_hooks33.useMedplumProfile)(),prevThreadId=(0,import_react_hooks33.usePrevious)(thread?.id),[communications,setCommunications]=(0,import_react67.useState)([]),profileRef=(0,import_react67.useMemo)(()=>profile?(0,import_core121.createReference)(profile):void 0,[profile]),threadRef=(0,import_react67.useMemo)(()=>(0,import_core121.createReference)(thread),[thread]);(0,import_react67.useEffect)(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=(0,import_react67.useCallback)((message,file,existingDocRef)=>{let profileRefStr=profileRef?(0,import_core121.getReferenceString)(profileRef):void 0;if(!profileRefStr)return;(async()=>{let payload=[];if(message&&payload.push({contentString:message}),existingDocRef)payload.push({contentReference:(0,import_core121.createReference)(existingDocRef)});else if(file){let docRef=await medplum.createDocumentReference({data:file,contentType:file.type||"application/octet-stream",filename:file.name,additionalFields:{...thread.subject?{subject:thread.subject}:{},description:file.name}});payload.push({contentReference:(0,import_core121.createReference)(docRef)})}let communication=await medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>(0,import_core121.getReferenceString)(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload,partOf:[threadRef],subject:thread.subject});setCommunications([...communications,communication]),onMessageSent?.(communication)})().catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent]),onMessageReceived=(0,import_react67.useMemo)(()=>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?(0,import_jsx_runtime95.jsx)(BaseChat,{title:title??(thread?.topic?(0,import_core121.formatCodeableConcept)(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled,excludeHeader,uploadEnabled,onError,attachmentSubjectRef:thread.subject,onViewInDocuments}):null}var import_core124=require("@mantine/core"),import_react68=require("react");var import_core122=require("@mantine/core"),import_core123=require("@medplum/core"),import_react_hooks34=require("@medplum/react-hooks");var ChatListItem_default={content:"ChatListItem_content",contentContainer:"ChatListItem_contentContainer",selected:"ChatListItem_selected"};var import_jsx_runtime96=require("react/jsx-runtime"),ChatListItem=props=>{let{topic,lastCommunication,isSelected,getThreadUri}=props,patientResource=(0,import_react_hooks34.useResource)(topic.subject),patientName=(0,import_core123.formatHumanName)(patientResource?.name?.[0]),lastMsg=lastCommunication?.payload?.[0]?.contentString,trimmedMsg=lastMsg?.length&&lastMsg.length>100?lastMsg.slice(0,100)+"...":lastMsg,senderName=lastCommunication?.sender?.display?`${lastCommunication?.sender?.display}: `:"",content=trimmedMsg?`${senderName} ${trimmedMsg}`:"No messages available",topicName=topic.topic?.text??content;return(0,import_jsx_runtime96.jsx)(MedplumLink,{to:getThreadUri(topic),underline:"never",children:(0,import_jsx_runtime96.jsxs)(import_core122.Group,{p:"xs",align:"center",wrap:"nowrap",className:clsx_default(ChatListItem_default.contentContainer,{[ChatListItem_default.selected]:isSelected}),children:[(0,import_jsx_runtime96.jsx)(ResourceAvatar,{value:topic.subject,radius:"xl",size:36}),(0,import_jsx_runtime96.jsxs)(import_core122.Stack,{gap:0,children:[(0,import_jsx_runtime96.jsx)(import_core122.Text,{size:"sm",fw:700,truncate:"end",children:patientName}),(0,import_jsx_runtime96.jsx)(import_core122.Text,{size:"sm",fw:400,lineClamp:2,className:ChatListItem_default.content,children:topicName}),(0,import_jsx_runtime96.jsx)(import_core122.Text,{size:"xs",style:{marginTop:2},children:lastCommunication?(0,import_core123.formatDateTime)(lastCommunication.sent):""})]})]})})};var import_jsx_runtime97=require("react/jsx-runtime"),ChatList=props=>{let{threads,selectedCommunication,getThreadUri}=props;return(0,import_jsx_runtime97.jsx)(import_core124.Stack,{gap:0,children:threads.map(thread=>{let topicCommunication=thread[0],lastCommunication=thread[1],_isSelected=selectedCommunication?.id===topicCommunication.id;return(0,import_jsx_runtime97.jsxs)(import_react68.Fragment,{children:[(0,import_jsx_runtime97.jsx)(ChatListItem,{topic:topicCommunication,lastCommunication,isSelected:_isSelected,getThreadUri}),(0,import_jsx_runtime97.jsx)(import_core124.Divider,{})]},topicCommunication.id)})})};var import_core136=require("@mantine/core"),import_notifications6=require("@mantine/notifications"),import_core137=require("@medplum/core"),import_react_hooks40=require("@medplum/react-hooks"),import_react72=require("react");var import_core134=require("@mantine/core"),import_core135=require("@medplum/core"),import_react_hooks39=require("@medplum/react-hooks"),import_react71=require("react");var import_core125=require("@mantine/core"),import_core126=require("@medplum/core"),import_react_hooks35=require("@medplum/react-hooks");var import_react69=require("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}};var import_jsx_runtime98=require("react/jsx-runtime");function SignatureInput(props){let medplum=(0,import_react_hooks35.useMedplum)(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=(0,import_react69.useRef)(null),signaturePadRef=(0,import_react69.useRef)(null),onChangeRef=(0,import_react69.useRef)(onChange);return(0,import_react69.useLayoutEffect)(()=>{onChangeRef.current=onChange}),(0,import_react69.useEffect)(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:import_core126.HTTP_HL7_ORG+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??(0,import_core126.createReference)(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]),(0,import_jsx_runtime98.jsxs)(import_core125.Paper,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[(0,import_jsx_runtime98.jsx)("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),(0,import_jsx_runtime98.jsx)(import_core125.Button,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:(0,import_jsx_runtime98.jsx)(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}var import_core132=require("@mantine/core"),import_react_hooks38=require("@medplum/react-hooks");var import_core127=require("@mantine/core");var import_jsx_runtime99=require("react/jsx-runtime");function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return(0,import_jsx_runtime99.jsxs)("div",{children:[props.item.text&&(0,import_jsx_runtime99.jsx)(import_core127.Title,{order:3,mb:"md",children:props.item.text}),(0,import_jsx_runtime99.jsx)(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}var import_core128=require("@mantine/core"),import_core129=require("@medplum/core"),import_react_hooks36=require("@medplum/react-hooks"),import_react70=require("react");var import_jsx_runtime100=require("react/jsx-runtime"),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!==import_react_hooks36.QuestionnaireItemType.choice&&item.type!==import_react_hooks36.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!==import_react_hooks36.QuestionnaireItemType.choice&&item.type!==import_react_hooks36.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)??(0,import_react_hooks36.getItemInitialValue)(initial),validationError=(0,import_core129.getExtension)(response,`${import_core129.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case import_react_hooks36.QuestionnaireItemType.display:formComponent=(0,import_jsx_runtime100.jsx)("p",{children:props.item.text},props.item.linkId);break;case import_react_hooks36.QuestionnaireItemType.boolean:formComponent=(0,import_jsx_runtime100.jsx)(CheckboxFormSection,{title:props.item.text,htmlFor:inputId,children:(0,import_jsx_runtime100.jsx)(import_core128.Checkbox,{id:inputId,name,required:props.required??item.required,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueBoolean:e.currentTarget.checked}])})},props.item.linkId);break;case import_react_hooks36.QuestionnaireItemType.decimal:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{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 import_react_hooks36.QuestionnaireItemType.integer:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{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 import_react_hooks36.QuestionnaireItemType.date:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{type:"date",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueDate:e.currentTarget.value}])});break;case import_react_hooks36.QuestionnaireItemType.dateTime:formComponent=(0,import_jsx_runtime100.jsx)(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case import_react_hooks36.QuestionnaireItemType.time:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{type:"time",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueTime:e.currentTarget.value}])});break;case import_react_hooks36.QuestionnaireItemType.string:case import_react_hooks36.QuestionnaireItemType.url:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case import_react_hooks36.QuestionnaireItemType.text:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.Textarea,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case import_react_hooks36.QuestionnaireItemType.attachment:formComponent=(0,import_jsx_runtime100.jsx)(import_core128.Group,{py:4,children:(0,import_jsx_runtime100.jsx)(AttachmentInput,{path:"",name:inputId,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case import_react_hooks36.QuestionnaireItemType.reference:formComponent=(0,import_jsx_runtime100.jsx)(ReferenceInput,{name:inputId,required:props.required??item.required,targetTypes:(0,import_react_hooks36.getQuestionnaireItemReferenceTargetTypes)(item),searchCriteria:(0,import_react_hooks36.getQuestionnaireItemReferenceFilter)(item,formState?.subject,formState?.encounter),defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueReference:newValue}])});break;case import_react_hooks36.QuestionnaireItemType.quantity:formComponent=(0,import_jsx_runtime100.jsx)(QuantityInput,{path:"",name:inputId,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueQuantity:newValue}]),disableWheel:!0});break;case import_react_hooks36.QuestionnaireItemType.choice:case import_react_hooks36.QuestionnaireItemType.openChoice:{let{widget,multiselect}=resolveChoiceControl(item),sharedProps={name:inputId,item,required:props.required??item.required,initial,response,multiselect,onChangeAnswer};widget==="check-box"?formComponent=(0,import_jsx_runtime100.jsx)(QuestionnaireCheckboxInput,{...sharedProps}):widget==="drop-down"?formComponent=(0,import_jsx_runtime100.jsx)(QuestionnaireDropdownInput,{...sharedProps}):formComponent=(0,import_jsx_runtime100.jsx)(QuestionnaireRadioButtonInput,{...sharedProps})}break;default:return null}return(0,import_jsx_runtime100.jsxs)(import_jsx_runtime100.Fragment,{children:[formComponent,validationError?.valueString&&(0,import_jsx_runtime100.jsx)(import_core128.Text,{c:"red",size:"lg",mt:4,children:validationError.valueString})]})}function QuestionnaireDropdownInput(props){let{name,item,required,initial,onChangeAnswer,response,multiselect}=props;if(!item.answerOption?.length&&!item.answerValueSet)return(0,import_jsx_runtime100.jsx)(NoAnswerDisplay,{});let initialValue=(0,import_react_hooks36.getItemInitialValue)(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||multiselect;if(item.answerValueSet)return(0,import_jsx_runtime100.jsx)(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(0,import_jsx_runtime100.jsx)(import_core128.MultiSelect,{data:data2,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[(0,import_core129.typedValueToString)(initialValue)],required,onChange:selected=>{if(selected.length===0)onChangeAnswer([{}]);else{let values=(0,import_react_hooks36.getNewMultiSelectValues)(selected,propertyName,item);onChangeAnswer(values)}}})}else{let data2=[""];if(item.answerOption)for(let option of item.answerOption){let optionValue=(0,import_react_hooks36.getItemAnswerOptionValue)(option);data2.push((0,import_core129.typedValueToString)(optionValue))}return(0,import_jsx_runtime100.jsx)(import_core128.NativeSelect,{id:name,name,required,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){onChangeAnswer([{}]);return}let option=item.answerOption[index-1],optionValue=(0,import_react_hooks36.getItemAnswerOptionValue)(option),propertyName="value"+(0,import_core129.capitalize)(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])},defaultValue:(0,import_core129.formatCoding)(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=(0,import_react_hooks36.useMedplum)(),[valueSetOptions,setValueSetOptions]=(0,import_react70.useState)([]),[isLoading,setIsLoading]=(0,import_react70.useState)(!1);return(0,import_react70.useEffect)(()=>{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=(0,import_core129.getElementDefinition)("QuestionnaireItemAnswerOption","value[x]"),initialValue=(0,import_react_hooks36.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=(0,import_react_hooks36.getItemAnswerOptionValue)(option);return optionValue?.value?(initialValue&&(0,import_core129.stringify)(optionValue)===(0,import_core129.stringify)(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return(0,import_jsx_runtime100.jsx)(import_core128.Text,{children:"Loading options..."});if(options.length===0)return(0,import_jsx_runtime100.jsx)(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return(0,import_jsx_runtime100.jsxs)(import_jsx_runtime100.Fragment,{children:[(0,import_jsx_runtime100.jsx)(import_core128.Radio.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+(0,import_core129.capitalize)(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>(0,import_jsx_runtime100.jsx)(import_core128.Radio,{id:optionName,value:optionName,py:4,required,label:(0,import_jsx_runtime100.jsx)(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)&&(0,import_jsx_runtime100.jsxs)(import_core128.Text,{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=(0,import_core129.getElementDefinition)("QuestionnaireItemAnswerOption","value[x]"),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),initialSelectedValues=item.answerValueSet?(response?.answer?.map(a=>a.valueCoding)||[]).filter(c=>c!==void 0):getCurrentMultiSelectAnswer(response),[selectedValues,setSelectedValues]=(0,import_react70.useState)(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=(0,import_react_hooks36.getItemAnswerOptionValue)(option);return optionValue?.value?[optionName,optionValue]:null}).filter(option=>option!==null);options.push(...mappedOptions)}if(isLoading)return(0,import_jsx_runtime100.jsx)(import_core128.Text,{children:"Loading options..."});if(options.length===0)return(0,import_jsx_runtime100.jsx)(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=>!(0,import_core129.deepEquals)(c,optionValue.value)),setSelectedValues(newCodings),newCodings.length===0?onChangeAnswer([{}]):onChangeAnswer(newCodings.map(coding=>({valueCoding:coding})))}else{let currentValues=selectedValues,optionValueStr=(0,import_core129.typedValueToString)(optionValue),newValues;if(selected?newValues=[...currentValues,optionValueStr]:newValues=currentValues.filter(v=>v!==optionValueStr),setSelectedValues(newValues),newValues.length===0)onChangeAnswer([{}]);else{let values=(0,import_react_hooks36.getNewMultiSelectValues)(newValues,"value"+(0,import_core129.capitalize)(optionValue.type),item);onChangeAnswer(values)}}};return(0,import_jsx_runtime100.jsxs)(import_core128.Group,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=(0,import_core129.typedValueToString)(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>(0,import_core129.deepEquals)(coding,optionValue.value)):selectedValues.includes(optionValueStr);return(0,import_jsx_runtime100.jsx)(import_core128.Checkbox,{id:optionName,label:(0,import_jsx_runtime100.jsx)(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)&&(0,import_jsx_runtime100.jsxs)(import_core128.Text,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return(0,import_jsx_runtime100.jsx)(import_core128.TextInput,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){return(0,import_react_hooks36.getItemAnswerOptionValue)(response?.answer?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response?.answer;return results?results.map(a=>(0,import_react_hooks36.getItemAnswerOptionValue)(a)).map(type=>(0,import_core129.formatCoding)(type?.value)||type?.value).filter(Boolean):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>(0,import_core129.deepEquals)(option[1].value,defaultAnswer?.value))?.[0]}var choiceTypes=["drop-down","radio-button","check-box"];function resolveChoiceControl(item){let widget="radio-button",multiselect=!1;item.answerValueSet&&(widget="drop-down");for(let ext of item.extension??[]){if(ext.url!==import_react_hooks36.QUESTIONNAIRE_ITEM_CONTROL_URL)continue;let code=ext.valueCodeableConcept?.coding?.[0]?.code;choiceTypes.includes(code)&&(widget=code),code==="multi-select"&&(multiselect=!0)}return widget==="radio-button"&&multiselect&&(widget="check-box"),{widget,multiselect}}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=(0,import_react_hooks36.getItemAnswerOptionValue)(option),propertyName="value"+(0,import_core129.capitalize)(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=(0,import_react_hooks36.getItemAnswerOptionValue)(answerOption),answerOptionValueStr=(0,import_core129.typedValueToString)(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}var import_core130=require("@mantine/core");var import_jsx_runtime101=require("react/jsx-runtime");function QuestionnaireFormRepeatableGroup(props){return(0,import_jsx_runtime101.jsxs)(import_jsx_runtime101.Fragment,{children:[props.responseItems.map(response=>(0,import_jsx_runtime101.jsx)(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),(0,import_jsx_runtime101.jsx)(import_core130.Anchor,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}var import_core131=require("@mantine/core"),import_react_hooks37=require("@medplum/react-hooks");var import_jsx_runtime102=require("react/jsx-runtime");function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,isChoiceType=item.type===import_react_hooks37.QuestionnaireItemType.choice||item.type===import_react_hooks37.QuestionnaireItemType.openChoice,showAddButton=!isChoiceType,answers=!isChoiceType&&responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return(0,import_jsx_runtime102.jsxs)(FormSection,{title:props.item.text,withAsterisk:props.item.required,children:[(0,import_jsx_runtime102.jsx)(import_core131.Stack,{gap:"xs",children:answers?.map((_,index)=>(0,import_jsx_runtime102.jsx)(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&(0,import_jsx_runtime102.jsx)(import_core131.Anchor,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}var import_jsx_runtime103=require("react/jsx-runtime");function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props;return(0,import_jsx_runtime103.jsx)(import_core132.Stack,{children:items.map((item,index)=>{if(!(0,import_react_hooks38.isQuestionEnabled)(item,formState.questionnaireResponse))return null;if(item.type===import_react_hooks38.QuestionnaireItemType.display)return(0,import_jsx_runtime103.jsx)("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===import_react_hooks38.QuestionnaireItemType.group&&item.repeats?(0,import_jsx_runtime103.jsx)(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems},`repeating-group-${item.id}-${index}`):item.type===import_react_hooks38.QuestionnaireItemType.group?(0,import_jsx_runtime103.jsx)(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]},`group-${item.id}-${index}`):item.type===import_react_hooks38.QuestionnaireItemType.boolean?(0,import_jsx_runtime103.jsx)(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?(0,import_jsx_runtime103.jsx)(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):(0,import_jsx_runtime103.jsx)(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:(0,import_jsx_runtime103.jsx)(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}var import_core133=require("@mantine/core");var import_jsx_runtime104=require("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(0,import_jsx_runtime104.jsxs)(import_jsx_runtime104.Fragment,{children:[(0,import_jsx_runtime104.jsx)(import_core133.Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>(0,import_jsx_runtime104.jsx)(import_core133.Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&(0,import_jsx_runtime104.jsxs)(import_core133.Group,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&(0,import_jsx_runtime104.jsx)(import_core133.Button,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&(0,import_jsx_runtime104.jsx)(import_core133.Button,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&(0,import_jsx_runtime104.jsx)(SubmitButton,{children:submitButtonText??"Submit"})]})]})}var import_jsx_runtime105=require("react/jsx-runtime");function QuestionnaireForm(props){let medplum=(0,import_react_hooks39.useMedplum)(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=(0,import_react71.useState)(!1),propsRef=(0,import_react71.useRef)(props),pendingChangeRef=(0,import_react71.useRef)(void 0);(0,import_react71.useLayoutEffect)(()=>{propsRef.current=props});let onFormChange=(0,import_react71.useCallback)(response=>{pendingChangeRef.current=response},[]),formState=(0,import_react_hooks39.useQuestionnaireForm)({questionnaire:props.questionnaire,defaultValue:props.questionnaireResponse,subject:props.subject,encounter:props.encounter,source:props.source,disablePagination:props.disablePagination,onChange:onFormChange}),formStateRef=(0,import_react71.useRef)(formState);(0,import_react71.useLayoutEffect)(()=>{formStateRef.current=formState}),(0,import_react71.useEffect)(()=>{let pendingChange=pendingChangeRef.current;pendingChange&&(pendingChangeRef.current=void 0,setSignatureRequiredSubmitted(!1),propsRef.current.onChange?.(pendingChange))});let isSignatureRequired=(0,import_react71.useMemo)(()=>formState.loading?!1:!!(0,import_core135.getExtension)(formState.questionnaire,import_react_hooks39.QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=(0,import_react71.useMemo)(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===import_react_hooks39.QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=(0,import_react71.useCallback)(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire2=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=(0,import_core135.createReference)(profile))}onSubmit({...response,questionnaire:questionnaire2.url??(0,import_core135.getReferenceString)(questionnaire2),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:(0,import_jsx_runtime105.jsxs)(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&(0,import_jsx_runtime105.jsx)(import_core134.Title,{children:formState.questionnaire.title}),formState.pagination?(0,import_jsx_runtime105.jsx)(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:(0,import_jsx_runtime105.jsx)(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):(0,import_jsx_runtime105.jsxs)(import_jsx_runtime105.Fragment,{children:[(0,import_jsx_runtime105.jsx)(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&(0,import_jsx_runtime105.jsxs)(import_core134.Stack,{mt:"md",gap:0,children:[(0,import_jsx_runtime105.jsx)(import_core134.Text,{size:"sm",fw:500,children:"Signature"}),(0,import_jsx_runtime105.jsx)(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&(0,import_jsx_runtime105.jsx)(import_core134.Text,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&(0,import_jsx_runtime105.jsx)(import_core134.Group,{justify:"flex-end",mt:"xl",gap:"xs",children:(0,import_jsx_runtime105.jsx)(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}var import_jsx_runtime106=require("react/jsx-runtime"),NewTopicDialog=props=>{let{subject,opened,onClose,onSubmit,allowPatientSelection=!1}=props,medplum=(0,import_react_hooks40.useMedplum)(),profile=(0,import_react_hooks40.useMedplumProfile)(),profileRef=(0,import_react72.useMemo)(()=>profile?(0,import_core137.createReference)(profile):void 0,[profile]),[topic,setTopic]=(0,import_react72.useState)(""),[practitioners,setPractitioners]=(0,import_react72.useState)(profile?.resourceType==="Practitioner"?[(0,import_core137.createReference)(profile)]:[]),[patient,setPatient]=(0,import_react72.useState)(subject?(0,import_core137.createReference)(subject):void 0),initialResponse=(0,import_react72.useMemo)(()=>{if(profile?.resourceType==="Practitioner")return{resourceType:"QuestionnaireResponse",status:"in-progress",item:[{linkId:"q1",answer:[{valueReference:(0,import_core137.createReference)(profile)}]}]}},[profile]);return(0,import_jsx_runtime106.jsx)(import_core136.Modal,{opened,onClose,title:"New Message",size:"md",children:(0,import_jsx_runtime106.jsxs)(import_core136.Stack,{gap:"xl",children:[(0,import_jsx_runtime106.jsxs)(import_core136.Stack,{gap:0,children:[(0,import_jsx_runtime106.jsx)(import_core136.Text,{fw:500,children:"Patient"}),allowPatientSelection&&(0,import_jsx_runtime106.jsx)(import_core136.Text,{c:"dimmed",children:"Select a patient"}),(0,import_jsx_runtime106.jsx)(ResourceInput,{resourceType:"Patient",name:"patient",required:!0,defaultValue:patient,disabled:!allowPatientSelection&&!!patient,onChange:value=>{setPatient(value?(0,import_core137.createReference)(value):void 0)}})]}),(0,import_jsx_runtime106.jsxs)(import_core136.Stack,{gap:0,children:[(0,import_jsx_runtime106.jsx)(import_core136.Text,{fw:500,children:"Practitioner (optional)"}),(0,import_jsx_runtime106.jsx)(import_core136.Text,{c:"dimmed",children:"Select one or more practitioners"}),(0,import_jsx_runtime106.jsx)(QuestionnaireForm,{questionnaire,questionnaireResponse:initialResponse,excludeButtons:!0,onChange:value=>{let references=value.item?.[0].answer?.map(item=>item.valueReference).filter(ref=>ref!==void 0)??[];setPractitioners(references)}})]}),(0,import_jsx_runtime106.jsxs)(import_core136.Stack,{gap:0,children:[(0,import_jsx_runtime106.jsx)(import_core136.Text,{fw:500,children:"Topic (optional)"}),(0,import_jsx_runtime106.jsx)(import_core136.Text,{c:"dimmed",children:"Enter a topic for the message"}),(0,import_jsx_runtime106.jsx)(import_core136.TextInput,{placeholder:"Enter your topic",value:topic,onChange:e=>setTopic(e.target.value)})]}),(0,import_jsx_runtime106.jsx)(import_core136.Button,{onClick:async()=>{if(!patient){(0,import_notifications6.showNotification)({title:"Error",message:"Please select a patient",color:"red"});return}let communication={resourceType:"Communication",status:"in-progress",subject:patient,sender:profileRef,recipient:[patient,...practitioners.map(practitioner=>({reference:practitioner.reference}))],topic:{text:topic}};try{let createdCommunication=await medplum.createResource(communication);onSubmit?.(createdCommunication),onClose()}catch(error){(0,import_notifications6.showNotification)({title:"Error",message:(0,import_core137.normalizeErrorString)(error),color:"red"})}},children:"Next"})]})})},questionnaire={resourceType:"Questionnaire",status:"active",item:[{linkId:"q1",type:"reference",repeats:!0,extension:[{url:`${import_core137.HTTP_HL7_ORG}/fhir/StructureDefinition/questionnaire-referenceResource`,valueCodeableConcept:{coding:[{system:`${import_core137.HTTP_HL7_ORG}/fhir/fhir-types`,display:"Practitioner",code:"Practitioner"}]}}]}]};var import_core138=require("@mantine/core"),import_hooks5=require("@mantine/hooks"),import_notifications7=require("@mantine/notifications"),import_core139=require("@medplum/core"),import_react_hooks41=require("@medplum/react-hooks");var import_react73=require("react");var ParticipantFilter_default={participantItem:"ParticipantFilter_participantItem"};var import_jsx_runtime107=require("react/jsx-runtime");function ParticipantFilter(props){let{selectedParticipants,onFilterChange}=props,[opened,{open,close}]=(0,import_hooks5.useDisclosure)(!1),[searchQuery,setSearchQuery]=(0,import_react73.useState)(""),[searchResults,setSearchResults]=(0,import_react73.useState)([]),[isSearching,setIsSearching]=(0,import_react73.useState)(!1),medplum=(0,import_react_hooks41.useMedplum)(),profile=(0,import_react_hooks41.useMedplumProfile)(),currentUserParticipant=(0,import_react73.useMemo)(()=>{if(profile)return(0,import_core139.createReference)(profile)},[profile]),additionalParticipants=(0,import_react73.useMemo)(()=>{let currentUserRef=currentUserParticipant?.reference;return selectedParticipants.filter(p=>p.reference!==currentUserRef)},[selectedParticipants,currentUserParticipant]),debouncedSearch=(0,import_hooks5.useDebouncedCallback)(async query=>{if(!query.trim()){setSearchResults([]);return}setIsSearching(!0);try{let bundle=await medplum.search("Patient",{_type:"Patient,Practitioner",name:query,_count:"10"}),currentUserRef=currentUserParticipant?.reference,results=(bundle.entry??[]).map(entry=>entry.resource).filter(resource=>{if(!resource)return!1;let refString=(0,import_core139.getReferenceString)(resource);return!!refString&&refString!==currentUserRef}).map(resource=>(0,import_core139.createReference)(resource));setSearchResults(results)}catch(error){(0,import_notifications7.showNotification)({title:"Error",message:(0,import_core139.normalizeErrorString)(error),color:"red"}),setSearchResults([])}finally{setIsSearching(!1)}},300);(0,import_react73.useEffect)(()=>(debouncedSearch(searchQuery),debouncedSearch.cancel),[searchQuery,debouncedSearch]);let isSelected=participant=>selectedParticipants.some(p=>p.reference===participant.reference),toggleParticipant=participant=>{let newParticipants=isSelected(participant)?selectedParticipants.filter(p=>p.reference!==participant.reference):[...selectedParticipants,participant];onFilterChange(newParticipants)},removeParticipant=participant=>{let newParticipants=selectedParticipants.filter(p=>p.reference!==participant.reference);onFilterChange(newParticipants)},displayParticipants=(0,import_react73.useMemo)(()=>{let result=[];for(let p of additionalParticipants)result.some(r2=>r2.reference===p.reference)||result.push(p);if(searchQuery.trim()&&searchResults.length>0)for(let p of searchResults)currentUserParticipant?.reference!==p.reference&&(result.some(r2=>r2.reference===p.reference)||result.push(p));return result},[additionalParticipants,searchQuery,searchResults,currentUserParticipant]),hasActiveFilter=selectedParticipants.length>0;return(0,import_jsx_runtime107.jsxs)(import_core138.Popover,{opened,onChange:o=>!o&&close(),position:"bottom-start",width:360,shadow:"md",radius:"md",withinPortal:!0,children:[(0,import_jsx_runtime107.jsx)(import_core138.Popover.Target,{children:(0,import_jsx_runtime107.jsx)(import_core138.Tooltip,{label:"Message Participants",position:"bottom",openDelay:500,disabled:opened,children:(0,import_jsx_runtime107.jsx)(import_core138.Indicator,{disabled:!hasActiveFilter,color:"blue",size:8,offset:4,children:(0,import_jsx_runtime107.jsx)(import_core138.ActionIcon,{variant:"transparent",onClick:opened?close:open,radius:"xl",size:32,className:"outline-icon-button","data-opened":opened||void 0,children:(0,import_jsx_runtime107.jsx)(IconUsers,{size:16})})})})}),(0,import_jsx_runtime107.jsx)(import_core138.Popover.Dropdown,{p:"md",children:(0,import_jsx_runtime107.jsxs)(import_core138.Stack,{gap:"md",children:[(0,import_jsx_runtime107.jsx)(import_core138.Text,{size:"xs",c:"dimmed",fw:500,children:"Message Participants"}),(0,import_jsx_runtime107.jsx)(import_core138.TextInput,{placeholder:"Search for a Patient or Practitioner...",value:searchQuery,autoFocus:!0,onChange:e=>setSearchQuery(e.target.value),rightSection:searchQuery?(0,import_jsx_runtime107.jsx)(import_core138.CloseButton,{size:"sm",onClick:()=>setSearchQuery("")}):null}),(0,import_jsx_runtime107.jsxs)(import_core138.Stack,{gap:"xs",mah:250,style:{overflowY:"auto"},children:[currentUserParticipant&&(0,import_jsx_runtime107.jsx)(ParticipantItem,{participant:currentUserParticipant,isSelected:isSelected(currentUserParticipant),isCurrentUser:!0,onToggle:()=>toggleParticipant(currentUserParticipant)}),displayParticipants.map(participant=>(0,import_jsx_runtime107.jsx)(ParticipantItem,{participant,isSelected:isSelected(participant),isCurrentUser:!1,onToggle:()=>toggleParticipant(participant),onRemove:isSelected(participant)?()=>removeParticipant(participant):void 0},participant.reference)),isSearching&&(0,import_jsx_runtime107.jsx)(import_core138.Text,{size:"sm",c:"dimmed",ta:"center",children:"Searching..."}),searchQuery.trim()&&!isSearching&&searchResults.length===0&&(0,import_jsx_runtime107.jsx)(import_core138.Text,{size:"sm",c:"dimmed",ta:"center",children:"No results found"})]})]})})]})}function ParticipantItem(props){let{participant,isSelected,isCurrentUser,onToggle,onRemove}=props,patientResource=(0,import_react_hooks41.useResource)(participant);return patientResource?(0,import_jsx_runtime107.jsxs)(import_core138.Group,{justify:"space-between",wrap:"nowrap",className:ParticipantFilter_default.participantItem,children:[(0,import_jsx_runtime107.jsxs)(import_core138.Group,{gap:"sm",wrap:"nowrap",style:{flex:1,minWidth:0},children:[(0,import_jsx_runtime107.jsx)(import_core138.Checkbox,{checked:isSelected,onChange:onToggle}),(0,import_jsx_runtime107.jsx)(ResourceAvatar,{value:participant,radius:"xl",size:32}),(0,import_jsx_runtime107.jsxs)(import_core138.Text,{size:"sm",truncate:!0,style:{flex:1},children:[(0,import_core139.formatHumanName)(patientResource?.name?.[0]??{}),isCurrentUser&&(0,import_jsx_runtime107.jsxs)(import_core138.Text,{component:"span",c:"dimmed",size:"sm",children:[" ","(you)"]})]})]}),onRemove&&(0,import_jsx_runtime107.jsx)(import_core138.CloseButton,{size:"sm",onClick:onRemove})]}):null}var import_core181=require("@mantine/core"),import_hooks14=require("@mantine/hooks"),import_notifications8=require("@mantine/notifications"),import_core182=require("@medplum/core"),import_react_hooks54=require("@medplum/react-hooks");var import_react89=require("react");var import_core179=require("@mantine/core"),import_core180=require("@medplum/core"),import_react_hooks53=require("@medplum/react-hooks"),import_react88=require("react");var PatientSummary_default={panel:"PatientSummary_panel",patientSummaryBadge:"PatientSummary_patientSummaryBadge",patientSummaryAddButton:"PatientSummary_patientSummaryAddButton",patientSummaryHeader:"PatientSummary_patientSummaryHeader",patientSummaryCollapseIcon:"PatientSummary_patientSummaryCollapseIcon",collapsed:"PatientSummary_collapsed"};var import_core177=require("@mantine/core"),import_core178=require("@medplum/core");var import_core145=require("@mantine/core"),import_hooks6=require("@mantine/hooks"),import_core146=require("@medplum/core"),import_react_hooks42=require("@medplum/react-hooks"),import_react76=require("react");var import_core140=require("@mantine/core"),import_jsx_runtime108=require("react/jsx-runtime"),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(0,import_jsx_runtime108.jsx)(import_core140.Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}var import_core141=require("@mantine/core"),import_core142=require("@medplum/core"),import_react74=require("react");var import_jsx_runtime109=require("react/jsx-runtime"),HTTP="http://",PATIENT_ALLERGY_PROFILE=import_core142.HTTP_HL7_ORG+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=(0,import_react74.useState)(allergy?.code),[clinicalStatus,setClinicalStatus]=(0,import_react74.useState)(allergy?.clinicalStatus),handleSubmit=(0,import_react74.useCallback)(formData=>{onSubmit((0,import_core142.addProfileToResource)({...allergy,resourceType:"AllergyIntolerance",patient:(0,import_core142.createReference)(patient),encounter:encounter?(0,import_core142.createReference)(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(0,import_jsx_runtime109.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime109.jsxs)(import_core141.Stack,{children:[(0,import_jsx_runtime109.jsx)(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}),(0,import_jsx_runtime109.jsx)(import_core141.TextInput,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),(0,import_jsx_runtime109.jsx)(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:import_core142.HTTP_HL7_ORG+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),(0,import_jsx_runtime109.jsx)(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),(0,import_jsx_runtime109.jsx)(import_core141.Group,{justify:"flex-end",gap:4,mt:"md",children:(0,import_jsx_runtime109.jsx)(SubmitButton,{children:"Save"})})]})},allergy?.id)}var import_core143=require("@mantine/core");var import_react75=require("react");var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title",addButton:"CollapsibleSection_addButton"};var import_jsx_runtime110=require("react/jsx-runtime");function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=(0,import_react75.useState)(!1);return(0,import_jsx_runtime110.jsxs)(import_core143.Box,{className:CollapsibleSection_default.root,children:[(0,import_jsx_runtime110.jsxs)(import_core143.Group,{justify:"space-between",className:CollapsibleSection_default.header,children:[(0,import_jsx_runtime110.jsxs)(import_core143.Group,{gap:8,children:[(0,import_jsx_runtime110.jsx)(import_core143.ActionIcon,{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:(0,import_jsx_runtime110.jsx)(IconChevronDown,{size:20})}),(0,import_jsx_runtime110.jsx)(import_core143.Text,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&(0,import_jsx_runtime110.jsx)(import_core143.ActionIcon,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:(0,import_jsx_runtime110.jsx)(IconPlus,{size:18})})]}),(0,import_jsx_runtime110.jsx)(import_core143.Collapse,{in:!collapsed,children:(0,import_jsx_runtime110.jsx)(import_core143.Box,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}var import_core144=require("@mantine/core");var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};var import_jsx_runtime111=require("react/jsx-runtime");function SummaryItem(props){let{children,onClick}=props;return(0,import_jsx_runtime111.jsxs)(import_core144.Box,{className:SummaryItem_default.item,onClick,children:[children,(0,import_jsx_runtime111.jsx)("div",{className:SummaryItem_default.gradient}),(0,import_jsx_runtime111.jsx)("div",{className:SummaryItem_default.container,children:(0,import_jsx_runtime111.jsx)(import_core144.ActionIcon,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:(0,import_jsx_runtime111.jsx)(IconChevronRight,{size:16,stroke:2.5})})})]})}var import_jsx_runtime112=require("react/jsx-runtime");function Allergies(props){let medplum=(0,import_react_hooks42.useMedplum)(),{patient,encounter}=props,[allergies,setAllergies]=(0,import_react76.useState)(props.allergies),[opened,{open,close}]=(0,import_hooks6.useDisclosure)(!1),[editAllergy,setEditAllergy]=(0,import_react76.useState)(),sortedAllergies=(0,import_react76.useMemo)(()=>[...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:(0,import_core146.getDisplayString)(a).localeCompare((0,import_core146.getDisplayString)(b))}),[allergies]),handleSubmit=(0,import_react76.useCallback)(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(0,import_jsx_runtime112.jsxs)(import_jsx_runtime112.Fragment,{children:[(0,import_jsx_runtime112.jsx)(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?(0,import_jsx_runtime112.jsx)(import_core145.Box,{children:(0,import_jsx_runtime112.jsx)(import_core145.Flex,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return(0,import_jsx_runtime112.jsx)(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:(0,import_jsx_runtime112.jsxs)(import_core145.Box,{children:[(0,import_jsx_runtime112.jsx)(import_core145.Text,{fw:500,className:SummaryItem_default.itemText,children:(0,import_core146.getDisplayString)(allergy)}),(0,import_jsx_runtime112.jsx)(import_core145.Group,{mt:2,gap:4,children:status&&(0,import_jsx_runtime112.jsx)(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):(0,import_jsx_runtime112.jsx)(import_core145.Text,{children:"(none)"})}),(0,import_jsx_runtime112.jsx)(import_core145.Modal,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:(0,import_jsx_runtime112.jsx)(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"}}var import_core147=require("@mantine/core"),import_core148=require("@medplum/core"),import_react_hooks43=require("@medplum/react-hooks");var import_jsx_runtime113=require("react/jsx-runtime");function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=(0,import_react_hooks43.useResource)(coverage),organizationResource=(0,import_react_hooks43.useResource)(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(0,import_jsx_runtime113.jsx)(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:(0,import_jsx_runtime113.jsxs)(import_core147.Box,{children:[(0,import_jsx_runtime113.jsx)(import_core147.Text,{fw:500,className:PatientSummary_default.itemText,children:payorName}),(0,import_jsx_runtime113.jsx)(import_core147.Text,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),(0,import_jsx_runtime113.jsxs)(import_core147.Group,{mt:2,gap:4,children:[(0,import_jsx_runtime113.jsx)(StatusBadge,{color:"green",variant:"light",status:"Active"}),(0,import_jsx_runtime113.jsxs)(import_core147.Text,{size:"xs",fw:500,color:"gray.6",children:["Ends ",(0,import_core148.formatDate)(coverageResource?.period?.end)]})]})]})})}function Insurance(props){let{coverages,onClickResource}=props,activeCoverages=coverages.filter(coverage=>coverage.status==="active"&&!coverage.type?.coding?.some(coding=>coding.code==="SELFPAY"));return(0,import_jsx_runtime113.jsx)(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?(0,import_jsx_runtime113.jsx)(import_core147.Flex,{direction:"column",gap:8,children:activeCoverages.map(coverage=>(0,import_jsx_runtime113.jsx)(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):(0,import_jsx_runtime113.jsx)(import_core147.Text,{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 ")??"":""}var import_core155=require("@mantine/core"),import_hooks7=require("@mantine/hooks"),import_core156=require("@medplum/core"),import_react79=require("react");var import_core153=require("@mantine/core"),import_core154=require("@medplum/core"),import_react_hooks45=require("@medplum/react-hooks");var import_react78=require("react");var import_core149=require("@mantine/core");var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};var import_jsx_runtime114=require("react/jsx-runtime");function NoteDisplay({value}){return value?(0,import_jsx_runtime114.jsx)(import_core149.Stack,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&(0,import_jsx_runtime114.jsx)(import_core149.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}var import_core152=require("@mantine/core");var import_core150=require("@mantine/core"),import_core151=require("@medplum/core"),import_react_hooks44=require("@medplum/react-hooks"),import_react77=require("react");var import_jsx_runtime115=require("react/jsx-runtime");function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=(0,import_react77.useState)(),resource=(0,import_react_hooks44.useResource)(value,setOutcome),text;if(outcome&&!(0,import_core151.isOk)(outcome))text=`[${(0,import_core151.normalizeErrorString)(outcome)}]`;else if(resource)text=(0,import_core151.getDisplayString)(resource);else return null;return link?(0,import_jsx_runtime115.jsx)(MedplumLink,{to:value,...rest,children:text}):(0,import_jsx_runtime115.jsx)(import_core150.Text,{component:"span",...rest,children:text})}var import_jsx_runtime116=require("react/jsx-runtime");function ResourceBadge(props){return(0,import_jsx_runtime116.jsxs)(import_core152.Group,{gap:"xs",children:[(0,import_jsx_runtime116.jsx)(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),(0,import_jsx_runtime116.jsx)(ResourceName,{value:props.value,link:props.link})]})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};var import_jsx_runtime117=require("react/jsx-runtime");DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=(0,import_react_hooks45.useMedplum)(),diagnosticReport=(0,import_react_hooks45.useResource)(props.value),[specimens,setSpecimens]=(0,import_react78.useState)();if((0,import_react78.useEffect)(()=>{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(0,import_jsx_runtime117.jsxs)(import_core153.Stack,{children:[(0,import_jsx_runtime117.jsx)(import_core153.Title,{children:"Diagnostic Report"}),(0,import_jsx_runtime117.jsx)(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&(0,import_jsx_runtime117.jsx)(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&(0,import_jsx_runtime117.jsx)(NoteDisplay,{value:specimenNotes}),diagnosticReport.conclusion&&(0,import_jsx_runtime117.jsxs)(import_core153.Stack,{mt:"md",children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{fw:500,size:"sm",c:"dimmed",children:"Conclusion"}),(0,import_jsx_runtime117.jsx)(import_core153.Text,{children:diagnosticReport.conclusion})]})]})}function DiagnosticReportHeader({value,hideSubject=!1}){return(0,import_jsx_runtime117.jsxs)(import_core153.Group,{mt:"md",gap:30,children:[value.subject&&!hideSubject&&(0,import_jsx_runtime117.jsxs)("div",{children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),(0,import_jsx_runtime117.jsx)(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>(0,import_jsx_runtime117.jsxs)("div",{children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),(0,import_jsx_runtime117.jsx)(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>(0,import_jsx_runtime117.jsxs)("div",{children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),(0,import_jsx_runtime117.jsx)(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&(0,import_jsx_runtime117.jsxs)("div",{children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),(0,import_jsx_runtime117.jsx)(import_core153.Text,{children:(0,import_core154.formatDateTime)(value.issued)})]}),value.status&&(0,import_jsx_runtime117.jsxs)("div",{children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),(0,import_jsx_runtime117.jsx)(StatusBadge,{status:value.status})]})]})}function SpecimenInfo(specimens){return(0,import_jsx_runtime117.jsxs)(import_core153.Stack,{gap:"xs",children:[(0,import_jsx_runtime117.jsx)(import_core153.Title,{order:2,size:"h6",children:"Specimens"}),(0,import_jsx_runtime117.jsx)(import_core153.List,{type:"ordered",children:specimens?.map(specimen=>(0,import_jsx_runtime117.jsx)(import_core153.List.Item,{ml:"sm",children:(0,import_jsx_runtime117.jsxs)(import_core153.Group,{gap:20,children:[(0,import_jsx_runtime117.jsxs)(import_core153.Group,{gap:5,children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{fw:500,children:"Collected:"})," ",(0,import_core154.formatDateTime)(specimen.collection?.collectedDateTime)]}),(0,import_jsx_runtime117.jsxs)(import_core153.Group,{gap:5,children:[(0,import_jsx_runtime117.jsx)(import_core153.Text,{fw:500,children:"Received:"})," ",(0,import_core154.formatDateTime)(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return(0,import_jsx_runtime117.jsxs)("table",{className:DiagnosticReportDisplay_default.table,children:[(0,import_jsx_runtime117.jsx)("thead",{children:(0,import_jsx_runtime117.jsxs)("tr",{children:[(0,import_jsx_runtime117.jsx)("th",{children:"Test"}),(0,import_jsx_runtime117.jsx)("th",{children:"Value"}),(0,import_jsx_runtime117.jsx)("th",{children:"Reference Range"}),(0,import_jsx_runtime117.jsx)("th",{children:"Interpretation"}),(0,import_jsx_runtime117.jsx)("th",{children:"Category"}),(0,import_jsx_runtime117.jsx)("th",{children:"Performer"}),(0,import_jsx_runtime117.jsx)("th",{children:"Status"})]})}),(0,import_jsx_runtime117.jsx)("tbody",{children:(0,import_jsx_runtime117.jsx)(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return(0,import_jsx_runtime117.jsx)(import_jsx_runtime117.Fragment,{children:props.value?.map(observation=>(0,import_jsx_runtime117.jsx)(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${(0,import_core154.isReference)(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=(0,import_react_hooks45.useResource)(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return(0,import_jsx_runtime117.jsxs)(import_jsx_runtime117.Fragment,{children:[(0,import_jsx_runtime117.jsxs)("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[(0,import_jsx_runtime117.jsx)("td",{rowSpan:displayNotes?2:1,children:(0,import_jsx_runtime117.jsx)(MedplumLink,{to:observation,children:(0,import_jsx_runtime117.jsx)(CodeableConceptDisplay,{value:observation.code})})}),(0,import_jsx_runtime117.jsx)("td",{children:(0,import_jsx_runtime117.jsx)(ObservationValueDisplay,{value:observation})}),(0,import_jsx_runtime117.jsx)("td",{children:(0,import_jsx_runtime117.jsx)(ReferenceRangeDisplay,{value:observation.referenceRange})}),(0,import_jsx_runtime117.jsx)("td",{children:observation.interpretation&&observation.interpretation.length>0&&(0,import_jsx_runtime117.jsx)(CodeableConceptDisplay,{value:observation.interpretation[0]})}),(0,import_jsx_runtime117.jsx)("td",{children:observation.category&&observation.category.length>0&&(0,import_jsx_runtime117.jsx)(import_jsx_runtime117.Fragment,{children:observation.category.map(concept=>(0,import_jsx_runtime117.jsx)("div",{children:(0,import_jsx_runtime117.jsx)(CodeableConceptDisplay,{value:concept})},`category-${(0,import_core154.formatCodeableConcept)(concept)}`))})}),(0,import_jsx_runtime117.jsx)("td",{children:observation.performer?.map(performer=>(0,import_jsx_runtime117.jsx)(ReferenceDisplay,{value:performer},performer.reference))}),(0,import_jsx_runtime117.jsx)("td",{children:observation.status&&(0,import_jsx_runtime117.jsx)(StatusBadge,{status:observation.status})})]}),observation.hasMember&&(0,import_jsx_runtime117.jsx)(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&(0,import_jsx_runtime117.jsx)("tr",{children:(0,import_jsx_runtime117.jsx)("td",{colSpan:6,children:(0,import_jsx_runtime117.jsx)(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return(0,import_jsx_runtime117.jsx)(import_jsx_runtime117.Fragment,{children:(0,import_core154.formatObservationValue)(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?(0,import_jsx_runtime117.jsx)(import_jsx_runtime117.Fragment,{children:range.text}):(0,import_jsx_runtime117.jsx)(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_jsx_runtime118=require("react/jsx-runtime");function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=(0,import_react79.useState)(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=(0,import_hooks7.useDisclosure)(!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(0,import_jsx_runtime118.jsxs)(import_jsx_runtime118.Fragment,{children:[(0,import_jsx_runtime118.jsx)(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:(0,import_jsx_runtime118.jsxs)(import_core155.Flex,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>(0,import_jsx_runtime118.jsx)(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:(0,import_jsx_runtime118.jsxs)(import_core155.Box,{children:[(0,import_jsx_runtime118.jsx)(import_core155.Text,{fw:500,className:SummaryItem_default.itemText,children:(0,import_core156.getDisplayString)(serviceRequest)}),(0,import_jsx_runtime118.jsxs)(import_core155.Group,{mt:2,gap:4,children:[serviceRequest.status&&(0,import_jsx_runtime118.jsx)(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),(0,import_jsx_runtime118.jsx)(import_core155.Text,{size:"xs",fw:500,c:"dimmed",children:(0,import_core156.formatDate)(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>(0,import_jsx_runtime118.jsx)(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:(0,import_jsx_runtime118.jsxs)(import_core155.Box,{children:[(0,import_jsx_runtime118.jsx)(import_core155.Text,{fw:500,className:SummaryItem_default.itemText,children:(0,import_core156.getDisplayString)(report)}),(0,import_jsx_runtime118.jsxs)(import_core155.Group,{mt:2,gap:4,children:[report.status&&(0,import_jsx_runtime118.jsx)(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),(0,import_jsx_runtime118.jsx)(import_core155.Text,{size:"xs",fw:500,c:"dimmed",children:(0,import_core156.formatDate)(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&(0,import_jsx_runtime118.jsx)(import_core155.Text,{children:"(none)"})]})}),(0,import_jsx_runtime118.jsx)(import_core155.Modal,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&(0,import_jsx_runtime118.jsx)(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))}var import_core159=require("@mantine/core"),import_hooks8=require("@mantine/hooks"),import_core160=require("@medplum/core"),import_react_hooks47=require("@medplum/react-hooks"),import_react81=require("react");var import_core157=require("@mantine/core"),import_core158=require("@medplum/core"),import_react_hooks46=require("@medplum/react-hooks"),import_react80=require("react");var import_jsx_runtime119=require("react/jsx-runtime"),HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=(0,import_react_hooks46.useMedplumProfile)(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=(0,import_react80.useState)(medication?.medicationCodeableConcept),handleSubmit=(0,import_react80.useCallback)(formData=>{if(!me)throw new Error("Not signed in");onSubmit((0,import_core158.addProfileToResource)({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&(0,import_core158.createReference)(encounter)),requester:medication?.requester??(0,import_core158.createReference)(me),medicationCodeableConcept:code,subject:(0,import_core158.createReference)(patient)},import_core158.HTTP_HL7_ORG+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?(0,import_jsx_runtime119.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime119.jsxs)(import_core157.Stack,{children:[(0,import_jsx_runtime119.jsx)(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}),(0,import_jsx_runtime119.jsx)(import_core157.Radio.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>(0,import_jsx_runtime119.jsx)(import_core157.Radio,{value:sv,label:sv,my:"xs",required:!0},sv))}),(0,import_jsx_runtime119.jsx)(import_core157.Group,{justify:"flex-end",gap:4,children:(0,import_jsx_runtime119.jsx)(SubmitButton,{children:"Save"})})]})}):(0,import_jsx_runtime119.jsx)(import_core157.Alert,{color:"red",children:"Not signed in"})}var import_jsx_runtime120=require("react/jsx-runtime");function Medications(props){let medplum=(0,import_react_hooks47.useMedplum)(),[medicationRequests,setMedicationRequests]=(0,import_react81.useState)(props.medicationRequests),[editMedication,setEditMedication]=(0,import_react81.useState)(),[opened,{open,close}]=(0,import_hooks8.useDisclosure)(!1),handleSubmit=(0,import_react81.useCallback)(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(0,import_jsx_runtime120.jsxs)(import_jsx_runtime120.Fragment,{children:[(0,import_jsx_runtime120.jsx)(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medicationRequests.length>0?(0,import_jsx_runtime120.jsx)(import_core159.Flex,{direction:"column",gap:8,children:medicationRequests.map(medication=>(0,import_jsx_runtime120.jsx)(SummaryItem,{onClick:()=>{setEditMedication(medication),open()},children:(0,import_jsx_runtime120.jsxs)(import_core159.Box,{children:[(0,import_jsx_runtime120.jsx)(import_core159.Text,{fw:500,className:SummaryItem_default.itemText,children:(0,import_core160.getDisplayString)(medication)}),(0,import_jsx_runtime120.jsx)(import_core159.Group,{mt:2,gap:4,children:medication.status&&(0,import_jsx_runtime120.jsx)(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},medication.id))}):(0,import_jsx_runtime120.jsx)(import_core159.Text,{children:"(none)"})}),(0,import_jsx_runtime120.jsx)(import_core159.Modal,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:(0,import_jsx_runtime120.jsx)(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"}}var import_core161=require("@mantine/core");var import_jsx_runtime121=require("react/jsx-runtime"),PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return(0,import_jsx_runtime121.jsx)(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:(0,import_jsx_runtime121.jsx)(import_core161.Box,{className:PatientSummary_default.patientSummaryListItem,children:(0,import_jsx_runtime121.jsx)(import_core161.Tooltip,{label,position:"top-start",openDelay:650,children:(0,import_jsx_runtime121.jsxs)(import_core161.Group,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,(0,import_jsx_runtime121.jsx)(import_core161.Text,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};var import_core162=require("@medplum/core");function getGenderIdentity(patient){return(0,import_core162.getExtension)(patient,`${import_core162.HTTP_HL7_ORG}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return(0,import_core162.getExtension)(patient,`${import_core162.HTTP_HL7_ORG}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return(0,import_core162.getExtension)(patient,`${import_core162.HTTP_HL7_ORG}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return(0,import_core162.getExtension)(patient,`${import_core162.HTTP_HL7_ORG}/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?(0,import_core162.capitalize)(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};var import_core164=require("@mantine/core"),import_hooks9=require("@mantine/hooks"),import_core165=require("@medplum/core"),import_react_hooks48=require("@medplum/react-hooks"),import_react82=require("react");var import_core163=require("@medplum/core");var import_jsx_runtime122=require("react/jsx-runtime");function Pharmacies(props){let{patient:patientProp,onClickResource,pharmacyDialogComponent}=props,PharmacyDialogComponent=pharmacyDialogComponent,medplum=(0,import_react_hooks48.useMedplum)(),[opened,{open,close}]=(0,import_hooks9.useDisclosure)(!1),[resolvedPharmacies,setResolvedPharmacies]=(0,import_react82.useState)([]),[loadState,setLoadState]=(0,import_react82.useState)("loading"),patient=(0,import_react_hooks48.useResource)(patientProp),pharmacyRefs=(0,import_react82.useMemo)(()=>patient?(0,import_core163.getPreferredPharmaciesFromPatient)(patient):[],[patient]);(0,import_react82.useEffect)(()=>{let cancelled=!1;return(async()=>{if(props.pharmacies){cancelled||(setResolvedPharmacies(props.pharmacies),setLoadState("loaded"));return}if(pharmacyRefs.length===0){cancelled||(setResolvedPharmacies([]),setLoadState("loaded"));return}setLoadState("loading");try{let results=await Promise.all(pharmacyRefs.map(async pharmacyRef=>{try{return{...await medplum.readReference(pharmacyRef.organizationRef),isPrimary:pharmacyRef.isPrimary}}catch(error){return isNotFoundError(error),null}}));if(!cancelled){let validResults=results.filter(result=>result!==null);setResolvedPharmacies(validResults),setLoadState(validResults.length===0&&pharmacyRefs.length>0?"error":"loaded")}}catch{cancelled||setLoadState("error")}})().catch(()=>{}),()=>{cancelled=!0}},[medplum,pharmacyRefs,props.pharmacies]);let handleSubmit=(0,import_react82.useCallback)(async _pharmacy=>{patient?.id&&medplum.invalidateUrl((0,import_core165.getReferenceString)(patient)),close()},[medplum,patient,close]);return patient?(0,import_jsx_runtime122.jsxs)(import_jsx_runtime122.Fragment,{children:[(0,import_jsx_runtime122.jsx)(CollapsibleSection,{title:"Pharmacies",onAdd:pharmacyDialogComponent?open:void 0,children:loadState==="loading"?(0,import_jsx_runtime122.jsx)(import_core164.Loader,{size:"sm"}):loadState==="error"?(0,import_jsx_runtime122.jsx)(import_core164.Text,{c:"red",size:"sm",children:"Failed to load pharmacies"}):resolvedPharmacies.length===0?(0,import_jsx_runtime122.jsx)(import_core164.Text,{children:"(none)"}):(0,import_jsx_runtime122.jsx)(import_core164.Box,{children:(0,import_jsx_runtime122.jsx)(import_core164.Flex,{direction:"column",gap:8,children:resolvedPharmacies.map((pharmacy,index)=>(0,import_jsx_runtime122.jsx)(SummaryItem,{onClick:()=>onClickResource?.(pharmacy),children:(0,import_jsx_runtime122.jsxs)(import_core164.Box,{children:[(0,import_jsx_runtime122.jsx)(import_core164.Text,{fw:500,className:SummaryItem_default.itemText,children:pharmacy.name}),(0,import_jsx_runtime122.jsxs)(import_core164.Group,{mt:2,gap:4,children:[pharmacy.isPrimary&&(0,import_jsx_runtime122.jsx)(StatusBadge,{color:"blue",variant:"light",status:"primary"}),pharmacy.address?.[0]&&(0,import_jsx_runtime122.jsx)(import_core164.Text,{size:"xs",c:"dimmed",children:(0,import_core165.formatAddress)(pharmacy.address[0])})]})]})},pharmacy.id||index))})})}),PharmacyDialogComponent?(0,import_jsx_runtime122.jsx)(import_core164.Modal,{opened,onClose:close,title:"Add Pharmacy",size:"lg",children:(0,import_jsx_runtime122.jsx)(PharmacyDialogComponent,{patient,onSubmit:handleSubmit,onClose:close})}):null]}):(0,import_jsx_runtime122.jsx)(import_jsx_runtime122.Fragment,{})}function isNotFoundError(error){return error instanceof import_core165.OperationOutcomeError?error.outcome.issue?.some(issue=>issue.code==="not-found")??!1:!1}var import_core168=require("@mantine/core"),import_hooks10=require("@mantine/hooks"),import_core169=require("@medplum/core"),import_react_hooks49=require("@medplum/react-hooks"),import_react84=require("react");var import_core166=require("@mantine/core"),import_core167=require("@medplum/core"),import_react83=require("react");var import_jsx_runtime123=require("react/jsx-runtime");function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=(0,import_react83.useState)(condition?.code),[clinicalStatus,setClinicalStatus]=(0,import_react83.useState)(condition?.clinicalStatus),handleSubmit=(0,import_react83.useCallback)(formData=>{let updatedCondition=(0,import_core167.addProfileToResource)({...condition,resourceType:"Condition",category:[{coding:[{system:import_core167.HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:(0,import_core167.createReference)(patient),encounter:encounter&&(0,import_core167.createReference)(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},import_core167.HTTP_HL7_ORG+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return(0,import_jsx_runtime123.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime123.jsxs)(import_core166.Stack,{children:[(0,import_jsx_runtime123.jsx)(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:import_core167.HTTP_HL7_ORG+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),(0,import_jsx_runtime123.jsx)(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:import_core167.HTTP_HL7_ORG+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),(0,import_jsx_runtime123.jsx)(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),(0,import_jsx_runtime123.jsx)(import_core166.Group,{justify:"flex-end",gap:4,mt:"md",children:(0,import_jsx_runtime123.jsx)(SubmitButton,{children:"Save"})})]})},condition?.id)}var import_jsx_runtime124=require("react/jsx-runtime");function getCodeKey(condition){let coding=condition.code?.coding?.[0];return coding?.system&&coding?.code?`${coding.system}|${coding.code}`:coding?.code?coding.code:condition.code?.text??condition.id}function ProblemList(props){let medplum=(0,import_react_hooks49.useMedplum)(),{patient,encounter}=props,[problems,setProblems]=(0,import_react84.useState)(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=(0,import_react84.useState)(),[opened,{open,close}]=(0,import_hooks10.useDisclosure)(!1),[expandedGroups,setExpandedGroups]=(0,import_react84.useState)(()=>new Set),groupedProblems=(0,import_react84.useMemo)(()=>{let groups=new Map;for(let i=0;i<problems.length;i++){let problem=problems[i],key=getCodeKey(problem)??`ungrouped-${i}`,existing=groups.get(key);existing?existing.push(problem):groups.set(key,[problem])}return Array.from(groups.entries())},[problems]),toggleGroup=(0,import_react84.useCallback)(key=>{setExpandedGroups(prev=>{let next=new Set(prev);return next.has(key)?next.delete(key):next.add(key),next})},[]),handleSubmit=(0,import_react84.useCallback)(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(0,import_jsx_runtime124.jsxs)(import_jsx_runtime124.Fragment,{children:[(0,import_jsx_runtime124.jsx)(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?(0,import_jsx_runtime124.jsx)(import_core168.Flex,{direction:"column",gap:8,children:groupedProblems.map(([key,group],groupIndex)=>{let isExpanded=expandedGroups.has(key),displayProblems=isExpanded?group:[group[0]],groupContentId=`problem-group-content-${groupIndex}`;return(0,import_jsx_runtime124.jsxs)(import_core168.Box,{children:[(0,import_jsx_runtime124.jsx)(import_core168.Flex,{direction:"column",gap:4,id:groupContentId,children:displayProblems.map(problem=>(0,import_jsx_runtime124.jsx)(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:(0,import_jsx_runtime124.jsxs)(import_core168.Box,{children:[(0,import_jsx_runtime124.jsxs)(import_core168.Group,{gap:6,wrap:"nowrap",children:[(0,import_jsx_runtime124.jsx)(import_core168.Text,{fw:500,className:SummaryItem_default.itemText,children:(0,import_core169.getDisplayString)(problem)}),!isExpanded&&group.length>1&&(0,import_jsx_runtime124.jsxs)(import_core168.Badge,{size:"xs",color:"gray",variant:"light",style:{flexShrink:0},children:["+",group.length-1]})]}),(0,import_jsx_runtime124.jsxs)(import_core168.Group,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&(0,import_jsx_runtime124.jsx)(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),(0,import_jsx_runtime124.jsx)(import_core168.Text,{size:"xs",fw:500,c:"dimmed",children:(0,import_core169.formatDate)(problem.onsetDateTime)})]})]})},problem.id))}),group.length>1&&(0,import_jsx_runtime124.jsx)(import_core168.UnstyledButton,{onClick:()=>toggleGroup(key),"aria-expanded":isExpanded,"aria-controls":groupContentId,pl:4,pt:2,style:{fontSize:"var(--mantine-font-size-xs)",color:"var(--mantine-color-dimmed)"},children:isExpanded?"Show less":`Show all ${group.length} entries`})]},key)})}):(0,import_jsx_runtime124.jsx)(import_core168.Text,{children:"(none)"})}),(0,import_jsx_runtime124.jsx)(import_core168.Modal,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:(0,import_jsx_runtime124.jsx)(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"}};var import_core170=require("@mantine/core"),import_hooks11=require("@mantine/hooks"),import_core171=require("@medplum/core"),import_react_hooks50=require("@medplum/react-hooks"),import_react85=require("react");var import_jsx_runtime125=require("react/jsx-runtime"),NULLFLAVOR=import_core171.HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/v3-NullFlavor",CodesToText={38628009:"Homosexual",20430005:"Heterosexual",42035005:"Bisexual",OTH:"Other",UNK:"Unknown",ASKU:"Asked but no answer"},CodesToSystem={38628009:import_core171.SNOMED,20430005:import_core171.SNOMED,42035005:import_core171.SNOMED,OTH:NULLFLAVOR,UNK:NULLFLAVOR,ASKU:NULLFLAVOR};function SexualOrientation(props){let{patient,encounter}=props,medplum=(0,import_react_hooks50.useMedplum)(),[sexualOrientation,setSexualOrientation]=(0,import_react85.useState)(props.sexualOrientation),[opened,{open,close}]=(0,import_hooks11.useDisclosure)(!1),[hoverIndex,setHoverIndex]=(0,import_react85.useState)(null),handleSubmit=(0,import_react85.useCallback)(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[import_core171.HTTP_HL7_ORG+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:import_core171.HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:import_core171.LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:(0,import_core171.createReference)(patient),encounter:encounter?(0,import_core171.createReference)(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(0,import_jsx_runtime125.jsxs)(import_jsx_runtime125.Fragment,{children:[(0,import_jsx_runtime125.jsx)(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?(0,import_jsx_runtime125.jsx)(import_core170.Flex,{direction:"column",gap:8,children:(0,import_jsx_runtime125.jsx)(import_core170.Box,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:(0,import_jsx_runtime125.jsx)(import_core170.UnstyledButton,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:(0,import_jsx_runtime125.jsx)(import_core170.Box,{pr:hoverIndex===0?24:0,children:(0,import_jsx_runtime125.jsx)(import_core170.Text,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):(0,import_jsx_runtime125.jsx)(import_core170.Text,{children:"(none)"})}),(0,import_jsx_runtime125.jsx)(import_core170.Modal,{opened,onClose:close,title:"Set Sexual Orientation",children:(0,import_jsx_runtime125.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime125.jsxs)(import_core170.Stack,{children:[(0,import_jsx_runtime125.jsx)(import_core170.Radio.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>(0,import_jsx_runtime125.jsx)(import_core170.Radio,{value:code,label:text,my:"xs"},code))}),(0,import_jsx_runtime125.jsx)(import_core170.Group,{justify:"flex-end",gap:4,mt:"md",children:(0,import_jsx_runtime125.jsx)(SubmitButton,{children:"Save"})})]})})})]})}var import_core172=require("@mantine/core"),import_hooks12=require("@mantine/hooks"),import_core173=require("@medplum/core"),import_react_hooks51=require("@medplum/react-hooks"),import_react86=require("react");var import_jsx_runtime126=require("react/jsx-runtime"),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=(0,import_react_hooks51.useMedplum)(),[smokingStatus,setSmokingStatus]=(0,import_react86.useState)(props.smokingStatus),[opened,{open,close}]=(0,import_hooks12.useDisclosure)(!1),handleSubmit=(0,import_react86.useCallback)(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[import_core173.HTTP_HL7_ORG+"/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:import_core173.LOINC,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:(0,import_core173.createReference)(props.patient),encounter:props.encounter?(0,import_core173.createReference)(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:import_core173.SNOMED,version:import_core173.SNOMED+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return(0,import_jsx_runtime126.jsxs)(import_jsx_runtime126.Fragment,{children:[(0,import_jsx_runtime126.jsx)(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?(0,import_jsx_runtime126.jsx)(import_core172.UnstyledButton,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:(0,import_jsx_runtime126.jsx)(import_core172.Text,{children:(0,import_core173.formatCodeableConcept)(smokingStatus.valueCodeableConcept)})}):(0,import_jsx_runtime126.jsx)(import_core172.Text,{children:"(none)"})}),(0,import_jsx_runtime126.jsx)(import_core172.Modal,{opened,onClose:close,title:"Set Smoking Status",children:(0,import_jsx_runtime126.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime126.jsxs)(import_core172.Stack,{children:[(0,import_jsx_runtime126.jsx)(import_core172.Radio.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>(0,import_jsx_runtime126.jsx)(import_core172.Radio,{value:code,label:text,my:"xs"},code))}),(0,import_jsx_runtime126.jsx)(import_core172.Group,{justify:"flex-end",gap:4,mt:"md",children:(0,import_jsx_runtime126.jsx)(SubmitButton,{children:"Save"})})]})})})]})}var import_core175=require("@mantine/core"),import_hooks13=require("@mantine/hooks"),import_core176=require("@medplum/core"),import_react_hooks52=require("@medplum/react-hooks"),import_react87=require("react");var import_core174=require("@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:(0,import_core174.createReference)(patient),encounter:encounter?(0,import_core174.createReference)(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:import_core174.LOINC}],text:display}}function createQuantity(value,unit){return{value,system:import_core174.UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!Number.isNaN(value)&&Number.isFinite(value)}var import_jsx_runtime127=require("react/jsx-runtime"),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=(0,import_react_hooks52.useMedplum)(),{patient,encounter}=props,[vitals,setVitals]=(0,import_react87.useState)(props.vitals),[opened,{open,close}]=(0,import_hooks13.useDisclosure)(!1),handleSubmit=(0,import_react87.useCallback)(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(0,import_jsx_runtime127.jsxs)(import_jsx_runtime127.Fragment,{children:[(0,import_jsx_runtime127.jsx)(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:(0,import_jsx_runtime127.jsx)(import_core175.Stack,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return(0,import_jsx_runtime127.jsxs)(import_core175.Group,{align:"center",children:[(0,import_jsx_runtime127.jsx)(import_core175.Text,{c:"dimmed",children:meta.short}),obs&&(0,import_jsx_runtime127.jsx)(import_core175.Text,{children:(0,import_core176.formatQuantity)(getObservationValue(obs,meta.component))})]},meta.name)})})}),(0,import_jsx_runtime127.jsx)(import_core175.Modal,{opened,onClose:close,title:"Add Vitals",children:(0,import_jsx_runtime127.jsxs)(Form,{onSubmit:handleSubmit,children:[(0,import_jsx_runtime127.jsx)(import_core175.SimpleGrid,{cols:2,children:LOINC_CODES.map((meta,index)=>(0,import_jsx_runtime127.jsx)(import_core175.TextInput,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),(0,import_jsx_runtime127.jsx)(import_core175.Textarea,{name:"notes",label:"Notes"}),(0,import_jsx_runtime127.jsx)(import_core175.Group,{justify:"flex-end",gap:4,mt:"md",children:(0,import_jsx_runtime127.jsx)(SubmitButton,{children:"Save"})})]})})]})}var import_jsx_runtime128=require("react/jsx-runtime"),DemographicsSection={key:"demographics",title:"Demographics",component:({patient,onClickResource})=>{let languageDisplay=getPreferredLanguage(patient);return(0,import_jsx_runtime128.jsxs)(import_core177.Stack,{gap:"xs",py:8,children:[(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${(0,import_core178.calculateAgeString)(patient.birthDate)})`:void 0,icon:(0,import_jsx_runtime128.jsx)(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:(0,import_jsx_runtime128.jsx)(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:(0,import_jsx_runtime128.jsx)(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:patient.address?.[0]?(0,import_core178.formatAddress)(patient.address[0]):void 0,icon:(0,import_jsx_runtime128.jsx)(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:languageDisplay,icon:(0,import_jsx_runtime128.jsx)(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),(0,import_jsx_runtime128.jsx)(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:(0,import_jsx_runtime128.jsx)(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add General Practitioner",label:"General Practitioner",onClickResource})]})}},InsuranceSection={key:"insurance",title:"Insurance",searches:[{key:"coverages",resourceType:"Coverage",patientParam:"beneficiary"}],component:({results,onClickResource})=>(0,import_jsx_runtime128.jsx)(Insurance,{coverages:results.coverages||[],onClickResource})},AllergiesSection={key:"allergies",title:"Allergies",searches:[{key:"allergies",resourceType:"AllergyIntolerance",patientParam:"patient"}],component:({results,patient,onClickResource})=>(0,import_jsx_runtime128.jsx)(Allergies,{patient,allergies:results.allergies||[],onClickResource})},ProblemListSection={key:"problemList",title:"Problems",searches:[{key:"conditions",resourceType:"Condition",patientParam:"patient"}],component:({results,patient,onClickResource})=>(0,import_jsx_runtime128.jsx)(ProblemList,{patient,problems:results.conditions||[],onClickResource})},MedicationsSection={key:"medications",title:"Medications",searches:[{key:"medications",resourceType:"MedicationRequest",patientParam:"subject"}],component:({results,patient,onClickResource})=>(0,import_jsx_runtime128.jsx)(Medications,{patient,medicationRequests:results.medications||[],onClickResource})};function createLabsSection(onRequestLabs){return{key:"labs",title:"Labs",searches:[{key:"serviceRequests",resourceType:"ServiceRequest",patientParam:"subject"},{key:"diagnosticReports",resourceType:"DiagnosticReport",patientParam:"subject"}],component:({results,patient,onClickResource})=>(0,import_jsx_runtime128.jsx)(Labs,{patient,serviceRequests:results.serviceRequests||[],diagnosticReports:results.diagnosticReports||[],onClickResource,onRequestLabs})}}var LabsSection=createLabsSection(),SexualOrientationSection={key:"sexualOrientation",title:"Sexual Orientation",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{code:"76690-7"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return(0,import_jsx_runtime128.jsx)(SexualOrientation,{patient,sexualOrientation:observations[0],onClickResource})}},SmokingStatusSection={key:"smokingStatus",title:"Smoking Status",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{code:"72166-2"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return(0,import_jsx_runtime128.jsx)(SmokingStatus,{patient,smokingStatus:observations[0],onClickResource})}},VitalsSection={key:"vitals",title:"Vitals",searches:[{key:"observations",resourceType:"Observation",patientParam:"subject",query:{category:"vital-signs"}}],component:({results,patient,onClickResource})=>{let observations=results.observations||[];return(0,import_jsx_runtime128.jsx)(Vitals,{patient,vitals:observations,onClickResource})}};function createPharmaciesSection(pharmacyDialogComponent){return{key:"pharmacies",title:"Pharmacies",component:({patient,onClickResource})=>(0,import_jsx_runtime128.jsx)(Pharmacies,{patient,onClickResource,pharmacyDialogComponent})}}var PharmaciesSection=createPharmaciesSection();function getDefaultSections(onRequestLabs){return[DemographicsSection,InsuranceSection,AllergiesSection,ProblemListSection,MedicationsSection,createLabsSection(onRequestLabs),SexualOrientationSection,SmokingStatusSection,VitalsSection,PharmaciesSection]}var import_jsx_runtime129=require("react/jsx-runtime");function PatientSummary(props){let medplum=(0,import_react_hooks53.useMedplum)(),{patient:propsPatient,onClickResource,onRequestLabs}=props,patient=(0,import_react_hooks53.useResource)(propsPatient),[createdDate,setCreatedDate]=(0,import_react88.useState)(),defaultSections=(0,import_react88.useMemo)(()=>getDefaultSections(onRequestLabs),[onRequestLabs]),sections=props.sections??defaultSections,{sectionData,loading,error}=(0,import_react_hooks53.usePatientSummaryData)(propsPatient,sections);return(0,import_react88.useEffect)(()=>{let id=(0,import_core180.resolveId)(propsPatient);id&&medplum.readHistory("Patient",id).then(history=>{let lastUpdated=history.entry?.[history.entry.length-1]?.resource?.meta?.lastUpdated;setCreatedDate(typeof lastUpdated=="string"?lastUpdated:"")}).catch(()=>{})},[propsPatient,medplum]),patient?(0,import_jsx_runtime129.jsxs)(import_core179.Flex,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[(0,import_jsx_runtime129.jsxs)(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[(0,import_jsx_runtime129.jsxs)(import_core179.Group,{align:"center",gap:"sm",p:16,children:[(0,import_jsx_runtime129.jsx)(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),(0,import_jsx_runtime129.jsxs)(import_core179.Stack,{gap:0,style:{flex:1,minWidth:0},children:[(0,import_jsx_runtime129.jsx)(import_core179.Tooltip,{label:(0,import_core180.formatHumanName)(patient.name?.[0]),position:"top-start",openDelay:650,children:(0,import_jsx_runtime129.jsx)(import_core179.Text,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:(0,import_core180.formatHumanName)(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return(0,import_jsx_runtime129.jsxs)(import_core179.Text,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),(0,import_jsx_runtime129.jsx)(import_core179.Divider,{})]}),(0,import_jsx_runtime129.jsxs)(import_core179.Stack,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:[error&&(0,import_jsx_runtime129.jsxs)(import_core179.Text,{c:"red",fz:"sm",children:["Error loading patient summary: ",error.message]}),!loading&&sections.length>0&&(0,import_jsx_runtime129.jsx)(import_jsx_runtime129.Fragment,{children:sections.map((section,index)=>{let SectionComponent=section.component;return(0,import_jsx_runtime129.jsxs)("div",{children:[(0,import_jsx_runtime129.jsx)(SectionComponent,{patient,onClickResource,results:sectionData[index]??{}}),(0,import_jsx_runtime129.jsx)(import_core179.Divider,{})]},section.key)})})]})]}):null}var ThreadInbox_default={container:"ThreadInbox_container",rightBorder:"ThreadInbox_rightBorder"};var import_jsx_runtime130=require("react/jsx-runtime");function ThreadInbox(props){let{query,threadId,subject,showPatientSummary=!1,sections,onNew,getThreadUri,uploadEnabled,onViewInDocuments,onChange,inProgressUri,completedUri,allowPatientSelection=!1}=props,navigate=(0,import_react_hooks54.useMedplumNavigate)(),[modalOpened,{open:openModal,close:closeModal}]=(0,import_hooks14.useDisclosure)(!1),currentSearch=(0,import_react89.useMemo)(()=>(0,import_core182.parseSearchRequest)(`Communication?${query}`),[query]),searchParams=(0,import_react89.useMemo)(()=>new URLSearchParams(query),[query]),itemsPerPage=Number.parseInt(searchParams.get("_count")||"20",10),currentOffset=Number.parseInt(searchParams.get("_offset")||"0",10),currentPage=Math.floor(currentOffset/itemsPerPage)+1,status=searchParams.get("status")||"in-progress",selectedParticipants=(0,import_react89.useMemo)(()=>(currentSearch.filters?.filter(f=>f.code==="recipient")??[]).flatMap(f=>f.value.split(",").filter(Boolean).map(ref=>({reference:ref}))),[currentSearch]),{loading,error,threadMessages,selectedThread,total,handleThreadStatusChange,addThreadMessage,refreshThreadMessages}=(0,import_react_hooks54.useThreadInbox)({query,threadId}),handleParticipantsChange=(0,import_react89.useCallback)(participants=>{let otherFilters=currentSearch.filters?.filter(f=>f.code!=="recipient")??[],participantRefs=participants.map(p=>p.reference).filter(Boolean),newFilters=participantRefs.length>0?[...otherFilters,{code:"recipient",operator:import_core182.Operator.EQUALS,value:participantRefs.join(",")}]:otherFilters;onChange({...currentSearch,filters:newFilters,offset:0})},[currentSearch,onChange]),skeletonTitleWidths=[80,72,68,64],skeletonSubtitleWidths=[85,78,70,60];(0,import_react89.useEffect)(()=>{error&&(0,import_notifications8.showNotification)({title:"Error",message:(0,import_core182.normalizeErrorString)(error),color:"red"})},[error]);let handleTopicStatusChangeWithErrorHandling=async newStatus=>{handleThreadStatusChange(newStatus);try{await refreshThreadMessages()}catch(error2){(0,import_notifications8.showNotification)({title:"Error",message:(0,import_core182.normalizeErrorString)(error2),color:"red"})}},handleNewTopicCompletion=message=>{addThreadMessage(message),onNew(message)};return(0,import_jsx_runtime130.jsxs)(import_jsx_runtime130.Fragment,{children:[(0,import_jsx_runtime130.jsx)("div",{className:ThreadInbox_default.container,children:(0,import_jsx_runtime130.jsxs)(import_core181.Flex,{direction:"row",h:"100%",w:"100%",children:[(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",w:380,h:"100%",className:ThreadInbox_default.rightBorder,children:(0,import_jsx_runtime130.jsxs)(import_core181.Paper,{h:"100%",style:{display:"flex",flexDirection:"column"},children:[(0,import_jsx_runtime130.jsxs)(import_core181.ScrollArea,{style:{flex:1},scrollbarSize:10,type:"hover",scrollHideDelay:250,children:[(0,import_jsx_runtime130.jsxs)(import_core181.Flex,{h:64,align:"center",justify:"space-between",p:"md",children:[(0,import_jsx_runtime130.jsx)(import_core181.Tabs,{value:status,onChange:value=>{navigate(value==="in-progress"?inProgressUri:completedUri)},variant:"unstyled",className:"pill-tabs",children:(0,import_jsx_runtime130.jsxs)(import_core181.Tabs.List,{children:[(0,import_jsx_runtime130.jsx)(import_core181.Tabs.Tab,{value:"in-progress",children:"In Progress"}),(0,import_jsx_runtime130.jsx)(import_core181.Tabs.Tab,{value:"completed",children:"Completed"})]})}),(0,import_jsx_runtime130.jsxs)(import_core181.Group,{gap:"xs",children:[(0,import_jsx_runtime130.jsx)(ParticipantFilter,{selectedParticipants,onFilterChange:handleParticipantsChange}),(0,import_jsx_runtime130.jsx)(import_core181.Tooltip,{label:"New Message",position:"bottom",openDelay:500,children:(0,import_jsx_runtime130.jsx)(import_core181.ActionIcon,{radius:"xl",variant:"filled",color:"blue",size:32,onClick:openModal,children:(0,import_jsx_runtime130.jsx)(IconPlus,{size:16})})})]})]}),(0,import_jsx_runtime130.jsx)(import_core181.Divider,{}),loading?(0,import_jsx_runtime130.jsx)(import_core181.Stack,{gap:"md",p:"md",children:Array.from({length:10}).map((_,index)=>{let titleWidth=skeletonTitleWidths[index%skeletonTitleWidths.length],subtitleWidth=skeletonSubtitleWidths[index%skeletonSubtitleWidths.length];return(0,import_jsx_runtime130.jsxs)(import_core181.Flex,{gap:"sm",align:"flex-start",children:[(0,import_jsx_runtime130.jsx)(import_core181.Skeleton,{height:40,width:40,radius:"50%"}),(0,import_jsx_runtime130.jsx)(import_core181.Box,{style:{flex:1},children:(0,import_jsx_runtime130.jsxs)(import_core181.Flex,{direction:"column",gap:"xs",children:[(0,import_jsx_runtime130.jsx)(import_core181.Skeleton,{height:16,width:`${titleWidth}%`}),(0,import_jsx_runtime130.jsx)(import_core181.Skeleton,{height:14,width:`${subtitleWidth}%`})]})})]},index)})}):threadMessages.length>0&&(0,import_jsx_runtime130.jsx)(ChatList,{threads:threadMessages,selectedCommunication:selectedThread,getThreadUri}),threadMessages.length===0&&!loading&&(0,import_jsx_runtime130.jsx)(EmptyMessagesState,{})]}),!loading&&total!==void 0&&total>itemsPerPage&&(0,import_jsx_runtime130.jsx)(import_core181.Box,{p:"md",children:(0,import_jsx_runtime130.jsx)(import_core181.Center,{children:(0,import_jsx_runtime130.jsx)(import_core181.Pagination,{value:currentPage,total:Math.ceil(total/itemsPerPage),onChange:page=>{let offset=(page-1)*itemsPerPage;onChange({...currentSearch,offset})},size:"sm",siblings:1,boundaries:1})})})]})}),selectedThread?(0,import_jsx_runtime130.jsxs)(import_jsx_runtime130.Fragment,{children:[(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",style:{flex:1},h:"100%",className:ThreadInbox_default.rightBorder,children:(0,import_jsx_runtime130.jsx)(import_core181.Paper,{h:"100%",children:(0,import_jsx_runtime130.jsxs)(import_core181.Stack,{h:"100%",gap:0,children:[(0,import_jsx_runtime130.jsxs)(import_core181.Flex,{h:64,align:"center",justify:"space-between",p:"md",children:[(0,import_jsx_runtime130.jsx)(import_core181.Text,{fw:800,truncate:!0,fz:"lg",children:selectedThread.topic?.text??"Messages"}),(0,import_jsx_runtime130.jsxs)(import_core181.Menu,{position:"bottom-end",shadow:"md",children:[(0,import_jsx_runtime130.jsx)(import_core181.Menu.Target,{children:(0,import_jsx_runtime130.jsx)(import_core181.Button,{variant:"light",color:getStatusColor4(selectedThread.status),rightSection:selectedThread.status==="completed"?void 0:(0,import_jsx_runtime130.jsx)(IconChevronDown,{size:16}),radius:"xl",size:"sm",children:selectedThread.status.split("-").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")})}),selectedThread.status!=="completed"&&(0,import_jsx_runtime130.jsx)(import_core181.Menu.Dropdown,{children:(0,import_jsx_runtime130.jsx)(import_core181.Menu.Item,{onClick:()=>handleTopicStatusChangeWithErrorHandling("completed"),children:"Completed"})})]})]}),(0,import_jsx_runtime130.jsx)(import_core181.Divider,{}),(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",style:{flex:1},h:"100%",children:(0,import_jsx_runtime130.jsx)(ThreadChat,{title:"Messages",thread:selectedThread,excludeHeader:!0,uploadEnabled,onViewInDocuments},`${(0,import_core182.getReferenceString)(selectedThread)}`)})]})})}),selectedThread.subject&&showPatientSummary&&(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",w:300,h:"100%",children:(0,import_jsx_runtime130.jsx)(import_core181.ScrollArea,{p:0,h:"100%",scrollbarSize:10,type:"hover",scrollHideDelay:250,children:(0,import_jsx_runtime130.jsx)(PatientSummary,{patient:selectedThread.subject,sections},selectedThread.id)})})]}):(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",style:{flex:1},h:"100%",children:(0,import_jsx_runtime130.jsx)(NoMessages,{})})]})}),(0,import_jsx_runtime130.jsx)(NewTopicDialog,{subject,opened:modalOpened,onClose:closeModal,onSubmit:handleNewTopicCompletion,allowPatientSelection})]})}function NoMessages(){return(0,import_jsx_runtime130.jsx)(import_core181.Center,{h:"100%",w:"100%",children:(0,import_jsx_runtime130.jsxs)(import_core181.Stack,{align:"center",gap:"md",children:[(0,import_jsx_runtime130.jsx)(import_core181.ThemeIcon,{size:64,variant:"light",color:"gray",children:(0,import_jsx_runtime130.jsx)(IconMessageCircle,{size:32})}),(0,import_jsx_runtime130.jsx)(import_core181.Stack,{align:"center",gap:"xs",children:(0,import_jsx_runtime130.jsx)(import_core181.Text,{size:"sm",c:"dimmed",ta:"center",children:"Select a message from the list to view details"})})]})})}function getStatusColor4(status){return status==="completed"?"green":status==="stopped"?"red":"blue"}function EmptyMessagesState(){return(0,import_jsx_runtime130.jsx)(import_core181.Flex,{direction:"column",h:"100%",justify:"center",align:"center",children:(0,import_jsx_runtime130.jsxs)(import_core181.Stack,{align:"center",gap:"md",pt:"xl",children:[(0,import_jsx_runtime130.jsx)(IconMessageCircle,{size:64,color:"var(--mantine-color-gray-4)"}),(0,import_jsx_runtime130.jsx)(import_core181.Text,{size:"lg",c:"dimmed",fw:500,children:"No messages found"})]})})}var import_core189=require("@mantine/core"),import_notifications9=require("@mantine/notifications"),import_core190=require("@medplum/core"),import_react_hooks57=require("@medplum/react-hooks");var import_react93=require("react");var import_core184=require("@mantine/core"),import_core185=require("@medplum/core"),import_react_hooks55=require("@medplum/react-hooks"),import_react91=require("react"),import_rfc6902=__toESM(require_rfc6902(),1);var import_core183=require("@mantine/core"),import_react90=require("react");var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};var import_jsx_runtime131=require("react/jsx-runtime");function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=(0,import_react90.useState)(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return(0,import_jsx_runtime131.jsx)(import_jsx_runtime131.Fragment,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?(0,import_jsx_runtime131.jsx)(import_jsx_runtime131.Fragment,{children:(0,import_jsx_runtime131.jsxs)(import_core183.Table.Tr,{children:[(0,import_jsx_runtime131.jsx)(import_core183.Table.Td,{children:name}),(0,import_jsx_runtime131.jsx)(import_core183.Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&(0,import_jsx_runtime131.jsx)(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),(0,import_jsx_runtime131.jsx)(import_core183.Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&(0,import_jsx_runtime131.jsx)(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):(0,import_jsx_runtime131.jsxs)(import_core183.Table.Tr,{children:[(0,import_jsx_runtime131.jsx)(import_core183.Table.Td,{children:name}),(0,import_jsx_runtime131.jsx)(import_core183.Table.Td,{colSpan:2,style:{textAlign:"right"},children:(0,import_jsx_runtime131.jsx)(import_core183.Button,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};var import_jsx_runtime132=require("react/jsx-runtime");function ResourceDiffTable(props){let medplum=(0,import_react_hooks55.useMedplum)(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=(0,import_react91.useState)(!1);(0,import_react91.useEffect)(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=(0,import_react91.useMemo)(()=>{if(!schemaLoaded)return null;let typedOriginal=[(0,import_core185.toTypedValue)(original)],typedRevised=[(0,import_core185.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:(0,import_core185.evalFhirPathTyped)(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:(0,import_core185.evalFhirPathTyped)(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${(0,import_core185.capitalize)(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?(0,import_jsx_runtime132.jsxs)(import_core184.Table,{className:ResourceDiffTable_default.root,children:[(0,import_jsx_runtime132.jsx)(import_core184.Table.Thead,{children:(0,import_jsx_runtime132.jsxs)(import_core184.Table.Tr,{children:[(0,import_jsx_runtime132.jsx)(import_core184.Table.Th,{}),(0,import_jsx_runtime132.jsx)(import_core184.Table.Th,{children:"Before"}),(0,import_jsx_runtime132.jsx)(import_core184.Table.Th,{children:"After"})]})}),(0,import_jsx_runtime132.jsx)(import_core184.Table.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return(0,import_jsx_runtime132.jsx)(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(0,import_core185.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=(0,import_core185.arrayify)(input).flatMap(v=>v.value);return isArray?inputValue:inputValue[0]}var import_core186=require("@medplum/core"),import_react_hooks56=require("@medplum/react-hooks"),import_react92=require("react");var import_jsx_runtime133=require("react/jsx-runtime");function ResourceTable(props){let{profileUrl}=props,medplum=(0,import_react_hooks56.useMedplum)(),accessPolicy=medplum.getAccessPolicy(),value=(0,import_react_hooks56.useResource)(props.value),[schemaLoaded,setSchemaLoaded]=(0,import_react92.useState)(!1);(0,import_react92.useEffect)(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{(0,import_core186.tryGetProfile)(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=(0,import_react92.useMemo)(()=>value&&(0,import_core186.satisfiedAccessPolicy)(value,import_core186.AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:(0,import_jsx_runtime133.jsx)(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}var import_core187=require("@mantine/core"),import_core188=require("@medplum/core");var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};var import_jsx_runtime134=require("react/jsx-runtime");function Timeline(props){return(0,import_jsx_runtime134.jsx)(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(0,import_jsx_runtime134.jsxs)(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[(0,import_jsx_runtime134.jsxs)(import_core187.Group,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[(0,import_jsx_runtime134.jsx)(ResourceAvatar,{value:author,link:!0,size:"md"}),(0,import_jsx_runtime134.jsxs)("div",{style:{flex:1},children:[(0,import_jsx_runtime134.jsx)(import_core187.Text,{size:"sm",children:(0,import_jsx_runtime134.jsx)(ResourceName,{c:"inherit",fw:500,value:author,link:!0})}),(0,import_jsx_runtime134.jsxs)(import_core187.Text,{size:"xs",children:[(0,import_jsx_runtime134.jsx)(MedplumLink,{c:"dimmed",to:props.resource,children:(0,import_core188.formatDateTime)(dateTime)}),(0,import_jsx_runtime134.jsx)(import_core187.Text,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),(0,import_jsx_runtime134.jsx)(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&(0,import_jsx_runtime134.jsxs)(import_core187.Menu,{position:"bottom-end",shadow:"md",width:200,children:[(0,import_jsx_runtime134.jsx)(import_core187.Menu.Target,{children:(0,import_jsx_runtime134.jsx)(import_core187.ActionIcon,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${(0,import_core188.getReferenceString)(props.resource)}`,children:(0,import_jsx_runtime134.jsx)(IconDots,{})})}),popupMenuItems]})]}),(0,import_jsx_runtime134.jsx)(ErrorBoundary,{children:(0,import_jsx_runtime134.jsx)("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"};var import_jsx_runtime135=require("react/jsx-runtime");function ResourceTimeline(props){let medplum=(0,import_react_hooks57.useMedplum)(),sender=medplum.getProfile(),inputRef=(0,import_react93.useRef)(null),resource=(0,import_react_hooks57.useResource)(props.value),[history,setHistory]=(0,import_react93.useState)(),[items,setItems]=(0,import_react93.useState)([]),[countToShow,setCountToShow]=(0,import_react93.useState)(10),loadTimelineResources=props.loadTimelineResources,itemsRef=(0,import_react93.useRef)(items);(0,import_react93.useLayoutEffect)(()=>{itemsRef.current=items});let sortAndSetItems=(0,import_react93.useCallback)(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=(0,import_react93.useCallback)(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=(0,import_react93.useCallback)(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=(0,import_react93.useCallback)(()=>{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]);(0,import_react93.useEffect)(()=>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(()=>(0,import_notifications9.updateNotification)({id:"upload-notification",color:"teal",title:"Upload complete",message:"",icon:(0,import_jsx_runtime135.jsx)(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>(0,import_notifications9.updateNotification)({id:"upload-notification",color:"red",title:"Upload error",message:(0,import_core190.normalizeErrorString)(reason),icon:(0,import_jsx_runtime135.jsx)(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){(0,import_notifications9.showNotification)({id:"upload-notification",loading:!0,title:"Initializing upload...",message:"Please wait...",autoClose:!1,withCloseButton:!1})}function onUploadProgress(e){(0,import_notifications9.updateNotification)({id:"upload-notification",loading:!0,title:"Uploading...",message:getProgressMessage(e),autoClose:!1,withCloseButton:!1})}function onUploadError(outcome){(0,import_notifications9.updateNotification)({id:"upload-notification",color:"red",title:"Upload error",message:(0,import_core190.normalizeErrorString)(outcome),icon:(0,import_jsx_runtime135.jsx)(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return(0,import_jsx_runtime135.jsx)(import_core189.Center,{style:{width:"100%",height:"100%"},children:(0,import_jsx_runtime135.jsx)(import_core189.Loader,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return(0,import_jsx_runtime135.jsxs)(Timeline,{children:[props.createCommunication&&(0,import_jsx_runtime135.jsx)(Panel,{children:(0,import_jsx_runtime135.jsx)(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:(0,import_jsx_runtime135.jsxs)(import_core189.Group,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[(0,import_jsx_runtime135.jsx)(ResourceAvatar,{value:sender}),(0,import_jsx_runtime135.jsx)(import_core189.TextInput,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),(0,import_jsx_runtime135.jsx)(import_core189.ActionIcon,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:(0,import_jsx_runtime135.jsx)(IconMessage,{size:16})}),(0,import_jsx_runtime135.jsx)(AttachmentButton,{securityContext:(0,import_core190.createReference)(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>(0,import_jsx_runtime135.jsx)(import_core189.ActionIcon,{...props2,radius:"xl",color:"blue",variant:"filled",children:(0,import_jsx_runtime135.jsx)(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(0,import_jsx_runtime135.jsx)(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return(0,import_jsx_runtime135.jsx)(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return(0,import_jsx_runtime135.jsx)(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return(0,import_jsx_runtime135.jsx)(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return(0,import_jsx_runtime135.jsx)(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return(0,import_jsx_runtime135.jsx)(TimelineItem,{resource:item,padding:!0,children:(0,import_jsx_runtime135.jsx)(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&(0,import_jsx_runtime135.jsx)(import_core189.Group,{justify:"center",pb:"lg",children:(0,import_jsx_runtime135.jsx)(import_core189.Button,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?(0,import_jsx_runtime135.jsx)(TimelineItem,{resource,padding:!0,...rest,children:(0,import_jsx_runtime135.jsx)(ResourceDiffTable,{original:previous,revised:props.resource})}):(0,import_jsx_runtime135.jsxs)(TimelineItem,{resource,padding:!0,...rest,children:[(0,import_jsx_runtime135.jsx)("h3",{children:"Created"}),(0,import_jsx_runtime135.jsx)(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(0,import_jsx_runtime135.jsx)(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:(0,import_jsx_runtime135.jsx)("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(0,import_jsx_runtime135.jsx)(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:(0,import_jsx_runtime135.jsx)(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return(0,import_jsx_runtime135.jsx)(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:(0,import_jsx_runtime135.jsx)(import_core189.ScrollArea,{children:(0,import_jsx_runtime135.jsx)("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return(0,import_jsx_runtime135.jsx)(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:(0,import_jsx_runtime135.jsx)(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"}var import_jsx_runtime136=require("react/jsx-runtime");function DefaultResourceTimeline(props){let{resource,...rest}=props;return(0,import_jsx_runtime136.jsx)(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})}var import_core191=require("@medplum/core");var import_jsx_runtime137=require("react/jsx-runtime");function EncounterTimeline(props){let{encounter,...rest}=props;return(0,import_jsx_runtime137.jsx)(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:(0,import_core191.createReference)(resource),subject:resource.subject,sender:(0,import_core191.createReference)(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:(0,import_core191.createReference)(resource),subject:resource.subject,operator:(0,import_core191.createReference)(operator),issued:new Date().toISOString(),content}),...rest})}var import_core208=require("@mantine/core"),import_core209=require("@medplum/core"),import_react_hooks59=require("@medplum/react-hooks"),import_react98=require("react");var import_core192=require("@medplum/core");var import_jsx_runtime138=require("react/jsx-runtime");function FhirPathDisplay(props){let value;try{value=(0,import_core192.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(0,import_jsx_runtime138.jsx)(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}var import_core206=require("@mantine/core"),import_core207=require("@medplum/core"),import_react_hooks58=require("@medplum/react-hooks");var import_react97=require("react");var import_core193=require("@mantine/core"),import_jsx_runtime139=require("react/jsx-runtime");function SearchExportDialog(props){return(0,import_jsx_runtime139.jsxs)(import_core193.Modal,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[(0,import_jsx_runtime139.jsxs)(import_core193.Box,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&(0,import_jsx_runtime139.jsx)(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&(0,import_jsx_runtime139.jsx)(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),(0,import_jsx_runtime139.jsx)(import_core193.Text,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return(0,import_jsx_runtime139.jsx)(import_core193.Button,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}var import_core195=require("@mantine/core"),import_core196=require("@medplum/core"),import_react94=require("react");var import_core194=require("@medplum/core");var import_jsx_runtime140=require("react/jsx-runtime"),searchParamToOperators={string:[import_core194.Operator.EQUALS,import_core194.Operator.NOT,import_core194.Operator.CONTAINS,import_core194.Operator.EXACT],fulltext:[import_core194.Operator.EQUALS,import_core194.Operator.NOT,import_core194.Operator.CONTAINS,import_core194.Operator.EXACT],token:[import_core194.Operator.EQUALS,import_core194.Operator.NOT,import_core194.Operator.TEXT],reference:[import_core194.Operator.EQUALS,import_core194.Operator.NOT],numeric:[import_core194.Operator.EQUALS,import_core194.Operator.NOT_EQUALS,import_core194.Operator.GREATER_THAN,import_core194.Operator.LESS_THAN,import_core194.Operator.GREATER_THAN_OR_EQUALS,import_core194.Operator.LESS_THAN_OR_EQUALS],quantity:[import_core194.Operator.EQUALS,import_core194.Operator.NOT_EQUALS,import_core194.Operator.GREATER_THAN,import_core194.Operator.LESS_THAN,import_core194.Operator.GREATER_THAN_OR_EQUALS,import_core194.Operator.LESS_THAN_OR_EQUALS],date:[import_core194.Operator.EQUALS,import_core194.Operator.NOT_EQUALS,import_core194.Operator.GREATER_THAN,import_core194.Operator.LESS_THAN,import_core194.Operator.GREATER_THAN_OR_EQUALS,import_core194.Operator.LESS_THAN_OR_EQUALS,import_core194.Operator.STARTS_AFTER,import_core194.Operator.ENDS_BEFORE,import_core194.Operator.APPROXIMATELY],datetime:[import_core194.Operator.EQUALS,import_core194.Operator.NOT_EQUALS,import_core194.Operator.GREATER_THAN,import_core194.Operator.LESS_THAN,import_core194.Operator.GREATER_THAN_OR_EQUALS,import_core194.Operator.LESS_THAN_OR_EQUALS,import_core194.Operator.STARTS_AFTER,import_core194.Operator.ENDS_BEFORE,import_core194.Operator.APPROXIMATELY],uri:[import_core194.Operator.EQUALS,import_core194.Operator.NOT,import_core194.Operator.ABOVE,import_core194.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,import_core194.Operator.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,import_core194.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,import_core194.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??import_core194.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(import_core194.capitalize).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?(0,import_jsx_runtime140.jsx)(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children:resource.id}):key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?(0,import_core194.formatDateTime)(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?(0,import_jsx_runtime140.jsx)(ResourcePropertyDisplay,{path:elementDefinition.path,property:elementDefinition,propertyType,value,maxWidth:200,ignoreMissingValues:!0,link:!1}):null}function renderSearchParameterValue(resource,searchParam){let value=(0,import_core194.evalFhirPathTyped)(searchParam.expression,[{type:resource.resourceType,value:resource}]);return!value||value.length===0?null:(0,import_jsx_runtime140.jsx)(import_jsx_runtime140.Fragment,{children:value.map((v,index)=>(0,import_jsx_runtime140.jsx)(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}var import_jsx_runtime141=require("react/jsx-runtime");function SearchFieldEditor(props){let wasDropdownOpen=(0,import_react94.useRef)(!1),[state,setState]=(0,import_react94.useState)({search:JSON.parse((0,import_core196.stringify)(props.search))}),[isDropdownOpen,setIsDropdownOpen]=(0,import_react94.useState)(!1);(0,import_react94.useEffect)(()=>{setState({search:props.search})},[props.search]);let allFields=(0,import_react94.useMemo)(()=>{if(!props.visible)return[];let resourceType=props.search.resourceType,typeSchema=(0,import_core196.getDataType)(resourceType),searchParams=(0,import_core196.getSearchParameters)(resourceType);return(0,import_core196.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(0,import_jsx_runtime141.jsx)(import_core195.Modal,{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:(0,import_jsx_runtime141.jsx)("div",{"data-testid":"overlay-child"})},children:(0,import_jsx_runtime141.jsxs)(import_core195.Stack,{children:[(0,import_jsx_runtime141.jsx)(import_core195.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}),(0,import_jsx_runtime141.jsx)(import_core195.Group,{justify:"flex-end",children:(0,import_jsx_runtime141.jsx)(import_core195.Button,{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}var import_core199=require("@mantine/core"),import_core200=require("@medplum/core");var import_react95=require("react");var import_core197=require("@mantine/core"),import_core198=require("@medplum/core");var import_jsx_runtime142=require("react/jsx-runtime");function SearchFilterValueInput(props){let details=(0,import_core198.getSearchParameterDetails)(props.resourceType,props.searchParam),name=props.name??"filter-value";switch(details.type){case import_core198.SearchParameterType.REFERENCE:return(0,import_jsx_runtime142.jsx)(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 import_core198.SearchParameterType.BOOLEAN:return(0,import_jsx_runtime142.jsx)(import_core197.Checkbox,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case import_core198.SearchParameterType.DATE:return(0,import_jsx_runtime142.jsx)(import_core197.TextInput,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case import_core198.SearchParameterType.DATETIME:return(0,import_jsx_runtime142.jsx)(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case import_core198.SearchParameterType.NUMBER:return(0,import_jsx_runtime142.jsx)(import_core197.TextInput,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case import_core198.SearchParameterType.QUANTITY:return(0,import_jsx_runtime142.jsx)(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return(0,import_jsx_runtime142.jsx)(import_core197.TextInput,{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}}}var import_jsx_runtime143=require("react/jsx-runtime");function SearchFilterEditor(props){let[search,setSearch]=(0,import_react95.useState)((0,import_core200.deepClone)(props.search)),searchRef=(0,import_react95.useRef)(search);(0,import_react95.useLayoutEffect)(()=>{searchRef.current=search}),(0,import_react95.useEffect)(()=>{setSearch((0,import_core200.deepClone)(props.search))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}let resourceType=props.search.resourceType,searchParams=(0,import_core200.getSearchParameters)(resourceType)??{},filters=search.filters||[];return(0,import_jsx_runtime143.jsx)(import_core199.Modal,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:(0,import_jsx_runtime143.jsxs)(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[(0,import_jsx_runtime143.jsxs)("div",{children:[(0,import_jsx_runtime143.jsxs)("table",{children:[(0,import_jsx_runtime143.jsxs)("colgroup",{children:[(0,import_jsx_runtime143.jsx)("col",{style:{width:200}}),(0,import_jsx_runtime143.jsx)("col",{style:{width:200}}),(0,import_jsx_runtime143.jsx)("col",{style:{width:380}}),(0,import_jsx_runtime143.jsx)("col",{style:{width:40}})]}),(0,import_jsx_runtime143.jsx)("thead",{children:(0,import_jsx_runtime143.jsxs)("tr",{children:[(0,import_jsx_runtime143.jsx)("th",{children:"Field"}),(0,import_jsx_runtime143.jsx)("th",{children:"Operation"}),(0,import_jsx_runtime143.jsx)("th",{children:"Value"}),(0,import_jsx_runtime143.jsx)("th",{})]})}),(0,import_jsx_runtime143.jsx)("tbody",{children:filters.map((filter,index)=>(0,import_jsx_runtime143.jsx)(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`))})]}),(0,import_jsx_runtime143.jsx)(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),(0,import_jsx_runtime143.jsx)(import_core199.Group,{justify:"flex-end",mt:"xl",children:(0,import_jsx_runtime143.jsx)(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value;function setFilterCode(newCode){props.onChange({code:newCode,operator:import_core200.Operator.EQUALS,value:""})}function setFilterOperator(newOperator){props.onChange({code:value.code,operator:newOperator,value:""})}function setFilterValue(newFilterValue){props.onChange({code:value.code,operator:value.operator,value:newFilterValue})}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return(0,import_jsx_runtime143.jsxs)("tr",{children:[(0,import_jsx_runtime143.jsx)("td",{children:(0,import_jsx_runtime143.jsx)(import_core199.NativeSelect,{"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)}))]})}),(0,import_jsx_runtime143.jsx)("td",{children:operators&&(0,import_jsx_runtime143.jsx)(import_core199.NativeSelect,{"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}`)}),(0,import_jsx_runtime143.jsx)("td",{children:searchParam&&value.operator&&(0,import_jsx_runtime143.jsx)(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}`)}),(0,import_jsx_runtime143.jsx)("td",{children:props.onDelete&&(0,import_jsx_runtime143.jsx)(import_core199.ActionIcon,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:(0,import_jsx_runtime143.jsx)(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}var import_core201=require("@mantine/core"),import_react96=require("react");var import_jsx_runtime144=require("react/jsx-runtime");function SearchFilterValueDialog(props){let[value,setValue]=(0,import_react96.useState)(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return(0,import_jsx_runtime144.jsx)(import_core201.Modal,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:(0,import_jsx_runtime144.jsx)(Form,{onSubmit:onOk,children:(0,import_jsx_runtime144.jsxs)(import_core201.Grid,{children:[(0,import_jsx_runtime144.jsx)(import_core201.Grid.Col,{span:10,children:(0,import_jsx_runtime144.jsx)(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),(0,import_jsx_runtime144.jsx)(import_core201.Grid.Col,{span:2,children:(0,import_jsx_runtime144.jsx)(import_core201.Button,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}var import_core202=require("@medplum/core");var import_jsx_runtime145=require("react/jsx-runtime");function SearchFilterValueDisplay(props){let{resourceType,filter}=props,searchParam=import_core202.globalSchema.types[resourceType].searchParams?.[filter.code];if(searchParam){if(searchParam.type==="reference"&&(filter.operator===import_core202.Operator.EQUALS||filter.operator===import_core202.Operator.NOT_EQUALS))return(0,import_jsx_runtime145.jsx)(ResourceName,{value:{reference:filter.value}});let searchParamDetails=(0,import_core202.getSearchParameterDetails)(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===import_core202.SearchParameterType.DATETIME)return(0,import_jsx_runtime145.jsx)(import_jsx_runtime145.Fragment,{children:(0,import_core202.formatDateTime)(filter.value)})}return(0,import_jsx_runtime145.jsx)(import_jsx_runtime145.Fragment,{children:filter.value})}var import_core203=require("@mantine/core"),import_core204=require("@medplum/core");var import_jsx_runtime146=require("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?(0,import_jsx_runtime146.jsx)(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):(0,import_jsx_runtime146.jsx)(import_core203.Menu.Dropdown,{children:props.searchParams.map(searchParam=>(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return(0,import_jsx_runtime146.jsx)(DateFilterSubMenu,{...props});case"number":case"quantity":return(0,import_jsx_runtime146.jsx)(NumericFilterSubMenu,{...props});case"reference":return(0,import_jsx_runtime146.jsx)(ReferenceFilterSubMenu,{...props});case"string":return(0,import_jsx_runtime146.jsx)(TextFilterSubMenu,{...props});case"token":return(0,import_jsx_runtime146.jsx)(TokenFilterSubMenu,{...props});case"uri":return(0,import_jsx_runtime146.jsx)(UriFilterSubMenu,{...props});default:return(0,import_jsx_runtime146.jsxs)(import_jsx_runtime146.Fragment,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT_EQUALS),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.ENDS_BEFORE),children:"Before..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.STARTS_AFTER),children:"After..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Between..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT_EQUALS),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.GREATER_THAN),children:"Greater than..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.LESS_THAN),children:"Less than..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.CONTAINS),children:"Contains..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Does not contain..."}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.TEXT),children:"Text contains..."}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function UriFilterSubMenu(props){let{searchParam}=props;return(0,import_jsx_runtime146.jsxs)(import_core203.Menu.Dropdown,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.EQUALS),children:"Equals..."}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,import_core204.Operator.NOT),children:"Does not equal..."}),(0,import_jsx_runtime146.jsx)(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return(0,import_jsx_runtime146.jsxs)(import_jsx_runtime146.Fragment,{children:[(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Divider,{}),(0,import_jsx_runtime146.jsx)(import_core203.Menu.Item,{leftSection:(0,import_jsx_runtime146.jsx)(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"};var import_core205=require("@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=(0,import_core205.getElementDefinition)(resourceType,name),exactSearchParam=(0,import_core205.getSearchParameter)(resourceType,name.toLowerCase());if(exactElementDefinition&&exactSearchParam)return{name,elementDefinition:exactElementDefinition,searchParams:[exactSearchParam]};if(exactElementDefinition){let allSearchParams=(0,import_core205.getSearchParameters)(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=(0,import_core205.getSearchParameterDetails)(resourceType,exactSearchParam);return{name,elementDefinition:details.elementDefinitions?.[0],searchParams:[exactSearchParam]}}return{name}}var import_jsx_runtime147=require("react/jsx-runtime"),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=(0,import_react_hooks58.useMedplum)(),[outcome,setOutcome]=(0,import_react97.useState)(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=(0,import_react97.useState)(search);(0,import_core207.deepEquals)(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=(0,import_react97.useState)({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=(0,import_react97.useRef)(state);(0,import_react97.useLayoutEffect)(()=>{stateRef.current=state});let total=memoizedSearch.total??"accurate",loadResults=(0,import_react97.useCallback)(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,(0,import_core207.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((0,import_core207.normalizeOperationOutcome)(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=(0,import_react97.useCallback)(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);(0,import_react97.useEffect)(()=>{loadResults()},[loadResults]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...stateRef.current.selected};checked?newSelected[id]=!0:delete newSelected[id],setState({...stateRef.current,selected:newSelected})}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},searchResponse=stateRef.current.searchResponse;checked&&searchResponse?.entry&&searchResponse.entry.forEach(entry=>{entry.resource?.id&&(newSelected[entry.resource.id]=!0)}),setState({...stateRef.current,selected:newSelected})}function isAllSelected(){if(!state.searchResponse?.entry||state.searchResponse.entry.length===0)return!1;for(let e of state.searchResponse.entry)if(e.resource?.id&&!state.selected[e.resource.id])return!1;return!0}function emitSearchChange(newSearch){props.onChange&&props.onChange(new SearchChangeEvent(newSearch))}function handleRowClick(e,resource){if(isCheckboxCell(e.target)||e.button===2)return;killEvent(e);let isAux=isAuxClick(e);!isAux&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),isAux&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e))}function isExportPassed(){return!!(props.onExport??props.onExportCsv??props.onExportTransactionBundle)}if(outcome)return(0,import_jsx_runtime147.jsx)(OperationOutcomeAlert,{outcome});if(!(0,import_core207.isDataTypeLoaded)(memoizedSearch.resourceType))return(0,import_jsx_runtime147.jsx)(import_core206.Center,{style:{width:"100%",height:"100%"},children:(0,import_jsx_runtime147.jsx)(import_core206.Loader,{})});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(0,import_jsx_runtime147.jsxs)("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&(0,import_jsx_runtime147.jsxs)(import_core206.Group,{justify:"space-between",mb:"xl",children:[(0,import_jsx_runtime147.jsxs)(import_core206.Group,{gap:2,children:[(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&(0,import_jsx_runtime147.jsx)(import_core206.Button,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:(0,import_jsx_runtime147.jsx)(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),(0,import_jsx_runtime147.jsxs)(import_core206.Group,{gap:2,children:[lastResult&&(0,import_jsx_runtime147.jsxs)(import_core206.Text,{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()}`]}),(0,import_jsx_runtime147.jsx)(import_core206.ActionIcon,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:(0,import_jsx_runtime147.jsx)(IconRefresh,{size:iconSize})})]})]}),(0,import_jsx_runtime147.jsxs)(import_core206.Table,{className:SearchControl_default.table,children:[(0,import_jsx_runtime147.jsxs)(import_core206.Table.Thead,{children:[(0,import_jsx_runtime147.jsxs)(import_core206.Table.Tr,{children:[checkboxColumn&&(0,import_jsx_runtime147.jsx)(import_core206.Table.Th,{children:(0,import_jsx_runtime147.jsx)("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>(0,import_jsx_runtime147.jsx)(import_core206.Table.Th,{children:(0,import_jsx_runtime147.jsxs)(import_core206.Menu,{shadow:"md",width:240,position:"bottom-end",children:[(0,import_jsx_runtime147.jsx)(import_core206.Menu.Target,{children:(0,import_jsx_runtime147.jsx)(import_core206.UnstyledButton,{className:SearchControl_default.control,p:2,children:(0,import_jsx_runtime147.jsxs)(import_core206.Group,{justify:"space-between",wrap:"nowrap",children:[(0,import_jsx_runtime147.jsx)(import_core206.Text,{fw:500,children:buildFieldNameString(field.name)}),(0,import_jsx_runtime147.jsx)(import_core206.Center,{className:SearchControl_default.icon,children:(0,import_jsx_runtime147.jsx)(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),(0,import_jsx_runtime147.jsx)(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&&(0,import_jsx_runtime147.jsxs)(import_core206.Table.Tr,{children:[checkboxColumn&&(0,import_jsx_runtime147.jsx)(import_core206.Table.Th,{}),fields.map(field=>(0,import_jsx_runtime147.jsx)(import_core206.Table.Th,{children:field.searchParams&&(0,import_jsx_runtime147.jsx)(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),(0,import_jsx_runtime147.jsx)(import_core206.Table.Tbody,{children:resources?.map(resource=>resource&&(0,import_jsx_runtime147.jsxs)(import_core206.Table.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&(0,import_jsx_runtime147.jsx)(import_core206.Table.Td,{children:(0,import_jsx_runtime147.jsx)("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=>(0,import_jsx_runtime147.jsx)(import_core206.Table.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&(0,import_jsx_runtime147.jsx)(Container,{children:(0,import_jsx_runtime147.jsx)(import_core206.Center,{style:{height:150},children:(0,import_jsx_runtime147.jsx)(import_core206.Text,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&(0,import_jsx_runtime147.jsx)(import_core206.Center,{m:"md",p:"md",children:(0,import_jsx_runtime147.jsx)(import_core206.Pagination,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),(0,import_jsx_runtime147.jsx)(SearchFieldEditor,{search:memoizedSearch,visible:state.fieldEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,fieldEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,fieldEditorVisible:!1})}},`search-field-editor-${state.dialogOpenTime}`),(0,import_jsx_runtime147.jsx)(SearchFilterEditor,{search:memoizedSearch,visible:state.filterEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,filterEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterEditorVisible:!1})}},`search-filter-editor-${state.dialogOpenTime}`),(0,import_jsx_runtime147.jsx)(SearchExportDialog,{visible:state.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),(0,import_jsx_runtime147.jsx)(SearchFilterValueDialog,{visible:state.filterDialogVisible,title:state.filterDialogSearchParam?.code?buildFieldNameString(state.filterDialogSearchParam.code):"",resourceType,searchParam:state.filterDialogSearchParam,filter:state.filterDialogFilter,defaultValue:"",onOk:filter=>{emitSearchChange(addFilter(memoizedSearch,filter.code,filter.operator,filter.value)),setState({...stateRef.current,filterDialogVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterDialogVisible:!1})}},`search-filter-dialog-${state.dialogOpenTime}`)]})}function FilterDescription(props){let filters=(props.filters??[]).filter(f=>props.searchParams.find(p=>p.code===f.code));return filters.length===0?(0,import_jsx_runtime147.jsx)("span",{children:"no filters"}):(0,import_jsx_runtime147.jsx)(import_jsx_runtime147.Fragment,{children:filters.map(filter=>(0,import_jsx_runtime147.jsxs)("div",{children:[getOpString(filter.operator),"\xA0",(0,import_jsx_runtime147.jsx)(SearchFilterValueDisplay,{resourceType:props.resourceType,filter})]},`filter-${filter.code}-${filter.operator}-${filter.value}`))})}function getPage(search){return Math.floor((search.offset??0)/(search.count??import_core207.DEFAULT_SEARCH_COUNT))+1}function getTotalPages(search,lastResult){let pageSize=search.count??import_core207.DEFAULT_SEARCH_COUNT,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}var import_jsx_runtime148=require("react/jsx-runtime");function FhirPathTable(props){let medplum=(0,import_react_hooks59.useMedplum)(),[schemaLoaded,setSchemaLoaded]=(0,import_react98.useState)(!1),[outcome,setOutcome]=(0,import_react98.useState)(),{query,fields}=props,[response,setResponse]=(0,import_react98.useState)(),[selected,setSelected]=(0,import_react98.useState)({});(0,import_react98.useEffect)(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome((0,import_core209.normalizeOperationOutcome)(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selected};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=response?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=response?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selected[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if((0,import_react98.useEffect)(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return(0,import_jsx_runtime148.jsx)(import_core208.Loader,{});let checkboxColumn=props.checkboxesEnabled;return(0,import_jsx_runtime148.jsxs)("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[(0,import_jsx_runtime148.jsxs)(import_core208.Table,{children:[(0,import_jsx_runtime148.jsx)(import_core208.Table.Thead,{children:(0,import_jsx_runtime148.jsxs)(import_core208.Table.Tr,{children:[checkboxColumn&&(0,import_jsx_runtime148.jsx)(import_core208.Table.Th,{children:(0,import_jsx_runtime148.jsx)("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>(0,import_jsx_runtime148.jsx)(import_core208.Table.Th,{children:field.name},field.name))]})}),(0,import_jsx_runtime148.jsx)(import_core208.Table.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&(0,import_jsx_runtime148.jsxs)(import_core208.Table.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&(0,import_jsx_runtime148.jsx)(import_core208.Table.Td,{children:(0,import_jsx_runtime148.jsx)("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=>(0,import_jsx_runtime148.jsx)(import_core208.Table.Td,{children:(0,import_jsx_runtime148.jsx)(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&(0,import_jsx_runtime148.jsx)("div",{"data-testid":"empty-search",children:"No results"}),outcome&&(0,import_jsx_runtime148.jsx)("div",{"data-testid":"search-error",children:(0,import_jsx_runtime148.jsx)("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&(0,import_jsx_runtime148.jsx)(import_core208.Button,{onClick:()=>props.onBulk(Object.keys(selected)),children:"Bulk..."})]})}var MemoizedFhirPathTable=(0,import_react98.memo)(FhirPathTable);var import_core210=require("@mantine/core");var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};var import_jsx_runtime149=require("react/jsx-runtime");function InfoBar(props){return(0,import_jsx_runtime149.jsx)(import_core210.ScrollArea,{children:(0,import_jsx_runtime149.jsx)("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return(0,import_jsx_runtime149.jsx)("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return(0,import_jsx_runtime149.jsx)("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return(0,import_jsx_runtime149.jsx)("div",{className:InfoBar_default.value,children:props.children})};var import_core211=require("@mantine/core"),import_core212=require("@medplum/core"),import_react_hooks60=require("@medplum/react-hooks"),import_react99=require("react");var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};var import_jsx_runtime150=require("react/jsx-runtime");function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=(0,import_react_hooks60.useMedplumNavigate)(),[currentTab,setCurrentTab]=(0,import_react99.useState)(()=>{let segment=import_core212.locationUtils.getPathname().split("/").pop();if(segment){let segmentLower=segment.toLowerCase(),matched=tabs.find(t=>t.value.split(/[?#]/)[0].toLowerCase()===segmentLower);if(matched)return matched.value}return tabs[0].value});function onTabChange(newTabName){newTabName=newTabName||tabs[0].value,setCurrentTab(newTabName),navigate(`${baseUrl}/${newTabName}`)}return(0,import_jsx_runtime150.jsxs)(import_core211.Tabs,{value:currentTab,onChange:onTabChange,...rest,children:[(0,import_jsx_runtime150.jsx)(import_core211.Tabs.List,{className:LinkTabs_default.list,children:tabs.map(t=>(0,import_jsx_runtime150.jsx)(import_core211.Tabs.Tab,{value:t.value,children:(0,import_jsx_runtime150.jsx)(import_core211.Anchor,{className:LinkTabs_default.link,href:`${baseUrl}/${t.value}`,onClick:onLinkClick,children:t.label})},t.value))}),children]})}function normalizeTabDefinitions(tabs){return tabs.map(t=>(0,import_core212.isString)(t)?{label:t,value:t.toLowerCase()}:t)}function onLinkClick(e){isAuxClick(e)||e.preventDefault()}var import_core215=require("@mantine/core"),import_react_hooks61=require("@medplum/react-hooks");var import_core213=require("@mantine/core"),import_core214=require("@medplum/core");var import_jsx_runtime151=require("react/jsx-runtime");function MeasureReportGroupDisplay(props){let{group}=props;return(0,import_jsx_runtime151.jsx)(import_core213.Paper,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:(0,import_jsx_runtime151.jsxs)(import_core213.Group,{children:[group.measureScore&&(0,import_jsx_runtime151.jsx)(MeasureScore,{group}),!group.measureScore&&(0,import_jsx_runtime151.jsx)(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return(0,import_jsx_runtime151.jsxs)(import_jsx_runtime151.Fragment,{children:[(0,import_jsx_runtime151.jsx)(import_core213.Text,{fz:"md",fw:500,mb:8,children:measure.title}),(0,import_jsx_runtime151.jsx)(import_core213.Text,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>(0,import_core214.formatCodeableConcept)(p.code)==="numerator"),denominator=populations?.find(p=>(0,import_core214.formatCodeableConcept)(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return(0,import_jsx_runtime151.jsxs)(import_core213.Box,{children:[(0,import_jsx_runtime151.jsx)(import_core213.Title,{order:3,children:"Not Applicable"}),(0,import_jsx_runtime151.jsx)(import_core213.Text,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return(0,import_jsx_runtime151.jsxs)(import_core213.Box,{children:[(0,import_jsx_runtime151.jsx)(import_core213.Title,{order:3,children:"Insufficient Data"}),(0,import_jsx_runtime151.jsx)(import_core213.Text,{children:`Numerator: ${numeratorCount}`}),(0,import_jsx_runtime151.jsx)(import_core213.Text,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return(0,import_jsx_runtime151.jsx)(import_core213.RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:(0,import_jsx_runtime151.jsx)(import_core213.Flex,{justify:"center",children:(0,import_jsx_runtime151.jsxs)(import_core213.Text,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return(0,import_jsx_runtime151.jsx)(import_jsx_runtime151.Fragment,{children:unit==="%"?(0,import_jsx_runtime151.jsx)(import_core213.RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:(0,import_jsx_runtime151.jsx)(import_core213.Flex,{justify:"center",children:(0,import_jsx_runtime151.jsx)(import_core213.Text,{fw:700,fz:18,children:(0,import_jsx_runtime151.jsx)(QuantityDisplay,{value:group.measureScore})})})}):(0,import_jsx_runtime151.jsx)(import_core213.Flex,{h:120,align:"center",children:(0,import_jsx_runtime151.jsx)(import_core213.Title,{order:3,children:(0,import_jsx_runtime151.jsx)(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"}var import_jsx_runtime152=require("react/jsx-runtime");function MeasureReportDisplay(props){let report=(0,import_react_hooks61.useResource)(props.measureReport),[measure]=(0,import_react_hooks61.useSearchOne)("Measure",{url:report?.measure});return report?(0,import_jsx_runtime152.jsxs)(import_core215.Box,{children:[measure&&(0,import_jsx_runtime152.jsx)(MeasureTitle,{measure}),(0,import_jsx_runtime152.jsx)(import_core215.SimpleGrid,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>(0,import_jsx_runtime152.jsx)(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}var import_core216=require("@mantine/core"),import_react_hooks62=require("@medplum/react-hooks"),import_jsx_runtime153=require("react/jsx-runtime");function NotificationIcon(props){let{resourceType,countCriteria,subscriptionCriteria}=props,unreadCount=(0,import_react_hooks62.useNotificationCount)({resourceType,countCriteria,subscriptionCriteria}),result=props.iconComponent;return props.onClick&&(result=(0,import_jsx_runtime153.jsx)(import_core216.ActionIcon,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=(0,import_jsx_runtime153.jsx)(import_core216.Tooltip,{label:props.tooltip,children:result})),unreadCount>0&&(result=(0,import_jsx_runtime153.jsx)(import_core216.Indicator,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}var import_core217=require("@mantine/core"),import_notifications10=require("@mantine/notifications"),import_core218=require("@medplum/core"),import_react_hooks63=require("@medplum/react-hooks");var import_react100=require("react");var import_jsx_runtime154=require("react/jsx-runtime"),NOTIFICATION_ID="patient-accounts",NOTIFICATION_TITLE="Patient Accounts",ACCOUNT_TARGET_TYPES=["Organization","HealthcareService","CareTeam"];function PatientAccountsForm(props){let{patient}=props,medplum=(0,import_react_hooks63.useMedplum)(),isAdmin=medplum.isProjectAdmin()||medplum.isSuperAdmin(),originalAccounts=(0,import_react100.useMemo)(()=>(0,import_core218.extractAccountReferences)(patient.meta)??[],[patient.meta]),[pendingAccounts,setPendingAccounts]=(0,import_react100.useState)(originalAccounts),[confirmModalOpen,setConfirmModalOpen]=(0,import_react100.useState)(!1),[propagate,setPropagate]=(0,import_react100.useState)(!0),[saving,setSaving]=(0,import_react100.useState)(!1),changes=(0,import_react100.useMemo)(()=>{let result=[];for(let account of pendingAccounts)originalAccounts.some(o=>o.reference===account.reference)||result.push({reference:account,type:"addition"});for(let account of originalAccounts)pendingAccounts.some(p=>p.reference===account.reference)||result.push({reference:account,type:"removal"});return result},[originalAccounts,pendingAccounts]),hasChanges=changes.length>0,handleAddAccount=(0,import_react100.useCallback)(value=>{value?.reference&&(pendingAccounts.some(a=>a.reference===value.reference)||setPendingAccounts(prev=>[...prev,value]))},[pendingAccounts]),handleRemoveAccount=(0,import_react100.useCallback)(referenceString=>{setPendingAccounts(prev=>prev.filter(a=>a.reference!==referenceString))},[]),handleSave=(0,import_react100.useCallback)(async()=>{let patientId=patient.id;if(!patientId){import_notifications10.notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:"Cannot update accounts: Patient resource has no ID.",icon:(0,import_jsx_runtime154.jsx)(IconX,{size:"1rem"}),autoClose:!1,withCloseButton:!0});return}setSaving(!0),setConfirmModalOpen(!1);let url=medplum.fhirUrl("Patient",patientId,"$set-accounts"),parameters={resourceType:"Parameters",parameter:[...pendingAccounts.map(account=>({name:"accounts",valueReference:{reference:account.reference}})),{name:"propagate",valueBoolean:propagate}]};import_notifications10.notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,loading:!0,message:propagate?"Saving account changes and propagating to compartment...":"Saving account changes...",autoClose:!1,withCloseButton:!1});try{let headers={};propagate&&(headers.Prefer="respond-async"),await medplum.post(url,parameters,void 0,{headers}),medplum.invalidateUrl(medplum.fhirUrl("Patient",patientId)),import_notifications10.notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"green",message:propagate?"Account changes saved. Compartment updates are being applied.":"Account changes saved.",icon:(0,import_jsx_runtime154.jsx)(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0}),props.onSaved?.()}catch(err){import_notifications10.notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:(0,import_core218.normalizeErrorString)(err),icon:(0,import_jsx_runtime154.jsx)(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}finally{setSaving(!1)}},[medplum,patient,pendingAccounts,propagate,props]);return isAdmin?(0,import_jsx_runtime154.jsxs)(import_jsx_runtime154.Fragment,{children:[(0,import_jsx_runtime154.jsxs)(import_core217.Stack,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Title,{order:3,children:"Current Accounts"}),pendingAccounts.length===0?(0,import_jsx_runtime154.jsx)(import_core217.Text,{c:"dimmed",children:"No accounts assigned to this patient."}):(0,import_jsx_runtime154.jsxs)(import_core217.Table,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Table.Thead,{children:(0,import_jsx_runtime154.jsxs)(import_core217.Table.Tr,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Table.Th,{children:"Type"}),(0,import_jsx_runtime154.jsx)(import_core217.Table.Th,{children:"Account"}),(0,import_jsx_runtime154.jsx)(import_core217.Table.Th,{})]})}),(0,import_jsx_runtime154.jsx)(import_core217.Table.Tbody,{children:pendingAccounts.map(account=>(0,import_jsx_runtime154.jsxs)(import_core217.Table.Tr,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Table.Td,{children:(0,import_jsx_runtime154.jsx)(AccountTypeBadge,{reference:account})}),(0,import_jsx_runtime154.jsx)(import_core217.Table.Td,{children:(0,import_jsx_runtime154.jsx)(ResourceBadge,{value:account,link:!0})}),(0,import_jsx_runtime154.jsx)(import_core217.Table.Td,{children:(0,import_jsx_runtime154.jsx)(import_core217.ActionIcon,{variant:"subtle",color:"red","aria-label":`Remove ${account.reference}`,onClick:()=>handleRemoveAccount(account.reference),children:(0,import_jsx_runtime154.jsx)(IconX,{size:16})})})]},account.reference))})]}),(0,import_jsx_runtime154.jsx)(import_core217.Divider,{}),(0,import_jsx_runtime154.jsx)(import_core217.Title,{order:4,children:"Add Account"}),(0,import_jsx_runtime154.jsx)(ReferenceInput,{name:"newAccount",placeholder:"Search for Organization, HealthcareService, or CareTeam...",targetTypes:ACCOUNT_TARGET_TYPES,onChange:value=>{value&&handleAddAccount(value)}}),hasChanges&&(0,import_jsx_runtime154.jsxs)(import_jsx_runtime154.Fragment,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Divider,{}),(0,import_jsx_runtime154.jsx)(import_core217.Title,{order:4,children:"Pending Changes"}),(0,import_jsx_runtime154.jsx)(import_core217.Stack,{gap:"xs",children:changes.map(change=>(0,import_jsx_runtime154.jsxs)(import_core217.Group,{gap:"xs",children:[change.type==="addition"?(0,import_jsx_runtime154.jsx)(import_core217.Badge,{color:"green",variant:"light",leftSection:(0,import_jsx_runtime154.jsx)(IconPlus,{size:12}),children:"Add"}):(0,import_jsx_runtime154.jsx)(import_core217.Badge,{color:"red",variant:"light",leftSection:(0,import_jsx_runtime154.jsx)(IconMinus,{size:12}),children:"Remove"}),(0,import_jsx_runtime154.jsx)(ResourceBadge,{value:change.reference,link:!0})]},`${change.type}-${change.reference.reference}`))})]}),(0,import_jsx_runtime154.jsx)(import_core217.Box,{children:(0,import_jsx_runtime154.jsx)(import_core217.Button,{disabled:!hasChanges||saving,onClick:()=>setConfirmModalOpen(!0),children:"Save Changes"})})]}),(0,import_jsx_runtime154.jsx)(import_core217.Modal,{opened:confirmModalOpen,onClose:()=>setConfirmModalOpen(!1),title:"Confirm Account Changes",size:"md",keepMounted:!0,children:(0,import_jsx_runtime154.jsxs)(import_core217.Stack,{children:[(0,import_jsx_runtime154.jsxs)(import_core217.Text,{children:["The following changes will be applied to Patient"," ",(0,import_jsx_runtime154.jsxs)("strong",{children:[patient.name?.[0]?.given?.join(" ")," ",patient.name?.[0]?.family]}),":"]}),changes.filter(c=>c.type==="addition").length>0&&(0,import_jsx_runtime154.jsxs)(import_core217.Box,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Text,{fw:600,c:"green",children:"Adding:"}),(0,import_jsx_runtime154.jsx)(import_core217.Stack,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="addition").map(c=>(0,import_jsx_runtime154.jsxs)(import_core217.Group,{gap:"xs",children:[(0,import_jsx_runtime154.jsx)(IconPlus,{size:14,color:"green"}),(0,import_jsx_runtime154.jsx)(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),changes.filter(c=>c.type==="removal").length>0&&(0,import_jsx_runtime154.jsxs)(import_core217.Box,{children:[(0,import_jsx_runtime154.jsx)(import_core217.Text,{fw:600,c:"red",children:"Removing:"}),(0,import_jsx_runtime154.jsx)(import_core217.Stack,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="removal").map(c=>(0,import_jsx_runtime154.jsxs)(import_core217.Group,{gap:"xs",children:[(0,import_jsx_runtime154.jsx)(IconMinus,{size:14,color:"red"}),(0,import_jsx_runtime154.jsx)(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),(0,import_jsx_runtime154.jsx)(import_core217.Checkbox,{label:"Propagate changes to all resources in this patient's compartment",checked:propagate,onChange:event=>setPropagate(event.currentTarget.checked)}),(0,import_jsx_runtime154.jsxs)(import_core217.Group,{justify:"right",mt:"md",children:[(0,import_jsx_runtime154.jsx)(import_core217.Button,{variant:"default",onClick:()=>setConfirmModalOpen(!1),children:"Cancel"}),(0,import_jsx_runtime154.jsx)(import_core217.Button,{onClick:handleSave,loading:saving,children:"Confirm"})]})]})})]}):(0,import_jsx_runtime154.jsx)(import_core217.Alert,{color:"blue",title:"Admin access required",children:"You need project admin access to manage patient account assignments."})}function AccountTypeBadge({reference}){let type=reference.reference?.split("/")[0]??"Unknown";return(0,import_jsx_runtime154.jsx)(import_core217.Badge,{variant:"light",color:{Organization:"blue",HealthcareService:"teal",CareTeam:"violet"}[type]??"gray",size:"sm",children:type})}var import_core219=require("@mantine/core"),import_notifications11=require("@mantine/notifications"),import_core220=require("@medplum/core"),import_react_hooks64=require("@medplum/react-hooks");var import_react101=require("react");var import_jsx_runtime155=require("react/jsx-runtime"),NOTIFICATION_ID2="patient-export",NOTIFICATION_TITLE2="Patient Export",formats={everything:{operation:"$everything",extension:"json",contentType:import_core220.ContentType.FHIR_JSON},summary:{operation:"$summary",extension:"json",contentType:import_core220.ContentType.FHIR_JSON},ccda:{operation:"$ccda-export",extension:"xml",contentType:import_core220.ContentType.CDA_XML},ccdaReferral:{operation:"$ccda-export",type:"referral",extension:"xml",contentType:import_core220.ContentType.CDA_XML}};function PatientExportForm(props){let medplum=(0,import_react_hooks64.useMedplum)(),{patient}=props,handleSubmit=(0,import_react101.useCallback)(async data2=>{let patientId=(0,import_core220.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),import_notifications11.notifications.show({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,loading:!0,message:"Exporting...",autoClose:!1,withCloseButton:!1});try{let response=await medplum.post(url,params,void 0,{cache:"no-cache",headers:{Accept:contentType}}),fileName=`Patient-export-${patientId}-${new Date().toISOString().replaceAll(":","-")}.${extension}`;saveData(response,fileName,contentType),import_notifications11.notifications.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"green",message:"Done",icon:(0,import_jsx_runtime155.jsx)(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){import_notifications11.notifications.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"red",message:(0,import_core220.normalizeErrorString)(err),icon:(0,import_jsx_runtime155.jsx)(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient]);return(0,import_jsx_runtime155.jsx)(Form,{onSubmit:handleSubmit,children:(0,import_jsx_runtime155.jsxs)(import_core219.Stack,{children:[(0,import_jsx_runtime155.jsx)(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:(0,import_jsx_runtime155.jsx)(import_core219.SegmentedControl,{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})}),(0,import_jsx_runtime155.jsx)(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:(0,import_jsx_runtime155.jsx)(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),(0,import_jsx_runtime155.jsx)(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:(0,import_jsx_runtime155.jsx)(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),(0,import_jsx_runtime155.jsx)(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:(0,import_jsx_runtime155.jsx)(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),(0,import_jsx_runtime155.jsx)(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:(0,import_jsx_runtime155.jsx)(DateTimeInput,{name:"endDate",placeholder:"End date"})}),(0,import_jsx_runtime155.jsx)(import_core219.Group,{justify:"right",children:(0,import_jsx_runtime155.jsx)(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)}var import_core221=require("@medplum/core"),import_react_hooks65=require("@medplum/react-hooks");function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}var import_jsx_runtime156=require("react/jsx-runtime");function PatientHeader(props){let patient=(0,import_react_hooks65.useResource)(props.patient);return patient?(0,import_jsx_runtime156.jsxs)(InfoBar,{children:[(0,import_jsx_runtime156.jsx)(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:"Name"}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:(0,import_jsx_runtime156.jsx)(MedplumLink,{to:patient,fw:500,children:patient.name?(0,import_jsx_runtime156.jsx)(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&(0,import_jsx_runtime156.jsxs)(import_jsx_runtime156.Fragment,{children:[(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:"DoB"}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:patient.birthDate})]}),(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:"Age"}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:(0,import_core221.calculateAgeString)(patient.birthDate)})]})]}),patient.gender&&(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:"Gender"}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:patient.gender})]}),patient.address&&(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:"State"}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>(0,import_jsx_runtime156.jsxs)(InfoBar.Entry,{children:[(0,import_jsx_runtime156.jsx)(InfoBar.Key,{children:identifier?.system}),(0,import_jsx_runtime156.jsx)(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}var import_core222=require("@mantine/core"),import_notifications12=require("@mantine/notifications"),import_core223=require("@medplum/core"),import_react102=require("react");var PharmacyDialog_default={pharmacyItem:"PharmacyDialog_pharmacyItem",pharmacyItemSelected:"PharmacyDialog_pharmacyItemSelected"};var import_jsx_runtime157=require("react/jsx-runtime");function getPharmacyKey(pharmacy,index){return pharmacy.identifier?.[0]?.value||`pharmacy-${index}`}function SearchForm({onSearch,searching}){return(0,import_jsx_runtime157.jsx)("form",{onSubmit:e=>{e.preventDefault();let formData=new FormData(e.currentTarget);onSearch(formData)},children:(0,import_jsx_runtime157.jsxs)(import_core222.Stack,{gap:"md",children:[(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"name",label:"Pharmacy Name",placeholder:"Enter pharmacy name (min 3 chars)"}),(0,import_jsx_runtime157.jsxs)(import_core222.Group,{grow:!0,children:[(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"city",label:"City",placeholder:"City (min 3 chars)"}),(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"state",label:"State",placeholder:"State (min 3 chars)"})]}),(0,import_jsx_runtime157.jsxs)(import_core222.Group,{grow:!0,children:[(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"zip",label:"Zip Code",placeholder:"Zip code (min 3 chars)"}),(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"phoneOrFax",label:"Phone or Fax",placeholder:"Phone or fax number"})]}),(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"address",label:"Address",placeholder:"Street address (min 3 chars)"}),(0,import_jsx_runtime157.jsx)(import_core222.TextInput,{name:"ncpdpID",label:"NCPDP ID",placeholder:"National Council for Prescription Drug Programs ID"}),(0,import_jsx_runtime157.jsx)(import_core222.Button,{type:"submit",loading:searching,children:"Search"})]})})}function PharmacyItem({pharmacy,pharmacyKey,isSelected,onSelect}){return(0,import_jsx_runtime157.jsx)(import_core222.Box,{p:"sm",className:isSelected?PharmacyDialog_default.pharmacyItemSelected:PharmacyDialog_default.pharmacyItem,onClick:onSelect,children:(0,import_jsx_runtime157.jsx)(import_core222.Radio,{value:pharmacyKey,label:(0,import_jsx_runtime157.jsxs)(import_core222.Box,{children:[(0,import_jsx_runtime157.jsx)(import_core222.Text,{fw:500,size:"sm",children:pharmacy.name}),pharmacy.address?.[0]&&(0,import_jsx_runtime157.jsx)(import_core222.Text,{size:"xs",c:"dimmed",children:(0,import_core223.formatAddress)(pharmacy.address[0])}),pharmacy.telecom?.find(t=>t.system==="phone")&&(0,import_jsx_runtime157.jsxs)(import_core222.Text,{size:"xs",c:"dimmed",children:["Phone: ",pharmacy.telecom.find(t=>t.system==="phone")?.value]}),pharmacy.telecom?.find(t=>t.system==="fax")&&(0,import_jsx_runtime157.jsxs)(import_core222.Text,{size:"xs",c:"dimmed",children:["Fax: ",pharmacy.telecom.find(t=>t.system==="fax")?.value]})]})})},pharmacyKey)}function SearchResults({searchResults,selectedPharmacy,onSelectPharmacy,setAsPrimary,onSetAsPrimary,onAddFavorite,onClose,adding}){return(0,import_jsx_runtime157.jsxs)(import_core222.Box,{mt:"xl",children:[(0,import_jsx_runtime157.jsxs)(import_core222.Text,{fw:600,mb:"md",children:["Search Results (",searchResults.length,")"]}),(0,import_jsx_runtime157.jsx)(import_core222.Radio.Group,{value:selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy)):"",onChange:value=>{let selected=searchResults.find((p,i)=>getPharmacyKey(p,i)===value);selected&&onSelectPharmacy(selected)},children:(0,import_jsx_runtime157.jsx)(import_core222.Stack,{gap:"sm",children:searchResults.map((pharmacy,index)=>{let pharmacyKey=getPharmacyKey(pharmacy,index),isSelected=selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy))===pharmacyKey:!1;return(0,import_jsx_runtime157.jsx)(PharmacyItem,{pharmacy,pharmacyKey,isSelected,onSelect:()=>onSelectPharmacy(pharmacy)},pharmacyKey)})})}),(0,import_jsx_runtime157.jsxs)(import_core222.Flex,{mt:"lg",gap:"md",align:"center",justify:"space-between",children:[(0,import_jsx_runtime157.jsx)(import_core222.Checkbox,{label:"Set as primary pharmacy",checked:setAsPrimary,onChange:e=>onSetAsPrimary(e.currentTarget.checked)}),(0,import_jsx_runtime157.jsxs)(import_core222.Group,{children:[(0,import_jsx_runtime157.jsx)(import_core222.Button,{variant:"subtle",onClick:onClose,children:"Cancel"}),(0,import_jsx_runtime157.jsx)(import_core222.Button,{onClick:onAddFavorite,disabled:!selectedPharmacy,loading:adding,children:"Add to Favorites"})]})]})]})}function PharmacyDialog(props){let{patient,onSubmit,onClose,onSearch,onAddToFavorites}=props,[searchResults,setSearchResults]=(0,import_react102.useState)([]),[searching,setSearching]=(0,import_react102.useState)(!1),[selectedPharmacy,setSelectedPharmacy]=(0,import_react102.useState)(),[setAsPrimary,setSetAsPrimary]=(0,import_react102.useState)(!1),[adding,setAdding]=(0,import_react102.useState)(!1),handleSearch=(0,import_react102.useCallback)(async formData=>{let searchParams={name:formData.get("name")||void 0,city:formData.get("city")||void 0,state:formData.get("state")||void 0,zip:formData.get("zip")||void 0,address:formData.get("address")||void 0,phoneOrFax:formData.get("phoneOrFax")||void 0,ncpdpID:formData.get("ncpdpID")||void 0},cleanParams=Object.fromEntries(Object.entries(searchParams).filter(([_,v])=>typeof v=="string"&&v.trim()!==""));if(Object.keys(cleanParams).length===0){(0,import_notifications12.showNotification)({color:"yellow",title:"Search Required",message:"Please enter at least one search criterion"});return}setSearching(!0),setSelectedPharmacy(void 0);try{let results=await onSearch(cleanParams);setSearchResults(results),results.length===0&&(0,import_notifications12.showNotification)({color:"blue",title:"No Results",message:"No pharmacies found matching your search criteria"})}catch(error){(0,import_notifications12.showNotification)({color:"red",title:"Search Error",message:(0,import_core223.normalizeErrorString)(error)})}finally{setSearching(!1)}},[onSearch]),handleAddFavorite=(0,import_react102.useCallback)(async()=>{if(!(!selectedPharmacy||!patient.id)){setAdding(!0);try{let response=await onAddToFavorites({patientId:patient.id,pharmacy:selectedPharmacy,setAsPrimary});response.success?((0,import_notifications12.showNotification)({color:"green",title:"Success",message:response.message}),onSubmit(response.organization||selectedPharmacy)):(0,import_notifications12.showNotification)({color:"red",title:"Error",message:response.message})}catch(error){(0,import_notifications12.showNotification)({color:"red",title:"Error",message:(0,import_core223.normalizeErrorString)(error)})}finally{setAdding(!1)}}},[selectedPharmacy,patient.id,setAsPrimary,onAddToFavorites,onSubmit]);return(0,import_jsx_runtime157.jsxs)(import_core222.Box,{children:[(0,import_jsx_runtime157.jsx)(SearchForm,{onSearch:formData=>handleSearch(formData).catch(console.error),searching}),searching&&(0,import_jsx_runtime157.jsx)(import_core222.Flex,{justify:"center",mt:"xl",children:(0,import_jsx_runtime157.jsx)(import_core222.Loader,{})}),searchResults.length>0&&!searching&&(0,import_jsx_runtime157.jsx)(SearchResults,{searchResults,selectedPharmacy,onSelectPharmacy:setSelectedPharmacy,setAsPrimary,onSetAsPrimary:setSetAsPrimary,onAddFavorite:handleAddFavorite,onClose,adding})]})}var import_core224=require("@mantine/core"),import_core225=require("@medplum/core");var import_jsx_runtime158=require("react/jsx-runtime");function summaryResourceListSection(options){return{key:options.key,title:options.title,searches:[{key:options.key,resourceType:options.search.resourceType,patientParam:options.search.patientParam,query:options.search.query}],component:context=>(0,import_jsx_runtime158.jsx)(ResourceListDisplay,{options,resources:context.results[options.key]??[],context})}}function ResourceListDisplay(props){let{options,context}=props,resources=[...props.resources];return options.filter&&(resources=resources.filter(options.filter)),options.sort&&resources.sort(options.sort),(0,import_jsx_runtime158.jsx)(CollapsibleSection,{title:options.title,onAdd:options.onAdd,children:resources.length>0?(0,import_jsx_runtime158.jsx)(import_core224.Flex,{direction:"column",gap:8,children:resources.map(resource=>{let displayString=options.getDisplayString?options.getDisplayString(resource):(0,import_core225.getDisplayString)(resource),status=options.getStatus?.(resource),secondaryText=options.getSecondaryText?.(resource);return(0,import_jsx_runtime158.jsx)(SummaryItem,{onClick:()=>context.onClickResource?.(resource),children:(0,import_jsx_runtime158.jsxs)(import_core224.Box,{children:[(0,import_jsx_runtime158.jsx)(import_core224.Text,{fw:500,className:SummaryItem_default.itemText,children:displayString}),(status||secondaryText)&&(0,import_jsx_runtime158.jsxs)(import_core224.Group,{mt:2,gap:4,children:[status&&(0,import_jsx_runtime158.jsx)(StatusBadge,{color:status.color,variant:"light",status:status.label}),secondaryText&&(0,import_jsx_runtime158.jsx)(import_core224.Text,{size:"xs",fw:500,c:"dimmed",children:secondaryText})]})]})},resource.id)})}):(0,import_jsx_runtime158.jsx)(import_core224.Text,{children:"(none)"})})}var import_core226=require("@medplum/core"),import_react103=require("react");var import_jsx_runtime159=require("react/jsx-runtime");function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=(0,import_react103.useCallback)((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),medplum.search("ClinicalImpression",{subject:ref,_count}),medplum.search("Communication",{subject:ref,_count}),medplum.search("Device",{patient:ref,_count}),medplum.search("DeviceRequest",{patient:ref,_count}),medplum.search("DiagnosticReport",{subject:ref,_count}),medplum.search("Media",{subject:ref,_count}),medplum.search("ServiceRequest",{subject:ref,_count}),medplum.search("Task",{subject:ref,_count})])},[]);return(0,import_jsx_runtime159.jsx)(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:(0,import_core226.createReference)(resource),sender:(0,import_core226.createReference)(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:(0,import_core226.createReference)(resource),operator:(0,import_core226.createReference)(operator),issued:new Date().toISOString(),content}),...rest})}var import_core227=require("@mantine/core"),import_core228=require("@medplum/core"),import_react_hooks66=require("@medplum/react-hooks");var import_react104=require("react");var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};var import_jsx_runtime160=require("react/jsx-runtime");function PlanDefinitionBuilder(props){let medplum=(0,import_react_hooks66.useMedplum)(),defaultValue2=(0,import_react_hooks66.useResource)(props.value),[schemaLoaded,setSchemaLoaded]=(0,import_react104.useState)(!1),[selectedKey,setSelectedKey]=(0,import_react104.useState)(),[hoverKey,setHoverKey]=(0,import_react104.useState)(),[value,setValue]=(0,import_react104.useState)();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}if((0,import_react104.useEffect)(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),(0,import_react104.useEffect)(()=>(setValue(ensurePlanDefinitionKeys(defaultValue2??{resourceType:"PlanDefinition",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]),!schemaLoaded||!value)return null;function changeProperty(property,newValue){setValue(prevValue=>({...prevValue,[property]:newValue}))}return(0,import_jsx_runtime160.jsx)("div",{children:(0,import_jsx_runtime160.jsxs)(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[(0,import_jsx_runtime160.jsx)(import_core227.TextInput,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),(0,import_jsx_runtime160.jsx)(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),(0,import_jsx_runtime160.jsx)(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){function changeAction(changedAction){props.onChange(props.actions.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...props.actions,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(props.actions.filter(i=>i!==removedAction))}return(0,import_jsx_runtime160.jsxs)(import_core227.Stack,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>(0,import_jsx_runtime160.jsx)(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),(0,import_jsx_runtime160.jsx)("div",{children:(0,import_jsx_runtime160.jsx)(import_core227.Button,{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(0,import_jsx_runtime160.jsx)("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:(0,import_jsx_runtime160.jsx)(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=(0,import_react104.useState)(),medplum=(0,import_react_hooks66.useMedplum)(),[loading,setLoading]=(0,import_react104.useState)(!1),[resource,setResource]=(0,import_react104.useState)(),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(0,import_react104.useEffect)(()=>{(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?(0,import_jsx_runtime160.jsx)(import_core227.Loader,{}):(0,import_jsx_runtime160.jsxs)(import_core227.Paper,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[(0,import_jsx_runtime160.jsxs)(import_core227.Flex,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[(0,import_jsx_runtime160.jsx)(import_core227.TextInput,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),(0,import_jsx_runtime160.jsx)(import_core227.CloseButton,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&(0,import_jsx_runtime160.jsxs)(import_core227.Stack,{gap:"xl",p:"md",children:[(0,import_jsx_runtime160.jsx)(import_core227.Box,{children:(0,import_jsx_runtime160.jsx)(import_core227.TextInput,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),(0,import_jsx_runtime160.jsx)(import_core227.Box,{children:(0,import_jsx_runtime160.jsx)(import_core227.NativeSelect,{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"&&(0,import_jsx_runtime160.jsxs)(import_core227.Stack,{gap:0,children:[(0,import_jsx_runtime160.jsxs)(import_core227.Group,{gap:0,mb:"xs",children:[(0,import_jsx_runtime160.jsx)(import_core227.Text,{fw:600,children:"Select questionnaire"}),(0,import_jsx_runtime160.jsx)(import_core227.Text,{c:"red",children:"*"})]}),(0,import_jsx_runtime160.jsxs)(import_core227.Text,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",(0,import_jsx_runtime160.jsx)(import_core227.Anchor,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),(0,import_jsx_runtime160.jsx)(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&(0,import_jsx_runtime160.jsxs)(import_core227.Stack,{gap:0,children:[(0,import_jsx_runtime160.jsxs)(import_core227.Group,{gap:0,mb:"xs",children:[(0,import_jsx_runtime160.jsx)(import_core227.Text,{fw:600,children:"Select activity definition"}),(0,import_jsx_runtime160.jsx)(import_core227.Text,{c:"red",children:"*"})]}),(0,import_jsx_runtime160.jsxs)(import_core227.Text,{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"," ",(0,import_jsx_runtime160.jsx)(import_core227.Anchor,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),(0,import_jsx_runtime160.jsx)(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return(0,import_jsx_runtime160.jsx)(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:(0,import_core228.getReferenceString)(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)}))}var import_core229=require("@mantine/core"),import_core230=require("@medplum/core"),import_react_hooks67=require("@medplum/react-hooks");var import_react105=require("react");var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};var import_jsx_runtime161=require("react/jsx-runtime");function QuestionnaireBuilder(props){let medplum=(0,import_react_hooks67.useMedplum)(),defaultValue2=(0,import_react_hooks67.useResource)(props.questionnaire),[schemaLoaded,setSchemaLoaded]=(0,import_react105.useState)(!1),[value,setValue]=(0,import_react105.useState)(),[selectedKey,setSelectedKey]=(0,import_react105.useState)(),[hoverKey,setHoverKey]=(0,import_react105.useState)();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}(0,import_react105.useEffect)(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),(0,import_react105.useEffect)(()=>(setValue(ensureQuestionnaireKeys(defaultValue2??{resourceType:"Questionnaire",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]);let handleChange=(questionnaire2,disableSubmit)=>{setValue(questionnaire2),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire2)};return!schemaLoaded||!value?null:(0,import_jsx_runtime161.jsx)("div",{children:(0,import_jsx_runtime161.jsxs)(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[(0,import_jsx_runtime161.jsx)(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),(0,import_jsx_runtime161.jsx)(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource4=(0,import_core230.isResource)(props.item),isContainer=isResource4||item.type===import_react_hooks67.QuestionnaireItemType.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=(0,import_react105.useRef)(props.item);(0,import_react105.useLayoutEffect)(()=>{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(0,import_jsx_runtime161.jsxs)("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[(0,import_jsx_runtime161.jsx)("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[isResource4&&(0,import_jsx_runtime161.jsx)(import_core229.TextInput,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource4&&(0,import_jsx_runtime161.jsx)(import_core229.Textarea,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&(0,import_jsx_runtime161.jsx)(ReferenceProfiles,{item,onChange:updateItem}),(0,import_react_hooks67.isChoiceQuestion)(item)&&(0,import_jsx_runtime161.jsx)(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[resource.title&&(0,import_jsx_runtime161.jsx)(import_core229.Title,{children:resource.title}),item.text&&(0,import_jsx_runtime161.jsx)("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&(0,import_jsx_runtime161.jsx)(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>(0,import_jsx_runtime161.jsx)("div",{children:(0,import_jsx_runtime161.jsx)(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&&(0,import_jsx_runtime161.jsx)("div",{className:QuestionnaireBuilder_default.topActions,children:editing?(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[(0,import_jsx_runtime161.jsx)(import_core229.TextInput,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&(0,import_jsx_runtime161.jsx)(import_core229.NativeSelect,{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"}]})]}):(0,import_jsx_runtime161.jsx)("div",{children:linkId})}),!isResource4&&(0,import_jsx_runtime161.jsx)(import_core229.Box,{className:QuestionnaireBuilder_default.movementActions,children:(0,import_jsx_runtime161.jsxs)(import_core229.Box,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:(0,import_jsx_runtime161.jsx)(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:(0,import_jsx_runtime161.jsx)(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),(0,import_jsx_runtime161.jsxs)("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource4&&(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource4&&(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{e.preventDefault(),props.onRemove&&props.onRemove()},children:"Remove"})]})]})]})}function AnswerBuilder(props){let property=(0,import_core230.getElementDefinition)("QuestionnaireItemAnswerOption","value[x]"),options=props.item.answerOption??[];return(0,import_jsx_runtime161.jsxs)("div",{children:[props.item.answerValueSet!==void 0?(0,import_jsx_runtime161.jsx)(import_core229.TextInput,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):(0,import_jsx_runtime161.jsx)(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),(0,import_jsx_runtime161.jsxs)(import_core229.Box,{display:"flex",children:[(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),(0,import_jsx_runtime161.jsx)(import_core229.Space,{w:"lg"}),(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return(0,import_jsx_runtime161.jsx)("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return(0,import_jsx_runtime161.jsxs)("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[(0,import_jsx_runtime161.jsx)("div",{children:(0,import_jsx_runtime161.jsx)(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)}),(0,import_jsx_runtime161.jsx)("div",{children:(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{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=(0,import_react_hooks67.getQuestionnaireItemReferenceTargetTypes)(props.item)??[];return(0,import_jsx_runtime161.jsxs)(import_jsx_runtime161.Fragment,{children:[targetTypes.map((targetType,index)=>(0,import_jsx_runtime161.jsxs)(import_core229.Group,{children:[(0,import_jsx_runtime161.jsx)(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange((0,import_react_hooks67.setQuestionnaireItemReferenceTargetTypes)(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{killEvent(e),props.onChange((0,import_react_hooks67.setQuestionnaireItemReferenceTargetTypes)(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),(0,import_jsx_runtime161.jsx)(import_core229.Anchor,{href:"#",onClick:e=>{killEvent(e),props.onChange((0,import_react_hooks67.setQuestionnaireItemReferenceTargetTypes)(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId2=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId2(){return"id-"+nextId2++}function ensureQuestionnaireKeys(questionnaire2){return{...questionnaire2,id:questionnaire2.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire2.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId2=Math.max(nextId2,Number.parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,Number.parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId2(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId2()}))}function createPage(){return{id:generateId2(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:import_react_hooks67.QUESTIONNAIRE_ITEM_CONTROL_URL,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}var import_core233=require("@mantine/core"),import_react_hooks68=require("@medplum/react-hooks");var import_core231=require("@mantine/core"),import_core232=require("@medplum/core"),import_react106=require("react");var import_jsx_runtime162=require("react/jsx-runtime");function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=(0,import_react106.useMemo)(()=>answer&&answer.length>0?(0,import_jsx_runtime162.jsx)(import_jsx_runtime162.Fragment,{children:answer.map((ans,index)=>(0,import_jsx_runtime162.jsx)(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?(0,import_jsx_runtime162.jsx)(import_jsx_runtime162.Fragment,{children:nestedAnswers.map((nestedAnswer,index)=>(0,import_jsx_runtime162.jsx)(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):(0,import_jsx_runtime162.jsx)(import_core231.Text,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return(0,import_jsx_runtime162.jsxs)(import_core231.Stack,{gap:0,pb:"xs",children:[(0,import_jsx_runtime162.jsx)(import_core231.Text,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return(0,import_jsx_runtime162.jsx)(import_core231.Text,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return(0,import_jsx_runtime162.jsx)(import_core231.Text,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:value});case"valueQuantity":return(0,import_jsx_runtime162.jsx)(QuantityDisplay,{value});case"valueString":return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:value});case"valueCoding":return(0,import_jsx_runtime162.jsx)(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return(0,import_jsx_runtime162.jsx)(RangeDisplay,{value});case"valueDateTime":return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:(0,import_core232.formatDate)(value)});case"valueBoolean":return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:value?"True":"False"});case"valueReference":return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:value.display??value.reference});default:return(0,import_jsx_runtime162.jsx)(import_core231.Text,{children:value.toString()})}}var import_jsx_runtime163=require("react/jsx-runtime");function QuestionnaireResponseDisplay(props){let questionnaireResponse=(0,import_react_hooks68.useResource)(props.questionnaireResponse);return(0,import_jsx_runtime163.jsx)(import_core233.Stack,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>(0,import_jsx_runtime163.jsx)(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}var import_core234=require("@mantine/core"),import_core235=require("@medplum/core");var import_react107=require("react");var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};var import_jsx_runtime164=require("react/jsx-runtime"),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]=(0,import_react107.useState)([]),[groupId,setGroupId]=(0,import_react107.useState)(1),[intervalId,setIntervalId]=(0,import_react107.useState)(1);return(0,import_react107.useEffect)(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),(0,import_jsx_runtime164.jsxs)(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[(0,import_jsx_runtime164.jsx)(import_core234.Stack,{children:intervalGroups.map(intervalGroup=>(0,import_jsx_runtime164.jsx)(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),(0,import_jsx_runtime164.jsx)(import_core234.ActionIcon,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:(0,import_jsx_runtime164.jsx)(IconCirclePlus,{})}),(0,import_jsx_runtime164.jsx)(import_core234.Group,{justify:"flex-end",children:(0,import_jsx_runtime164.jsx)(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(0,import_jsx_runtime164.jsx)(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:(0,import_jsx_runtime164.jsxs)(import_core234.Stack,{gap:"lg",children:[(0,import_jsx_runtime164.jsx)(import_core234.Group,{justify:"flex-end",children:(0,import_jsx_runtime164.jsx)(import_core234.ActionIcon,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:(0,import_jsx_runtime164.jsx)(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),(0,import_jsx_runtime164.jsx)(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),(0,import_jsx_runtime164.jsx)(import_core234.Divider,{}),intervalGroup.intervals.map(interval=>(0,import_jsx_runtime164.jsxs)(import_core234.Stack,{gap:"xs",children:[(0,import_jsx_runtime164.jsxs)(import_core234.Group,{children:[(0,import_jsx_runtime164.jsx)(import_core234.TextInput,{"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}`),(0,import_jsx_runtime164.jsx)(import_core234.ActionIcon,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:(0,import_jsx_runtime164.jsx)(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),(0,import_jsx_runtime164.jsx)(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),(0,import_jsx_runtime164.jsx)(import_core234.ActionIcon,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:(0,import_jsx_runtime164.jsx)(IconCirclePlus,{})})]})})}function ReferenceRangeGroupFilters(props){let{intervalGroup,onChange}=props,age=intervalGroup.filters.age??{},ageWithDefaults={low:age.low?.unit?age.low:{...age.low,unit:"years",system:"http://unitsofmeasure.org"},high:age.high?.unit?age.high:{...age.high,unit:"years",system:"http://unitsofmeasure.org"}};return(0,import_jsx_runtime164.jsxs)(import_core234.Stack,{style:{maxWidth:"50%"},children:[(0,import_jsx_runtime164.jsx)(import_core234.Group,{children:(0,import_jsx_runtime164.jsx)(import_core234.NativeSelect,{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})}}})}),(0,import_jsx_runtime164.jsxs)(import_core234.Group,{gap:"xs",children:[(0,import_jsx_runtime164.jsx)(import_core234.Text,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),(0,import_jsx_runtime164.jsx)("div",{id:`div-age-${intervalGroup.id}`,children:(0,import_jsx_runtime164.jsx)(RangeInput,{path:"",name:`age-${intervalGroup.id}`,defaultValue:ageWithDefaults,onChange:ageRange=>{for(let interval of intervalGroup.intervals)onChange(intervalGroup.id,{...interval,age:ageRange})}},`age-${intervalGroup.id}`)})]}),(0,import_jsx_runtime164.jsx)(import_core234.NativeSelect,{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"}]}})}}}),(0,import_jsx_runtime164.jsx)(import_core234.NativeSelect,{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=${(0,import_core235.formatRange)(interval.age)}`,`gestationalAge=${(0,import_core235.formatRange)(interval.gestationalAge)}`,`context=${interval.context?.text}`,`appliesTo=${interval.appliesTo?.map(c=>c.text).join("+")}`,`category=${interval.category}`].join(":")}function getUnitString(unit){return unit&&((0,import_core235.getCodeBySystem)(unit,"http://unitsofmeasure.org")||unit.text)}function isEmptyInterval(interval){return interval.range?.low?.value===void 0&&interval.range?.high?.value===void 0}var import_core236=require("@mantine/core"),import_core237=require("@medplum/core"),import_react_hooks69=require("@medplum/react-hooks");var import_react108=require("react");var import_jsx_runtime165=require("react/jsx-runtime");function RequestGroupDisplay(props){let medplum=(0,import_react_hooks69.useMedplum)(),requestGroup=(0,import_react_hooks69.useResource)(props.value),[startedLoading,setStartedLoading]=(0,import_react108.useState)(!1),[responseBundle,setResponseBundle]=(0,import_react108.useState)();if((0,import_react108.useEffect)(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return(0,import_jsx_runtime165.jsx)(import_core236.Grid,{children:requestGroup.action?.map((action,index)=>{let task=action.resource&&findBundleEntry(action.resource),taskInput=task?.input?.[0]?.valueReference,taskOutput=task?.output?.[0]?.valueReference;return(0,import_jsx_runtime165.jsxs)(import_react108.Fragment,{children:[(0,import_jsx_runtime165.jsx)(import_core236.Grid.Col,{span:1,p:"md",children:task?.status==="completed"?(0,import_jsx_runtime165.jsx)(IconCheckbox,{}):(0,import_jsx_runtime165.jsx)(IconSquare,{color:"gray"})}),(0,import_jsx_runtime165.jsxs)(import_core236.Grid.Col,{span:9,p:"xs",children:[(0,import_jsx_runtime165.jsx)(import_core236.Text,{fw:500,children:action.title}),action.description&&(0,import_jsx_runtime165.jsx)("div",{children:action.description}),(0,import_jsx_runtime165.jsxs)("div",{children:["Last edited by\xA0",(0,import_jsx_runtime165.jsx)(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",(0,import_core237.formatDateTime)(task?.meta?.lastUpdated)]}),(0,import_jsx_runtime165.jsxs)("div",{children:["Status: ",(0,import_jsx_runtime165.jsx)(StatusBadge,{status:task?.status||"unknown"})]})]}),(0,import_jsx_runtime165.jsxs)(import_core236.Grid.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&(0,import_jsx_runtime165.jsx)(import_core236.Button,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&(0,import_jsx_runtime165.jsx)(import_core236.Button,{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===(0,import_core237.getReferenceString)(entry.resource))return entry.resource}}var import_react_hooks70=require("@medplum/react-hooks"),import_react109=require("react");var import_core238=require("@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:(0,import_core238.stringify)(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`}var import_jsx_runtime166=require("react/jsx-runtime");function ResourceBlame(props){let medplum=(0,import_react_hooks70.useMedplum)(),[value,setValue]=(0,import_react109.useState)(props.history);if((0,import_react109.useEffect)(()=>{!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(0,import_jsx_runtime166.jsx)("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return(0,import_jsx_runtime166.jsx)("div",{className:ResourceBlame_default.container,children:(0,import_jsx_runtime166.jsx)("table",{className:ResourceBlame_default.root,children:(0,import_jsx_runtime166.jsx)("tbody",{children:table.map((row,index)=>(0,import_jsx_runtime166.jsxs)("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&(0,import_jsx_runtime166.jsxs)(import_jsx_runtime166.Fragment,{children:[(0,import_jsx_runtime166.jsx)("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:(0,import_jsx_runtime166.jsx)(ResourceName,{value:row.meta.author,link:!0,fz:"xs"})}),(0,import_jsx_runtime166.jsx)("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:(0,import_jsx_runtime166.jsx)(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),fz:"xs",children:getTimeString(row.meta.lastUpdated)})})]}),(0,import_jsx_runtime166.jsx)("td",{className:ResourceBlame_default.lineNumber,children:index+1}),(0,import_jsx_runtime166.jsx)("td",{className:ResourceBlame_default.line,children:(0,import_jsx_runtime166.jsx)("pre",{className:ResourceBlame_default.pre,children:row.value})})]},"row-"+index))})})})}var import_core239=require("@medplum/core");var ResourceDiff_default={removed:"ResourceDiff_removed",added:"ResourceDiff_added"};var import_jsx_runtime167=require("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=(0,import_core239.stringify)(originalResource,!0).match(/[^\r\n]+/g)??["{","}"],revised=(0,import_core239.stringify)(revisedResource,!0).match(/[^\r\n]+/g)??["{","}"],deltas=diff(original,revised);return(0,import_jsx_runtime167.jsx)("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>(0,import_jsx_runtime167.jsx)(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return(0,import_jsx_runtime167.jsxs)(import_jsx_runtime167.Fragment,{children:["...",(0,import_jsx_runtime167.jsx)("br",{}),props.delta.original.lines.length>0&&(0,import_jsx_runtime167.jsx)("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
110
110
  `)}),props.delta.revised.lines.length>0&&(0,import_jsx_runtime167.jsx)("div",{className:ResourceDiff_default.added,children:props.delta.revised.lines.join(`
111
111
  `)}),"...",(0,import_jsx_runtime167.jsx)("br",{})]})}var import_core240=require("@mantine/core"),import_core241=require("@medplum/core"),import_react_hooks71=require("@medplum/react-hooks");var import_react110=require("react");var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};var import_jsx_runtime168=require("react/jsx-runtime");function ResourceForm(props){let{outcome}=props,medplum=(0,import_react_hooks71.useMedplum)(),defaultValue2=(0,import_react_hooks71.useResource)(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=(0,import_react110.useState)(!1),[value,setValue]=(0,import_react110.useState)(),accessPolicy=medplum.getAccessPolicy(),theme=(0,import_core240.useMantineTheme)();(0,import_react110.useEffect)(()=>{if(defaultValue2)if(props.profileUrl){let profileUrl=props.profileUrl;medplum.requestProfileSchema(props.profileUrl,{expandProfile:!0}).then(()=>{let profile=(0,import_core241.tryGetProfile)(profileUrl);if(profile){setSchemaLoaded(!0);let modifiedDefaultValue=(0,import_core241.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=(0,import_react110.useMemo)(()=>defaultValue2&&(0,import_core241.satisfiedAccessPolicy)(defaultValue2,import_core241.AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=(0,import_react110.useMemo)(()=>medplum.isSuperAdmin()||!accessPolicy||!(0,import_core241.isPopulated)(value?.resourceType)?!0:(0,import_core241.canWriteResourceType)(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?(0,import_jsx_runtime168.jsx)("div",{children:"Loading..."}):canWrite?(0,import_jsx_runtime168.jsxs)("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[(0,import_jsx_runtime168.jsxs)(import_core240.Stack,{mb:"xl",children:[(0,import_jsx_runtime168.jsx)(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:(0,import_jsx_runtime168.jsx)(import_core240.TextInput,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),(0,import_jsx_runtime168.jsx)(FormSection,{title:"ID",htmlFor:"id",outcome,children:(0,import_jsx_runtime168.jsx)(import_core240.TextInput,{name:"id",defaultValue:value.id,disabled:!0})})]}),(0,import_jsx_runtime168.jsx)(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:resourceType,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl,accessPolicyResource}),(0,import_jsx_runtime168.jsxs)(import_core240.Group,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[(0,import_jsx_runtime168.jsx)(import_core240.Button,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&(0,import_jsx_runtime168.jsxs)(import_core240.Menu,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[(0,import_jsx_runtime168.jsx)(import_core240.Menu.Target,{children:(0,import_jsx_runtime168.jsx)(import_core240.ActionIcon,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:(0,import_jsx_runtime168.jsx)(IconChevronDown,{size:14,stroke:1.5})})}),(0,import_jsx_runtime168.jsxs)(import_core240.Menu.Dropdown,{children:[props.onPatch&&(0,import_jsx_runtime168.jsx)(import_core240.Menu.Item,{leftSection:(0,import_jsx_runtime168.jsx)(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&(0,import_jsx_runtime168.jsx)(import_core240.Menu.Item,{color:"red",leftSection:(0,import_jsx_runtime168.jsx)(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):(0,import_jsx_runtime168.jsxs)(import_core240.Alert,{color:"red",title:"Permission denied",icon:(0,import_jsx_runtime168.jsx)(IconAlertCircle,{}),children:["Your access level prevents you from editing and creating ",value.resourceType," resources."]})}var import_core242=require("@mantine/core"),import_core243=require("@medplum/core"),import_react_hooks72=require("@medplum/react-hooks"),import_react111=require("react");var import_jsx_runtime169=require("react/jsx-runtime");function ResourceHistoryTable(props){let medplum=(0,import_react_hooks72.useMedplum)(),[value,setValue]=(0,import_react111.useState)(props.history);return(0,import_react111.useEffect)(()=>{!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?(0,import_jsx_runtime169.jsxs)(import_core242.Table,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[(0,import_jsx_runtime169.jsx)(import_core242.Table.Thead,{children:(0,import_jsx_runtime169.jsxs)(import_core242.Table.Tr,{children:[(0,import_jsx_runtime169.jsx)(import_core242.Table.Th,{children:"Author"}),(0,import_jsx_runtime169.jsx)(import_core242.Table.Th,{children:"Date"}),(0,import_jsx_runtime169.jsx)(import_core242.Table.Th,{children:"Version"})]})}),(0,import_jsx_runtime169.jsx)(import_core242.Table.Tbody,{children:value.entry?.map((entry,index)=>(0,import_jsx_runtime169.jsx)(HistoryRow,{entry},"entry-"+index))})]}):(0,import_jsx_runtime169.jsx)("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?(0,import_jsx_runtime169.jsxs)(import_core242.Table.Tr,{children:[(0,import_jsx_runtime169.jsx)(import_core242.Table.Td,{children:(0,import_jsx_runtime169.jsx)(ResourceBadge,{value:resource.meta?.author,link:!0})}),(0,import_jsx_runtime169.jsx)(import_core242.Table.Td,{children:(0,import_core243.formatDateTime)(resource.meta?.lastUpdated)}),(0,import_jsx_runtime169.jsx)(import_core242.Table.Td,{children:(0,import_jsx_runtime169.jsx)(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):(0,import_jsx_runtime169.jsx)(import_core242.Table.Tr,{children:(0,import_jsx_runtime169.jsx)(import_core242.Table.Td,{colSpan:3,children:(0,import_core243.normalizeErrorString)(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}var import_core244=require("@mantine/core"),import_notifications13=require("@mantine/notifications"),import_core245=require("@medplum/core"),import_react_hooks73=require("@medplum/react-hooks"),import_react112=require("react");var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};var import_jsx_runtime170=require("react/jsx-runtime");function onlyPractitioner(schedule){let refs=schedule.actor.filter(ref=>(0,import_core245.isReference)(ref,"Practitioner"));if(refs.length===1)return refs[0]}function Scheduler(props){let medplum=(0,import_react_hooks73.useMedplum)(),[month,setMonth]=(0,import_react112.useState)(getStartMonth()),[date,setDate]=(0,import_react112.useState)(),[actor,setActor]=(0,import_react112.useState)(),[slots,setSlots]=(0,import_react112.useState)(),[selectedSlot,setSelectedSlot]=(0,import_react112.useState)(),handleSelectSlot=slot=>{setSelectedSlot(slot),props.onSelectSlot?.(slot)};(0,import_react112.useEffect)(()=>{props.schedule||setSlots([]),(props.fetchSlots??(async period=>{let scheduleArray=[];if(!Array.isArray(props.schedule))scheduleArray.push((0,import_core245.isReference)(props.schedule,"Schedule")?props.schedule.reference:(0,import_core245.getReferenceString)(props.schedule));else for(let schedule of props.schedule)if((0,import_core245.isReference)(schedule))scheduleArray.push(schedule.reference);else{let scheduleRef=(0,import_core245.getReferenceString)(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)}))({start:getStart2(month),end:getEnd2(month)}).then(setSlots).catch(console.error)},[medplum,props.schedule,props.fetchSlots,month]),(0,import_react112.useEffect)(()=>{props.schedule&&!Array.isArray(props.schedule)&&((0,import_core245.isResource)(props.schedule)?setActor(onlyPractitioner(props.schedule)):medplum.readReference(props.schedule).then(schedule=>setActor(onlyPractitioner(schedule))).catch(error=>{(0,import_notifications13.showNotification)({color:"red",title:"Error",message:(0,import_core245.normalizeErrorString)(error)})}))},[medplum,props.schedule]);let startTimeToSlotMap=(0,import_react112.useMemo)(()=>{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?(0,import_jsx_runtime170.jsxs)("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[(0,import_jsx_runtime170.jsxs)("div",{className:Scheduler_default.info,children:[actor&&(0,import_jsx_runtime170.jsx)(ResourceAvatar,{value:actor,size:"xl"}),actor&&(0,import_jsx_runtime170.jsx)(import_core244.Text,{size:"xl",fw:500,children:(0,import_jsx_runtime170.jsx)(ResourceName,{value:actor})}),(0,import_jsx_runtime170.jsx)("p",{children:"1 hour"}),date&&(0,import_jsx_runtime170.jsx)("p",{children:date.toLocaleDateString()}),selectedSlot&&(0,import_jsx_runtime170.jsx)("p",{children:formatTime(new Date(selectedSlot.start))})]}),(0,import_jsx_runtime170.jsxs)("div",{className:Scheduler_default.selection,children:[!date&&(0,import_jsx_runtime170.jsxs)("div",{children:[(0,import_jsx_runtime170.jsx)("h3",{children:"Select date"}),(0,import_jsx_runtime170.jsx)(CalendarInput,{slots,onChangeMonth:setMonth,onClick:setDate})]}),date&&!selectedSlot&&(0,import_jsx_runtime170.jsxs)("div",{children:[(0,import_jsx_runtime170.jsx)("h3",{children:"Select time"}),(0,import_jsx_runtime170.jsx)(import_core244.Stack,{children:Array.from(startTimeToSlotMap?.entries()??[]).map(([startTime,slot])=>(0,import_jsx_runtime170.jsx)("div",{children:(0,import_jsx_runtime170.jsx)(import_core244.Button,{variant:"outline",style:{width:150},onClick:()=>handleSelectSlot(slot),children:startTime})},slot.id))})]}),props.children]})]}):(0,import_jsx_runtime170.jsx)("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:(0,import_jsx_runtime170.jsx)(import_core244.Loader,{})})}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"})}var import_core246=require("@medplum/core");var import_jsx_runtime171=require("react/jsx-runtime");function ServiceRequestTimeline(props){let{serviceRequest,...rest}=props;return(0,import_jsx_runtime171.jsx)(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:[(0,import_core246.createReference)(resource)],subject:resource.subject,sender:(0,import_core246.createReference)(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[(0,import_core246.createReference)(resource)],subject:resource.subject,operator:(0,import_core246.createReference)(operator),issued:new Date().toISOString(),content}),...rest})}var import_core247=require("@mantine/core"),import_notifications14=require("@mantine/notifications"),import_core248=require("@medplum/core"),import_react_hooks74=require("@medplum/react-hooks"),import_jsx_runtime172=require("react/jsx-runtime");function SmartAppLaunchLink(props){let medplum=(0,import_react_hooks74.useMedplum)(),{client,patient,encounter,children,...rest}=props,patientResource=(0,import_react_hooks74.useResource)(patient),encounterResource=(0,import_react_hooks74.useResource)(encounter);function launchApp(){let patientRef=patient,encounterRef=encounter;if(client.launchIdentifierSystems?.length){let patientIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Patient");if(patientRef&&patientResource&&patientIdentifierConfig?.system){let identifier=patientResource.identifier?.find(i=>i.system===patientIdentifierConfig.system);identifier&&(patientRef={...patient,identifier})}let encounterIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Encounter");if(encounterRef&&encounterResource&&encounterIdentifierConfig?.system){let identifier=encounterResource.identifier?.find(i=>i.system===encounterIdentifierConfig.system);identifier&&(encounterRef={...encounter,identifier})}}medplum.createResource({resourceType:"SmartAppLaunch",patient:patientRef,encounter:encounterRef,fhirContext:props.fhirContext}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",(0,import_core248.ensureTrailingSlash)(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),window.open(url.toString(),"_blank")}).catch(err=>(0,import_notifications14.showNotification)({color:"red",message:(0,import_core248.normalizeErrorString)(err),autoClose:!1}))}return(0,import_jsx_runtime172.jsx)(import_core247.Anchor,{onClick:()=>launchApp(),...rest,children})}
112
112
  /*! Bundled license information: