UNPKG

@medplum/react

Version:

Medplum React Component Library

203 lines 541 kB
var __defProp=Object.defineProperty;var __defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value;var __publicField=(obj,key,value)=>__defNormalProp(obj,typeof key!="symbol"?key+"":key,value);export*from"@medplum/react-hooks";import{formatAddress}from"@medplum/core";import{Fragment,jsx}from"react/jsx-runtime";function AddressDisplay(props){let address=props.value;return address?jsx(Fragment,{children:formatAddress(address,props.options)}):null}import{Group,NativeSelect,TextInput}from"@mantine/core";import{trimTrailingEmptyElements}from"@medplum/core";import{useContext,useMemo,useState}from"react";import{isPopulated}from"@medplum/core";import{createContext}from"react";var DEFAULT_IGNORED_PROPERTIES=["meta","implicitRules","contained","extension","modifierExtension"],DEFAULT_IGNORED_NON_NESTED_PROPERTIES=["language","text"];var ElementsContext=createContext({path:"",profileUrl:void 0,elements:Object.create(null),elementsByPath:Object.create(null),getExtendedProps:()=>({readonly:!1,hidden:!1}),accessPolicyResource:void 0,debugMode:!1,isDefaultContext:!0});ElementsContext.displayName="ElementsContext";var EXTENSION_KEYS=["extension","modifierExtension"],IGNORED_PROPERTIES=["id",...DEFAULT_IGNORED_PROPERTIES].filter(prop=>!EXTENSION_KEYS.includes(prop));function getElementsToRender(inputElements){return Object.entries(inputElements).filter(([key,element])=>!isPopulated(element.type)||element.max===0||element.path.toLowerCase().endsWith("extension.url")&&element.fixed||EXTENSION_KEYS.includes(key)&&!isPopulated(element.slicing?.slices)||IGNORED_PROPERTIES.includes(key)?!1:!(DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key)&&element.path.split(".").length===2||key.includes(".")))}import{jsx as jsx2,jsxs}from"react/jsx-runtime";function getLine(address,index){return address.line&&address.line.length>index?address.line[index]:""}function setLine(address,index,str){let line=address.line||[];for(;line.length<=index;)line.push("");return line[index]=str,{...address,line:trimTrailingEmptyElements(line)}}function AddressInput(props){let[value,setValue]=useState(props.defaultValue||{}),{getExtendedProps}=useContext(ElementsContext),[useProps,typeProps,line1Props,line2Props,cityProps,stateProps,postalCodeProps]=useMemo(()=>["use","type","line1","line2","city","state","postalCode"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(prevValue=>({...prevValue,...newValue})),props.onChange&&props.onChange({...value,...newValue})}function setUse(use){setValueWrapper({use})}function setType(type){setValueWrapper({type})}function setLine1(line1){setValueWrapper(setLine(value,0,line1))}function setLine2(line2){setValueWrapper(setLine(value,1,line2))}function setCity(city){setValueWrapper({city})}function setState(state){setValueWrapper({state})}function setPostalCode(postalCode){setValueWrapper({postalCode})}return jsxs(Group,{gap:"xs",wrap:"nowrap",grow:!0,children:[jsx2(NativeSelect,{disabled:props.disabled||useProps?.readonly,"data-testid":"address-use",defaultValue:value.use,onChange:e=>setUse(e.currentTarget.value),data:["","home","work","temp","old","billing"]}),jsx2(NativeSelect,{disabled:props.disabled||typeProps?.readonly,"data-testid":"address-type",defaultValue:value.type,onChange:e=>setType(e.currentTarget.value),data:["","postal","physical","both"]}),jsx2(TextInput,{disabled:props.disabled||line1Props?.readonly,placeholder:"Line 1",defaultValue:getLine(value,0),onChange:e=>setLine1(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||line2Props?.readonly,placeholder:"Line 2",defaultValue:getLine(value,1),onChange:e=>setLine2(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||cityProps?.readonly,placeholder:"City",defaultValue:value.city,onChange:e=>setCity(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||stateProps?.readonly,placeholder:"State",defaultValue:value.state,onChange:e=>setState(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||postalCodeProps?.readonly,placeholder:"Postal Code",defaultValue:value.postalCode,onChange:e=>setPostalCode(e.currentTarget.value)})]})}import{TextInput as TextInput2}from"@mantine/core";import{createReference}from"@medplum/core";import{useMedplumProfile}from"@medplum/react-hooks";import{useState as useState2}from"react";import{jsx as jsx3}from"react/jsx-runtime";function AnnotationInput(props){let author=useMedplumProfile(),[value,setValue]=useState2(props.defaultValue||{});function setText(text){let newValue=text?{text,authorReference:author&&createReference(author),time:new Date().toISOString()}:{};setValue(newValue),props.onChange&&props.onChange(newValue)}return jsx3(TextInput2,{disabled:props.disabled,name:props.name,placeholder:"Annotation text",defaultValue:value.text,onChange:e=>setText(e.currentTarget.value)})}import{AppShell as MantineAppShell3}from"@mantine/core";import{useMedplum as useMedplum7,useMedplumProfile as useMedplumProfile4}from"@medplum/react-hooks";import{Suspense,useState as useState12}from"react";import{Alert}from"@mantine/core";import{locationUtils,normalizeErrorString}from"@medplum/core";import{forwardRef,createElement}from"react";var defaultAttributes={outline:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},filled:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"currentColor",stroke:"none"}};var createReactComponent=(type,iconName,iconNamePascal,iconNode)=>{let Component2=forwardRef(({color="currentColor",size=24,stroke=2,title,className,children,...rest},ref)=>createElement("svg",{ref,...defaultAttributes[type],width:size,height:size,className:["tabler-icon",`tabler-icon-${iconName}`,className].join(" "),...type==="filled"?{fill:color}:{strokeWidth:stroke,stroke:color},...rest},[title&&createElement("title",{key:"svg-title"},title),...iconNode.map(([tag,attrs])=>createElement(tag,attrs)),...Array.isArray(children)?children:[children]]));return Component2.displayName=`${iconNamePascal}`,Component2};var __iconNode=[["path",{d:"M12 6a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-0"}],["path",{d:"M4 6l8 0",key:"svg-1"}],["path",{d:"M16 6l4 0",key:"svg-2"}],["path",{d:"M6 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-3"}],["path",{d:"M4 12l2 0",key:"svg-4"}],["path",{d:"M10 12l10 0",key:"svg-5"}],["path",{d:"M15 18a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-6"}],["path",{d:"M4 18l11 0",key:"svg-7"}],["path",{d:"M19 18l1 0",key:"svg-8"}]],IconAdjustmentsHorizontal=createReactComponent("outline","adjustments-horizontal","AdjustmentsHorizontal",__iconNode);var __iconNode2=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M12 8v4",key:"svg-1"}],["path",{d:"M12 16h.01",key:"svg-2"}]],IconAlertCircle=createReactComponent("outline","alert-circle","AlertCircle",__iconNode2);var __iconNode3=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M18 13l-6 6",key:"svg-1"}],["path",{d:"M6 13l6 6",key:"svg-2"}]],IconArrowDown=createReactComponent("outline","arrow-down","ArrowDown",__iconNode3);var __iconNode4=[["path",{d:"M5 12l14 0",key:"svg-0"}],["path",{d:"M13 18l6 -6",key:"svg-1"}],["path",{d:"M13 6l6 6",key:"svg-2"}]],IconArrowRight=createReactComponent("outline","arrow-right","ArrowRight",__iconNode4);var __iconNode5=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M18 11l-6 -6",key:"svg-1"}],["path",{d:"M6 11l6 -6",key:"svg-2"}]],IconArrowUp=createReactComponent("outline","arrow-up","ArrowUp",__iconNode5);var __iconNode6=[["path",{d:"M6 20a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-0"}],["path",{d:"M16 4a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-1"}],["path",{d:"M16 20a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-2"}],["path",{d:"M11 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-3"}],["path",{d:"M21 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-4"}],["path",{d:"M5.058 18.306l2.88 -4.606",key:"svg-5"}],["path",{d:"M10.061 10.303l2.877 -4.604",key:"svg-6"}],["path",{d:"M10.065 13.705l2.876 4.6",key:"svg-7"}],["path",{d:"M15.063 5.7l2.881 4.61",key:"svg-8"}]],IconBinaryTree=createReactComponent("outline","binary-tree","BinaryTree",__iconNode6);var __iconNode7=[["path",{d:"M5 19h14m1.986 -1.977a2 2 0 0 0 -.146 -.773l-7.1 -12.25a2 2 0 0 0 -3.5 0l-.815 1.405m-1.488 2.568l-4.797 8.277a2 2 0 0 0 1.75 2.75",key:"svg-0"}],["path",{d:"M3 3l18 18",key:"svg-1"}]],IconBleachOff=createReactComponent("outline","bleach-off","BleachOff",__iconNode7);var __iconNode8=[["path",{d:"M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75",key:"svg-0"}]],IconBleach=createReactComponent("outline","bleach","Bleach",__iconNode8);var __iconNode9=[["path",{d:"M18 7v14l-6 -4l-6 4v-14a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4",key:"svg-0"}]],IconBookmark=createReactComponent("outline","bookmark","Bookmark",__iconNode9);var __iconNode10=[["path",{d:"M7 5a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2l0 -10",key:"svg-0"}],["path",{d:"M17 17v2a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2",key:"svg-1"}]],IconBoxMultiple=createReactComponent("outline","box-multiple","BoxMultiple",__iconNode10);var __iconNode11=[["path",{d:"M7 4h-4v16h4",key:"svg-0"}],["path",{d:"M17 4h4v16h-4",key:"svg-1"}],["path",{d:"M8 16h.01",key:"svg-2"}],["path",{d:"M12 16h.01",key:"svg-3"}],["path",{d:"M16 16h.01",key:"svg-4"}]],IconBracketsContain=createReactComponent("outline","brackets-contain","BracketsContain",__iconNode11);var __iconNode12=[["path",{d:"M3 9a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v9a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2l0 -9",key:"svg-0"}],["path",{d:"M8 7v-2a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v2",key:"svg-1"}],["path",{d:"M12 12l0 .01",key:"svg-2"}],["path",{d:"M3 13a20 20 0 0 0 18 0",key:"svg-3"}]],IconBriefcase=createReactComponent("outline","briefcase","Briefcase",__iconNode12);var __iconNode13=[["path",{d:"M5.029 5.036c-.655 .58 -1.029 1.25 -1.029 1.964c0 2.033 3.033 3.712 6.96 3.967m3.788 -.21c3.064 -.559 5.252 -2.029 5.252 -3.757c0 -2.21 -3.582 -4 -8 -4c-1.605 0 -3.1 .236 -4.352 .643",key:"svg-0"}],["path",{d:"M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.1 -.3 .252 -.812 .457 -1.535m.862 -3.146c.262 -.975 .735 -2.76 1.418 -5.354a7.45 7.45 0 0 0 .263 -1.965",key:"svg-1"}],["path",{d:"M3 3l18 18",key:"svg-2"}]],IconBucketOff=createReactComponent("outline","bucket-off","BucketOff",__iconNode13);var __iconNode14=[["path",{d:"M4 7a8 4 0 1 0 16 0a8 4 0 1 0 -16 0",key:"svg-0"}],["path",{d:"M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.333 -1 1.246 -4.345 2.737 -10.035a7.45 7.45 0 0 0 .263 -1.965",key:"svg-1"}]],IconBucket=createReactComponent("outline","bucket","Bucket",__iconNode14);var __iconNode15=[["path",{d:"M3 20h18v-8a3 3 0 0 0 -3 -3h-12a3 3 0 0 0 -3 3v8",key:"svg-0"}],["path",{d:"M3 14.803c.312 .135 .654 .204 1 .197a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1c.35 .007 .692 -.062 1 -.197",key:"svg-1"}],["path",{d:"M12 4l1.465 1.638a2 2 0 1 1 -3.015 .099l1.55 -1.737",key:"svg-2"}]],IconCake=createReactComponent("outline","cake","Cake",__iconNode15);var __iconNode16=[["path",{d:"M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12",key:"svg-0"}],["path",{d:"M16 3v4",key:"svg-1"}],["path",{d:"M8 3v4",key:"svg-2"}],["path",{d:"M4 11h16",key:"svg-3"}],["path",{d:"M11 15h1",key:"svg-4"}],["path",{d:"M12 15v3",key:"svg-5"}]],IconCalendar=createReactComponent("outline","calendar","Calendar",__iconNode16);var __iconNode17=[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]],IconCheck=createReactComponent("outline","check","Check",__iconNode17);var __iconNode18=[["path",{d:"M9 11l3 3l8 -8",key:"svg-0"}],["path",{d:"M20 12v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h9",key:"svg-1"}]],IconCheckbox=createReactComponent("outline","checkbox","Checkbox",__iconNode18);var __iconNode19=[["path",{d:"M6 9l6 6l6 -6",key:"svg-0"}]],IconChevronDown=createReactComponent("outline","chevron-down","ChevronDown",__iconNode19);var __iconNode20=[["path",{d:"M9 6l6 6l-6 6",key:"svg-0"}]],IconChevronRight=createReactComponent("outline","chevron-right","ChevronRight",__iconNode20);var __iconNode21=[["path",{d:"M6 15l6 -6l6 6",key:"svg-0"}]],IconChevronUp=createReactComponent("outline","chevron-up","ChevronUp",__iconNode21);var __iconNode22=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M9 12l6 0",key:"svg-1"}]],IconCircleMinus=createReactComponent("outline","circle-minus","CircleMinus",__iconNode22);var __iconNode23=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M9 12h6",key:"svg-1"}],["path",{d:"M12 9v6",key:"svg-2"}]],IconCirclePlus=createReactComponent("outline","circle-plus","CirclePlus",__iconNode23);var __iconNode24=[["path",{d:"M7 18a4.6 4.4 0 0 1 0 -9a5 4.5 0 0 1 11 2h1a3.5 3.5 0 0 1 0 7h-1",key:"svg-0"}],["path",{d:"M9 15l3 -3l3 3",key:"svg-1"}],["path",{d:"M12 12l0 9",key:"svg-2"}]],IconCloudUpload=createReactComponent("outline","cloud-upload","CloudUpload",__iconNode24);var __iconNode25=[["path",{d:"M4 6l5.5 0",key:"svg-0"}],["path",{d:"M4 10l5.5 0",key:"svg-1"}],["path",{d:"M4 14l5.5 0",key:"svg-2"}],["path",{d:"M4 18l5.5 0",key:"svg-3"}],["path",{d:"M14.5 6l5.5 0",key:"svg-4"}],["path",{d:"M14.5 10l5.5 0",key:"svg-5"}],["path",{d:"M14.5 14l5.5 0",key:"svg-6"}],["path",{d:"M14.5 18l5.5 0",key:"svg-7"}]],IconColumns=createReactComponent("outline","columns","Columns",__iconNode25);var __iconNode26=[["path",{d:"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666",key:"svg-0"}],["path",{d:"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1",key:"svg-1"}]],IconCopy=createReactComponent("outline","copy","Copy",__iconNode26);var __iconNode27=[["path",{d:"M16.7 8a3 3 0 0 0 -2.7 -2h-4a3 3 0 0 0 0 6h4a3 3 0 0 1 0 6h-4a3 3 0 0 1 -2.7 -2",key:"svg-0"}],["path",{d:"M12 3v3m0 12v3",key:"svg-1"}]],IconCurrencyDollar=createReactComponent("outline","currency-dollar","CurrencyDollar",__iconNode27);var __iconNode28=[["path",{d:"M3 5a1 1 0 0 1 1 -1h16a1 1 0 0 1 1 1v10a1 1 0 0 1 -1 1h-16a1 1 0 0 1 -1 -1v-10",key:"svg-0"}],["path",{d:"M7 20h10",key:"svg-1"}],["path",{d:"M9 16v4",key:"svg-2"}],["path",{d:"M15 16v4",key:"svg-3"}]],IconDeviceDesktop=createReactComponent("outline","device-desktop","DeviceDesktop",__iconNode28);var __iconNode29=[["path",{d:"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}]],IconDots=createReactComponent("outline","dots","Dots",__iconNode29);var __iconNode30=[["path",{d:"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2",key:"svg-0"}],["path",{d:"M7 11l5 5l5 -5",key:"svg-1"}],["path",{d:"M12 4l0 12",key:"svg-2"}]],IconDownload=createReactComponent("outline","download","Download",__iconNode30);var __iconNode31=[["path",{d:"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1",key:"svg-0"}],["path",{d:"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]],IconEdit=createReactComponent("outline","edit","Edit",__iconNode31);var __iconNode32=[["path",{d:"M9.5 5.5a2.5 2.5 0 1 0 5 0a2.5 2.5 0 1 0 -5 0",key:"svg-0"}],["path",{d:"M12 21.368l5.095 -5.096a3.088 3.088 0 1 0 -4.367 -4.367l-.728 .727l-.728 -.727a3.088 3.088 0 1 0 -4.367 4.367l5.095 5.096",key:"svg-1"}]],IconEmpathize=createReactComponent("outline","empathize","Empathize",__iconNode32);var __iconNode33=[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}],["path",{d:"M5 19l14 -14",key:"svg-2"}]],IconEqualNot=createReactComponent("outline","equal-not","EqualNot",__iconNode33);var __iconNode34=[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}]],IconEqual=createReactComponent("outline","equal","Equal",__iconNode34);var __iconNode35=[["path",{d:"M10.585 10.587a2 2 0 0 0 2.829 2.828",key:"svg-0"}],["path",{d:"M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87",key:"svg-1"}],["path",{d:"M3 3l18 18",key:"svg-2"}]],IconEyeOff=createReactComponent("outline","eye-off","EyeOff",__iconNode35);var __iconNode36=[["path",{d:"M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-0"}],["path",{d:"M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6",key:"svg-1"}]],IconEye=createReactComponent("outline","eye","Eye",__iconNode36);var __iconNode37=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2",key:"svg-1"}],["path",{d:"M12 17l.01 0",key:"svg-2"}],["path",{d:"M12 11l0 3",key:"svg-3"}]],IconFileAlert=createReactComponent("outline","file-alert","FileAlert",__iconNode37);var __iconNode38=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M11.5 21h-4.5a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v5m-5 6h7m-3 -3l3 3l-3 3",key:"svg-1"}]],IconFileExport=createReactComponent("outline","file-export","FileExport",__iconNode38);var __iconNode39=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2",key:"svg-1"}],["path",{d:"M12 11l0 6",key:"svg-2"}],["path",{d:"M9 14l6 0",key:"svg-3"}]],IconFilePlus=createReactComponent("outline","file-plus","FilePlus",__iconNode39);var __iconNode40=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2",key:"svg-1"}],["path",{d:"M9 9l1 0",key:"svg-2"}],["path",{d:"M9 13l6 0",key:"svg-3"}],["path",{d:"M9 17l6 0",key:"svg-4"}]],IconFileText=createReactComponent("outline","file-text","FileText",__iconNode40);var __iconNode41=[["path",{d:"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227",key:"svg-0"}]],IconFilter=createReactComponent("outline","filter","Filter",__iconNode41);var __iconNode42=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M12 9h.01",key:"svg-1"}],["path",{d:"M11 12h1v4h1",key:"svg-2"}]],IconInfoCircle=createReactComponent("outline","info-circle","InfoCircle",__iconNode42);var __iconNode43=[["path",{d:"M9 6.371c0 4.418 -2.239 6.629 -5 6.629",key:"svg-0"}],["path",{d:"M4 6.371h7",key:"svg-1"}],["path",{d:"M5 9c0 2.144 2.252 3.908 6 4",key:"svg-2"}],["path",{d:"M12 20l4 -9l4 9",key:"svg-3"}],["path",{d:"M19.1 18h-6.2",key:"svg-4"}],["path",{d:"M6.694 3l.793 .582",key:"svg-5"}]],IconLanguage=createReactComponent("outline","language","Language",__iconNode43);var __iconNode44=[["path",{d:"M4 6a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12",key:"svg-0"}],["path",{d:"M9 4l0 16",key:"svg-1"}]],IconLayoutSidebar=createReactComponent("outline","layout-sidebar","LayoutSidebar",__iconNode44);var __iconNode45=[["path",{d:"M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2",key:"svg-0"}],["path",{d:"M9 12h12l-3 -3",key:"svg-1"}],["path",{d:"M18 15l3 -3",key:"svg-2"}]],IconLogout=createReactComponent("outline","logout","Logout",__iconNode45);var __iconNode46=[["path",{d:"M9 11a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-0"}],["path",{d:"M17.657 16.657l-4.243 4.243a2 2 0 0 1 -2.827 0l-4.244 -4.243a8 8 0 1 1 11.314 0",key:"svg-1"}]],IconMapPin=createReactComponent("outline","map-pin","MapPin",__iconNode46);var __iconNode47=[["path",{d:"M5 18l14 -6l-14 -6",key:"svg-0"}]],IconMathGreater=createReactComponent("outline","math-greater","MathGreater",__iconNode47);var __iconNode48=[["path",{d:"M19 18l-14 -6l14 -6",key:"svg-0"}]],IconMathLower=createReactComponent("outline","math-lower","MathLower",__iconNode48);var __iconNode49=[["path",{d:"M3 20l1.3 -3.9c-2.324 -3.437 -1.426 -7.872 2.1 -10.374c3.526 -2.501 8.59 -2.296 11.845 .48c3.255 2.777 3.695 7.266 1.029 10.501c-2.666 3.235 -7.615 4.215 -11.574 2.293l-4.7 1",key:"svg-0"}]],IconMessageCircle=createReactComponent("outline","message-circle","MessageCircle",__iconNode49);var __iconNode50=[["path",{d:"M8 9h8",key:"svg-0"}],["path",{d:"M8 13h6",key:"svg-1"}],["path",{d:"M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12",key:"svg-2"}]],IconMessage=createReactComponent("outline","message","Message",__iconNode50);var __iconNode51=[["path",{d:"M9 5a3 3 0 0 1 3 -3a3 3 0 0 1 3 3v5a3 3 0 0 1 -3 3a3 3 0 0 1 -3 -3l0 -5",key:"svg-0"}],["path",{d:"M5 10a7 7 0 0 0 14 0",key:"svg-1"}],["path",{d:"M8 21l8 0",key:"svg-2"}],["path",{d:"M12 17l0 4",key:"svg-3"}]],IconMicrophone=createReactComponent("outline","microphone","Microphone",__iconNode51);var __iconNode52=[["path",{d:"M5 12l14 0",key:"svg-0"}]],IconMinus=createReactComponent("outline","minus","Minus",__iconNode52);var __iconNode53=[["path",{d:"M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454l0 .008",key:"svg-0"}]],IconMoon=createReactComponent("outline","moon","Moon",__iconNode53);var __iconNode54=[["path",{d:"M12 21a9 9 0 0 1 0 -18c4.97 0 9 3.582 9 8c0 1.06 -.474 2.078 -1.318 2.828c-.844 .75 -1.989 1.172 -3.182 1.172h-2.5a2 2 0 0 0 -1 3.75a1.3 1.3 0 0 1 -1 2.25",key:"svg-0"}],["path",{d:"M7.5 10.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M11.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}],["path",{d:"M15.5 10.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-3"}]],IconPalette=createReactComponent("outline","palette","Palette",__iconNode54);var __iconNode55=[["path",{d:"M15 7l-6.5 6.5a1.5 1.5 0 0 0 3 3l6.5 -6.5a3 3 0 0 0 -6 -6l-6.5 6.5a4.5 4.5 0 0 0 9 9l6.5 -6.5",key:"svg-0"}]],IconPaperclip=createReactComponent("outline","paperclip","Paperclip",__iconNode55);var __iconNode56=[["path",{d:"M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4",key:"svg-0"}],["path",{d:"M13.5 6.5l4 4",key:"svg-1"}]],IconPencil=createReactComponent("outline","pencil","Pencil",__iconNode56);var __iconNode57=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]],IconPlus=createReactComponent("outline","plus","Plus",__iconNode57);var __iconNode58=[["path",{d:"M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4",key:"svg-0"}],["path",{d:"M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4",key:"svg-1"}]],IconRefresh=createReactComponent("outline","refresh","Refresh",__iconNode58);var __iconNode59=[["path",{d:"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]],IconSearch=createReactComponent("outline","search","Search",__iconNode59);var __iconNode60=[["path",{d:"M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065",key:"svg-0"}],["path",{d:"M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-1"}]],IconSettings=createReactComponent("outline","settings","Settings",__iconNode60);var __iconNode61=[["path",{d:"M4 6l7 0",key:"svg-0"}],["path",{d:"M4 12l7 0",key:"svg-1"}],["path",{d:"M4 18l9 0",key:"svg-2"}],["path",{d:"M15 9l3 -3l3 3",key:"svg-3"}],["path",{d:"M18 6l0 12",key:"svg-4"}]],IconSortAscending=createReactComponent("outline","sort-ascending","SortAscending",__iconNode61);var __iconNode62=[["path",{d:"M4 6l9 0",key:"svg-0"}],["path",{d:"M4 12l7 0",key:"svg-1"}],["path",{d:"M4 18l7 0",key:"svg-2"}],["path",{d:"M15 15l3 3l3 -3",key:"svg-3"}],["path",{d:"M18 6l0 12",key:"svg-4"}]],IconSortDescending=createReactComponent("outline","sort-descending","SortDescending",__iconNode62);var __iconNode63=[["path",{d:"M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14",key:"svg-0"}]],IconSquare=createReactComponent("outline","square","Square",__iconNode63);var __iconNode64=[["path",{d:"M6 4h-1a2 2 0 0 0 -2 2v3.5a5.5 5.5 0 0 0 11 0v-3.5a2 2 0 0 0 -2 -2h-1",key:"svg-0"}],["path",{d:"M8 15a6 6 0 1 0 12 0v-3",key:"svg-1"}],["path",{d:"M11 3v2",key:"svg-2"}],["path",{d:"M6 3v2",key:"svg-3"}],["path",{d:"M18 10a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-4"}]],IconStethoscope=createReactComponent("outline","stethoscope","Stethoscope",__iconNode64);var __iconNode65=[["path",{d:"M14.828 14.828a4 4 0 1 0 -5.656 -5.656a4 4 0 0 0 5.656 5.656",key:"svg-0"}],["path",{d:"M6.343 17.657l-1.414 1.414",key:"svg-1"}],["path",{d:"M6.343 6.343l-1.414 -1.414",key:"svg-2"}],["path",{d:"M17.657 6.343l1.414 -1.414",key:"svg-3"}],["path",{d:"M17.657 17.657l1.414 1.414",key:"svg-4"}],["path",{d:"M4 12h-2",key:"svg-5"}],["path",{d:"M12 4v-2",key:"svg-6"}],["path",{d:"M20 12h2",key:"svg-7"}],["path",{d:"M12 20v2",key:"svg-8"}]],IconSunHigh=createReactComponent("outline","sun-high","SunHigh",__iconNode65);var __iconNode66=[["path",{d:"M16 3l4 4l-4 4",key:"svg-0"}],["path",{d:"M10 7l10 0",key:"svg-1"}],["path",{d:"M8 13l-4 4l4 4",key:"svg-2"}],["path",{d:"M4 17l9 0",key:"svg-3"}]],IconSwitchHorizontal=createReactComponent("outline","switch-horizontal","SwitchHorizontal",__iconNode66);var __iconNode67=[["path",{d:"M12.5 21h-7.5a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v7.5",key:"svg-0"}],["path",{d:"M3 10h18",key:"svg-1"}],["path",{d:"M10 3v18",key:"svg-2"}],["path",{d:"M16 19h6",key:"svg-3"}],["path",{d:"M19 16l3 3l-3 3",key:"svg-4"}]],IconTableExport=createReactComponent("outline","table-export","TableExport",__iconNode67);var __iconNode68=[["path",{d:"M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14",key:"svg-0"}],["path",{d:"M3 10h18",key:"svg-1"}],["path",{d:"M10 3v18",key:"svg-2"}]],IconTable=createReactComponent("outline","table","Table",__iconNode68);var __iconNode69=[["path",{d:"M4 7l16 0",key:"svg-0"}],["path",{d:"M10 11l0 6",key:"svg-1"}],["path",{d:"M14 11l0 6",key:"svg-2"}],["path",{d:"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12",key:"svg-3"}],["path",{d:"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3",key:"svg-4"}]],IconTrash=createReactComponent("outline","trash","Trash",__iconNode69);var __iconNode70=[["path",{d:"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0",key:"svg-0"}],["path",{d:"M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2",key:"svg-1"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"svg-2"}],["path",{d:"M21 21v-2a4 4 0 0 0 -3 -3.85",key:"svg-3"}]],IconUsers=createReactComponent("outline","users","Users",__iconNode70);var __iconNode71=[["path",{d:"M18 6l-12 12",key:"svg-0"}],["path",{d:"M6 6l12 12",key:"svg-1"}]],IconX=createReactComponent("outline","x","X",__iconNode71);var __iconNode72=[["path",{d:"M7 3.34a10 10 0 1 1 -4.995 8.984l-.005 -.324l.005 -.324a10 10 0 0 1 4.995 -8.336z",key:"svg-0"}]],IconCircleFilled=createReactComponent("filled","circle-filled","CircleFilled",__iconNode72);import{Component}from"react";import{jsx as jsx4}from"react/jsx-runtime";var ErrorBoundary=class extends Component{constructor(props){super(props);__publicField(this,"state");this.state={lastLocation:locationUtils.getLocation()}}static getDerivedStateFromError(error){return{error,lastLocation:locationUtils.getLocation()}}componentDidUpdate(_prevProps,_prevState){locationUtils.getLocation()!==this.state.lastLocation&&this.setState({lastLocation:locationUtils.getLocation(),error:void 0})}shouldComponentUpdate(nextProps,nextState){return!!(this.props.children!==nextProps.children||nextState.error&&!this.state.error||this.state.lastLocation!==locationUtils.getLocation())}componentDidCatch(error,errorInfo){console.error("Uncaught error:",error,errorInfo)}render(){return this.state.error?jsx4(Alert,{icon:jsx4(IconAlertCircle,{size:16}),title:"Something went wrong",color:"red",children:normalizeErrorString(this.state.error)}):this.props.children}};import{Center,Loader}from"@mantine/core";import{jsx as jsx5}from"react/jsx-runtime";function Loading(){return jsx5(Center,{style:{width:"100%",height:"100vh"},children:jsx5(Loader,{})})}import{Box,CloseButton,Group as Group2,Text}from"@mantine/core";var AppShell_default={main:"AppShell_main",announcement:"AppShell_announcement"};import{Fragment as Fragment2,jsx as jsx6,jsxs as jsxs2}from"react/jsx-runtime";function AnnouncementBanners(props){return jsx6(Fragment2,{children:props.announcements.map((announcement,index)=>jsx6(Box,{className:AppShell_default.announcement,style:{backgroundColor:`var(--mantine-color-${announcement.color??"yellow"}-light)`,color:`var(--mantine-color-${announcement.color??"yellow"}-light-color)`},role:announcement.role??"status",children:jsxs2(Group2,{gap:"xs",wrap:"nowrap",h:"100%",px:"md",children:[announcement.icon,jsx6(Text,{size:"sm",fw:500,truncate:!0,children:announcement.message}),announcement.dismissible&&jsx6(CloseButton,{size:"sm",variant:"subtle","aria-label":"Dismiss announcement",onClick:()=>props.onDismiss(announcement),ml:"auto"})]})},announcement.id??index))})}import{Box as Box4,Group as Group6,AppShell as MantineAppShell,Menu as Menu2,Stack,Text as Text5,UnstyledButton}from"@mantine/core";import{formatHumanName as formatHumanName3}from"@medplum/core";import{useMedplum as useMedplum2,useMedplumProfile as useMedplumProfile2}from"@medplum/react-hooks";import{useState as useState5}from"react";import{Avatar}from"@mantine/core";import{getDisplayString,getImageSrc}from"@medplum/core";import{useCachedBinaryUrl,useResource}from"@medplum/react-hooks";import{Anchor}from"@mantine/core";import{isReference,isResource}from"@medplum/core";import{useMedplumNavigate}from"@medplum/react-hooks";import{ContentType}from"@medplum/core";function killEvent(e){e.preventDefault(),e.stopPropagation()}function isAuxClick(e){return e.button===1||e.ctrlKey||e.metaKey}function isCheckboxCell(el){if(isCheckboxElement(el))return!0;if(el instanceof HTMLTableCellElement){let children=el.children;if(children.length===1&&isCheckboxElement(children[0]))return!0}return!1}function isCheckboxElement(el){return el instanceof HTMLInputElement&&el.type==="checkbox"}async function sendCommand(frame,command){return new Promise((resolve,reject)=>{let channel=new MessageChannel;channel.port1.onmessage=({data:data2})=>{channel.port1.close(),data2.error?reject(data2.error):resolve(data2.result)},frame.contentWindow?.postMessage(command,new URL(frame.src).origin,[channel.port2])})}function exportJsonFile(jsonString,fileName){let blobForExport=new Blob([jsonString],{type:ContentType.JSON}),url=URL.createObjectURL(blobForExport),link=document.createElement("a");link.href=url;let linkName=fileName??new Date().toISOString().replaceAll(/\D/g,"");link.download=`${linkName}.json`,document.body.appendChild(link),link.click(),URL.revokeObjectURL(url)}import{jsx as jsx7}from"react/jsx-runtime";function MedplumLink(props){let navigate=useMedplumNavigate(),{to,suffix,label,onClick,children,...rest}=props,href=getHref(to);return suffix&&(href+="/"+suffix),jsx7(Anchor,{href,"aria-label":label,onAuxClick:e=>{e.stopPropagation()},onClick:e=>{e.stopPropagation(),onClick?(e.preventDefault(),onClick(e)):to&&(isAuxClick(e)||(e.preventDefault(),navigate(href)))},...rest,children})}function getHref(to){if(to){if(typeof to=="string")return getStringHref(to);if(isResource(to))return getResourceHref(to);if(isReference(to))return getReferenceHref(to)}return"#"}function getStringHref(to){return to.startsWith("http://")||to.startsWith("https://")||to.startsWith("/")?to:"/"+to}function getResourceHref(to){return`/${to.resourceType}/${to.id}`}function getReferenceHref(to){return`/${to.reference}`}function getInitials(input){let words=input.split(" ").filter(Boolean);return words.length>1?words[0][0]+words.at(-1)?.at(0):words.length===1?words[0][0]:""}import{jsx as jsx8}from"react/jsx-runtime";function ResourceAvatar(props){let resource=useResource(props.value),text=resource?getDisplayString(resource):props.alt??"",initials=getInitials(text),uncachedImageUrl=(resource&&getImageSrc(resource))??props.src,imageUrl=useCachedBinaryUrl(uncachedImageUrl??void 0),radius=props.radius??"xl",avatarProps={...props,value:void 0,link:void 0};return props.link?jsx8(MedplumLink,{to:resource,children:jsx8(Avatar,{src:imageUrl,alt:text,radius,...avatarProps,children:initials})}):jsx8(Avatar,{src:imageUrl,alt:text,radius,...avatarProps,children:initials})}var Header_default={logoButton:"Header_logoButton",user:"Header_user",userInfo:"Header_userInfo",userName:"Header_userName",userProject:"Header_userProject"};import{Box as Box3,Divider,Flex,Menu,SegmentedControl,Text as Text3,useMantineColorScheme}from"@mantine/core";import{formatHumanName,getReferenceString,locationUtils as locationUtils2}from"@medplum/core";import{useMedplumContext}from"@medplum/react-hooks";function r(e){var t,f,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f)}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}var clsx_default=clsx;import{useState as useState3}from"react";import{Box as Box2,Group as Group3,Text as Text2}from"@mantine/core";var ProjectLoginOption_default={iconBox:"ProjectLoginOption_iconBox",subtitle:"ProjectLoginOption_subtitle",interactive:"ProjectLoginOption_interactive"};import{jsx as jsx9,jsxs as jsxs3}from"react/jsx-runtime";function ProjectLoginOption(props){let{projectDisplay,profileDisplay,label,selected}=props,projectTitle=label?`${projectDisplay} - ${label}`:projectDisplay;return jsxs3(Group3,{gap:"xs",align:"center",wrap:"nowrap",style:{width:"100%",minWidth:0},children:[jsx9(Box2,{className:ProjectLoginOption_default.iconBox,children:jsx9(IconBriefcase,{size:16,stroke:2})}),jsxs3("div",{style:{flex:1,minWidth:0},children:[jsx9(Text2,{size:"sm",fw:500,truncate:!0,children:projectTitle}),jsx9(Text2,{size:"xs",className:ProjectLoginOption_default.subtitle,truncate:!0,children:profileDisplay})]}),selected&&jsx9(IconCheck,{size:16,stroke:2,color:"var(--mantine-color-blue-6)"})]})}function ProjectMembershipLoginOption(props){let{membership,label}=props;return jsx9(ProjectLoginOption,{projectDisplay:membership.project?.display,profileDisplay:membership.profile?.display,label})}function getAppName(){return import.meta.env.MEDPLUM_APP_NAME||"Medplum"}var HeaderDropdown_default={divider:"HeaderDropdown_divider",accountSection:"HeaderDropdown_accountSection",projectOption:"HeaderDropdown_projectOption",recentProjectItem:"HeaderDropdown_recentProjectItem",dropdown:"HeaderDropdown_dropdown",settingsRow:"HeaderDropdown_settingsRow",settingsControlWrapper:"HeaderDropdown_settingsControlWrapper",segmentedControl:"HeaderDropdown_segmentedControl",appearanceControl:"HeaderDropdown_appearanceControl",layoutControl:"HeaderDropdown_layoutControl"};import{Fragment as Fragment3,jsx as jsx10,jsxs as jsxs4}from"react/jsx-runtime";var MENU_ICON_COLOR="var(--mantine-color-dimmed)",THEME_OPTIONS=[{value:"light",label:jsx10(ThemeOptionLabel,{Icon:IconSunHigh,label:"Light"})},{value:"auto",label:jsx10(ThemeOptionLabel,{Icon:IconDeviceDesktop,label:"System"})},{value:"dark",label:jsx10(ThemeOptionLabel,{Icon:IconMoon,label:"Dark"})}],LAYOUT_OPTIONS=[{label:"v1",value:"v1"},{label:"v2",value:"v2"}];function ThemeOptionLabel({Icon,label}){return jsx10("span",{"aria-label":label,style:{display:"flex"},children:jsx10(Icon,{size:16,color:MENU_ICON_COLOR,"aria-hidden":!0})})}function HeaderDropdownDivider(){return jsx10(Divider,{my:4,mx:4,className:HeaderDropdown_default.divider})}function isSameLogin(a,b){return b?a.project.reference===b.project.reference&&a.profile.reference===b.profile.reference:!1}function getLoginKey(login){return`${login.project.reference}-${login.profile.reference}`}function HeaderDropdown(props){let context=useMedplumContext(),{medplum,profile,navigate}=context,activeLogin=medplum.getActiveLogin(),recentLogins=medplum.getLogins().filter(login=>!isSameLogin(login,activeLogin)),project=medplum.getProject(),{colorScheme,setColorScheme}=useMantineColorScheme(),[layoutVersion]=useState3(()=>localStorage.appShellLayoutVersion??"v1"),showLayoutToggle=props.showLayoutVersionToggle??!0,projectDisplay=project?.name??medplum.getActiveLogin()?.project.display,profileDisplay=activeLogin?.profile.display??(profile?formatHumanName(profile.name?.[0]):void 0);function switchLogin(login){medplum.setActiveLogin(login).then(()=>locationUtils2.reload()).catch(console.error)}return jsxs4(Fragment3,{children:[jsx10(Box3,{className:HeaderDropdown_default.accountSection,children:jsx10(Box3,{className:HeaderDropdown_default.projectOption,children:jsx10(ProjectLoginOption,{projectDisplay,profileDisplay,selected:!0})})}),recentLogins.length>0&&jsxs4(Fragment3,{children:[jsx10(HeaderDropdownDivider,{}),recentLogins.map(login=>jsx10(Menu.Item,{className:HeaderDropdown_default.recentProjectItem,onClick:()=>switchLogin(login),children:jsx10(Box3,{className:HeaderDropdown_default.projectOption,children:jsx10(ProjectLoginOption,{projectDisplay:login.project.display,profileDisplay:login.profile.display})})},getLoginKey(login)))]}),jsx10(HeaderDropdownDivider,{}),jsx10(Menu.Item,{leftSection:jsx10(IconSwitchHorizontal,{size:16,color:MENU_ICON_COLOR}),onClick:()=>navigate("/signin"),children:jsx10(Text3,{size:"sm",children:"Switch to another project"})}),jsx10(Menu.Item,{leftSection:jsx10(IconSettings,{size:16,color:MENU_ICON_COLOR}),onClick:()=>navigate(`/${getReferenceString(profile)}`),children:jsx10(Text3,{size:"sm",children:"Account settings"})}),jsxs4(Flex,{className:HeaderDropdown_default.settingsRow,align:"center",pl:"sm",pr:"xs",py:"xs",children:[jsxs4(Flex,{align:"center",gap:"xs",children:[jsx10(IconPalette,{size:16,color:MENU_ICON_COLOR}),jsx10(Text3,{size:"sm",children:"Appearance"})]}),jsx10(Box3,{className:HeaderDropdown_default.settingsControlWrapper,children:jsx10(SegmentedControl,{classNames:{root:clsx_default(HeaderDropdown_default.segmentedControl,HeaderDropdown_default.appearanceControl)},size:"xs",radius:"xl",withItemsBorders:!1,value:colorScheme,onChange:newValue=>setColorScheme(newValue),data:THEME_OPTIONS,"aria-label":"Color scheme"})})]}),showLayoutToggle&&jsxs4(Flex,{className:HeaderDropdown_default.settingsRow,align:"center",pl:"sm",pr:"xs",py:"xs",children:[jsxs4(Flex,{align:"center",gap:"xs",children:[jsx10(IconTable,{size:16,color:MENU_ICON_COLOR}),jsx10(Text3,{size:"sm",children:"Layout"})]}),jsx10(Box3,{className:HeaderDropdown_default.settingsControlWrapper,children:jsx10(SegmentedControl,{classNames:{root:clsx_default(HeaderDropdown_default.segmentedControl,HeaderDropdown_default.layoutControl)},size:"xs",radius:"xl",withItemsBorders:!1,value:layoutVersion,onChange:newValue=>{localStorage.appShellLayoutVersion=newValue,locationUtils2.reload()},data:LAYOUT_OPTIONS,"aria-label":"App shell layout version"})})]}),jsx10(Menu.Item,{leftSection:jsx10(IconLogout,{size:16,color:MENU_ICON_COLOR}),onClick:async()=>{await medplum.signOut(),navigate("/signin")},children:jsx10(Text3,{size:"sm",children:"Sign out"})}),jsx10(HeaderDropdownDivider,{}),jsxs4(Text3,{size:"xs",c:"dimmed",fw:500,my:"sm",ta:"center",children:[getAppName()," ",props.version]})]})}import{Group as Group5,Text as Text4}from"@mantine/core";import{formatHumanName as formatHumanName2,getDisplayString as getDisplayString2,getReferenceString as getReferenceString2,isUUID}from"@medplum/core";import{useMedplum,useMedplumNavigate as useMedplumNavigate2}from"@medplum/react-hooks";import{forwardRef as forwardRef2,useCallback as useCallback2}from"react";import{Combobox,Group as Group4,Loader as Loader2,Pill,PillsInput,ScrollAreaAutosize,useCombobox}from"@mantine/core";import{showNotification}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString2}from"@medplum/core";import{useCallback,useEffect,useLayoutEffect,useMemo as useMemo2,useRef,useState as useState4}from"react";var AsyncAutocompleteTestIds={selectedItems:"selected-items",options:"options"};import{jsx as jsx11,jsxs as jsxs5}from"react/jsx-runtime";function AsyncAutocomplete(props){let combobox=useCombobox({onDropdownClose:()=>combobox.resetSelectedOption(),onDropdownOpen:()=>combobox.updateSelectedOptionIndex("active")}),{name,label,description,error,defaultValue:defaultValue2,toOption:toOption4,loadOptions,itemComponent,pillComponent,emptyComponent,onChange,onCreate,creatable,clearable,required,placeholder,leftSection,maxValues,optionsDropdownMaxHeight=320,minInputLength=0,...rest}=props,disabled=rest.disabled,defaultItems=toDefaultItems(defaultValue2),[search,setSearch]=useState4(""),[timer,setTimer]=useState4(),[abortController,setAbortController]=useState4(),[autoSubmit,setAutoSubmit]=useState4(),[selected,setSelected]=useState4(defaultItems.map(toOption4)),[options,setOptions]=useState4([]),ItemComponent3=itemComponent??DefaultItemComponent,PillComponent=pillComponent??DefaultPillComponent,EmptyComponent=emptyComponent??DefaultEmptyComponent,searchRef=useRef(search),lastLoadOptionsRef=useRef(void 0),lastValueRef=useRef(void 0),timerRef=useRef(timer),abortControllerRef=useRef(abortController),autoSubmitRef=useRef(autoSubmit);useLayoutEffect(()=>{searchRef.current=search,timerRef.current=timer,abortControllerRef.current=abortController,autoSubmitRef.current=autoSubmit});let handleTimer=useCallback(()=>{if(setTimer(void 0),searchRef.current===lastValueRef.current&&loadOptions===lastLoadOptionsRef.current||(searchRef.current?.length??0)<minInputLength)return;lastValueRef.current=searchRef.current,lastLoadOptionsRef.current=loadOptions;let newAbortController=new AbortController;setAbortController(newAbortController),loadOptions(searchRef.current??"",newAbortController.signal).then(newValues=>{newAbortController.signal.aborted||(setOptions(newValues.map(toOption4)),autoSubmitRef.current?(newValues.length>0&&onChange(newValues.slice(0,1)),setAutoSubmit(!1)):newValues.length>0&&combobox.openDropdown())}).catch(err=>{newAbortController.signal.aborted||err.message.includes("aborted")||showNotification({color:"red",message:normalizeErrorString2(err)})}).finally(()=>{newAbortController.signal.aborted||setAbortController(void 0)})},[combobox,loadOptions,onChange,toOption4,minInputLength]),handleSearchChange=useCallback(e=>{(options&&options.length>0||creatable)&&combobox.openDropdown(),combobox.updateSelectedOptionIndex(),setSearch(e.currentTarget.value),abortControllerRef.current&&(abortControllerRef.current.abort(),setAbortController(void 0)),timerRef.current!==void 0&&window.clearTimeout(timerRef.current);let newTimer=window.setTimeout(()=>handleTimer(),100);setTimer(newTimer)},[combobox,options,creatable,handleTimer]),addSelected=useCallback(newValue=>{let alreadySelected=selected.some(v=>v.value===newValue),newSelected=alreadySelected?selected.filter(v=>v.value!==newValue):[...selected],option=options?.find(option2=>option2.value===newValue);if(!option&&creatable!==!1&&onCreate){let createdResource=onCreate(newValue);option=toOption4(createdResource)}if(option){if(maxValues===0){onChange([option.resource]),selected.length>0&&setSelected([]);return}alreadySelected||newSelected.push(option)}if(maxValues!==void 0)for(;newSelected.length>maxValues;)newSelected.shift();onChange(newSelected.map(v=>v.resource)),setSelected(newSelected)},[creatable,options,selected,maxValues,onChange,onCreate,toOption4]),handleValueSelect=useMemo2(()=>{if(!disabled)return val=>{disabled||(maxValues===1&&(setSearch(""),setOptions([]),combobox.closeDropdown()),lastValueRef.current=void 0,val==="$create"?(setSearch(""),addSelected(search)):addSelected(val))}},[addSelected,combobox,disabled,maxValues,search]),handleValueRemove=useCallback(item=>{let newSelected=selected.filter(v=>v.value!==item.value);onChange(newSelected.map(v=>v.resource)),setSelected(newSelected)},[selected,onChange]),handleKeyDown=useCallback(e=>{e.key==="Enter"?(timer||abortController)&&setAutoSubmit(!0):e.key==="Backspace"&&search.length===0&&(killEvent(e),handleValueRemove(selected[selected.length-1]))},[abortController,handleValueRemove,search.length,selected,timer]);useEffect(()=>()=>{abortControllerRef.current&&abortControllerRef.current.abort()},[]);let clearButton=!disabled&&clearable&&selected.length>0&&jsx11(Combobox.ClearButton,{title:"Clear all",size:"sm",onClear:()=>{setSearch(""),setSelected([]),onChange([]),combobox.closeDropdown()}}),createVisible=creatable&&search.trim().length>0,comboboxVisible=options.length>0||createVisible;return jsxs5(Combobox,{store:combobox,onOptionSubmit:handleValueSelect,withinPortal:!0,shadow:"xl",...rest,children:[jsx11(Combobox.DropdownTarget,{children:jsx11(PillsInput,{label,description,error,className:props.className,leftSection,rightSection:abortController?jsx11(Loader2,{size:16}):clearButton,required,disabled,children:jsxs5(Pill.Group,{"data-testid":AsyncAutocompleteTestIds.selectedItems,children:[selected.map(item=>jsx11(PillComponent,{item,disabled,onRemove:()=>handleValueRemove(item)},item.value)),!disabled&&(maxValues===void 0||maxValues===0||selected.length<maxValues)&&jsx11(Combobox.EventsTarget,{children:jsx11(PillsInput.Field,{role:"searchbox",name,value:search,placeholder,onFocus:handleSearchChange,onBlur:()=>{combobox.closeDropdown(),setSearch("")},onKeyDown:handleKeyDown,onChange:handleSearchChange})})]})})}),jsx11(Combobox.Dropdown,{hidden:!comboboxVisible,"data-testid":AsyncAutocompleteTestIds.options,children:jsx11(Combobox.Options,{children:jsxs5(ScrollAreaAutosize,{type:"scroll",mah:optionsDropdownMaxHeight,children:[options.map(item=>{let active=selected.some(v=>v.value===item.value);return jsx11(Combobox.Option,{value:item.value,active,children:jsx11(ItemComponent3,{...item,active})},item.value)}),createVisible&&jsxs5(Combobox.Option,{value:"$create",children:["+ Create ",search]}),!creatable&&search.trim().length>0&&options.length===0&&jsx11(EmptyComponent,{search})]})})})]})}function toDefaultItems(defaultValue2){return defaultValue2?Array.isArray(defaultValue2)?defaultValue2:[defaultValue2]:[]}function DefaultItemComponent(props){return jsxs5(Group4,{gap:"xs",children:[props.active&&jsx11(IconCheck,{size:12}),jsx11("span",{children:props.label})]})}function DefaultPillComponent({item,disabled,onRemove}){return jsx11(Pill,{withRemoveButton:!disabled,onRemove,children:item.label})}function DefaultEmptyComponent(){return jsx11(Combobox.Empty,{children:"Nothing found"})}var HeaderSearchInput_default={searchInput:"HeaderSearchInput_searchInput"};import{jsx as jsx12,jsxs as jsxs6}from"react/jsx-runtime";function toOption(resource){return{value:resource.id,label:getDisplayString2(resource),resource}}function HeaderSearchInput(props){let navigate=useMedplumNavigate2(),medplum=useMedplum(),loadData=useCallback2(async(input,signal)=>{let query=buildGraphQLQuery(input),options={signal},response=await medplum.graphql(query,void 0,void 0,options);return getResourcesFromResponse(response,input)},[medplum]),handleSelect=useCallback2(item=>{item.length>0&&navigate(`/${getReferenceString2(item[0])}`)},[navigate]);return jsx12(AsyncAutocomplete,{size:"sm",radius:"md",className:HeaderSearchInput_default.searchInput,leftSection:jsx12(IconSearch,{size:16}),placeholder:"Search",itemComponent:ItemComponent,toOption,onChange:handleSelect,loadOptions:loadData,maxValues:0,clearable:!1},`${props.pathname}?${props.searchParams}`)}var ItemComponent=forwardRef2(({resource,active:_active,...others},ref)=>{let helpText;return resource.resourceType==="Patient"?helpText=resource.birthDate:resource.resourceType==="ServiceRequest"&&(helpText=resource.subject?.display),jsx12("div",{ref,...others,children:jsxs6(Group5,{wrap:"nowrap",children:[jsx12(ResourceAvatar,{value:resource}),jsxs6("div",{children:[jsx12(Text4,{children:getDisplayString2(resource)}),jsx12(Text4,{size:"xs",c:"dimmed",children:helpText})]})]})})});function buildGraphQLQuery(input){let escaped=JSON.stringify(input);return isUUID(input)?`{
      Patients1: PatientList(_id: ${escaped}, _count: 1) {
        resourceType
        id
        identifier {
          system
          value
        }
        name {
          given
          family
        }
        birthDate
      }
      ServiceRequestList(_id: ${escaped}, _count: 1) {
        resourceType
        id
        identifier {
          system
          value
        }
        subject {
          display
        }
      }
    }`.replaceAll(/\s+/g," "):`{
    Patients1: PatientList(name: ${escaped}, _count: 5) {
      resourceType
      id
      identifier {
        system
        value
      }
      name {
        given
        family
      }
      birthDate
    }
    Patients2: PatientList(identifier: ${escaped}, _count: 5) {
      resourceType
      id
      identifier {
        system
        value
      }
      name {
        given
        family
      }
      birthDate
    }
    ServiceRequestList(identifier: ${escaped}, _count: 5) {
      resourceType
      id
      identifier {
        system
        value
      }
      subject {
        display
      }
    }
  }`.replaceAll(/\s+/g," ")}function getResourcesFromResponse(response,query){let resources=[];return response.data.Patients1&&resources.push(...response.data.Patients1),response.data.Patients2&&resources.push(...response.data.Patients2),response.data.ServiceRequestList&&resources.push(...response.data.ServiceRequestList),sortByRelevance(dedupeResources(resources),query).slice(0,5)}function dedupeResources(resources){let ids=new Set,result=[];for(let resource of resources)ids.has(resource.id)||(ids.add(resource.id),result.push(resource));return result}function sortByRelevance(resources,query){return resources.sort((a,b)=>getResourceScore(b,query)-getResourceScore(a,query))}function getResourceScore(resource,query){let bestScore=0;if(resource.identifier)for(let identifier of resource.identifier)bestScore=Math.max(bestScore,getStringScore(identifier.value,query));if(resource.resourceType==="Patient"&&resource.name)for(let name of resource.name)bestScore=Math.max(bestScore,getStringScore(formatHumanName2(name),query));return bestScore}function getStringScore(str,query){if(!str)return 0;let index=str.toLowerCase().indexOf(query.toLowerCase());return index<0?0:100-index}import{jsx as jsx13,jsxs as jsxs7}from"react/jsx-runtime";function Header(props){let medplum=useMedplum2(),profile=useMedplumProfile2(),[userMenuOpened,setUserMenuOpened]=useState5(!1),projectDisplay=medplum.getProject()?.name??medplum.getActiveLogin()?.project.display;return jsxs7(MantineAppShell.Header,{p:0,style:{zIndex:101},children:[jsx13(Box4,{p:8,h:60,children:jsxs7(Group6,{justify:"space-between",children:[jsxs7(Group6,{gap:"xs",children:[jsx13(UnstyledButton,{className:Header_default.logoButton,"aria-expanded":props.navbarOpen,"aria-controls":"navbar",onClick:()=>props.navbarToggle(),children:props.logo}),!props.headerSearchDisabled&&jsx13(HeaderSearchInput,{pathname:props.pathname,searchParams:props.searchParams})]}),jsxs7(Group6,{gap:"lg",pr:"sm",children:[props.notifications,jsxs7(Menu2,{width:260,shadow:"md",radius:"md",position:"bottom-end",transitionProps:{transition:"fade-down"},opened:userMenuOpened,onClose:()=>setUserMenuOpened(!1),children:[jsx13(Menu2.Target,{children:jsx13(UnstyledButton,{className:Header_default.user,"aria-label":"User menu","data-active":userMenuOpened||void 0,onClick:()=>setUserMenuOpened(o=>!o),children:jsxs7(Group6,{gap:7,children:[jsx13(ResourceAvatar,{value:profile,radius:"xl",size:24}),jsxs7(Stack,{gap:0,className:Header_default.userInfo,children:[jsx13(Text5,{size:"sm",className:Header_default.userName,truncate:!0,children:formatHumanName3(profile?.name?.[0])}),projectDisplay&&jsx13(Text5,{size:"xs",c:"dimmed",className:Header_default.userProject,title:projectDisplay,truncate:!0,children:projectDisplay})]}),jsx13(IconChevronDown,{size:12,stroke:1.5})]})})}),jsx13(Menu2.Dropdown,{className:HeaderDropdown_default.dropdown,children:jsx13(HeaderDropdown,{version:props.version})})]})]})]})}),!!props.announcements?.length&&props.onDismissAnnouncement&&jsx13(AnnouncementBanners,{announcements:props.announcements,onDismiss:props.onDismissAnnouncement})]})}import{Box as Box6,Divider as Divider2,AppShell as MantineAppShell2,Menu as Menu3,ScrollArea,Stack as Stack4,Text as Text9,Tooltip as Tooltip2,UnstyledButton as UnstyledButton2}from"@mantine/core";import{spotlight as spotlight2}from"@mantine/spotlight";import{formatHumanName as formatHumanName5}from"@medplum/core";import{useMedplum as useMedplum6,useMedplumNavigate as useMedplumNavigate4,useMedplumProfile as useMedplumProfile3,useNotificationCount}from"@medplum/react-hooks";import{Fragment as Fragment5,useState as useState11}from"react";import{Group as Group7,Modal,NativeSelect as NativeSelect2,Stack as Stack2,TextInput as TextInput3}from"@mantine/core";import{showNotification as showNotification2}from"@mantine/notifications";import{deepClone,normalizeErrorString as normalizeErrorString3}from"@medplum/core";import{useMedplum as useMedplum3}from"@medplum/react-hooks";import{useState as useState6}from"react";import{createContext as createContext2}from"react";var FormContext=createContext2({submitting:!1});FormContext.displayName="FormContext";function parseForm(form){let result={};for(let element of Array.from(form.elements))element instanceof HTMLInputElement?parseInputElement(result,element):element instanceof HTMLTextAreaElement?result[element.name]=element.value:element instanceof HTMLSelectElement&&parseSelectElement(result,element);return result}function parseInputElement(result,el){el.disabled||(el.type==="checkbox"||el.type==="radio")&&!el.checked||(result[el.name]=el.value)}function parseSelectElement(result,el){result[el.name]=el.value}import{jsx as jsx14}from"react/jsx-runtime";function Form(props){let[submitting,setSubmitting]=useState6(!1);return jsx14(FormContext.Provider,{value:{submitting},children:jsx14("form",{style:props.style,"data-testid":props.testid,onSubmit:e=>{e.preventDefault();let formData=parseForm(e.target);if(props.onSubmit){setSubmitting(!0);let result=props.onSubmit(formData);result?.then?result.catch(console.error).finally(()=>{setSubmitting(!1)}):setSubmitting(!1)}},children:props.children})})}import{Button}from"@mantine/core";import{useContext as useContext2}from"react";import{jsx as jsx15}from"react/jsx-runtime";function SubmitButton(props){let{children,...buttonProps}=props,{submitting}=useContext2(FormContext);return jsx15(Button,{type:"submit",loading:submitting,...buttonProps,children})}import{jsx as jsx16,jsxs as jsxs8}from"react/jsx-runtime";function BookmarkDialog(props){let medplum=useMedplum3(),config=medplum.getUserConfiguration();function submitHandler(formData){let{menuname,bookmarkname:name}=formData,target=`${props.pathname}?${props.searchParams.toString()}`,newConfig=deepClone(config);newConfig.menu?.find(({title})=>title===menuname)?.link?.push({name,target}),medplum.updateResource(newConfig).then(res=>{config.menu=res.menu,medplum.dispatchEvent({type:"change"}),showNotification2({color:"green",message:"Success"}),props.onOk()}).catch(err=>{showNotification2({color:"red",message:normalizeErrorString3(err)})})}return jsx16(Modal,{title:"Add Bookmark",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:jsx16(Form,{onSubmit:submitHandler,children:jsxs8(Stack2,{children:[jsx16(SelectMenu,{config}),jsx16(TextInput3,{label:"Bookmark Name",type:"text",name:"bookmarkname",placeholder:"Bookmark Name",defaultValue:props.pathname.split("/")[1]||"",withAsterisk:!0}),jsx16(Group7,{justify:"flex-end",children:jsx16(SubmitButton,{mt:"sm",children:"OK"})})]})})})}function SelectMenu(props){function userConfigToMenu(config){return config?.menu?.map(menu=>menu.title)}let menus=userConfigToMenu(props.config);return jsx16(NativeSelect2,{name:"menuname",defaultValue:menus[0],label:"Select Menu Option",data:menus,withAsterisk:!0})}import{useCallback as useCallback4,useState as useState9}from"react";import{useState as useState8}from"react";import{Box as Box5,Group as Group8,Text as Text7}from"@mantine/core";import{normalizeErrorString as normalizeErrorString4}from"@medplum/core";import{useMedplum as useMedplum4,useValueSetAvailability}from"@medplum/react-hooks";import{forwardRef as forwardRef3,useCallback as useCallback3,useState as useState7}from"react";import{ActionIcon,Text as Text6,Tooltip}from"@mantine/core";import{jsx as jsx17,jsxs as jsxs9}from"react/jsx-runtime";function UnavailableNote({text,color,message}){return jsxs9(Text6,{span:!0,size:"xs",c:color,children:[text,jsx17(Tooltip,{label:message,position:"top-start",withArrow:!0,events:{hover:!0,focus:!0,touch:!0},children:jsx17(ActionIcon,{variant:"subtle",color,size:16,ml:4,"aria-label":`Why is this unavailable? ${message}`,style:{verticalAlign:"text-bottom"},children:jsx17(IconInfoCircle,{size:14})})})]})}import{Fragment as Fragment4,jsx as jsx18,jsxs as jsxs10}from"react/jsx-runtime";function toKey(element){return typeof element.code=="string"?element.code:JSON.stringify(element)}function getDisplay(item){return typeof item.display=="string"?item.display:toKey(item)}function toOption2(element){return{value:toKey(element),label:getDisplay(element),resource:element}}function createValue(input){return{code:input,display:input}}function ValueSetAutocomplete(props){let medplum=useMedplum4(),{binding,creatable,clearable,expandParams,withHelpText,error,description,...rest}=props,isCreatable=creatable??!0,isUnavailable=useValueSetAvailability(binding)===!1,[searchError,setSearchError]=useState7(),loadValues=useCallback3(async(input,signal)=>{if(!binding||isUnavailable)return[];try{let valueSet=await medplum.valueSetExpand({count:10,...expandParams,url:binding,filter:input},{signal});setSearchError(void 0);let valueSetElements=valueSet.expansion?.contains??[],newData=[];for(let valueSetElement of valueSetElements)valueSetElement.code&&!newData.some(item=>item.code===valueSetElement.code)&&newData.push(valueSetElement);return newData}catch(err){let message=normalizeErrorString4(err);return signal.aborted||message.includes("aborted")||setSearchError(message),[]}},[medplum,expandParams,binding,isUnavailable]),inputDescription=description,inputError=error,inputDisabled=rest.disabled;if(isUnavailable){let unavailableMessage=`Value set ${binding} is unavailable`;isCreatable?inputDescription=combineNodes(description,jsx18(UnavailableNote,{text:"Suggestions unavailable",color:"yellow.9",message:unavailableMessage})):(inputError=combineNodes(error,jsx18(UnavailableNote,{text:"This field is unavailable.",color:"red",message:unavailableMessage})),inputDisabled=!0)}else searchError&&(inputError=combineNodes(error,searchError));return jsx18(AsyncAutocomplete,{...rest,description:inputDescription,error:inputError,disabled:inputDisabled,creatable:isCreatable,clearable:clearable??!0,toOption:toOption2,loadOptions:loadValues,onCreate:createValue,itemComponent:withHelpText?ItemComponent2:void 0})}function combineNodes(first,second){return first&&second?jsxs10(Fragment4,{children:[first,jsx18(Box5,{component:"span",display:"block",mt:"xs",children:second})]}):first||second}var ItemComponent2=forwardRef3(({label,resource,active,...others},ref)=>jsx18("div",{ref,...others,children:jsxs10(Group8,{wrap:"nowrap",gap:"xs",children:[active&&jsx18(IconCheck,{size:12}),jsxs10("div",{children:[jsx18(Text7,{children:label}),jsx18(Text7,{size:"xs",c:"dimmed",children:`${resource.system}#${resource.code}`})]})]})}));import{jsx as jsx19}from"react/jsx-runtime";function CodeInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,...rest}=props,[value,setValue]=useState8(defaultValue2);function handleChange(newValues){let newValue=newValues[0],newCode=valueSetElementToCode(newValue);setValue(newCode),onChange&&onChange(newCode)}return jsx19(ValueSetAutocomplete,{defaultValue:codeToValueSetElement(value),onChange:handleChange,withHelpText:withHelpText??!0,...rest})}function codeToValueSetElement(code){return code?{code}:void 0}function valueSetElementToCode(element){return element?.code}import{jsx as jsx20}from"react/jsx-runtime";function ResourceTypeInput(props){let[resourceType,setResourceType]=useState9(props.defaultValue),onChange=props.onChange,setResourceTypeWrapper=useCallback4(newResourceType=>{setResourceType(newResourceType),onChange&&onChange(newResourceType)},[onChange]);return jsx20(CodeInput,{disabled:props.disabled,"data-autofocus":props.autoFocus,"data-testid":props.testId,defaultValue:resourceType,onChange:setResourceTypeWrapper,name:props.name,placeholder:props.placeholder,binding:"https://medplum.com/fhir/ValueSet/resource-types",creatable:!1,maxValues:props.maxValues??1,clearable:!1,withHelpText:!1})}var Navbar_default={navbar:"Navbar_navbar",logoButton:"Navbar_logoButton",menuTitle:"Navbar_menuTitle",link:"Navbar_link",dismissButton:"Navbar_dismissButton",linkLabel:"Navbar_linkLabel",userLink:"Navbar_userLink",userLinkLabel:"Navbar_userLinkLabel",iconWrapper:"Navbar_iconWrapper",alertDot:"Navbar_alertDot",linkCount:"Navbar_linkCount",addBookmarkLink:"Navbar_addBookmarkLink",toggleButton:"Navbar_toggleButton",divider:"Navbar_divider"};import{Group as Group9,Kbd,Stack as Stack3,Text as Text8}from"@mantine/core";import{useDebouncedCallback}from"@mantine/hooks";import{Spotlight as MantineSpotlight,spotlight}from"@mantine/spotlight";import{formatHumanName as formatHumanName4,isUUID as isUUID2}from"@medplum/core";import{useMedplum as useMedplum5,useMedplumNavigate as useMedplumNavigate3}from"@medplum/react-hooks";import{useState as useState10}from"react";var Spotlight_default={actionSection:"Spotlight_actionSection",action:"Spotlight_action",actionDescription:"Spotlight_actionDescription",actionsGroup:"Spotlight_actionsGroup",actionsList:"Spotlight_actionsList",content:"Spotlight_content",groupLabel:"Spotlight_groupLabel",emptyState:"Spotlight_emptyState",footer:"Spotlight_footer",shortcutHints:"Spotlight_shortcutHints"};import{jsx as jsx21,jsxs as jsxs11}from"react/jsx-runtime";var DEBOUNCE_MS=200;function ShortcutHints(){return jsxs11(Group9,{gap:"lg",justify:"flex-start",align:"center",wrap:"wrap",className:Spotlight_default.shortcutHints,children:[jsxs11(Group9,{gap:6,align:"center",wrap:"nowrap",children:[jsx21("span",{className:Spotlight_default.groupLabel,children:"Open search"}),jsx21(Kbd,{children:"\u2318"}),jsx21(Kbd,{children:"K"})]}),jsxs11(Group9,{gap:6,align:"center",wrap:"nowrap",children:[jsx21("span",{className:Spotlight_default.groupLabel,children:"Select"}),jsx21(Kbd,{children:"\u2191"}),jsx21(Kbd,{children:"\u2193"})]}),jsxs11(Group9,{gap:6,align:"center",wrap:"nowrap",children:[jsx21("span",{className:Spotlight_default.groupLabel,children:"Open / Go"}),jsx21(Kbd,{children:"\u21B5"})]})]})}function SpotlightActionItem({action,group,highlightQuery}){let navigate=useMedplumNavigate3(),{href,onClick}=action,handleClick=event=>{href&&(event.metaKey||event.ctrlKey||event.shiftKey||event.altKey)||(event.preventDefault(),onClick?onClick(event):href&&navigate(href),spotlight.close())};return jsx21(MantineSpotlight.Action,{label:action.label,description:action.description,leftSection:action.leftSection,highlightQuery,closeSpotlightOnTrigger:!1,onClick:handleClick,...href&&{component:"a",href},group})}function filterActionGroups(query,groups){let q=query.trim().toLowerCase(),result=[];for(let{group,actions}of groups){let matches=actions.filter(a=>a.label?.toLowerCase().includes(q)||a.description?.toLowerCase().includes(q));matches.length>0&&result.push({group,actions:matches})}return result}function KeyboardHint(){return jsxs11(Stack3,{gap:"xs",py:"lg",children:[jsxs11(Text8,{size:"sm",c:"dimmed",children:["Press ",jsx21(Kbd,{children:"\u2318"})," + ",jsx21(Kbd,{children:"K"})," to open Search next time."]}),jsxs11(Text8,{size:"sm",c:"dimmed",children:["(",jsx21(Kbd,{children:"Ctrl"})," + ",jsx21(Kbd,{children:"K"})," on Windows)"]})]})}function Spotlight({patientsOnly,staticActions}){let medplum=useMedplum5(),[query,setQuery]=useState10(""),[searching,setSearching]=useState10(!1),[actions,setActions]=useState10([]),debouncedSearch=useDebouncedCallback(searchQuery=>{let graphqlQuery=buildGraphQLQuery2(searchQuery);patientsOnly?medplum.graphql(graphqlQuery).then(response=>{let patients=getResourcesFromResponse2(response).filter(r2=>r2.resourceType==="Patient");setActions(patientsToActions(patients))}).catch(console.error).finally(()=>setSearching(!1)):Promise.all([medplum.graphql(graphqlQuery),medplum.valueSetExpand({url:"https://medplum.com/fhir/ValueSet/resource-types",filter:searchQuery,count:5})]).then(([graphqlResponse,valueSetResult])=>{let resources=getResourcesFromResponse2(graphqlResponse),resourceTypes=valueSetResult.expansion?.contains??[];setActions(resourcesToActions(resources,resourceTypes))}).catch(console.error).finally(()=>setSearching(!1))},DEBOUNCE_MS),handleQueryChange=newQuery=>{if(setQuery(newQuery),!newQuery){debouncedSearch.cancel(),setSearching(!1),setActions([]);return}setSearching(!0),debouncedSearch(newQuery)},showStaticActions=!query&&!!staticActions?.length,filteredActions=query?filterActionGroups(query,actions):[],emptyContent;return!showStaticActions&&filteredActions.length===0&&(searching?emptyContent="Searching...":query?emptyContent="No results found":emptyContent=jsx21(KeyboardHint,{})),jsxs11(MantineSpotlight.Root,{query,onQueryChange:handleQueryChange,radius:"md",classNames:{body:Spotlight_default.body,content:Spotlight_default.content,search:Spotlight_default.search,actionsList:Spotlight_default.actionsList,action:Spotlight_default.action,actionSection:Spotlight_default.actionSection,actionDescription:Spotlight_default.actionDescription,actionsGroup:Spotlight_default.actionsGroup,empty:Spotlight_default.emptyState,footer:Spotlight_default.footer},children:[jsx21(MantineSpotlight.Search,{leftSection:jsx21(IconSearch,{size:"1.2rem",stroke:2,color:"var(--mantine-color-gray-5)"}),placeholder:"Start typing to search\u2026",type:"search",autoComplete:"off",autoCorrect:"off",spellCheck:!1,name:patientsOnly?"provider-spotlight-search":"spotlight-search","data-1p-ignore":"true","data-lpignore":"true",leftSectionProps:{style:{marginLeft:"calc(var(--mantine-spacing-md) - 12px)"}}}),jsxs11(MantineSpotlight.ActionsList,{children:[showStaticActions&&jsx21(MantineSpotlight.ActionsGroup,{label:"Actions",children:staticActions?.map(action=>jsx21(SpotlightActionItem,{action,group:"Actions"},action.id))}),!!query&&filteredActions.map(group=>jsx21(MantineSpotlight.ActionsGroup,{label:group.group,children:group.actions.map(action=>jsx21(SpotlightActionItem,{action,group:group.group,highlightQuery:!0},action.id))},group.group)),emptyContent&&jsx21(MantineSpotlight.Empty,{children:emptyContent})]}),jsx21(MantineSpotlight.Footer,{children:jsx21(ShortcutHints,{})})]})}function buildGraphQLQuery2(input){let escaped=JSON.stringify(input);return isUUID2(input)?`{
      Patients1: PatientList(_id: ${escaped}, _count: 1) {
        resourceType
        id
        identifier { system value }
        name { given family }
        birthDate
        photo { url contentType }
      }
      ServiceRequestList(_id: ${escaped}, _count: 1) {
        resourceType
        id
        identifier { system value }
        subject { display }
      }
    }`.replaceAll(/\s+/g," "):`{
    Patients1: PatientList(name: ${escaped}, _count: 5) {
      resourceType
      id
      identifier { system value }
      name { given family }
      birthDate
      photo { url contentType }
    }
    Patients2: PatientList(identifier: ${escaped}, _count: 5) {
      resourceType
      id
      identifier { system value }
      name { given family }
      birthDate
      photo { url contentType }
    }
    ServiceRequestList(identifier: ${escaped}, _count: 5) {
      resourceType
      id
      identifier { system value }
      subject { display }
    }
  }`.replaceAll(/\s+/g," ")}function getResourcesFromResponse2(response){let resources=[];return response.data.Patients1&&resources.push(...response.data.Patients1),response.data.Patients2&&resources.push(...response.data.Patients2),response.data.ServiceRequestList&&resources.push(...response.data.ServiceRequestList),dedupeResources2(resources)}function dedupeResources2(resources){let ids=new Set,result=[];for(let resource of resources)resource.id&&!ids.has(resource.id)&&(ids.add(resource.id),result.push(resource));return result}function patientToAction(patient){return{id:patient.id,href:`/Patient/${patient.id}`,label:patient.name?formatHumanName4(patient.name[0]):patient.id,description:patient.birthDate,leftSection:jsx21(ResourceAvatar,{value:patient,radius:"xl",size:24})}}function patientsToActions(patients){let patientActions=patients.filter(p=>!!p.id).map(patientToAction);return patientActions.length>0?[{group:"Patients",actions:patientActions}]:[]}function resourcesToActions(resources,resourceTypes){let result=[],resourceTypeActions=resourceTypes.map(rt=>({id:`resource-type-${rt.code}`,href:`/${rt.code}`,label:rt.display??rt.code??"",description:"Resource Type"}));resourceTypeActions.length>0&&result.push({group:"Resource Types",actions:resourceTypeActions});let patientActions=[],serviceRequestActions=[];for(let resource of resources)resource.resourceType==="Patient"&&resource.id?patientActions.push(patientToAction(resource)):resource.resourceType==="ServiceRequest"&&resource.id&&serviceRequestActions.push({id:resource.id,href:`/ServiceRequest/${resource.id}`,label:resource.id,description:resource.subject?.display});return patientActions.length>0&&result.push({group:"Patients",actions:patientActions}),serviceRequestActions.length>0&&result.push({group:"Service Requests",actions:serviceRequestActions}),result}import{Fragment as Fragment6,jsx as jsx22,jsxs as jsxs12}from"react/jsx-runtime";function Navbar(props){let medplum=useMedplum6(),navigate=useMedplumNavigate4(),profile=useMedplumProfile3(),activeLink=getActiveLink(props.pathname,props.searchParams,props.menus),[userMenuOpened,setUserMenuOpened]=useState11(!1),[bookmarkDialogVisible,setBookmarkDialogVisible]=useState11(!1),projectDisplay=medplum.getProject()?.name??medplum.getActiveLogin()?.project.display;function onLinkClick2(e,to){e.stopPropagation(),e.preventDefault(),navigate(to),window.innerWidth<768&&props.closeNavbar()}function navigateResourceType(resourceType){resourceType&&navigate(`/${resourceType}`)}let opened=props.opened??!0;return jsxs12(Fragment6,{children:[jsxs12(MantineAppShell2.Navbar,{id:"navbar",className:Navbar_default.navbar,children:[props.logo&&jsx22(MantineAppShell2.Section,{px:"xs",pt:"xs",pb:"4px",children:jsx22(UnstyledButton2,{className:Navbar_default.logoButton,onClick:props.navbarToggle,"aria-expanded":opened,"aria-controls":"navbar","aria-label":"Medplum Logo",children:props.logo})}),jsx22(ScrollArea,{px:"xs",pb:"xs",pt:"sm",h:"100%",children:jsxs12(MantineAppShell2.Section,{grow:!0,children:[props.spotlightEnabled&&jsx22(Box6,{mb:2,children:jsx22(Tooltip2,{label:"Search",position:"right",transitionProps:{duration:0},disabled:opened,children:jsxs12(UnstyledButton2,{className:Navbar_default.link,onClick:()=>spotlight2.open(),"aria-label":"Search",children:[jsx22(IconSearch,{size:"1.2rem"}),jsx22("span",{className:Navbar_default.linkLabel,"data-opened":opened||void 0,children:"Search"})]})})}),props.spotlightEnabled&&jsx22(Spotlight,{patientsOnly:props.patientsOnly,staticActions:props.spotlightActions}),!props.resourceTypeSearchDisabled&&jsx22(MantineAppShell2.Section,{mb:"sm",children:jsx22(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",maxValues:0,onChange:newValue=>navigateResourceType(newValue)},window.location.pathname)}),props.menus?.map((menu,index)=>jsxs12(Fragment5,{children:[menu.title&&jsx22(Text9,{className:Navbar_default.menuTitle,"data-opened":opened||void 0,children:menu.title}),jsx22(Stack4,{gap:"2",children:menu.links?.map(link=>link.notificationCount?jsx22(NavbarLinkWithSubscription,{to:link.href,active:link.href===activeLink?.href,onClick:e=>onLinkClick2(e,link.href),icon:link.icon,label:link.label??"",opened,alert:link.alert,notificationCount:link.notificationCount,onDismiss:link.onDismiss},link.href):jsx22(NavbarLinkContent,{to:link.href,active:link.href===activeLink?.href,onClick:e=>onLinkClick2(e,link.href),icon:link.icon,label:link.label??"",opened,alert:link.alert,count:link.count,onDismiss:link.onDismiss},link.href))})]},`menu-${menu.title??index}`)),props.displayAddBookmark&&jsx22(Tooltip2,{label:"Add Bookmark",position:"right",transitionProps:{duration:0},disabled:opened,children:jsxs12(UnstyledButton2,{className:`${Navbar_default.link} ${Navbar_default.addBookmarkLink}`,onClick:()=>setBookmarkDialogVisible(!0),children:[jsx22(IconCirclePlus,{}),jsx22("span",{className:Navbar_default.linkLabel,"data-opened":opened||void 0,children:"Add Bookmark"})]})})]})}),props.userMenuEnabled&&jsxs12(MantineAppShell2.Section,{px:"xs",py:"xs",children:[jsx22(Tooltip2,{label:opened?"Close Sidebar":"Open Sidebar",position:"right",transitionProps:{duration:0},children:jsx22(UnstyledButton2,{className:Navbar_default.toggleButton,"data-opened":opened||void 0,"aria-label":opened?"Close Sidebar":"Open Sidebar",onClick:props.navbarToggle,"aria-expanded":opened,"aria-controls":"navbar",children:jsx22(IconLayoutSidebar,{})})}),jsx22(Divider2,{my:"xs",className:Navbar_default.divider}),jsxs12(Menu3,{width:260,shadow:"md",radius:"md",position:"top-start",transitionProps:{transition:"fade-up"},opened:userMenuOpened,onClose:()=>setUserMenuOpened(!1),children:[jsx22(Menu3.Target,{children:jsxs12(UnstyledButton2,{className:`${Navbar_default.link} ${Navbar_default.userLink}`,pl:"7","aria-label":"User menu","data-active":userMenuOpened||void 0,onClick:()=>setUserMenuOpened(o=>!o),bd:"1px 0 0 0 solid var(--mantine-color-gray-200)",children:[jsx22(ResourceAvatar,{value:profile,radius:"xl",size:24}),jsxs12("span",{className:Navbar_default.userLinkLabel,"data-opened":opened||void 0,children:[jsx22(Text9,{span:!0,inherit:!0,truncate:!0,children:formatHumanName5(profile?.name?.[0])}),projectDisplay&&jsx22(Text9,{span:!0,inherit:!0,fz:"xs",c:"dimmed",truncate:!0,title:projectDisplay,children:projectDisplay})]})]})}),jsx22(Menu3.Dropdown,{className:HeaderDropdown_default.dropdown,children:jsx22(HeaderDropdown,{version:props.version,showLayoutVersionToggle:props.showLayoutVersionToggle})})]})]})]}),props.pathname&&props.searchParams&&jsx22(BookmarkDialog,{pathname:props.pathname,searchParams:props.searchParams,visible:bookmarkDialogVisible,onOk:()=>setBookmarkDialogVisible(!1),onCancel:()=>setBookmarkDialogVisible(!1)})]})}function NavbarLinkContent(props){let{to,icon,label,onClick,active,count,alert,opened,onDismiss}=props,showCount=count!==void 0&&count>0,iconElement=icon??jsx22(IconBookmark,{}),showDot=showCount&&alert&&!opened;function handleDismiss(e){e.preventDefault(),e.stopPropagation(),onDismiss?.()}return jsx22(Tooltip2,{label,position:"right",transitionProps:{duration:0},disabled:opened,children:jsxs12(MedplumLink,{to,onClick,className:Navbar_default.link,"data-active":active||void 0,children:[jsxs12("span",{className:Navbar_default.iconWrapper,children:[iconElement,showDot&&jsx22("span",{className:Navbar_default.alertDot})]}),jsx22("span",{className:Navbar_default.linkLabel,"data-opened":opened||void 0,children:label}),showCount&&jsx22("span",{className:Navbar_default.linkCount,"data-opened":opened||void 0,"data-alert":alert||void 0,children:count.toLocaleString()}),onDismiss&&opened&&jsx22(Tooltip2,{label:"Dismiss",openDelay:500,children:jsx22(UnstyledButton2,{"aria-label":"Dismiss",className:Navbar_default.dismissButton,onClick:handleDismiss,children:jsx22(IconX,{size:14})})})]})})}function NavbarLinkWithSubscription(props){let count=useNotificationCount(props.notificationCount);return jsx22(NavbarLinkContent,{to:props.to,active:props.active,onClick:props.onClick,icon:props.icon,label:props.label,opened:props.opened,alert:props.alert,count,onDismiss:props.onDismiss})}function getActiveLink(currentPathname,currentSearchParams,menus){if(!currentPathname||!currentSearchParams||!menus)return;let bestLink,bestScore=0;for(let menu of menus)if(menu.links)for(let link of menu.links){let score=getLinkScore(currentPathname,currentSearchParams,link.href);score>bestScore&&(bestScore=score,bestLink=link)}return bestLink}function getLinkScore(currentPathname,currentSearchParams,linkHref){let linkUrl=new URL(linkHref,"https://example.com");if(currentPathname!==linkUrl.pathname)return 0;let ignoredParams=["_count","_offset"];for(let[key,value]of linkUrl.searchParams.entries())if(!ignoredParams.includes(key)&&currentSearchParams.get(key)!==value)return 0;let count=1;for(let[key,value]of currentSearchParams.entries())ignoredParams.includes(key)||linkUrl.searchParams.get(key)===value&&count++;return count}import{jsx as jsx23,jsxs as jsxs13}from"react/jsx-runtime";var OPEN_WIDTH=250,CLOSED_WIDTH=59,HEADER_HEIGHT=60,ANNOUNCEMENT_HEIGHT=36;function AppShell(props){let[navbarOpen,setNavbarOpen]=useState12(localStorage.navbarOpen==="true"),[layoutVersion]=useState12(props.layoutVersion??localStorage.appShellLayoutVersion??"v1"),medplum=useMedplum7(),profile=useMedplumProfile4(),[dismissedAnnouncementIds,setDismissedAnnouncementIds]=useState12(()=>{try{let dismissed=localStorage.appShellDismissedAnnouncements;return new Set(dismissed?JSON.parse(dismissed):[])}catch{return new Set}}),visibleAnnouncements=props.announcements?.filter(announcement=>!announcement.id||!dismissedAnnouncementIds.has(announcement.id)),announcementHeight=visibleAnnouncements?.length?visibleAnnouncements.length*ANNOUNCEMENT_HEIGHT:0;function setNavbarOpenWrapper(open){localStorage.navbarOpen=open.toString(),setNavbarOpen(open)}function dismissAnnouncement(announcement){announcement.id&&setDismissedAnnouncementIds(dismissedIds=>{let updated=new Set(dismissedIds);return updated.add(announcement.id),localStorage.appShellDismissedAnnouncements=JSON.stringify([...updated]),updated}),announcement.onDismiss?.(announcement)}function closeNavbar(){setNavbarOpenWrapper(!1)}function toggleNavbar(){setNavbarOpenWrapper(!navbarOpen)}if(medplum.isLoading())return jsx23(Loading,{});let headerProp,navbarProp,headerComponent,navbarComponent;return layoutVersion==="v2"?(headerProp={height:announcementHeight},navbarProp={width:navbarOpen?OPEN_WIDTH:CLOSED_WIDTH,breakpoint:0,collapsed:{desktop:!profile,mobile:!profile}},headerComponent=visibleAnnouncements?.length?jsx23(MantineAppShell3.Header,{style:{zIndex:101},children:jsx23(AnnouncementBanners,{announcements:visibleAnnouncements,onDismiss:dismissAnnouncement})}):void 0,navbarComponent=profile?jsx23(Navbar,{logo:props.logo,pathname:props.pathname,searchParams:props.searchParams,menus:props.menus,navbarToggle:toggleNavbar,closeNavbar,displayAddBookmark:props.displayAddBookmark,resourceTypeSearchDisabled:!0,opened:navbarOpen,spotlightEnabled:!0,patientsOnly:props.spotlightPatientsOnly,spotlightActions:props.spotlightActions,userMenuEnabled:!0,version:props.version,showLayoutVersionToggle:props.showLayoutVersionToggle}):void 0):(headerProp={height:HEADER_HEIGHT+announcementHeight},navbarProp={width:OPEN_WIDTH,breakpoint:"sm",collapsed:{desktop:!profile||!navbarOpen,mobile:!profile||!navbarOpen}},headerComponent=profile&&jsx23(Header,{pathname:props.pathname,searchParams:props.searchParams,headerSearchDisabled:props.headerSearchDisabled,logo:props.logo,version:props.version,navbarOpen,navbarToggle:toggleNavbar,notifications:props.notifications,announcements:visibleAnnouncements,onDismissAnnouncement:dismissAnnouncement}),navbarComponent=profile&&navbarOpen?jsx23(Navbar,{pathname:props.pathname,searchParams:props.searchParams,menus:props.menus,navbarToggle:toggleNavbar,closeNavbar,displayAddBookmark:props.displayAddBookmark,resourceTypeSearchDisabled:props.resourceTypeSearchDisabled,patientsOnly:props.spotlightPatientsOnly,spotlightActions:props.spotlightActions}):void 0),jsxs13(MantineAppShell3,{header:headerProp,navbar:navbarProp,padding:0,children:[headerComponent,navbarComponent,jsx23(MantineAppShell3.Main,{className:AppShell_default.main,children:jsx23(ErrorBoundary,{children:jsx23(Suspense,{fallback:jsx23(Loading,{}),children:props.children})})})]})}import{getPathDisplayName,isPopulated as isPopulated2}from"@medplum/core";import{Anchor as Anchor2}from"@mantine/core";import{ContentType as ContentType2}from"@medplum/core";import{useCachedBinaryUrl as useCachedBinaryUrl2}from"@medplum/react-hooks";import{Button as Button2}from"@mantine/core";import{useEffect as useEffect2,useRef as useRef2,useState as useState13}from"react";import{Fragment as Fragment7,jsx as jsx24,jsxs as jsxs14}from"react/jsx-runtime";var CCDA_VIEWER_URL="https://ccda.medplum.com",BASE_VALIDATION_URL="https://ccda-validator.medplum.com/";function CcdaDisplay(props){let{url}=props,[shouldSend,setShouldSend]=useState13(!1),iframeRef=useRef2(null),[validationResult,setValidationResult]=useState13(),[validating,setValidating]=useState13(!1);useEffect2(()=>{url&&shouldSend&&iframeRef.current&&(sendCommand(iframeRef.current,{command:"loadCcdaXml",value:url}).catch(console.error),setShouldSend(!1))},[url,shouldSend]);let validateCcda=async()=>{if(url)try{setValidating(!0);let ccdaContent=await(await fetch(url)).text(),formData=new FormData;formData.append("ccdaFile",new Blob([ccdaContent],{type:"text/xml"}),"ccda.xml");let validationUrl=`${BASE_VALIDATION_URL}referenceccdaservice/?validationObjective=C-CDA_IG_Plus_Vocab&referenceFileName=No%20scenario%20File&curesUpdate=true&severityLevel=WARNING`,validationResponse=await fetch(validationUrl,{method:"POST",body:formData,credentials:"omit",redirect:"manual"});if(!validationResponse.ok)throw new Error(`Validation failed: ${validationResponse.status} ${validationResponse.statusText}`);let validationResult2=await validationResponse.json();setValidationResult(validationResult2)}catch(error){setValidationResult(void 0),console.error("CCDA validation error:",error)}finally{setValidating(!1)}},downloadResults=()=>{if(!validationResult)return;let resultsJson=JSON.stringify(validationResult,null,2);exportJsonFile(resultsJson,"ccda-validation-results")},getErrorCount=()=>validationResult?validationResult.resultsMetaData.resultMetaData.filter(item=>item?.type.includes("Error")).reduce((sum,item)=>sum+(item.count||0),0):0;return url?jsxs14("div",{"data-testid":"ccda-iframe",style:{maxWidth:props.maxWidth},children:[jsx24("div",{style:{minHeight:400},children:jsx24("iframe",{title:"C-CDA Viewer",width:"100%",height:"400",ref:iframeRef,src:CCDA_VIEWER_URL,allowFullScreen:!0,frameBorder:0,seamless:!0,onLoad:()=>setShouldSend(!0)})}),jsxs14("div",{style:{marginTop:"10px",marginBottom:"10px",display:"flex",alignItems:"center"},children:[jsx24(Button2,{type:"button",onClick:validateCcda,disabled:validating,children:validating?"Validating...":"Validate"}),validationResult&&jsxs14(Fragment7,{children:[jsxs14("div",{style:{marginLeft:"15px"},children:[jsx24("strong",{children:"Validation Results:"})," ",getErrorCount()," errors found"]}),jsx24(Button2,{type:"button",onClick:downloadResults,color:"green",style:{marginLeft:"auto"},children:"Download Full Results"})]})]})]}):null}import{Loader as Loader3}from"@mantine/core";import{useEffect as useEffect3,useRef as useRef3,useState as useState14}from"react";import{jsx as jsx25}from"react/jsx-runtime";function ScannedImage(props){let{maxRetries=5,...rest}=props,[attempt,setAttempt]=useState14(0),[status,setStatus]=useState14("fetching"),timeoutRef=useRef3(void 0);useEffect3(()=>()=>{timeoutRef.current!==void 0&&clearTimeout(timeoutRef.current)},[]);let handleError=()=>{if(attempt>=maxRetries){setStatus("failed");return}setStatus("backoff");let delay=Math.min(1e3*2**attempt,16e3);timeoutRef.current=setTimeout(()=>{setAttempt(a=>a+1),setStatus("fetching"),timeoutRef.current=void 0},delay)};return status==="failed"?jsx25("div",{className:"image-placeholder",children:"Image unavailable"}):status==="backoff"?jsx25(Loader3,{}):jsx25("img",{onLoad:()=>setStatus("loaded"),onError:handleError,...rest})}import{jsx as jsx26,jsxs as jsxs15}from"react/jsx-runtime";function AttachmentDisplay(props){let{contentType,data:data2,url:uncachedUrl,title}=props.value??{},cachedUrl=useCachedBinaryUrl2(uncachedUrl);if(!cachedUrl&&!data2)return null;let url=cachedUrl??`data:${contentType};base64,${data2}`;return jsxs15("div",{"data-testid":"attachment-display",children:[contentType?.startsWith("image/")&&jsx26(ScannedImage,{"data-testid":"attachment-image",style:{maxWidth:props.maxWidth},src:url,alt:title}),contentType?.startsWith("video/")&&jsx26("video",{"data-testid":"attachment-video",style:{maxWidth:props.maxWidth},controls:!0,children:jsx26("source",{type:contentType,src:url})}),(contentType?.startsWith("text/")||contentType==="application/json"||contentType==="application/pdf")&&jsx26("div",{"data-testid":"attachment-iframe",style:{maxWidth:props.maxWidth,minHeight:400},children:jsx26("iframe",{title:"Attachment",width:"100%",height:"400",src:url+"#navpanes=0",allowFullScreen:!0,frameBorder:0,seamless:!0})}),contentType===ContentType2.CDA_XML&&jsx26(CcdaDisplay,{url}),jsx26("div",{"data-testid":"download-link",style:{padding:"2px 16px 16px 16px"},children:jsx26(Anchor2,{href:uncachedUrl,"data-testid":"attachment-details",target:"_blank",rel:"noopener noreferrer",download:getDownloadName(title),children:title||"Download"})})]})}function getDownloadName(title){return title?.includes(".")?title:void 0}var DescriptionList_default={root:"DescriptionList_root",compact:"DescriptionList_compact"};import{Fragment as Fragment8,jsx as jsx27,jsxs as jsxs16}from"react/jsx-runtime";function DescriptionList(props){let{children,compact}=props;return jsx27("dl",{className:clsx_default(DescriptionList_default.root,{[DescriptionList_default.compact]:compact}),children})}function DescriptionListEntry(props){return jsxs16(Fragment8,{children:[jsx27("dt",{children:props.term}),jsx27("dd",{children:props.children})]})}import{Fragment as Fragment9,jsx as jsx28}from"react/jsx-runtime";function AttachmentArrayDisplay(props){let attachmentElements=props.values?.map((v,index)=>jsx28("div",{children:jsx28(AttachmentDisplay,{value:v,maxWidth:props.maxWidth})},"attatchment-"+index)),content;if(props.includeDescriptionListEntry){if(props.property===void 0)throw new Error("props.property is required when includeDescriptionListEntry is true");if(!isPopulated2(props.path))throw new Error("props.path is required when includeDescriptionListEntry is true");let key=props.path.split(".").pop();content=jsx28(DescriptionListEntry,{term:getPathDisplayName(key),children:attachmentElements})}else content=jsx28(Fragment9,{children:attachmentElements});return content}import{ActionIcon as ActionIcon2}from"@mantine/core";import{useState as useState15}from"react";import{normalizeOperationOutcome}from"@medplum/core";import{useMedplum as useMedplum8}from"@medplum/react-hooks";import{useRef as useRef4}from"react";import{Fragment as Fragment10,jsx as jsx29,jsxs as jsxs17}from"react/jsx-runtime";function AttachmentButton(props){let medplum=useMedplum8(),fileInputRef=useRef4(null);function onClick(e){killEvent(e),fileInputRef.current?.click()}function onFileChange(e){killEvent(e);let files=e.target.files;files&&Array.from(files).forEach(processFile)}function processFile(file){!file||!file.name||(props.onUploadStart&&props.onUploadStart(),medplum.createAttachment({data:file,contentType:file.type||"application/octet-stream",filename:file.name,securityContext:props.securityContext,onProgress:props.onUploadProgress}).then(attachment=>props.onUpload(attachment)).catch(err=>{props.onUploadError&&props.onUploadError(normalizeOperationOutcome(err))}))}return jsxs17(Fragment10,{children:[jsx29("input",{disabled:props.disabled,type:"file","data-testid":"upload-file-input",style:{display:"none"},ref:fileInputRef,onChange:e=>onFileChange(e)}),props.children({onClick,disabled:props.disabled})]})}import{jsx as jsx30,jsxs as jsxs18}from"react/jsx-runtime";function AttachmentArrayInput(props){let[values,setValues]=useState15(props.defaultValue??[]);function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}return jsxs18("table",{style:{width:"100%"},children:[jsxs18("colgroup",{children:[jsx30("col",{width:"97%"}),jsx30("col",{width:"3%"})]}),jsxs18("tbody",{children:[values.map((v,index)=>jsxs18("tr",{children:[jsx30("td",{children:jsx30(AttachmentDisplay,{value:v,maxWidth:200})}),jsx30("td",{children:jsx30(ActionIcon2,{disabled:props.disabled,title:"Remove",variant:"subtle",size:"sm",color:"gray",onClick:e=>{killEvent(e);let copy=values.slice();copy.splice(index,1),setValuesWrapper(copy)},children:jsx30(IconCircleMinus,{})})})]},`${index}-${values.length}`)),jsxs18("tr",{children:[jsx30("td",{}),jsx30("td",{children:jsx30(AttachmentButton,{disabled:props.disabled,onUpload:attachment=>{setValuesWrapper([...values,attachment])},children:props2=>jsx30(ActionIcon2,{...props2,title:"Add",variant:"subtle",size:"sm",color:props2.disabled?"gray":"green",children:jsx30(IconCloudUpload,{})})})})]})]})]})}import{Button as Button3}from"@mantine/core";import{useState as useState16}from"react";import{Fragment as Fragment11,jsx as jsx31,jsxs as jsxs19}from"react/jsx-runtime";function AttachmentInput(props){let[value,setValue]=useState16(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return value?jsxs19(Fragment11,{children:[jsx31(AttachmentDisplay,{value,maxWidth:200}),jsx31(Button3,{disabled:props.disabled,onClick:e=>{killEvent(e),setValueWrapper(void 0)},children:"Remove"})]}):jsx31(AttachmentButton,{disabled:props.disabled,securityContext:props.securityContext,onUpload:setValueWrapper,children:props2=>jsx31(Button3,{...props2,children:"Upload..."})})}import{Button as Button4,Flex as Flex2,Group as Group10,Stack as Stack5,Title}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome2}from"@medplum/core";import{useMedplum as useMedplum9}from"@medplum/react-hooks";import{useState as useState17}from"react";import{Container as MantineContainer}from"@mantine/core";var Container_default={root:"Container_root"};import{jsx as jsx32}from"react/jsx-runtime";function Container(props){let{children,...others}=props;return jsx32(MantineContainer,{className:Container_default.root,...others,children})}import{Paper}from"@mantine/core";var Panel_default={paper:"Panel_paper",fill:"Panel_fill"};import{jsx as jsx33}from"react/jsx-runtime";function Panel(props){let{width,fill,className,children,...rest}=props,style=width?{maxWidth:width}:void 0;return jsx33(Paper,{className:clsx_default(Panel_default.paper,fill&&Panel_default.fill,className),style,shadow:"sm",radius:"sm",withBorder:!0,...rest,children})}import{jsx as jsx34}from"react/jsx-runtime";function Document(props){let{children,...others}=props;return jsx34(Container,{children:jsx34(Panel,{...others,children})})}import{jsx as jsx35,jsxs as jsxs20}from"react/jsx-runtime";function Logo(props){let overrideUrl=import.meta.env.MEDPLUM_LOGO_URL;return overrideUrl?jsx35("img",{src:overrideUrl,alt:"Logo",style:{maxHeight:props.size}}):jsxs20("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 180 180",style:{width:props.size,height:props.size},children:[jsx35("title",{children:"Medplum Logo"}),jsx35("path",{fill:props.fill??"#9c36b5",d:"M84 56c-3-15-15-24-23-28l5-10c8 2 14 8 20 14 0-12 1-16 5-21 8-9 13-9 41-9 0 7 1 18-3 24-7 9-16 7-41 8 5 8 7 14 8 22 36-24 74-7 74 39 0 42-40 83-80 83s-80-41-80-83c0-46 38-63 74-39Zm-3 43H65c-4 0-7 3-7 7v4c0 4 3 7 7 7h16v16c0 4 3 7 7 7h4c4 0 7-3 7-7v-16h16c4 0 7-3 7-7v-4c0-4-3-7-7-7H99V83c0-4-3-7-7-7h-4c-4 0-7 3-7 7z"})]})}import{PasswordInput as MantinePasswordInput}from"@mantine/core";import{jsx as jsx36}from"react/jsx-runtime";function PasswordInput(props){let{visibilityToggleButtonProps,...rest}=props;return jsx36(MantinePasswordInput,{...rest,visibilityToggleButtonProps:{"aria-label":"Toggle password visibility",tabIndex:0,...visibilityToggleButtonProps}})}function getErrorsForInput(outcome,expression){return outcome?.issue?.filter(issue=>isExpressionMatch(issue.expression?.[0],expression))?.map(issue=>issue.details?.text)?.join(`
`)}function getIssuesForExpression(outcome,expression){return outcome?.issue?.filter(issue=>isExpressionMatch(issue.expression?.[0],expression))}var ARRAY_INDEX_REGEX=/\[\d+\]/;function isExpressionMatch(expr1,expr2){let isExpr1Indexed=typeof expr1=="string"&&ARRAY_INDEX_REGEX.test(expr1),isExpr2Indexed=typeof expr2=="string"&&ARRAY_INDEX_REGEX.test(expr2);if(isExpr1Indexed!==isExpr2Indexed&&(expr1=expr1?.replace(ARRAY_INDEX_REGEX,""),expr2=expr2?.replace(ARRAY_INDEX_REGEX,"")),expr1===expr2)return!0;if(!expr1||!expr2)return!1;let dot1=expr1.indexOf(".");if(dot1>=0&&expr1.substring(dot1+1)===expr2)return!0;let dot2=expr2.indexOf(".");return dot2>=0&&expr2.substring(dot2+1)===expr1}import{jsx as jsx37,jsxs as jsxs21}from"react/jsx-runtime";function ChangePasswordForm(props){let{onSuccess}=props,medplum=useMedplum9(),[outcome,setOutcome]=useState17(),[success,setSuccess]=useState17(!1);return jsx37(Document,{width:450,children:jsxs21(Form,{onSubmit:formData=>{setOutcome(void 0),medplum.post("auth/changepassword",formData).then(()=>{setSuccess(!0),onSuccess?.()}).catch(err=>setOutcome(normalizeOperationOutcome2(err)))},children:[jsxs21(Flex2,{direction:"column",align:"center",justify:"center",children:[jsx37(Logo,{size:32}),jsx37(Title,{children:"Change password"})]}),!success&&jsxs21(Stack5,{gap:"xl",mt:"xl",children:[jsx37(PasswordInput,{name:"oldPassword",label:"Old password",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"oldPassword")}),jsx37(PasswordInput,{name:"newPassword",label:"New password",required:!0,error:getErrorsForInput(outcome,"newPassword")}),jsx37(PasswordInput,{name:"confirmPassword",label:"Confirm new password",required:!0,error:getErrorsForInput(outcome,"confirmPassword")}),jsx37(Group10,{justify:"flex-end",mt:"xl",wrap:"nowrap",children:jsx37(Button4,{type:"submit",children:"Change password"})})]}),success&&jsx37("div",{"data-testid":"success",children:"Password changed successfully"})]})})}import{Checkbox,Flex as Flex3,Group as Group11,Stack as Stack6,Title as Title2}from"@mantine/core";import{useMedplum as useMedplum10}from"@medplum/react-hooks";import{Fragment as Fragment12}from"react/jsx-runtime";import{jsx as jsx38,jsxs as jsxs22}from"react/jsx-runtime";var openConditionScope=/^patient\/Condition\.(?:\*|c?r?u?d?s?)$/,encounterDiagnosis="?category=http://terminology.hl7.org/CodeSystem/condition-category|encounter-diagnosis",problemListItem="?category=http://terminology.hl7.org/CodeSystem/condition-category|problem-list-item",healthConcern="?category=http://hl7.org/fhir/us/core/CodeSystem/condition-category|health-concern",openObservationScope=/^patient\/Observation\.(?:\*|c?r?u?d?s?)$/,clinicalTest="?category=http://hl7.org/fhir/us/core/CodeSystem/us-core-observation-category|clinical-test",laboratory="?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory",socialHistory="?category=http://terminology.hl7.org/CodeSystem/observation-category|social-history",sdoh="?category=http://hl7.org/fhir/us/core/CodeSystem/us-core-category|sdoh",survey="?category=http://terminology.hl7.org/CodeSystem/observation-category|survey",vitalSigns="?category=http://terminology.hl7.org/CodeSystem/observation-category|vital-signs";function ChooseScopeForm(props){let medplum=useMedplum10();return jsx38(Form,{onSubmit:formData=>{medplum.post("auth/scope",{login:props.login,scope:Object.keys(formData).join(" ")}).then(props.handleAuthResponse).catch(console.log)},children:jsxs22(Stack6,{children:[jsxs22(Flex3,{direction:"column",align:"center",justify:"center",children:[props.logo??jsx38(Logo,{size:32}),jsx38(Title2,{order:3,py:"lg",children:props.title??"Choose scope"}),props.children]}),jsx38(Stack6,{children:(props.scope??"openid").split(" ").map(scopeName=>{let additionalScopes;return openConditionScope.test(scopeName)?additionalScopes=[scopeName+encounterDiagnosis,scopeName+problemListItem,scopeName+healthConcern]:openObservationScope.test(scopeName)&&(additionalScopes=[scopeName+clinicalTest,scopeName+laboratory,scopeName+socialHistory,scopeName+sdoh,scopeName+survey,scopeName+vitalSigns]),jsxs22(Fragment12,{children:[jsx38(Checkbox,{id:scopeName,name:scopeName,label:scopeName,defaultChecked:!0},scopeName),additionalScopes?.map(scope=>jsx38(Checkbox,{id:scope,name:scope,label:scope},scope))]},scopeName+"_group")})}),jsx38(Group11,{justify:"flex-end",mt:"xl",children:jsx38(SubmitButton,{fullWidth:!0,children:props.submitLabel??"Set Scope"})})]})})}import{Button as Button5,Center as Center3,Stack as Stack8,Text as Text11,Title as Title4}from"@mantine/core";import{useState as useState19}from"react";import{Alert as Alert2,Center as Center2,Image as Image2,Stack as Stack7,Text as Text10,TextInput as TextInput4,Title as Title3}from"@mantine/core";import{normalizeErrorString as normalizeErrorString5}from"@medplum/core";import{useState as useState18}from"react";import{jsx as jsx39,jsxs as jsxs23}from"react/jsx-runtime";function MfaForm(props){let[errorMessage,setErrorMessage]=useState18();return jsxs23(Form,{onSubmit:formData=>{setErrorMessage(void 0),props.onSubmit(formData)?.catch(err=>setErrorMessage(normalizeErrorString5(err)))},children:[jsxs23(Center2,{style:{flexDirection:"column"},children:[jsx39(Logo,{size:32}),jsx39(Title3,{order:3,py:"lg",children:props.title}),!props.qrCodeUrl&&props.description&&jsx39(Text10,{c:"dimmed",mb:"lg",mt:"-lg",ta:"center",children:props.description})]}),errorMessage&&jsx39(Alert2,{icon:jsx39(IconAlertCircle,{size:16}),title:"Error",color:"red",mb:"lg",children:errorMessage}),props.qrCodeUrl&&jsx39(Center2,{children:jsxs23(Stack7,{mb:"xl",justify:"center",children:[props.description&&jsx39(Text10,{c:"dimmed",mb:"md",mt:"-lg",ta:"center",children:props.description}),jsx39(Image2,{src:props.qrCodeUrl,alt:"Multi Factor Auth QR Code",w:"60%",mx:"auto",radius:"md",p:"xs",bg:"var(--mantine-color-white)",style:{border:"1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-4))"}})]})}),jsx39(Stack7,{gap:"sm",children:jsx39(TextInput4,{name:"token",label:"MFA code",autoComplete:"one-time-code",required:!0,autoFocus:!0})}),jsxs23(Stack7,{gap:"xs",pt:"md",children:[jsx39(SubmitButton,{fullWidth:!0,children:props.buttonText}),props.footer]})]})}import{jsx as jsx40,jsxs as jsxs24}from"react/jsx-runtime";function MfaEnrollForm(props){let{allowedMethods,qrCodeUrl,onEnrollEmail,onEnrollTotp}=props,[selected,setSelected]=useState19(),emailAllowed=allowedMethods.includes("email"),totpAllowed=allowedMethods.includes("totp");return emailAllowed&&totpAllowed&&!selected?jsxs24(Center3,{style:{flexDirection:"column"},children:[jsx40(Logo,{size:32}),jsx40(Title4,{order:3,py:"lg",ta:"center",children:"Set up multi-factor authentication"}),jsxs24(Stack8,{w:"100%",children:[jsx40(Text11,{c:"dimmed",ta:"center",children:"Choose how you want to verify your identity when you sign in."}),jsx40(Button5,{fullWidth:!0,onClick:()=>setSelected("totp"),children:"Use an authenticator app (recommended)"}),jsx40(Button5,{fullWidth:!0,variant:"default",onClick:onEnrollEmail,children:"Continue with email-based MFA"})]})]}):emailAllowed&&!totpAllowed?jsxs24(Center3,{style:{flexDirection:"column"},children:[jsx40(Logo,{size:32}),jsx40(Title4,{order:3,py:"lg",children:"Set up email-based MFA"}),jsxs24(Stack8,{w:"100%",children:[jsx40(Text11,{c:"dimmed",ta:"center",children:"When you sign in, we'll email you a verification code to confirm your identity."}),jsx40(Button5,{fullWidth:!0,onClick:onEnrollEmail,children:"Enable email-based MFA"})]})]}):jsx40(MfaForm,{title:props.totpTitle,description:props.totpDescription,buttonText:props.totpButtonText??"Enroll",qrCodeUrl,onSubmit:fields=>onEnrollTotp(fields.token)})}import{Anchor as Anchor3}from"@mantine/core";import{showNotification as showNotification3}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString6}from"@medplum/core";import{useState as useState20}from"react";import{Fragment as Fragment13,jsx as jsx41,jsxs as jsxs25}from"react/jsx-runtime";function MfaVerificationForm(props){let{methods,email,onRequestEmailCode,onSubmit}=props,[emailMode,setEmailMode]=useState20(!!props.initialEmailMode),requestEmailCode=()=>{Promise.resolve(onRequestEmailCode()).then(()=>setEmailMode(!0)).catch(err=>showNotification3({color:"red",message:normalizeErrorString6(err)}))},footer;return emailMode?footer=jsx41(Anchor3,{component:"button",type:"button",size:"sm",ta:"center",onClick:requestEmailCode,children:"Resend code"}):methods.includes("email")&&(footer=jsx41(Anchor3,{component:"button",type:"button",size:"sm",ta:"center",onClick:requestEmailCode,children:"Get a code by email instead"})),jsx41(MfaForm,{title:emailMode?"Enter verification code":"Enter MFA code",description:emailMode?jsxs25(Fragment13,{children:["Enter the 6-digit code we emailed",email?" to ":"",email&&jsx41("strong",{children:email})]}):"Enter the code from your authenticator app.",buttonText:props.buttonText??"Submit code",onSubmit:fields=>onSubmit(fields.token),footer})}import{normalizeOperationOutcome as normalizeOperationOutcome5}from"@medplum/core";import{useMedplum as useMedplum13}from"@medplum/react-hooks";import{useEffect as useEffect6,useState as useState24}from"react";import{Alert as Alert3}from"@mantine/core";import{isOk,operationOutcomeIssueToString}from"@medplum/core";import{jsx as jsx42}from"react/jsx-runtime";function OperationOutcomeAlert(props){let{outcome,issues:issuesProp,displayOkOutcomes,...spacingProps}=props,issues=outcome?.issue||issuesProp;return!issues||issues.length===0||outcome&&isOk(outcome)&&!displayOkOutcomes?null:jsx42(Alert3,{icon:jsx42(IconAlertCircle,{size:16}),color:"red",...spacingProps,children:issues.map(issue=>jsx42("div",{"data-testid":"text-field-error",children:operationOutcomeIssueToString(issue)},issue.details?.text))})}import{Anchor as Anchor4,Flex as Flex4,Stack as Stack9,Text as Text12,TextInput as TextInput5,Title as Title5}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome3}from"@medplum/core";import{useMedplum as useMedplum11}from"@medplum/react-hooks";import{useState as useState21}from"react";import{jsx as jsx43,jsxs as jsxs26}from"react/jsx-runtime";function NewProjectForm(props){let medplum=useMedplum11(),[outcome,setOutcome]=useState21(),issues=getIssuesForExpression(outcome,void 0);return jsxs26(Form,{onSubmit:async formData=>{try{props.handleAuthResponse(await medplum.startNewProject({login:props.login,projectName:formData.projectName}))}catch(err){setOutcome(normalizeOperationOutcome3(err))}},children:[jsxs26(Flex4,{direction:"column",align:"center",justify:"center",children:[jsx43(Logo,{size:32}),jsx43(Title5,{order:3,py:"lg",children:"Create a new project"})]}),jsx43(OperationOutcomeAlert,{issues,mb:"lg"}),jsx43(Stack9,{gap:"sm",children:jsx43(TextInput5,{name:"projectName",label:"Project Name",placeholder:"My Project",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"projectName")})}),jsxs26(Stack9,{gap:"xs",mt:"md",children:[jsx43(SubmitButton,{fullWidth:!0,children:"Create Project"}),jsxs26(Text12,{c:"dimmed",size:"xs",pt:"lg",ta:"center",children:['By clicking "Create Project" you agree to the Medplum'," ",jsx43(Anchor4,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx43(Anchor4,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]})]})]})}import{Anchor as Anchor5,Box as Box8,Checkbox as Checkbox2,Divider as Divider3,Flex as Flex5,Stack as Stack10,Text as Text13,TextInput as TextInput6}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome4}from"@medplum/core";import{useMedplum as useMedplum12}from"@medplum/react-hooks";import{useEffect as useEffect5,useState as useState23}from"react";import{Box as Box7}from"@mantine/core";import{useEffect as useEffect4,useRef as useRef5,useState as useState22}from"react";function createScriptTag(src,onload){let head=document.getElementsByTagName("head")[0],script=document.createElement("script");script.async=!0,script.src=src,script.onload=onload??null,head.appendChild(script)}import{jsx as jsx44}from"react/jsx-runtime";function GoogleButton(props){let{googleClientId,handleGoogleCredential}=props,parentRef=useRef5(null),[scriptLoaded,setScriptLoaded]=useState22(typeof google<"u"),initializedRef=useRef5(!1),buttonRenderedRef=useRef5(!1);return useEffect4(()=>{if(typeof google>"u"){createScriptTag("https://accounts.google.com/gsi/client",()=>setScriptLoaded(!0));return}initializedRef.current||(google.accounts.id.initialize({client_id:googleClientId,callback:handleGoogleCredential}),initializedRef.current=!0),parentRef.current&&!buttonRenderedRef.current&&(google.accounts.id.renderButton(parentRef.current,{type:"standard",logo_alignment:"center",width:parentRef.current.clientWidth}),buttonRenderedRef.current=!0)},[googleClientId,scriptLoaded,handleGoogleCredential]),googleClientId?jsx44(Box7,{ref:parentRef,w:"100%",h:40,display:"flex",style:{justifyContent:"center"}}):null}import{locationUtils as locationUtils3}from"@medplum/core";function getGoogleClientId(clientId){if(clientId)return clientId;let origin=locationUtils3.getOrigin();if(origin&&("undefined"?.split(",")??[]).includes(origin))return"__GOOGLE_CLIENT_ID__"}function initRecaptcha(siteKey){typeof grecaptcha>"u"&&createScriptTag("https://www.google.com/recaptcha/api.js?render="+siteKey)}function getRecaptcha(siteKey){return new Promise((resolve,reject)=>{grecaptcha.ready(async()=>{try{resolve(await grecaptcha.execute(siteKey,{action:"submit"}))}catch(err){reject(err)}})})}import{Fragment as Fragment14,jsx as jsx45,jsxs as jsxs27}from"react/jsx-runtime";function NewUserForm(props){let googleClientId=getGoogleClientId(props.googleClientId),recaptchaSiteKey=props.recaptchaSiteKey,medplum=useMedplum12(),[outcome,setOutcome]=useState23(),issues=getIssuesForExpression(outcome,void 0);return useEffect5(()=>{recaptchaSiteKey&&initRecaptcha(recaptchaSiteKey)},[recaptchaSiteKey]),jsxs27(Form,{onSubmit:async formData=>{setOutcome(void 0);try{let recaptchaToken="";recaptchaSiteKey&&(recaptchaToken=await getRecaptcha(recaptchaSiteKey)),props.handleAuthResponse(await medplum.startNewUser({projectId:props.projectId,clientId:props.clientId,firstName:formData.firstName,lastName:formData.lastName,email:formData.email,password:formData.password,remember:formData.remember==="true",recaptchaSiteKey,recaptchaToken}))}catch(err){setOutcome(normalizeOperationOutcome4(err))}},children:[jsx45(Flex5,{direction:"column",align:"center",justify:"center",children:props.children}),jsx45(OperationOutcomeAlert,{issues,mb:"lg"}),googleClientId&&jsxs27(Fragment14,{children:[jsx45(Box8,{style:{minHeight:40},children:jsx45(GoogleButton,{googleClientId,handleGoogleCredential:async response=>{try{props.handleAuthResponse(await medplum.startGoogleLogin({googleClientId:response.clientId,googleCredential:response.credential,projectId:props.projectId,createUser:!0}))}catch(err){setOutcome(normalizeOperationOutcome4(err))}}})}),jsx45(Divider3,{label:"or",labelPosition:"center",my:"lg"})]}),jsxs27(Stack10,{gap:"sm",children:[jsx45(TextInput6,{name:"firstName",type:"text",label:"First name",placeholder:"First name",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"firstName")}),jsx45(TextInput6,{name:"lastName",type:"text",label:"Last name",placeholder:"Last name",required:!0,error:getErrorsForInput(outcome,"lastName")}),jsx45(TextInput6,{name:"email",type:"email",label:"Email",placeholder:"name@domain.com",required:!0,error:getErrorsForInput(outcome,"email")}),jsx45(PasswordInput,{name:"password",label:"Password",autoComplete:"off",required:!0,error:getErrorsForInput(outcome,"password")})]}),jsxs27(Stack10,{gap:"xs",children:[jsx45(Checkbox2,{id:"remember",name:"remember",label:"Remember me",size:"xs",style:{lineHeight:1},pt:"md",pb:"xs"}),jsx45(SubmitButton,{fullWidth:!0,children:"Register Account"}),props.onSignIn&&jsxs27(Text13,{size:"sm",mt:"lg",c:"dimmed",ta:"center","data-dashlane-ignore":"true","data-lp-ignore":"true","data-no-autofill":"true","data-form-type":"navigation",children:["Already have an account?"," ",jsx45(Anchor5,{component:"button",type:"button",onClick:props.onSignIn,children:"Sign In"})]}),jsxs27(Text13,{c:"dimmed",size:"xs",pt:"lg",ta:"center",children:['By clicking "Register Account" you agree to the Medplum'," ",jsx45(Anchor5,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx45(Anchor5,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]}),jsxs27(Text13,{c:"dimmed",size:"xs",ta:"center",children:["This site is protected by reCAPTCHA and the Google"," ",jsx45(Anchor5,{href:"https://policies.google.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx45(Anchor5,{href:"https://policies.google.com/terms",children:"Terms\xA0of\xA0Service"})," apply."]})]})]})}import{jsx as jsx46,jsxs as jsxs28}from"react/jsx-runtime";function RegisterForm(props){let{type,projectId,clientId,googleClientId,recaptchaSiteKey,onSuccess,onSignIn}=props,medplum=useMedplum13(),[login,setLogin]=useState24(props.login),[outcome,setOutcome]=useState24(),[emailVerificationRequired,setEmailVerificationRequired]=useState24(!1);useEffect6(()=>{type==="patient"&&login&&medplum.startNewPatient({login,projectId}).then(response=>medplum.processCode(response.code)).then(()=>onSuccess()).catch(err=>setOutcome(normalizeOperationOutcome5(err)))},[medplum,type,projectId,login,onSuccess]);function handleAuthResponse(response){response.code&&medplum.processCode(response.code).then(()=>onSuccess()).catch(err=>setOutcome(normalizeOperationOutcome5(err))),response.login&&setLogin(response.login),response.emailVerificationRequired&&setEmailVerificationRequired(!0)}let issues=getIssuesForExpression(outcome,void 0);return jsxs28(Document,{width:400,px:"xl",py:"xl",bdrs:"md",children:[jsx46(OperationOutcomeAlert,{issues,mb:"lg"}),!login&&jsx46(NewUserForm,{projectId,clientId,googleClientId,recaptchaSiteKey,onSignIn,handleAuthResponse,children:props.children}),emailVerificationRequired&&jsx46("div",{children:"Please check your email for a verification link. Click the link to continue setting up your account."}),login&&!emailVerificationRequired&&type==="project"&&jsx46(NewProjectForm,{login,handleAuthResponse})]})}import{Anchor as Anchor6,Flex as Flex6,Stack as Stack11,Text as Text14,TextInput as TextInput7,Title as Title6}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome6}from"@medplum/core";import{useMedplum as useMedplum14}from"@medplum/react-hooks";import{useEffect as useEffect7,useState as useState25}from"react";import{Fragment as Fragment15,jsx as jsx47,jsxs as jsxs29}from"react/jsx-runtime";function ResetPasswordForm(props){let{projectId,recaptchaSiteKey,onSuccess,onSignIn,onRegister}=props,medplum=useMedplum14(),[outcome,setOutcome]=useState25(),[success,setSuccess]=useState25(!1);return useEffect7(()=>{recaptchaSiteKey&&initRecaptcha(recaptchaSiteKey)},[recaptchaSiteKey]),jsx47(Document,{width:400,px:"xl",py:"xl",bdrs:"md",children:jsxs29(Form,{onSubmit:async formData=>{setOutcome(void 0);try{let recaptchaToken="";recaptchaSiteKey&&(recaptchaToken=await getRecaptcha(recaptchaSiteKey)),await medplum.post("auth/resetpassword",{...formData,projectId,recaptchaToken}),setSuccess(!0),onSuccess?.()}catch(err){setOutcome(normalizeOperationOutcome6(err))}},children:[jsxs29(Flex6,{direction:"column",align:"center",justify:"center",children:[jsx47(Logo,{size:32}),jsx47(Title6,{order:3,py:"lg",children:"Reset your password"})]}),jsx47(OperationOutcomeAlert,{issues:getIssuesForExpression(outcome,void 0),mb:"lg"}),!success&&jsxs29(Fragment15,{children:[jsx47(Stack11,{gap:"sm",mb:"md",children:jsx47(TextInput7,{name:"email",type:"email",label:"Email",placeholder:"name@domain.com",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"email")})}),jsxs29(Stack11,{gap:"xs",children:[jsx47(SubmitButton,{fullWidth:!0,children:"Reset Password"}),onSignIn&&jsx47(Text14,{size:"sm",mt:"lg",c:"dimmed",style:{textAlign:"center"},"data-dashlane-ignore":"true","data-lp-ignore":"true","data-no-autofill":"true","data-form-type":"navigation",children:jsx47(Anchor6,{onClick:onSignIn,children:"Back to Sign In"})}),onRegister&&jsxs29(Text14,{size:"sm",mt:"none",c:"dimmed",style:{textAlign:"center"},"data-dashlane-ignore":"true","data-lp-ignore":"true","data-no-autofill":"true","data-form-type":"navigation",children:["Don't have an account? ",jsx47(Anchor6,{onClick:onRegister,children:"Sign Up"})]})]})]}),success&&jsx47(Text14,{c:"dimmed",size:"sm",ta:"center",mt:"md",children:"If the account exists on our system, a password reset email will be sent."})]})})}import{Anchor as Anchor7,Button as Button6,Flex as Flex7,Group as Group12,Stack as Stack12,Title as Title7}from"@mantine/core";import{badRequest,normalizeOperationOutcome as normalizeOperationOutcome7}from"@medplum/core";import{useMedplum as useMedplum15}from"@medplum/react-hooks";import{useState as useState26}from"react";import{jsx as jsx48,jsxs as jsxs30}from"react/jsx-runtime";function SetPasswordForm(props){let{id,secret,onSuccess,onSignIn}=props,medplum=useMedplum15(),[outcome,setOutcome]=useState26(),[success,setSuccess]=useState26(!1),issues=getIssuesForExpression(outcome,void 0);return jsxs30(Document,{width:450,children:[jsx48(OperationOutcomeAlert,{issues}),jsxs30(Form,{onSubmit:formData=>{if(formData.password!==formData.confirmPassword){setOutcome(badRequest("Passwords do not match","confirmPassword"));return}setOutcome(void 0),medplum.post("auth/setpassword",{id,secret,password:formData.password}).then(()=>{setSuccess(!0),onSuccess?.()}).catch(err=>setOutcome(normalizeOperationOutcome7(err)))},children:[jsxs30(Flex7,{direction:"column",align:"center",justify:"center",children:[jsx48(Logo,{size:32}),jsx48(Title7,{children:"Set password"})]}),!success&&jsxs30(Stack12,{children:[jsx48(PasswordInput,{name:"password",label:"New password",required:!0,error:getErrorsForInput(outcome,"password")}),jsx48(PasswordInput,{name:"confirmPassword",label:"Confirm new password",required:!0,error:getErrorsForInput(outcome,"confirmPassword")}),jsx48(Group12,{justify:"flex-end",mt:"xl",children:jsx48(Button6,{type:"submit",children:"Set password"})})]}),success&&jsxs30("div",{"data-testid":"success",children:["Password set. You can now\xA0",onSignIn?jsx48(Anchor7,{component:"button",type:"button",onClick:onSignIn,children:"sign in"}):"sign in","."]})]})]})}import{showNotification as showNotification4}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useMedplum as useMedplum18}from"@medplum/react-hooks";import{useCallback as useCallback6,useEffect as useEffect8,useRef as useRef6,useState as useState29}from"react";import{ActionIcon as ActionIcon3,Anchor as Anchor8,Box as Box9,Checkbox as Checkbox3,Divider as Divider4,Flex as Flex8,Stack as Stack13,Text as Text15,TextInput as TextInput8}from"@mantine/core";import{locationUtils as locationUtils4,normalizeOperationOutcome as normalizeOperationOutcome8}from"@medplum/core";import{useMedplum as useMedplum16}from"@medplum/react-hooks";import{useCallback as useCallback5,useState as useState27}from"react";import{Fragment as Fragment16,jsx as jsx49,jsxs as jsxs31}from"react/jsx-runtime";function AuthenticationForm(props){let[email,setEmail]=useState27();return email?jsx49(PasswordForm,{email,resetEmail:()=>setEmail(void 0),...props}):jsx49(EmailForm,{setEmail,...props})}function EmailForm(props){let{setEmail,onRegister,handleAuthResponse,children,disableEmailAuth,...baseLoginRequest}=props,medplum=useMedplum16(),googleClientId=!props.disableGoogleAuth&&getGoogleClientId(props.googleClientId),[outcome,setOutcome]=useState27(),issues=getIssuesForExpression(outcome,void 0),isExternalAuth=useCallback5(async authMethod=>{if(!authMethod.authorizeUrl)return!1;let state=JSON.stringify({...await medplum.ensureCodeChallenge(baseLoginRequest),domain:authMethod.domain,returnTo:locationUtils4.getLocation()}),url=new URL(authMethod.authorizeUrl);return url.searchParams.set("state",state),locationUtils4.assign(url.toString()),!0},[medplum,baseLoginRequest]),handleSubmit=useCallback5(async formData=>{let authMethod=await medplum.post("auth/method",{email:formData.email});await isExternalAuth(authMethod)||setEmail(formData.email)},[medplum,isExternalAuth,setEmail]),handleGoogleCredential=useCallback5(async response=>{try{let authResponse=await medplum.startGoogleLogin({...baseLoginRequest,googleCredential:response.credential});await isExternalAuth(authResponse)||handleAuthResponse(authResponse)}catch(err){setOutcome(normalizeOperationOutcome8(err))}},[medplum,baseLoginRequest,isExternalAuth,handleAuthResponse]);return jsxs31(Form,{onSubmit:handleSubmit,children:[jsx49(Flex8,{direction:"column",align:"center",justify:"center",children}),jsx49(OperationOutcomeAlert,{issues,mb:"lg"}),googleClientId&&jsxs31(Fragment16,{children:[jsx49(Box9,{style:{minHeight:40},children:jsx49(GoogleButton,{googleClientId,handleGoogleCredential})}),!disableEmailAuth&&jsx49(Divider4,{label:"or",labelPosition:"center",my:"lg"})]}),!disableEmailAuth&&jsx49(TextInput8,{name:"email",type:"email",label:"Email",mb:"md",placeholder:"name@domain.com",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"email"),"data-testid":"auth.email"}),jsxs31(Stack13,{gap:"xs",children:[!disableEmailAuth&&jsx49(SubmitButton,{fullWidth:!0,children:"Continue"}),onRegister&&jsxs31(Text15,{size:"sm",mt:"lg",c:"dimmed",style:{textAlign:"center"},"data-dashlane-ignore":"true","data-lp-ignore":"true","data-no-autofill":"true","data-form-type":"navigation",children:["Don\u2019t have an account? ",jsx49(Anchor8,{onClick:onRegister,children:"Register"})]})]})]})}function PasswordForm(props){let{onForgotPassword,handleAuthResponse,children,...baseLoginRequest}=props,medplum=useMedplum16(),[outcome,setOutcome]=useState27(),issues=getIssuesForExpression(outcome,void 0),handleSubmit=useCallback5(formData=>medplum.startLogin({...baseLoginRequest,password:formData.password,remember:formData.remember==="on"}).then(handleAuthResponse).catch(err=>setOutcome(normalizeOperationOutcome8(err))),[medplum,baseLoginRequest,handleAuthResponse]);return jsxs31(Form,{onSubmit:handleSubmit,children:[jsx49(Flex8,{direction:"column",align:"center",justify:"center",children}),jsx49(OperationOutcomeAlert,{issues,mb:"lg"}),jsxs31(Stack13,{gap:"sm",children:[jsx49(TextInput8,{label:"Email",value:props.email,disabled:!0,rightSectionWidth:36,rightSection:jsx49(ActionIcon3,{variant:"subtle",color:"gray",onClick:props.resetEmail,"aria-label":"Change email",children:jsx49(IconPencil,{size:"1rem",stroke:1.5})})}),jsx49(PasswordInput,{name:"password",label:"Password",autoComplete:"off",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"password"),"data-testid":"auth.password"})]}),jsxs31(Stack13,{gap:"xs",children:[jsx49(Checkbox3,{id:"remember",name:"remember",label:"Remember me",size:"xs",style:{lineHeight:1},pt:"md",pb:"xs"}),jsx49(SubmitButton,{children:"Sign In"}),onForgotPassword&&jsx49(Text15,{size:"sm",mt:"lg",c:"dimmed",style:{textAlign:"center"},"data-dashlane-ignore":"true","data-lp-ignore":"true","data-no-autofill":"true","data-form-type":"navigation",children:jsx49(Anchor8,{onClick:onForgotPassword,children:"Reset Password"})})]})]})}import{Anchor as Anchor9,Combobox as Combobox2,Flex as Flex9,Stack as Stack14,Text as Text16,TextInput as TextInput9,Title as Title8,useCombobox as useCombobox2}from"@mantine/core";import{getIdentifier,normalizeOperationOutcome as normalizeOperationOutcome9}from"@medplum/core";import{useMedplum as useMedplum17}from"@medplum/react-hooks";import{useState as useState28}from"react";import{jsx as jsx50,jsxs as jsxs32}from"react/jsx-runtime";function ChooseProfileForm(props){let medplum=useMedplum17(),combobox=useCombobox2(),[search,setSearch]=useState28(""),[outcome,setOutcome]=useState28();function filterDisplay(display){return!!display?.toLowerCase()?.includes(search.toLowerCase())}function filterMembership(membership){return filterDisplay(membership.profile?.display)||filterDisplay(membership.project?.display)||filterDisplay(getMembershipLabel(membership))}function handleValueSelect(membershipId){medplum.post("auth/profile",{login:props.login,profile:membershipId}).then(props.handleAuthResponse).catch(err=>setOutcome(normalizeOperationOutcome9(err)))}let options=props.memberships.filter(filterMembership).slice(0,10).map(item=>jsx50(Combobox2.Option,{value:item.id,className:ProjectLoginOption_default.interactive,children:jsx50(ProjectMembershipLoginOption,{membership:item,label:getMembershipLabel(item)})},item.id));return jsxs32(Stack14,{gap:"0",children:[jsxs32(Flex9,{justify:"center",align:"center",direction:"column",wrap:"nowrap",children:[jsx50(Logo,{size:32}),jsx50(Title8,{order:3,py:"lg",children:"Choose a Project"})]}),jsx50(OperationOutcomeAlert,{outcome,mb:"lg"}),jsxs32(Combobox2,{store:combobox,onOptionSubmit:handleValueSelect,children:[jsx50(Combobox2.EventsTarget,{children:jsx50(TextInput9,{placeholder:"Search",value:search,mb:"md",autoFocus:!0,leftSection:jsx50(IconSearch,{size:16}),onChange:event=>{setSearch(event.currentTarget.value),combobox.updateSelectedOptionIndex()}})}),jsx50("div",{children:jsx50(Combobox2.Options,{style:{marginLeft:"-10px",marginRight:"-10px",marginBottom:"-10px"},children:options.length>0?options:jsx50(Combobox2.Empty,{children:"Nothing found..."})})})]}),jsx50(Text16,{size:"sm",ta:"center",mt:"md",children:jsx50(Anchor9,{component:"button",type:"button",onClick:()=>{window.location.href=`/signin?project=new&login=${props.login}`},children:"Create a new project"})})]})}function getMembershipLabel(membership){return getIdentifier(membership,"https://medplum.com/identifier/label")}import{jsx as jsx51}from"react/jsx-runtime";function SignInForm(props){let{login:loginCode,chooseScopes,chooseScopeFormProps,onSuccess,onForgotPassword,onRegister,onCode,...baseLoginRequest}=props,medplum=useMedplum18(),[login,setLogin]=useState29(),loginRequested=useRef6(!1),[mfaEnrollRequired,setMfaEnrollRequired]=useState29(!1),[enrollQrCode,setEnrollQrCode]=useState29(),[enrollMethods,setEnrollMethods]=useState29(),[mfaRequired,setMfaRequired]=useState29(!1),[mfaMethods,setMfaMethods]=useState29(),[mfaEmail,setMfaEmail]=useState29(),[mfaEmailMode,setMfaEmailMode]=useState29(!1),[memberships,setMemberships]=useState29(),handleCode=useCallback6(code=>{onCode?onCode(code):medplum.processCode(code).then(()=>{onSuccess&&onSuccess()}).catch(err=>showNotification4({color:"red",message:normalizeErrorString7(err)}))},[medplum,onCode,onSuccess]),handleAuthResponse=useCallback6(response=>{if(setMfaEnrollRequired(!!response.mfaEnrollRequired),setEnrollQrCode(response.enrollQrCode),setEnrollMethods(response.allowedMfaMethods),setMfaRequired(!!response.mfaRequired),response.mfaRequired){let methods=response.mfaMethods;setMfaMethods(methods),setMfaEmail(response.email),methods?.length===1&&methods[0]==="email"&&setMfaEmailMode(!0)}else setMfaMethods(void 0),setMfaEmail(void 0),setMfaEmailMode(!1);response.login&&setLogin(response.login),response.memberships&&setMemberships(response.memberships),response.code&&(chooseScopes?setMemberships(void 0):handleCode(response.code))},[chooseScopes,handleCode]),requestEmailCode=useCallback6(async()=>{login&&await medplum.post("auth/mfa/send-email",{login})},[medplum,login]),enrollEmail=useCallback6(()=>{login&&medplum.post("auth/mfa/login-enroll",{login,method:"email"}).then(handleAuthResponse).catch(err=>showNotification4({color:"red",message:normalizeErrorString7(err)}))},[medplum,login,handleAuthResponse]),handleScopeResponse=useCallback6(response=>{handleCode(response.code)},[handleCode]);return useEffect8(()=>{loginCode&&!loginRequested.current&&!login&&(loginRequested.current=!0,medplum.get("auth/login/"+loginCode).then(handleAuthResponse).catch(err=>showNotification4({color:"red",message:normalizeErrorString7(err)})))},[medplum,loginCode,loginRequested,login,handleAuthResponse]),jsx51(Document,{width:400,px:"xl",py:"xl",bdrs:"md",children:login?mfaEnrollRequired?jsx51(MfaEnrollForm,{allowedMethods:enrollMethods??["totp"],qrCodeUrl:enrollQrCode,onEnrollEmail:enrollEmail,totpTitle:"Enroll in MFA",totpDescription:"Scan this QR code with your authenticator app.",onEnrollTotp:async token=>{let res=await medplum.post("auth/mfa/login-enroll",{login,method:"totp",token});handleAuthResponse(res)}}):mfaRequired?jsx51(MfaVerificationForm,{methods:mfaMethods??[],email:mfaEmail,initialEmailMode:mfaEmailMode,onRequestEmailCode:requestEmailCode,onSubmit:async token=>{let res=await medplum.post("auth/mfa/verify",{login,token});handleAuthResponse(res)}}):props.projectId==="new"?jsx51(NewProjectForm,{login,handleAuthResponse}):memberships?jsx51(ChooseProfileForm,{login,memberships,handleAuthResponse}):props.chooseScopes?jsx51(ChooseScopeForm,{login,scope:props.scope,handleAuthResponse:handleScopeResponse,...chooseScopeFormProps}):jsx51("div",{children:"Success"}):jsx51(AuthenticationForm,{onForgotPassword,onRegister,handleAuthResponse,disableGoogleAuth:props.disableGoogleAuth,disableEmailAuth:props.disableEmailAuth,...baseLoginRequest,children:props.children})})}import{buildElementsContext as buildElementsContext2,getPathDisplayName as getPathDisplayName3,isEmpty as isEmpty2,tryGetDataType}from"@medplum/core";import{useContext as useContext6,useMemo as useMemo6}from"react";import{ActionIcon as ActionIcon4,CopyButton,Flex as Flex10,Tooltip as Tooltip3}from"@mantine/core";import{formatDateTime,formatPeriod,formatTiming,formatWallTime,isEmpty,isObject,isString,PropertyType}from"@medplum/core";import{useState as useState32}from"react";import{formatCodeableConcept}from"@medplum/core";import{Fragment as Fragment17,jsx as jsx52}from"react/jsx-runtime";function CodeableConceptDisplay(props){return jsx52(Fragment17,{children:formatCodeableConcept(props.value)})}import{formatCoding}from"@medplum/core";import{Fragment as Fragment18,jsx as jsx53}from"react/jsx-runtime";function CodingDisplay(props){return jsx53(Fragment18,{children:formatCoding(props.value,props.includeCode)})}import{Fragment as Fragment19,jsx as jsx54}from"react/jsx-runtime";function ContactPointDisplay(props){let contactPoint=props.value;if(!contactPoint)return null;let builder=[];return contactPoint.value&&builder.push(contactPoint.value),(contactPoint.use||contactPoint.system)&&(builder.push(" ["),contactPoint.use&&builder.push(contactPoint.use),contactPoint.use&&contactPoint.system&&builder.push(" "),contactPoint.system&&builder.push(contactPoint.system),builder.push("]")),jsx54(Fragment19,{children:builder.join("").trim()})}import{Fragment as Fragment20,jsx as jsx55,jsxs as jsxs33}from"react/jsx-runtime";function ContactDetailDisplay(props){let contactDetail=props.value;return contactDetail?jsxs33(Fragment20,{children:[contactDetail.name,contactDetail.name&&": ",contactDetail.telecom?.map(telecom=>jsx55(ContactPointDisplay,{value:telecom},`telecom-${contactDetail.name}-${telecom.value}`))]}):null}import{getDataType,isPopulated as isPopulated3,isProfileLoaded,tryGetProfile}from"@medplum/core";import{useMedplum as useMedplum19}from"@medplum/react-hooks";import{useContext as useContext3,useEffect as useEffect9,useMemo as useMemo3,useState as useState30}from"react";import{getTypedPropertyValue,getTypedPropertyValueWithSchema}from"@medplum/core";function getValueAndType(context,path,profileUrl){let typedResult=getTypedPropertyValue(context,path,{profileUrl});return typedResult?Array.isArray(typedResult)?[typedResult.map(e=>e.value),typedResult[0].type]:[typedResult.value,typedResult.type]:[void 0,"undefined"]}function getValueAndTypeFromElement(typedValue,path,element){let typedResult=getTypedPropertyValueWithSchema(typedValue,path,element);return typedResult?Array.isArray(typedResult)?[typedResult.map(e=>e.value),typedResult[0].type]:[typedResult.value,typedResult.type]:[void 0,"undefined"]}import{jsx as jsx56}from"react/jsx-runtime";function ExtensionDisplay(props){let{elementDefinitionType}=props,medplum=useMedplum19(),ctx=useContext3(ElementsContext),[typeSchema,setTypeSchema]=useState30(getDataType("Extension")),profileUrl=useMemo3(()=>{if(isPopulated3(elementDefinitionType?.profile))return elementDefinitionType.profile[0]},[elementDefinitionType]),[loadingProfile,setLoadingProfile]=useState30(profileUrl!==void 0);if(useEffect9(()=>{profileUrl&&(setLoadingProfile(!0),medplum.requestProfileSchema(profileUrl).then(()=>{let profile=tryGetProfile(profileUrl);setLoadingProfile(!1),profile&&setTypeSchema(profile)}).catch(reason=>{setLoadingProfile(!1),console.warn(reason)}))},[medplum,profileUrl]),profileUrl&&(loadingProfile||!isProfileLoaded(profileUrl)))return jsx56("div",{children:"Loading..."});if(typeSchema.elements["value[x]"]?.max!==0){let[propertyValue,propertyType]=getValueAndType({type:"Extension",value:props.value},"value[x]",profileUrl??ctx.profileUrl);return jsx56(ResourcePropertyDisplay,{propertyType,value:propertyValue})}return jsx56(BackboneElementDisplay,{path:props.path,value:{type:typeSchema.type,value:props.value},compact:props.compact,ignoreMissingValues:props.ignoreMissingValues,link:props.link,profileUrl})}import{formatHumanName as formatHumanName6}from"@medplum/core";import{Fragment as Fragment21,jsx as jsx57}from"react/jsx-runtime";function HumanNameDisplay(props){let name=props.value;return name?jsx57(Fragment21,{children:formatHumanName6(name,props.options)}):null}import{jsxs as jsxs34}from"react/jsx-runtime";function IdentifierDisplay(props){return jsxs34("div",{children:[props.value?.system,": ",props.value?.value]})}import{formatMoney}from"@medplum/core";import{Fragment as Fragment22,jsx as jsx58}from"react/jsx-runtime";function MoneyDisplay(props){return jsx58(Fragment22,{children:formatMoney(props.value)})}import{formatQuantity}from"@medplum/core";import{Fragment as Fragment23,jsx as jsx59}from"react/jsx-runtime";function QuantityDisplay(props){return jsx59(Fragment23,{children:formatQuantity(props.value,props.precision)})}import{formatRange}from"@medplum/core";import{Fragment as Fragment24,jsx as jsx60}from"react/jsx-runtime";function RangeDisplay(props){return jsx60(Fragment24,{children:formatRange(props.value,props.precision,props.exclusive)})}import{Fragment as Fragment25,jsx as jsx61,jsxs as jsxs35}from"react/jsx-runtime";function RatioDisplay(props){let value=props.value;return value?jsxs35(Fragment25,{children:[jsx61(QuantityDisplay,{value:value.numerator,precision:props.precision}),"\xA0/\xA0",jsx61(QuantityDisplay,{value:value.denominator,precision:props.precision})]}):null}import{stringify}from"@medplum/core";import{Fragment as Fragment26,jsx as jsx62}from"react/jsx-runtime";function ReferenceDisplay(props){if(!props.value)return null;let displayString=props.value.display||props.value.reference||stringify(props.value);return props.link!==!1&&props.value.reference?jsx62(MedplumLink,{to:props.value,children:displayString}):jsx62(Fragment26,{children:displayString})}import{Group as Group13,Text as Text17}from"@mantine/core";import{getPathDisplayName as getPathDisplayName2,isPopulated as isPopulated6}from"@medplum/core";import{useMedplum as useMedplum20}from"@medplum/react-hooks";import{useContext as useContext5,useEffect as useEffect10,useMemo as useMemo5,useState as useState31}from"react";import{getValueSliceName,isPopulated as isPopulated4,isSliceDefinitionWithTypes,tryGetProfile as tryGetProfile2}from"@medplum/core";function assignValuesIntoSlices(values,slices,slicing,profileUrl){if(!isPopulated4(slicing?.slices))return[values];let slicedValues=new Array(slices.length+1);for(let i=0;i<slicedValues.length;i++)slicedValues[i]=[];for(let value of values){let sliceName=getValueSliceName(value,slices,slicing.discriminator,profileUrl),sliceIndex=sliceName?slices.findIndex(slice=>slice.name===sliceName):-1;sliceIndex===-1&&(sliceIndex=slices.length),slicedValues[sliceIndex].push(value)}return slicedValues}async function prepareSlices({medplum,property}){return new Promise((resolve,reject)=>{if(!property.slicing){resolve([]);return}let supportedSlices=[],profileUrls=[],promises=[];for(let slice of property.slicing.slices){if(!isSliceDefinitionWithTypes(slice)){console.debug("Unsupported slice definition",slice);continue}let profileUrl;isPopulated4(slice.elements)||(profileUrl=slice.type[0]?.profile?.[0]),supportedSlices.push(slice),profileUrls.push(profileUrl),profileUrl&&promises.push(medplum.requestProfileSchema(profileUrl))}Promise.all(promises).then(()=>{for(let i=0;i<supportedSlices.length;i++){let slice=supportedSlices[i],profileUrl=profileUrls[i];if(profileUrl){let typeSchema=tryGetProfile2(profileUrl);slice.typeSchema=typeSchema}}resolve(supportedSlices)}).catch(reject)})}import{buildElementsContext,isPopulated as isPopulated5}from"@medplum/core";import{useContext as useContext4,useMemo as useMemo4}from"react";import{jsx as jsx63}from"react/jsx-runtime";function maybeWrapWithContext(ContextProvider,contextValue,contents){return contextValue!==void 0?jsx63(ContextProvider,{value:contextValue,children:contents}):contents}import{Fragment as Fragment27,jsx as jsx64}from"react/jsx-runtime";function SliceDisplay(props){let{slice,property}=props,sliceElements=slice.typeSchema?.elements??slice.elements,parentContext=useContext4(ElementsContext),contextValue=useMemo4(()=>{if(isPopulated5(sliceElements))return buildElementsContext({parentContext,elements:sliceElements,path:props.path,profileUrl:slice.typeSchema?.url})},[parentContext,props.path,slice.typeSchema?.url,sliceElements]);return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx64(Fragment27,{children:props.value.map((value,valueIndex)=>jsx64("div",{children:jsx64(ResourcePropertyDisplay,{property,path:props.path,arrayElement:!0,elementDefinitionType:slice.type[0],propertyType:slice.type[0].code,value,ignoreMissingValues:props.ignoreMissingValues,link:props.link})},`${valueIndex}-${props.value.length}`))}))}import{Fragment as Fragment28,jsx as jsx65,jsxs as jsxs36}from"react/jsx-runtime";var MAX_ARRAY_SIZE=50;function ResourceArrayDisplay(props){let{property,propertyType}=props,medplum=useMedplum20(),values=useMemo5(()=>Array.isArray(props.values)?props.values:[],[props.values]),[loading,setLoading]=useState31(!0),[slices,setSlices]=useState31([]),[slicedValues,setSlicedValues]=useState31(()=>[values]),[valuesLength,setValuesLength]=useState31(0),ctx=useContext5(ElementsContext);if(useEffect10(()=>{prepareSlices({medplum,property}).then(slices2=>{setValuesLength(values.length),setSlices(slices2);let limitedValues=values.slice(0,MAX_ARRAY_SIZE),slicedValues2=assignValuesIntoSlices(limitedValues,slices2,property.slicing,ctx.profileUrl);setSlicedValues(slicedValues2),setLoading(!1)}).catch(reason=>{console.error(reason),setLoading(!1)})},[medplum,property,ctx.profileUrl,setSlicedValues,values]),loading)return jsx65("div",{children:"Loading..."});let nonSliceContent;if(property.type[0]?.code!=="Extension"){let nonSliceValues=slicedValues[slices.length],nonSliceElements=nonSliceValues.map((value,valueIndex)=>jsx65("div",{children:jsx65(ResourcePropertyDisplay,{path:props.path,arrayElement:!0,property,propertyType,value,ignoreMissingValues:props.ignoreMissingValues,link:props.link})},`${valueIndex}-${nonSliceValues.length}`));if(props.includeDescriptionListEntry){if(!isPopulated6(props.path))throw new Error("props.path is required when includeDescriptionListEntry is true");let key=props.path.split(".").pop();nonSliceContent=jsx65(DescriptionListEntry,{term:getPathDisplayName2(key),children:nonSliceElements})}else nonSliceContent=jsx65(Fragment28,{children:nonSliceElements})}return jsxs36(Fragment28,{children:[slices.map((slice,sliceIndex)=>{if(!props.path)throw new Error(`Displaying a resource property with slices of type ${props.propertyType} requires path`);let sliceDisplay=jsx65(SliceDisplay,{path:props.path,slice,property,value:slicedValues[sliceIndex],ignoreMissingValues:props.ignoreMissingValues,link:props.link},slice.name);return props.includeDescriptionListEntry&&(sliceDisplay=jsx65(DescriptionListEntry,{term:getPathDisplayName2(slice.name),children:sliceDisplay},slice.name)),sliceDisplay}),nonSliceContent,valuesLength>MAX_ARRAY_SIZE&&jsx65(Group13,{justify:"right",children:jsxs36(Text17,{children:["... ",valuesLength," total values"]})})]})}import{Fragment as Fragment29,jsx as jsx66,jsxs as jsxs37}from"react/jsx-runtime";function ResourcePropertyDisplay(props){let{property,propertyType,value}=props;if(property?.path?.endsWith(".id"))return jsxs37(Flex10,{gap:3,align:"center",children:[value,!isEmpty(value)&&jsx66(CopyButton,{value,timeout:2e3,children:({copied,copy})=>jsx66(Tooltip3,{label:copied?"Copied":"Copy",withArrow:!0,position:"right",children:jsx66(ActionIcon4,{variant:"subtle",color:copied?"teal":"gray",onClick:copy,children:copied?jsx66(IconCheck,{size:"1rem"}):jsx66(IconCopy,{size:"1rem"})})})})]});if(property&&(property.isArray||property.max>1)&&!props.arrayElement)return propertyType===PropertyType.Attachment?jsx66(AttachmentArrayDisplay,{values:value,maxWidth:props.maxWidth,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,property,path:props.path}):jsx66(ResourceArrayDisplay,{path:props.path,property,propertyType,values:value,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,ignoreMissingValues:props.ignoreMissingValues,link:props.link});switch(propertyType){case PropertyType.boolean:return jsx66(Fragment29,{children:value===void 0?"":(!!value).toString()});case PropertyType.SystemString:case PropertyType.string:return props.property?.path?.toLowerCase().includes("secret")?jsx66(SecretFieldDisplay,{value}):jsx66("div",{style:{whiteSpace:"pre-wrap"},children:value});case PropertyType.code:case PropertyType.date:case PropertyType.decimal:case PropertyType.id:case PropertyType.integer:case PropertyType.positiveInt:case PropertyType.unsignedInt:case PropertyType.uri:case PropertyType.url:case PropertyType.xhtml:return isObject(value)&&!isString(value)?(console.warn("Non-standard FHIR data or missing primitive value with extension",{path:props.path,propertyType,value}),null):jsx66(Fragment29,{children:value?.toString()});case PropertyType.canonical:return jsx66(ReferenceDisplay,{value:{reference:value},link:props.link});case PropertyType.dateTime:case PropertyType.instant:return jsx66(Fragment29,{children:formatDateTime(value)});case PropertyType.time:return jsx66(Fragment29,{children:formatWallTime(value)});case PropertyType.markdown:return jsx66("pre",{children:value});case PropertyType.Address:return jsx66(AddressDisplay,{value});case PropertyType.Annotation:return jsx66(Fragment29,{children:value?.text});case PropertyType.Attachment:return jsx66(AttachmentDisplay,{value,maxWidth:props.maxWidth});case PropertyType.CodeableConcept:return jsx66(CodeableConceptDisplay,{value});case PropertyType.Coding:return jsx66(CodingDisplay,{value});case PropertyType.ContactDetail:return jsx66(ContactDetailDisplay,{value});case PropertyType.ContactPoint:return jsx66(ContactPointDisplay,{value});case PropertyType.HumanName:return jsx66(HumanNameDisplay,{value});case PropertyType.Identifier:return jsx66(IdentifierDisplay,{value});case PropertyType.Money:return jsx66(MoneyDisplay,{value});case PropertyType.Period:return jsx66(Fragment29,{children:formatPeriod(value)});case PropertyType.Quantity:case PropertyType.Duration:return jsx66(QuantityDisplay,{value});case PropertyType.Range:return jsx66(RangeDisplay,{value});case PropertyType.Ratio:return jsx66(RatioDisplay,{value});case PropertyType.Reference:return jsx66(ReferenceDisplay,{value,link:props.link});case PropertyType.Timing:return jsx66(Fragment29,{children:formatTiming(value)});case PropertyType.Dosage:case PropertyType.UsageContext:if(!props.path)throw new Error(`Displaying property of type ${props.propertyType} requires path`);return jsx66(BackboneElementDisplay,{path:props.path,value:{type:propertyType,value},compact:!0,ignoreMissingValues:props.ignoreMissingValues});case PropertyType.Extension:if(!props.path)throw new Error(`Displaying property of type ${props.propertyType} requires path`);return jsx66(ExtensionDisplay,{path:props.path,value,compact:!0,ignoreMissingValues:props.ignoreMissingValues,elementDefinitionType:props.elementDefinitionType});default:if(!property)throw new Error(`Displaying property of type ${props.propertyType} requires element schema`);if(!props.path)throw new Error(`Displaying property of type ${props.propertyType} requires path`);return jsx66(BackboneElementDisplay,{path:props.path,value:{type:property.type[0].code,value},compact:!0,ignoreMissingValues:props.ignoreMissingValues})}}function SecretFieldDisplay(props){let[isVisible,setIsVisible]=useState32(!1),secretValue=props.value??"",hasValue=!isEmpty(secretValue),MASK="\u2022".repeat(8);return jsxs37(Flex10,{gap:3,align:"center",children:[isVisible?jsx66("div",{style:{whiteSpace:"pre-wrap"},children:secretValue}):jsx66("div",{style:{whiteSpace:"pre-wrap"},"aria-hidden":"true",children:hasValue?MASK:""}),hasValue&&jsxs37(Fragment29,{children:[jsx66(CopyButton,{value:props.value,timeout:2e3,children:({copied,copy})=>jsx66(Tooltip3,{label:copied?"Copied":"Copy secret",withArrow:!0,position:"right",children:jsx66(ActionIcon4,{variant:"subtle",color:copied?"teal":"gray",onClick:copy,"aria-label":copied?"Copied":"Copy secret",children:copied?jsx66(IconCheck,{size:"1rem"}):jsx66(IconCopy,{size:"1rem"})})})}),jsx66(Tooltip3,{label:isVisible?"Hide secret":"Show secret",withArrow:!0,position:"right",children:jsx66(ActionIcon4,{variant:"subtle",color:"gray",onClick:()=>setIsVisible(!isVisible),"aria-label":isVisible?"Hide secret":"Show secret",children:isVisible?jsx66(IconEyeOff,{size:"1rem"}):jsx66(IconEye,{size:"1rem"})})})]})]})}import{jsx as jsx67,jsxs as jsxs38}from"react/jsx-runtime";var EXTENSION_KEYS2=["extension","modifierExtension"],IGNORED_PROPERTIES2=DEFAULT_IGNORED_PROPERTIES.filter(prop=>!EXTENSION_KEYS2.includes(prop));function BackboneElementDisplay(props){let typedValue=props.value,{value,type:typeName}=typedValue,parentElementsContext=useContext6(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo6(()=>tryGetDataType(typeName,profileUrl),[profileUrl,typeName]),newElementsContext=useMemo6(()=>{if(typeSchema)return buildElementsContext2({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);if(isEmpty2(value))return null;if(!typeSchema)return jsxs38("div",{children:[typeName,"\xA0not implemented"]});if(typeof value=="object"&&"name"in value&&Object.keys(value).length===1&&typeof value.name=="string")return jsx67("div",{children:value.name});let elementsContext=newElementsContext??parentElementsContext;return maybeWrapWithContext(ElementsContext.Provider,newElementsContext,jsx67(DescriptionList,{compact:props.compact,children:Object.entries(elementsContext.elements).map(([key,property])=>{if(EXTENSION_KEYS2.includes(key)&&isEmpty2(property.slicing?.slices))return null;if(IGNORED_PROPERTIES2.includes(key))return null;if(DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key)&&property.path.split(".").length===2||key.includes("."))return null;let[propertyValue,propertyType]=getValueAndType(typedValue,key,elementsContext.profileUrl);if((props.ignoreMissingValues||property.max===0)&&isEmpty2(propertyValue)||props.path.endsWith(".extension")&&(key==="url"||key==="id"))return null;let isArrayProperty=property.max>1||property.isArray,resourcePropertyDisplay=jsx67(ResourcePropertyDisplay,{property,propertyType,path:props.path+"."+key,value:propertyValue,ignoreMissingValues:props.ignoreMissingValues,includeArrayDescriptionListEntry:isArrayProperty,link:props.link},key);return isArrayProperty?resourcePropertyDisplay:jsx67(DescriptionListEntry,{term:getPathDisplayName3(key),children:resourcePropertyDisplay},key)})}))}import{Box as Box11}from"@mantine/core";import{buildElementsContext as buildElementsContext4,tryGetDataType as tryGetDataType2}from"@medplum/core";import{useContext as useContext23,useMemo as useMemo22,useState as useState53}from"react";import{Stack as Stack18}from"@mantine/core";import{getPathDisplayName as getPathDisplayName5}from"@medplum/core";import{useContext as useContext22,useMemo as useMemo21,useState as useState52}from"react";import{Group as Group14,Input}from"@mantine/core";import{useContext as useContext7}from"react";var FormSection_default={dimmed:"FormSection_dimmed",preserveBreaks:"FormSection_preserveBreaks"};import{Tooltip as Tooltip4}from"@mantine/core";import{jsx as jsx68}from"react/jsx-runtime";var READ_ONLY_TOOLTIP_TEXT="Read Only";function maybeWrapWithTooltip(tooltipText,children){return tooltipText?jsx68(Tooltip4.Floating,{label:tooltipText,children}):children}import{jsx as jsx69,jsxs as jsxs39}from"react/jsx-runtime";function CheckboxFormSection(props){let{debugMode}=useContext7(ElementsContext),label;return debugMode&&props.fhirPath?label=`${props.title} - ${props.fhirPath}`:label=props.title,maybeWrapWithTooltip(props?.readonly?READ_ONLY_TOOLTIP_TEXT:void 0,jsxs39(Group14,{wrap:"nowrap","data-testid":props.testId,children:[jsx69("div",{children:props.children}),jsx69("div",{children:jsx69(Input.Wrapper,{id:props.htmlFor,label,classNames:{label:props?.readonly?FormSection_default.dimmed:void 0},description:props.description,withAsterisk:props.withAsterisk,children:null})})]}))}import{Input as Input2}from"@mantine/core";import{useContext as useContext8}from"react";import{jsx as jsx70}from"react/jsx-runtime";function FormSection(props){let{debugMode}=useContext8(ElementsContext),label;return debugMode&&props.fhirPath?label=`${props.title} - ${props.fhirPath}`:label=props.title,maybeWrapWithTooltip(props?.readonly?READ_ONLY_TOOLTIP_TEXT:void 0,jsx70(Input2.Wrapper,{id:props.htmlFor,label,classNames:{label:clsx_default({[FormSection_default.dimmed]:props?.readonly},FormSection_default.preserveBreaks)},description:props.description,withAsterisk:props.withAsterisk,error:getErrorsForInput(props.outcome,props.errorExpression??props.htmlFor),"data-testid":props.testId,children:props.children}))}import{capitalize,isEmpty as isEmpty3}from"@medplum/core";function setPropertyValue(obj,key,propName,elementDefinition,value){let types=elementDefinition.type;if(types.length>1)for(let type of types){let compoundKey=key.replace("[x]",capitalize(type.code));compoundKey in obj&&delete obj[compoundKey]}return isEmpty3(value)?obj[propName]=void 0:obj[propName]=value,obj}function isSupportedProfileStructureDefinition(profile){return!!profile&&!isEmpty3(profile.url)&&!isEmpty3(profile.name)}import{Checkbox as Checkbox4,Group as Group28,NativeSelect as NativeSelect9,Textarea as Textarea2,TextInput as TextInput18}from"@mantine/core";import{applyDefaultValuesToElement,capitalize as capitalize2,getPathDifference,HTTP_HL7_ORG,isComplexTypeCode,isEmpty as isEmpty6,isPopulated as isPopulated10,PropertyType as PropertyType2}from"@medplum/core";import{useContext as useContext21,useMemo as useMemo20,useState as useState51}from"react";import{useState as useState33}from"react";import{jsx as jsx71}from"react/jsx-runtime";function CodeableConceptInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,outcome:_outcome,path:_path,valuePath:_valuePath,...rest}=props,[value,setValue]=useState33(defaultValue2);function handleChange(newValues){let newConcept=valueSetElementToCodeableConcept(newValues);setValue(newConcept),onChange&&onChange(newConcept)}return jsx71(ValueSetAutocomplete,{defaultValue:value&&codeableConceptToValueSetElement(value),onChange:handleChange,withHelpText:withHelpText??!0,...rest})}function codeableConceptToValueSetElement(concept){return concept.coding?.map(c=>({system:c.system,code:c.code,display:c.display}))}function valueSetElementToCodeableConcept(elements){if(elements.length!==0)return{coding:elements.map(e=>({system:e.system,code:e.code,display:e.display}))}}import{useState as useState34}from"react";import{jsx as jsx72}from"react/jsx-runtime";function CodingInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,response,...rest}=props,[value,setValue]=useState34(response?.answer?.[0]?.valueCoding??defaultValue2);function handleChange(newValues){let newValue=newValues[0],newConcept=newValue&&valueSetElementToCoding(newValue);setValue(newConcept),onChange&&onChange(newConcept)}return jsx72(ValueSetAutocomplete,{defaultValue:value?codingToValueSetElement(value):void 0,maxValues:1,onChange:handleChange,withHelpText:withHelpText??!0,...rest})}function codingToValueSetElement(coding){return{system:coding.system,code:coding.code,display:coding.display}}function valueSetElementToCoding(element){return{system:element.system,code:element.code,display:element.display}}import{Group as Group16,TextInput as TextInput11}from"@mantine/core";import{useContext as useContext10,useMemo as useMemo8,useState as useState36}from"react";import{Group as Group15,NativeSelect as NativeSelect3,TextInput as TextInput10}from"@mantine/core";import{useContext as useContext9,useMemo as useMemo7,useState as useState35}from"react";import{jsx as jsx73,jsxs as jsxs40}from"react/jsx-runtime";function ContactPointInput(props){let{path,outcome}=props,{elementsByPath,getExtendedProps}=useContext9(ElementsContext),[contactPoint,setContactPoint]=useState35(props.defaultValue),[systemElement,useElement,valueElement]=useMemo7(()=>["system","use","value"].map(field=>elementsByPath[path+"."+field]),[elementsByPath,path]),[systemProps,useProps,valueProps]=useMemo7(()=>["system","use","value"].map(field=>getExtendedProps(path+"."+field)),[getExtendedProps,path]);function setContactPointWrapper(newValue){newValue&&Object.keys(newValue).length===0&&(newValue=void 0),setContactPoint(newValue),props.onChange&&props.onChange(newValue)}function setSystem(system){let newValue={...contactPoint,system};system||delete newValue.system,setContactPointWrapper(newValue)}function setUse(use){let newValue={...contactPoint,use};use||delete newValue.use,setContactPointWrapper(newValue)}function setValue(value){let newValue={...contactPoint,value};value||delete newValue.value,setContactPointWrapper(newValue)}let errorPath=props.valuePath??path;return jsxs40(Group15,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx73(NativeSelect3,{disabled:props.disabled||systemProps?.readonly,"data-testid":"system",defaultValue:contactPoint?.system,required:(systemElement?.min??0)>0,onChange:e=>setSystem(e.currentTarget.value),data:["","email","phone","fax","pager","sms","url","other"],error:getErrorsForInput(outcome,errorPath+".system")}),jsx73(NativeSelect3,{disabled:props.disabled||useProps?.readonly,"data-testid":"use",defaultValue:contactPoint?.use,required:(useElement?.min??0)>0,onChange:e=>setUse(e.currentTarget.value),data:["","home","work","temp","old","mobile"],error:getErrorsForInput(outcome,errorPath+".use")}),jsx73(TextInput10,{disabled:props.disabled||valueProps?.readonly,placeholder:"Value",defaultValue:contactPoint?.value,required:(valueElement?.min??0)>0,onChange:e=>setValue(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".value")})]})}import{jsx as jsx74,jsxs as jsxs41}from"react/jsx-runtime";function ContactDetailInput(props){let[contactDetail,setContactDetail]=useState36(props.defaultValue),{getExtendedProps}=useContext10(ElementsContext),[nameProps,telecomProps]=useMemo8(()=>["name","telecom"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setContactDetailWrapper(newValue){setContactDetail(newValue),props.onChange&&props.onChange(newValue)}function setName(name){let newValue={...contactDetail,name};name||delete newValue.name,setContactDetailWrapper(newValue)}function setTelecom(telecom){let newValue={...contactDetail,telecom:telecom&&[telecom]};telecom||delete newValue.telecom,setContactDetailWrapper(newValue)}return jsxs41(Group16,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx74(TextInput11,{disabled:props.disabled||nameProps?.readonly,"data-testid":props.name+"-name",name:props.name+"-name",placeholder:"Name",style:{width:180},defaultValue:contactDetail?.name,onChange:e=>setName(e.currentTarget.value)}),jsx74(ContactPointInput,{disabled:props.disabled||telecomProps?.readonly,name:props.name+"-telecom",path:props.path+".telecom",defaultValue:contactDetail?.telecom?.[0],onChange:setTelecom,outcome:props.outcome})]})}import{TextInput as TextInput12}from"@mantine/core";import{isValidDate}from"@medplum/core";function convertIsoToLocal(isoString){if(!isoString)return"";let date=new Date(isoString);return isValidDate(date)?date.toLocaleDateString("sv")+"T"+date.toLocaleTimeString("sv"):""}function convertLocalToIso(localString){if(!localString)return"";let date=new Date(localString);return isValidDate(date)?date.toISOString():""}import{jsx as jsx75}from"react/jsx-runtime";function DateTimeInput(props){return jsx75(TextInput12,{id:props.name,name:props.name,label:props.label,"data-autofocus":props.autoFocus,"data-testid":props["data-testid"]??props.name,placeholder:props.placeholder,required:props.required,disabled:props.disabled,type:getInputType(),step:1,defaultValue:convertIsoToLocal(props.defaultValue),autoFocus:props.autoFocus,error:getErrorsForInput(props.outcome,props.name),onChange:e=>{if(props.onChange){let newValue=e.currentTarget.value;props.onChange(convertLocalToIso(newValue))}}})}function getInputType(){return"datetime-local"}import{isPopulated as isPopulated7,isProfileLoaded as isProfileLoaded2}from"@medplum/core";import{useMedplum as useMedplum21}from"@medplum/react-hooks";import{useEffect as useEffect11,useMemo as useMemo9,useState as useState37}from"react";import{jsx as jsx76}from"react/jsx-runtime";function ExtensionInput(props){let{propertyType}=props,medplum=useMedplum21(),profileUrl=useMemo9(()=>{if(isPopulated7(propertyType.profile))return propertyType.profile[0]},[propertyType]),[loadingProfile,setLoadingProfile]=useState37(profileUrl!==void 0);return useEffect11(()=>{profileUrl&&(setLoadingProfile(!0),medplum.requestProfileSchema(profileUrl).then(()=>setLoadingProfile(!1)).catch(reason=>{setLoadingProfile(!1),console.warn(reason)}))},[medplum,profileUrl]),profileUrl&&(loadingProfile||!isProfileLoaded2(profileUrl))?jsx76("div",{children:"Loading..."}):jsx76(BackboneElementInput,{profileUrl,path:props.path,typeName:"Extension",defaultValue:props.defaultValue,onChange:props.onChange})}import{Group as Group17,NativeSelect as NativeSelect4,TextInput as TextInput13}from"@mantine/core";import{useContext as useContext11,useMemo as useMemo10,useState as useState38}from"react";import{jsx as jsx77,jsxs as jsxs42}from"react/jsx-runtime";function HumanNameInput(props){let{outcome,path}=props,[value,setValue]=useState38(props.defaultValue),{getExtendedProps}=useContext11(ElementsContext),[useProps,prefixProps,givenProps,familyProps,suffixProps]=useMemo10(()=>["use","prefix","given","family","suffix"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}function setUse(use){setValueWrapper({...value,use:use||void 0})}function setPrefix(prefix){setValueWrapper({...value,prefix:prefix?prefix.split(" "):void 0})}function setGiven(given){setValueWrapper({...value,given:given?given.split(" "):void 0})}function setFamily(family){setValueWrapper({...value,family:family||void 0})}function setSuffix(suffix){setValueWrapper({...value,suffix:suffix?suffix.split(" "):void 0})}let errorPath=props.valuePath??path;return jsxs42(Group17,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx77(NativeSelect4,{disabled:props.disabled||useProps?.readonly,defaultValue:value?.use,name:props.name+"-use","data-testid":"use",onChange:e=>setUse(e.currentTarget.value),data:["","temp","old","usual","official","nickname","anonymous","maiden"],error:getErrorsForInput(outcome,errorPath+".use")}),jsx77(TextInput13,{disabled:props.disabled||prefixProps?.readonly,placeholder:"Prefix",name:props.name+"-prefix",defaultValue:value?.prefix?.join(" "),onChange:e=>setPrefix(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".prefix")}),jsx77(TextInput13,{disabled:props.disabled||givenProps?.readonly,placeholder:"Given",name:props.name+"-given",defaultValue:value?.given?.join(" "),onChange:e=>setGiven(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".given")}),jsx77(TextInput13,{disabled:props.disabled||familyProps?.readonly,name:props.name+"-family",placeholder:"Family",defaultValue:value?.family,onChange:e=>setFamily(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".family")}),jsx77(TextInput13,{disabled:props.disabled||suffixProps?.readonly,placeholder:"Suffix",name:props.name+"-suffix",defaultValue:value?.suffix?.join(" "),onChange:e=>setSuffix(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".suffix")})]})}import{Group as Group18,TextInput as TextInput14}from"@mantine/core";import{useContext as useContext12,useMemo as useMemo11,useState as useState39}from"react";import{jsx as jsx78,jsxs as jsxs43}from"react/jsx-runtime";function IdentifierInput(props){let[value,setValue]=useState39(props.defaultValue),{elementsByPath,getExtendedProps}=useContext12(ElementsContext),[systemElement,valueElement]=useMemo11(()=>["system","value"].map(field=>elementsByPath[props.path+"."+field]),[elementsByPath,props.path]),[systemProps,valueProps]=useMemo11(()=>["system","value"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let errorPath=props.valuePath??props.path;return jsxs43(Group18,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx78(TextInput14,{disabled:props.disabled||systemProps?.readonly,placeholder:"System",required:(systemElement?.min??0)>0,defaultValue:value?.system,onChange:e=>setValueWrapper({...value,system:e.currentTarget.value}),error:getErrorsForInput(props.outcome,errorPath+".system")}),jsx78(TextInput14,{disabled:props.disabled||valueProps?.readonly,placeholder:"Value",required:(valueElement?.min??0)>0,defaultValue:value?.value,onChange:e=>setValueWrapper({...value,value:e.currentTarget.value}),error:getErrorsForInput(props.outcome,errorPath+".value")})]})}import{NativeSelect as NativeSelect5,TextInput as TextInput15}from"@mantine/core";import{useCallback as useCallback7,useContext as useContext13,useMemo as useMemo12,useState as useState40}from"react";import{jsx as jsx79}from"react/jsx-runtime";var data=["USD","EUR","CAD","GBP","AUD"];function MoneyInput(props){let{onChange}=props,[value,setValue]=useState40(props.defaultValue),{getExtendedProps}=useContext13(ElementsContext),[currencyProps,valueProps]=useMemo12(()=>["currency","value"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]),setValueWrapper=useCallback7(newValue=>{setValue(newValue),onChange&&onChange(newValue)},[onChange]),handleCurrencyChange=useCallback7(e=>{setValueWrapper({...value,currency:e.currentTarget.value})},[value,setValueWrapper]),handleValueChange=useCallback7(e=>{setValueWrapper({...value,value:e.currentTarget.valueAsNumber})},[value,setValueWrapper]),select=jsx79(NativeSelect5,{disabled:props.disabled||currencyProps?.readonly,defaultValue:value?.currency,data,styles:{input:{fontWeight:500,borderTopLeftRadius:0,borderBottomLeftRadius:0,width:92}},onChange:handleCurrencyChange});return jsx79(TextInput15,{disabled:props.disabled||valueProps?.readonly,type:"number",name:props.name,label:props.label,placeholder:props.placeholder??"Value",defaultValue:value?.value?.toString()??"USD",leftSection:jsx79(IconCurrencyDollar,{size:14}),rightSection:select,rightSectionWidth:92,onChange:handleValueChange})}import{Group as Group19}from"@mantine/core";import{useContext as useContext14,useMemo as useMemo13,useState as useState41}from"react";import{jsx as jsx80,jsxs as jsxs44}from"react/jsx-runtime";function PeriodInput(props){let[value,setValue]=useState41(props.defaultValue),{getExtendedProps}=useContext14(ElementsContext),[startProps,endProps]=useMemo13(()=>["start","end"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs44(Group19,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx80(DateTimeInput,{disabled:props.disabled||startProps?.readonly,name:props.name+".start",placeholder:"Start",defaultValue:value?.start,onChange:newValue=>setValueWrapper({...value,start:newValue})}),jsx80(DateTimeInput,{disabled:props.disabled||endProps?.readonly,name:props.name+".end",placeholder:"End",defaultValue:value?.end,onChange:newValue=>setValueWrapper({...value,end:newValue})})]})}import{Group as Group20,NativeSelect as NativeSelect6,TextInput as TextInput16}from"@mantine/core";import{useContext as useContext15,useMemo as useMemo14,useState as useState42}from"react";import{jsx as jsx81,jsxs as jsxs45}from"react/jsx-runtime";function QuantityInput(props){let[value,setValue]=useState42(props.defaultValue),{getExtendedProps}=useContext15(ElementsContext),[comparatorProps,valueProps,unitProps]=useMemo14(()=>["comparator","value","unit"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs45(Group20,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81(NativeSelect6,{disabled:props.disabled||comparatorProps?.readonly,style:{width:80},"data-testid":props.name+"-comparator",defaultValue:value?.comparator,data:["","<","<=",">=",">"],onChange:e=>setValueWrapper({...value,comparator:e.currentTarget.value})}),jsx81(TextInput16,{disabled:props.disabled||valueProps?.readonly,id:props.name,name:props.name,required:props.required,"data-autofocus":props.autoFocus,"data-testid":props.name+"-value",type:"number",placeholder:"Value",defaultValue:value?.value,autoFocus:props.autoFocus,step:"any",onWheel:e=>{props.disableWheel&&e.currentTarget.blur()},onChange:e=>{setValueWrapper({...value,value:tryParseNumber(e.currentTarget.value)})}}),jsx81(TextInput16,{disabled:props.disabled||unitProps?.readonly,placeholder:"Unit","data-testid":props.name+"-unit",defaultValue:value?.unit,onChange:e=>setValueWrapper({...value,unit:e.currentTarget.value})})]})}function tryParseNumber(str){if(str)return Number.parseFloat(str)}import{Group as Group21}from"@mantine/core";import{useContext as useContext16,useMemo as useMemo15,useState as useState43}from"react";import{jsx as jsx82,jsxs as jsxs46}from"react/jsx-runtime";function RangeInput(props){let[value,setValue]=useState43(props.defaultValue),{getExtendedProps}=useContext16(ElementsContext),[lowProps,highProps]=useMemo15(()=>["low","high"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs46(Group21,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx82(QuantityInput,{path:props.path+".low",disabled:props.disabled||lowProps?.readonly,name:props.name+"-low",defaultValue:value?.low,onChange:v=>setValueWrapper({...value,low:v})}),jsx82(QuantityInput,{path:props.path+".high",disabled:props.disabled||highProps?.readonly,name:props.name+"-high",defaultValue:value?.high,onChange:v=>setValueWrapper({...value,high:v})})]})}import{Group as Group22}from"@mantine/core";import{useContext as useContext17,useMemo as useMemo16,useState as useState44}from"react";import{jsx as jsx83,jsxs as jsxs47}from"react/jsx-runtime";function RatioInput(props){let[value,setValue]=useState44(props.defaultValue),{getExtendedProps}=useContext17(ElementsContext),[numeratorProps,denominatorProps]=useMemo16(()=>["numerator","denominator"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs47(Group22,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx83(QuantityInput,{path:props.path+".numerator",disabled:props.disabled||numeratorProps?.readonly,name:props.name+"-numerator",defaultValue:value?.numerator,onChange:v=>setValueWrapper({...value,numerator:v})}),jsx83(QuantityInput,{path:props.path+".denominator",disabled:props.disabled||denominatorProps?.readonly,name:props.name+"-denominator",defaultValue:value?.denominator,onChange:v=>setValueWrapper({...value,denominator:v})})]})}import{Group as Group24,NativeSelect as NativeSelect7}from"@mantine/core";import{LRUCache,ReadablePromise,createReference as createReference2,isEmpty as isEmpty4,isPopulated as isPopulated8,tryGetProfile as tryGetProfile3}from"@medplum/core";import{useMedplum as useMedplum23}from"@medplum/react-hooks";import{useCallback as useCallback10,useEffect as useEffect13,useMemo as useMemo17,useRef as useRef8,useState as useState46}from"react";import{useCallback as useCallback9}from"react";import{Group as Group23,Text as Text18}from"@mantine/core";import{getDisplayString as getDisplayString3,getReferenceString as getReferenceString3,isReference as isReference2,isResource as isResource2}from"@medplum/core";import{useMedplum as useMedplum22}from"@medplum/react-hooks";import{forwardRef as forwardRef4,useCallback as useCallback8,useEffect as useEffect12,useRef as useRef7,useState as useState45}from"react";import{jsx as jsx84,jsxs as jsxs48}from"react/jsx-runtime";var SEARCH_CODES={Device:"device-name",Observation:"code",Subscription:"criteria",User:"email:contains"},NAME_RESOURCE_TYPES=["AccessPolicy","Account","ActivityDefinition","Bot","CapabilityStatement","CareTeam","ClientApplication","CodeSystem","CompartmentDefinition","ConceptMap","EffectEvidenceSynthesis","Endpoint","EventDefinition","Evidence","EvidenceVariable","ExampleScenario","GraphDefinition","Group","HealthcareService","ImplementationGuide","InsurancePlan","Library","Location","Measure","MedicinalProduct","MessageDefinition","NamingSystem","OperationDefinition","Organization","Patient","Person","PlanDefinition","Practitioner","Project","Questionnaire","RelatedPerson","ResearchDefinition","ResearchElementDefinition","ResearchStudy","RiskEvidenceSynthesis","SearchParameter","StructureDefinition","StructureMap","TerminologyCapabilities","TestScript","UserConfiguration","ValueSet"];function toOption3(resource){return{value:getReferenceString3(resource)??"",label:getDisplayString3(resource),resource}}function getSearchParamForResourceType(resourceType){return SEARCH_CODES[resourceType]??(NAME_RESOURCE_TYPES.includes(resourceType)?"name":"_id")}var DefaultResourceItemComponent=forwardRef4(({label,resource,active:_active,...others},ref)=>jsx84("div",{ref,...others,children:jsxs48(Group23,{wrap:"nowrap",children:[jsx84(ResourceAvatar,{value:resource}),jsxs48("div",{children:[jsx84(Text18,{children:label}),jsx84(Text18,{size:"xs",c:"dimmed",children:resource.birthDate||resource.id})]})]})}));DefaultResourceItemComponent.displayName="DefaultResourceItemComponent";function MultiResourceInput(props){let medplum=useMedplum22(),{resourceType,searchCriteria}=props,ItemComponent3=props.itemComponent??DefaultResourceItemComponent,onChange=props.onChange,initialDefaultValue=useRef7(props.defaultValue),[defaultResources,setDefaultResources]=useState45(!props.defaultValue||props.defaultValue.length===0?[]:void 0);useEffect12(()=>{let cancelled=!1,items=initialDefaultValue.current;return items&&items.length>0&&Promise.allSettled(items.map(item=>{if(isResource2(item))return Promise.resolve(item);if(isReference2(item)){let ref=item;return medplum.readReference(ref)}return Promise.reject(new Error("Not a resolvable item"))})).then(settled=>{cancelled||setDefaultResources(settled.filter(r2=>r2.status==="fulfilled").map(r2=>r2.value))}).catch(()=>{}),()=>{cancelled=!0}},[medplum]);let loadValues=useCallback8(async(input,signal)=>{let searchCode=getSearchParamForResourceType(resourceType),searchParams=new URLSearchParams({[searchCode]:input??"",_count:"10",...searchCriteria});return await medplum.searchResources(resourceType,searchParams,{signal})},[medplum,resourceType,searchCriteria]),handleChange=useCallback8(newResources=>{onChange&&onChange(newResources)},[onChange]);return defaultResources===void 0?null:jsx84(AsyncAutocomplete,{disabled:props.disabled,name:props.name,label:props.label,error:props.error,required:props.required,itemComponent:ItemComponent3,defaultValue:defaultResources,placeholder:props.placeholder,maxValues:props.maxValues,toOption:toOption3,loadOptions:loadValues,onChange:handleChange,clearable:!0})}import{jsx as jsx85}from"react/jsx-runtime";function ResourceInput(props){let onChange=props.onChange,handleChange=useCallback9(newResources=>{onChange&&onChange(newResources[0])},[onChange]);return jsx85(MultiResourceInput,{resourceType:props.resourceType,name:props.name,defaultValue:props.defaultValue?[props.defaultValue]:void 0,searchCriteria:props.searchCriteria,placeholder:props.placeholder,required:props.required,itemComponent:props.itemComponent,onChange:handleChange,disabled:props.disabled,label:props.label,error:props.error,maxValues:1})}import{Fragment as Fragment30,jsx as jsx86,jsxs as jsxs49}from"react/jsx-runtime";function ReferenceInput(props){let{onChange}=props,medplum=useMedplum23(),[value,setValue]=useState46(props.defaultValue),[targetTypes,setTargetTypes]=useState46(()=>createTargetTypes(props.targetTypes)),[targetType,setTargetType]=useState46(()=>getInitialTargetType(props.defaultValue,targetTypes)),promiseCache=useRef8(new LRUCache),searchCriteria=useMemo17(()=>targetType?.type==="profile"?{...props.searchCriteria,_profile:targetType.value}:props.searchCriteria,[props.searchCriteria,targetType]);useEffect13(()=>{let anyToFetch=!1,newTargetTypePromises=targetTypes?.map(tt=>{if(!shouldFetchResourceType(tt))return Promise.resolve(tt);anyToFetch=!0;let cacheKey=tt.value,cached=promiseCache.current.get(cacheKey);if(cached)return cached;let promise=fetchResourceTypeOfProfile(medplum,tt.value).then(profile=>{let newTargetType={...tt};return profile?isPopulated8(profile.type)?(newTargetType.resourceType=profile.type,newTargetType.name=profile.name,newTargetType.title=profile.title):(console.error(`StructureDefinition.type missing for ${tt.value}`),newTargetType.error="StructureDefinition.type missing"):(console.error(`StructureDefinition not found for ${tt.value}`),newTargetType.error="StructureDefinition not found"),newTargetType}).catch(reason=>(console.error(reason),{...tt,error:reason})),readablePromise=new ReadablePromise(promise);return promiseCache.current.set(cacheKey,readablePromise),readablePromise});!newTargetTypePromises||!anyToFetch||Promise.all(newTargetTypePromises).then(newTargetTypes=>{if(setTargetTypes(newTargetTypes),!targetType)return;let index=newTargetTypes.findIndex(tt=>tt.value===targetType.value||tt.resourceType===targetType.resourceType);if(index===-1){console.debug(`defaultValue had unexpected resourceType: ${targetType.resourceType}`);return}setTargetType(newTargetTypes[index])}).catch(console.error)},[medplum,targetType,targetTypes]);let setValueHelper=useCallback10(item=>{let newValue=item?createReference2(item):void 0;setValue(newValue),onChange&&onChange(newValue)},[onChange]),typeSelectOptions=useMemo17(()=>targetTypes?targetTypes.map(tt=>({value:tt.value,label:tt.type==="profile"?tt.title??tt.name??tt.resourceType??tt.value:tt.value})):[],[targetTypes]);return jsxs49(Fragment30,{children:[props.name&&jsx86("input",{type:"hidden",name:props.name,value:value?.reference??""}),jsxs49(Group24,{gap:"xs",grow:!0,wrap:"nowrap",children:[targetTypes&&targetTypes.length>1&&jsx86(NativeSelect7,{name:props.name+"-resourceType",disabled:props.disabled,"data-autofocus":props.autoFocus,"data-testid":"reference-input-resource-type-select",defaultValue:targetType?.resourceType,autoFocus:props.autoFocus,onChange:e=>{let newValue=e.currentTarget.value,newTargetType=targetTypes.find(tt=>tt.value===newValue);setTargetType(newTargetType)},data:typeSelectOptions}),!targetTypes&&jsx86(ResourceTypeInput,{disabled:props.disabled,autoFocus:props.autoFocus,testId:"reference-input-resource-type-input",defaultValue:targetType?.resourceType,onChange:newResourceType=>{setTargetType(newResourceType?{type:"resourceType",value:newResourceType,resourceType:newResourceType}:void 0)},name:props.name+"-resourceType",placeholder:"Resource Type"}),jsx86(ResourceInput,{resourceType:targetType?.resourceType,name:props.name+"-id",required:props.required,placeholder:props.placeholder,defaultValue:value,searchCriteria,onChange:setValueHelper,disabled:props.disabled})]})]})}function createTargetTypes(resourceTypesAndProfileUrls){if(!resourceTypesAndProfileUrls||resourceTypesAndProfileUrls.length===0||resourceTypesAndProfileUrls.length===1&&resourceTypesAndProfileUrls[0]==="Resource")return;let results=[];for(let value of resourceTypesAndProfileUrls)value.includes("/")?results.push({type:"profile",value}):results.push({type:"resourceType",value,resourceType:value});return results}function getInitialTargetType(defaultValue2,targetTypes){let defaultValueResourceType=defaultValue2?.reference?.split("/")[0];if(defaultValueResourceType){let targetType=targetTypes?.find(tt=>tt.resourceType===defaultValueResourceType);return targetType||{type:"resourceType",value:defaultValueResourceType,resourceType:defaultValueResourceType}}if(targetTypes&&targetTypes.length>0)return targetTypes[0]}async function fetchResourceTypeOfProfile(medplum,profileUrl){let profile=tryGetProfile3(profileUrl);if(profile)return{type:profile.type,name:profile.name,title:profile.title};let query=`{
      StructureDefinitionList(url: "${profileUrl}", _sort: "_lastUpdated", _count: 1) {
        type,
        name,
        title,
      }
    }`.replaceAll(/\s+/g," ");return(await medplum.graphql(query)).data.StructureDefinitionList[0]}function shouldFetchResourceType(targetType){return targetType.type==="profile"&&!targetType?.error&&isEmpty4(targetType.resourceType)}import{Group as Group26,Stack as Stack16,Text as Text20}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useMedplum as useMedplum24}from"@medplum/react-hooks";import{useContext as useContext19,useEffect as useEffect14,useState as useState48}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group25,Stack as Stack15,Text as Text19}from"@mantine/core";import{buildElementsContext as buildElementsContext3,getPropertyDisplayName,isEmpty as isEmpty5,isPopulated as isPopulated9}from"@medplum/core";import{useContext as useContext18,useMemo as useMemo18,useState as useState47}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon5,Button as Button7}from"@mantine/core";import{jsx as jsx87}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx87(Button7,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx87(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx87(ActionIcon5,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx87(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon6}from"@mantine/core";import{jsx as jsx88}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx88(ActionIcon6,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx88(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx89,jsxs as jsxs50}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState47(props.defaultValue),sliceElements=slice.typeSchema?.elements??slice.elements,parentElementsContextValue=useContext18(ElementsContext),contextValue=useMemo18(()=>{if(isPopulated9(sliceElements))return buildElementsContext3({parentContext:parentElementsContextValue,elements:sliceElements,path:props.path,profileUrl:slice.typeSchema?.url})},[parentElementsContextValue,props.path,slice.typeSchema?.url,sliceElements]);function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}let required=slice.min>0,indentedStack=isEmpty5(slice.elements),propertyDisplayName=getPropertyDisplayName(slice.name),showEmptyMessage=props.property.readonly&&values.length===0;return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx89(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx89(Text19,{c:"dimmed",children:"(empty)"}):jsxs50(Stack15,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs50(Group25,{wrap:"nowrap",children:[jsx89("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx89(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&&jsx89(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&&jsx89(Group25,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx89(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx90,jsxs as jsxs51}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum24(),[loading,setLoading]=useState48(!0),[slices,setSlices]=useState48([]),[defaultValue2]=useState48(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState48(()=>[defaultValue2]),ctx=useContext19(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect14(()=>{prepareSlices({medplum,property}).then(slices2=>{setSlices(slices2);let slicedValues2=assignValuesIntoSlices(defaultValue2,slices2,property.slicing,ctx.profileUrl);addPlaceholderValues(slicedValues2,slices2),setSlicedValues(slicedValues2),setLoading(!1)}).catch(reason=>{console.error(reason),setLoading(!1)})},[medplum,property,defaultValue2,ctx.profileUrl,setSlicedValues]);function setValuesWrapper(newValues,sliceIndex){let newSlicedValues=[...slicedValues];if(newSlicedValues[sliceIndex]=newValues,setSlicedValues(newSlicedValues),props.onChange){let cleaned=newSlicedValues.flat().filter(val=>val!==void 0);props.onChange(cleaned)}}if(loading)return jsx90("div",{children:"Loading..."});let nonSliceIndex=slices.length,nonSliceValues=slicedValues[nonSliceIndex],showNonSliceValues=!(props.hideNonSliceValues??(propertyTypeCode==="Extension"&&slices.length>0)),propertyDisplayName=getPathDisplayName4(property.path),showEmptyMessage=props.property.readonly&&slices.length===0&&defaultValue2.length===0;return jsxs51(Stack16,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx90(Text20,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx90(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)=>jsxs51(Group26,{wrap:"nowrap",style:{flexGrow:1},children:[jsx90("div",{style:{flexGrow:1},children:jsx90(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&&jsx90(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&&jsx90(Group26,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx90(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.push(void 0),setValuesWrapper(newNonSliceValues,nonSliceIndex)},testId:"nonsliced-add"})})]})}function addPlaceholderValues(slicedValues,slices){for(let sliceIndex=0;sliceIndex<slices.length;sliceIndex++){let slice=slices[sliceIndex],sliceValues=slicedValues[sliceIndex];for(;sliceValues.length<slice.min;)sliceValues.push(void 0)}}import{ActionIcon as ActionIcon7,Flex as Flex11,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification5}from"@mantine/notifications";import{useRef as useRef9,useState as useState49}from"react";import{jsx as jsx91,jsxs as jsxs52}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState49(!1),clipboard=useClipboard(),ref=useRef9(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs52(Flex11,{gap:"xs",children:[jsx91(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx91(ActionIcon7,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification5({color:"green",message:"Copied"})},children:jsx91(IconCopy,{})})]})}import{Box as Box10,Button as Button8,Chip,Group as Group27,Modal as Modal2,NativeSelect as NativeSelect8,Stack as Stack17,Switch,TextInput as TextInput17}from"@mantine/core";import{formatTiming as formatTiming2}from"@medplum/core";import{useContext as useContext20,useMemo as useMemo19,useRef as useRef10,useState as useState50}from"react";import{Fragment as Fragment31,jsx as jsx92,jsxs as jsxs53}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState50(props.defaultValue),[open,setOpen]=useState50(!props.disabled&&(props.defaultModalOpen??!1));return jsxs53(Fragment31,{children:[jsxs53(Group27,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx92("span",{"data-testid":"timinginput-display",children:formatTiming2(value)||"No repeat"}),jsx92(Button8,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx92(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]=useState50(props.defaultValue||defaultValue),[timeOfDayItems,setTimeOfDayItems]=useState50(()=>(props.defaultValue?.repeat?.timeOfDay??[]).map((v,i)=>({id:i,value:v}))),nextTimeOfDayId=useRef10(timeOfDayItems.length),{getExtendedProps}=useContext20(ElementsContext),[eventProps,repeatProps,repeatPeriodProps,repeatPeriodUnitProps,repeatDayOfWeekProps,repeatTimeOfDayProps]=useMemo19(()=>["event","repeat","repeat.period","repeat.periodUnit","repeat.dayOfWeek","repeat.timeOfDay"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setStart(newStart){setValue(value2=>({...value2,event:[newStart]}))}function setRepeat(repeat){setValue(value2=>({...value2,repeat}))}function setPeriod(period){setValue(value2=>({...value2,repeat:{...value2.repeat,period}}))}function setPeriodUnit(periodUnit){setValue(value2=>({...value2,repeat:{...value2.repeat,periodUnit}}))}function setDaysOfWeek(dayOfWeek){setValue(value2=>({...value2,repeat:{...value2.repeat,dayOfWeek}}))}function setTimeOfDay(updater){setTimeOfDayItems(items=>{let newItems=updater(items),timeOfDay=newItems.map(item=>item.value);return setValue(value2=>({...value2,repeat:{...value2.repeat,timeOfDay}})),newItems})}return jsx92(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs53(Stack17,{gap:"md",children:[jsx92(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx92(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx92(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs53(Fragment31,{children:[jsx92(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs53(Group27,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx92(TextInput17,{disabled:repeatPeriodProps?.readonly,type:"number",step:1,id:"timing-dialog-period",name:"timing-dialog-period",defaultValue:value.repeat.period||1,onChange:e=>setPeriod(Number.parseInt(e.currentTarget.value,10)||1)}),jsx92(NativeSelect8,{disabled:repeatPeriodUnitProps?.readonly,id:"timing-dialog-periodUnit",name:"timing-dialog-periodUnit",defaultValue:value.repeat.periodUnit,onChange:e=>setPeriodUnit(e.currentTarget.value),data:[{label:"minute",value:"min"},{label:"hour",value:"h"},{label:"day",value:"d"},{label:"week",value:"wk"},{label:"month",value:"mo"},{label:"year",value:"a"}]})]})}),value.repeat.periodUnit==="wk"&&jsx92(FormSection,{title:"Repeat on",children:jsx92(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,value:value.repeat?.dayOfWeek,children:jsx92(Group27,{justify:"space-between",mt:"xs",gap:"xs",children:daysOfWeek.map(day=>jsx92(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,checked:(value.repeat?.dayOfWeek??[]).includes(day),children:day.charAt(0).toUpperCase()},day))})})}),jsx92(FormSection,{title:"At times",children:jsxs53(Stack17,{mt:"xs",children:[timeOfDayItems.map((item,idx)=>jsxs53(Group27,{children:[jsx92(TextInput17,{disabled:repeatTimeOfDayProps?.readonly,type:"time",id:`timing-dialog-repeat-timeOfDay[${idx}]`,name:`timing-dialog-repeat-timeOfDay[${idx}]`,"data-testid":`timing-repeat-timeOfDay-input-${idx}`,defaultValue:item.value.slice(0,5),onChange:e=>{let newValue=`${e.currentTarget.value}:00`;setTimeOfDay(items=>items.with(idx,{...item,value:newValue}))},style:{flexGrow:1}}),jsx92(ArrayRemoveButton,{testId:`timing-repeat-timeOfDay-remove-${idx}`,onClick:()=>setTimeOfDay(items=>items.toSpliced(idx,1))})]},item.id)),jsx92(Box10,{children:jsx92(ArrayAddButton,{propertyDisplayName:"Time of Day",onClick:()=>setTimeOfDay(items=>{let id=nextTimeOfDayId.current++;return items.concat({id,value:"00:00:00"})})})})]})})]}),jsx92(Group27,{justify:"flex-end",children:jsx92(Button8,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx93,jsxs as jsxs54}from"react/jsx-runtime";function ResourcePropertyInput(props){let{property,name,onChange,defaultValue:defaultValue2}=props,defaultPropertyType=props.defaultPropertyType&&props.defaultPropertyType!=="undefined"?props.defaultPropertyType:property.type[0].code,propertyTypes=property.type;if((property.isArray||property.max>1)&&!props.arrayElement){if(defaultPropertyType===PropertyType2.Attachment)return jsx93(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx93(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx93(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx93(ElementDefinitionTypeInput,{name,defaultValue:defaultValue2,onChange:newValue=>{if(props.onChange){let newPropName=props.name.replace("[x]",capitalize2(propertyTypes[0].code));props.onChange(newValue,newPropName)}},outcome:props.outcome,elementDefinitionType:propertyTypes[0],min:property.min,max:property.min,binding:property.binding,path:props.path,valuePath:props.valuePath,readOnly:property.readonly})}function ElementDefinitionInputSelector(props){let propertyTypes=props.elementDefinitionTypes,initialPropertyType;props.defaultPropertyType&&(initialPropertyType=propertyTypes.find(t=>t.code===props.defaultPropertyType)),initialPropertyType||(initialPropertyType=propertyTypes[0]);let[selectedType,setSelectedType]=useState51(initialPropertyType);return jsxs54(Group28,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx93(NativeSelect9,{disabled:props.property.readonly,style:{width:"200px"},defaultValue:selectedType.code,"data-testid":props.name&&props.name+"-selector",onChange:e=>{setSelectedType(propertyTypes.find(type=>type.code===e.currentTarget.value))},data:propertyTypes.map(type=>({value:type.code,label:type.code}))}),jsx93(ElementDefinitionTypeInput,{name:props.name,defaultValue:props.defaultValue,outcome:props.outcome,elementDefinitionType:selectedType,onChange:newValue=>{props.onChange&&props.onChange(newValue,props.name.replace("[x]",capitalize2(selectedType.code)))},min:props.property.min,max:props.property.max,binding:props.property.binding,path:props.property.path,valuePath:props.valuePath,readOnly:props.property.readonly})]})}function ElementDefinitionTypeInput(props){let{name,onChange,outcome,binding,path,valuePath,readOnly}=props,required=props.min!==void 0&&props.min>0,propertyType=props.elementDefinitionType.code,elementsContext=useContext21(ElementsContext),defaultValue2=useMemo20(()=>{if(!isComplexTypeCode(propertyType)||!isEmpty6(props.defaultValue))return props.defaultValue;let withDefaults=Object.create(null);if(elementsContext.path===props.path)applyDefaultValuesToElement(withDefaults,elementsContext.elements);else{let key=getPathDifference(elementsContext.path,props.path);if(key===void 0)return props.defaultValue;applyDefaultValuesToElement(withDefaults,elementsContext.elements,key)}return isPopulated10(withDefaults)?withDefaults:props.defaultValue},[propertyType,elementsContext.path,elementsContext.elements,props.path,props.defaultValue]);if(!propertyType)return jsx93("div",{children:"Property type not specified "});function getComplexInputProps(){return{name,defaultValue:defaultValue2,onChange,outcome,path,valuePath,disabled:readOnly}}function getPrimitiveInputProps(){let error=getErrorsForInput(props.outcome,valuePath??path);return{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,error,disabled:readOnly}}switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.id:case PropertyType2.string:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"||props.path==="ClientApplication.certificateTrustStore"?jsx93(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx93(TextInput18,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx93(TextInput18,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.time:return jsx93(TextInput18,{...getPrimitiveInputProps(),type:"time",step:1,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx93(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx93(TextInput18,{...getPrimitiveInputProps(),type:"number",step:propertyType===PropertyType2.decimal?"any":"1",onChange:e=>{if(onChange){let num=e.currentTarget.valueAsNumber;onChange(Number.isNaN(num)?void 0:num)}}});case PropertyType2.code:return jsx93(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx93(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:case PropertyType2.xhtml:return jsx93(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx93(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx93(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx93(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx93(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx93(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx93(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx93(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx93(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx93(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx93(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx93(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx93(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx93(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx93(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx93(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx93(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx93(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx93(BackboneElementInput,{...getComplexInputProps(),typeName:propertyType})}}var RESOURCE_TYPE_URL_PREFIXES=[`${HTTP_HL7_ORG}/fhir/StructureDefinition/`,"https://medplum.com/fhir/StructureDefinition/"];function getTargetTypes(elementDefinitionType){return elementDefinitionType?.targetProfile?.map(p=>{let resourceTypePrefix=RESOURCE_TYPE_URL_PREFIXES.find(prefix=>p.startsWith(prefix));return resourceTypePrefix?p.slice(resourceTypePrefix.length):p})}import{jsx as jsx94}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState52(props.defaultValue??{}),elementsContext=useContext22(ElementsContext),elementsToRender=useMemo21(()=>getElementsToRender(elementsContext.elements),[elementsContext.elements]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let typedValue={type:props.type,value};return jsx94(Stack18,{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=jsx94(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"?jsx94(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx94(FormSection,{title:getPathDisplayName5(key),description:element.description,withAsterisk:required,htmlFor:key,outcome:props.outcome,fhirPath:element.path,errorExpression:valuePath,readonly:element.readonly,children:resourcePropertyInput},key)})})}var BackboneElementInput_default={nested:"BackboneElementInput_nested"};import{jsx as jsx95,jsxs as jsxs55}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState53(()=>props.defaultValue??{}),parentElementsContext=useContext23(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo22(()=>tryGetDataType2(props.typeName,profileUrl),[props.typeName,profileUrl]),type=typeSchema?.type??props.typeName,contextValue=useMemo22(()=>{if(typeSchema)return buildElementsContext4({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);if(!typeSchema)return jsxs55("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx95(Box11,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:jsx95(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}import{Button as Button9,Group as Group29}from"@mantine/core";import{useMemo as useMemo23,useState as useState54}from"react";var CalendarDateInput_default={table:"CalendarDateInput_table",available:"CalendarDateInput_available",selected:"CalendarDateInput_selected"};function getMonthString(date){return date.toLocaleString("default",{month:"long"})+" "+date.getFullYear()}function getStartMonth(){return startOfMonth(new Date)}function startOfMonth(date){return new Date(date.getFullYear(),date.getMonth(),1)}function isBeforeDay(day,limit){return day.getTime()<new Date(limit.getFullYear(),limit.getMonth(),limit.getDate()).getTime()}function isSameDay(left,right){return!!right&&left.getFullYear()===right.getFullYear()&&left.getMonth()===right.getMonth()&&left.getDate()===right.getDate()}import{jsx as jsx96,jsxs as jsxs56}from"react/jsx-runtime";function CalendarDateInput(props){let{onChangeMonth,onClick,selected,allowUnavailableDates,earliestDate}=props,[uncontrolledMonth,setUncontrolledMonth]=useState54(getStartMonth),shownMonth=props.month??uncontrolledMonth,year=shownMonth.getFullYear(),monthIndex=shownMonth.getMonth(),month=useMemo23(()=>new Date(year,monthIndex,1),[year,monthIndex]),atEarliestMonth=!!earliestDate&&month<=startOfMonth(earliestDate);function moveMonth(delta){let newMonth=new Date(month.getFullYear(),month.getMonth()+delta,1);props.month===void 0&&setUncontrolledMonth(newMonth),onChangeMonth(newMonth)}function isDayDisabled(day){return!day.available&&!allowUnavailableDates||!!earliestDate&&isBeforeDay(day.date,earliestDate)}let grid=useMemo23(()=>buildGrid(month,props.availableDates),[month,props.availableDates]);return jsxs56("div",{children:[jsxs56(Group29,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx96("p",{style:{flex:1},children:getMonthString(month)}),jsxs56(Group29,{justify:"flex-end",gap:"xs",children:[jsx96(Button9,{variant:"outline","aria-label":"Previous month",disabled:atEarliestMonth,onClick:()=>moveMonth(-1),children:"<"}),jsx96(Button9,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs56("table",{className:CalendarDateInput_default.table,children:[jsx96("thead",{children:jsxs56("tr",{children:[jsx96("th",{children:"SUN"}),jsx96("th",{children:"MON"}),jsx96("th",{children:"TUE"}),jsx96("th",{children:"WED"}),jsx96("th",{children:"THU"}),jsx96("th",{children:"FRI"}),jsx96("th",{children:"SAT"})]})}),jsx96("tbody",{children:grid.map((week,weekIndex)=>jsx96("tr",{children:week.map((day,dayIndex)=>jsx96("td",{children:day&&jsx96(Button9,{variant:"light",className:clsx_default(day.available&&CalendarDateInput_default.available,isSameDay(day.date,selected)&&CalendarDateInput_default.selected),"aria-pressed":selected?isSameDay(day.date,selected):void 0,disabled:isDayDisabled(day),onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,availableDates){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d),available:isDayAvailable(d,availableDates)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,availableDates){return availableDates.some(availableDate=>isSameDay(availableDate,day))}import{useMemo as useMemo24}from"react";import{jsx as jsx97}from"react/jsx-runtime";function CalendarInput(props){let{slots,...rest}=props,availableDates=useMemo24(()=>slots.map(slot=>new Date(slot.start)),[slots]);return jsx97(CalendarDateInput,{...rest,availableDates})}import{ActionIcon as ActionIcon8,Group as Group30,LoadingOverlay,Menu as Menu4,Paper as Paper2,Popover,ScrollArea as ScrollArea2,Skeleton,Stack as Stack20,Text as Text22,TextInput as TextInput20,Title as Title9}from"@mantine/core";import{useResizeObserver}from"@mantine/hooks";import{showNotification as showNotification6}from"@mantine/notifications";import{getDisplayString as getDisplayString4,getReferenceString as getReferenceString5,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useCachedBinaryUrl as useCachedBinaryUrl3,useMedplum as useMedplum26,useResource as useResource2,useSubscription}from"@medplum/react-hooks";import{useCallback as useCallback11,useEffect as useEffect16,useMemo as useMemo25,useRef as useRef11,useState as useState56}from"react";var BaseChat_default={chatPaper:"BaseChat_chatPaper",chatTitle:"BaseChat_chatTitle",chatBody:"BaseChat_chatBody",chatScrollArea:"BaseChat_chatScrollArea",chatInputContainer:"BaseChat_chatInputContainer",chatPendingFile:"BaseChat_chatPendingFile",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble",chatBubbleNameRight:"BaseChat_chatBubbleNameRight",chatBubbleAttachmentWithText:"BaseChat_chatBubbleAttachmentWithText",chatBubbleAttachmentIcon:"BaseChat_chatBubbleAttachmentIcon",chatBubbleMenu:"BaseChat_chatBubbleMenu"};import{Box as Box12,Divider as Divider5,Loader as Loader4,Stack as Stack19,Text as Text21,TextInput as TextInput19,UnstyledButton as UnstyledButton3}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback2}from"@mantine/hooks";import{getReferenceString as getReferenceString4}from"@medplum/core";import{useMedplum as useMedplum25}from"@medplum/react-hooks";import{useEffect as useEffect15,useState as useState55}from"react";import{jsx as jsx98,jsxs as jsxs57}from"react/jsx-runtime";function DocumentPicker({subjectRef,onSelect,onUpload}){let medplum=useMedplum25(),[search,setSearch]=useState55(""),[docs,setDocs]=useState55([]),[loading,setLoading]=useState55(!0),subjectRefStr=subjectRef?getReferenceString4(subjectRef):void 0,fetchDocs=useDebouncedCallback2(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);useEffect15(()=>{fetchDocs(search)},[fetchDocs,search]);let getDocName=doc=>doc.description??doc.content?.[0]?.attachment?.title??"Untitled";return jsxs57(Stack19,{gap:0,w:280,children:[jsx98(Text21,{fw:500,fz:"sm",px:"sm",pt:"sm",pb:"xs",children:"Attachments"}),jsx98(Box12,{px:"sm",pb:"xs",children:jsx98(TextInput19,{placeholder:"Search for a Document...",size:"xs",value:search,onChange:e=>setSearch(e.currentTarget.value)})}),jsx98(Divider5,{}),loading?jsx98(Box12,{py:"sm",style:{display:"flex",justifyContent:"center"},children:jsx98(Loader4,{size:"xs"})}):jsxs57(Stack19,{gap:0,children:[docs.map(doc=>jsxs57(UnstyledButton3,{px:"sm",py:"xs",onClick:()=>onSelect(doc),style:{display:"flex",alignItems:"center",gap:8},children:[jsx98(IconFileText,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-blue-6)"}}),jsx98(Text21,{fz:"sm",truncate:!0,children:getDocName(doc)})]},doc.id)),docs.length===0&&jsx98(Text21,{fz:"xs",c:"dimmed",px:"sm",py:"xs",children:"No documents found"})]}),jsx98(Divider5,{}),jsxs57(UnstyledButton3,{px:"sm",py:"xs",onClick:onUpload,style:{display:"flex",alignItems:"center",gap:8},children:[jsx98(IconPaperclip,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-gray-6)"}}),jsx98(Text21,{fz:"sm",c:"dimmed",children:"Upload an image, pdf, etc."})]})]})}import{jsx as jsx99,jsxs as jsxs58}from"react/jsx-runtime";function toSafeUrl(url){if(url)try{let{protocol}=new URL(url);return protocol==="https:"||protocol==="http:"||protocol==="blob:"?url:void 0}catch{return}}function showError(message){showNotification6({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=useMedplum26(),inputRef=useRef11(null),scrollAreaRef=useRef11(null),firstScrollRef=useRef11(!0),initialLoadRef=useRef11(!0),[profile,setProfile]=useState56(medplum.getProfile()),[reconnecting,setReconnecting]=useState56(!1),[loading,setLoading]=useState56(!0),[pendingFile,setPendingFile]=useState56(void 0),[pendingDocRef,setPendingDocRef]=useState56(void 0),[pickerOpen,setPickerOpen]=useState56(!1),fileInputRef=useRef11(null);loading||(initialLoadRef.current=!1);let profileRefStr=useMemo25(()=>profile?getReferenceString5(medplum.getProfile()):"",[profile,medplum]),searchMessages=useCallback11(async()=>{setLoading(!0);let searchParams=new URLSearchParams(query);searchParams.append("_sort","-sent"),searchParams.append("sent:missing","false");let searchResult=await medplum.searchResources("Communication",searchParams,{cache:"no-cache"});upsertCommunications(communicationsRef.current,searchResult,setCommunications),setLoading(!1)},[medplum,setCommunications,query]);useEffect16(()=>{searchMessages().catch(err=>showNotification6({color:"red",message:normalizeErrorString8(err)}))},[searchMessages]),useSubscription(`Communication?${query}`,bundle=>{let communication=bundle.entry?.[1]?.resource;upsertCommunications(communicationsRef.current,[communication],setCommunications),getReferenceString5(communication.sender)!==profileRefStr&&(communicationsRef.current.find(c=>c.id===communication.id)?onMessageUpdated?.(communication):onMessageReceived?.(communication))},{onWebSocketClose:useCallback11(()=>{reconnecting||setReconnecting(!0),showNotification6({color:"red",message:"Live chat disconnected. Attempting to reconnect..."})},[reconnecting]),onWebSocketOpen:useCallback11(()=>{reconnecting&&showNotification6({color:"green",message:"Live chat reconnected."})},[reconnecting]),onSubscriptionConnect:useCallback11(()=>{reconnecting&&(searchMessages().catch(err=>showNotification6({color:"red",message:normalizeErrorString8(err)})),setReconnecting(!1))},[reconnecting,searchMessages]),onError:useCallback11(err=>{onError?onError(err):showError(normalizeErrorString8(err))},[onError])});let sendMessageInternal=useCallback11(formData=>{if(inputDisabled)return;let message=formData.message?.trim()??"";!message&&!pendingFile&&!pendingDocRef||(inputRef.current&&(inputRef.current.value=""),fileInputRef.current&&(fileInputRef.current.value=""),sendMessage(message,pendingFile,pendingDocRef),setPendingFile(void 0),setPendingDocRef(void 0),scrollToBottomRef.current=!0)},[inputDisabled,sendMessage,pendingFile,pendingDocRef]);useEffect16(()=>{let latestProfile=medplum.getProfile();profile?.id!==latestProfile?.id&&(setProfile(latestProfile),setCommunications([]))});let[parentRef,parentRect]=useResizeObserver(),communicationsRef=useRef11(communications);communicationsRef.current=communications;let prevCommunicationsRef=useRef11(communications),scrollToBottomRef=useRef11(!0);useEffect16(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),useEffect16(()=>{scrollToBottomRef.current&&scrollAreaRef.current?.scrollTo&&(scrollAreaRef.current.scrollTo({top:scrollAreaRef.current.scrollHeight,...firstScrollRef.current?{duration:0}:{behavior:"smooth"}}),firstScrollRef.current=!1,scrollToBottomRef.current=!1)});let myLastDeliveredId=useMemo25(()=>{let i=communications.length;for(;i--;){let comm=communications[i];if(comm.sender?.reference===profileRefStr&&comm.received)return comm.id}return""},[communications,profileRefStr]);return profile?jsxs58(Paper2,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[!excludeHeader&&jsx99(Title9,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx99("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs58(Stack20,{align:"stretch",mt:"lg",children:[jsxs58(Group30,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx99(Skeleton,{height:38,circle:!0,ml:"md"}),jsx99(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs58(Group30,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx99(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx99(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs58(Group30,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx99(Skeleton,{height:38,circle:!0,ml:"md"}),jsx99(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs58(ScrollArea2,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx99(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?jsx99(ChatBubbleMenu,{contentRef,contentAttachment,onViewInDocuments}):null;return jsxs58(Stack20,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx99(Text22,{fz:"xs",ta:"center",children:currCommTime}),isSender?jsxs58(Group30,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx99("div",{className:BaseChat_default.chatBubbleMenu,children:menu}),jsx99(ChatBubble,{alignment:"right",communication:c,showDelivered}),jsx99(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender,mb:showDelivered?void 0:"sm"})]}):jsxs58(Group30,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx99(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),jsx99(ChatBubble,{alignment:"left",communication:c}),jsx99("div",{className:BaseChat_default.chatBubbleMenu,children:menu})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsxs58("div",{className:BaseChat_default.chatInputContainer,children:[(pendingFile||pendingDocRef)&&jsxs58(Group30,{className:BaseChat_default.chatPendingFile,gap:4,align:"center",wrap:"nowrap",children:[pendingDocRef?jsx99(IconFileText,{size:"0.75rem"}):jsx99(IconPaperclip,{size:"0.75rem"}),jsx99(Text22,{fz:"xs",c:"dimmed",flex:1,truncate:!0,children:pendingDocRef?pendingDocRef.description??pendingDocRef.content?.[0]?.attachment?.title??"Document":pendingFile?.name}),jsx99(ActionIcon8,{size:"xs",variant:"subtle",color:"red",onClick:()=>{setPendingDocRef(void 0),setPendingFile(void 0),fileInputRef.current&&(fileInputRef.current.value="")},"aria-label":"Remove attachment",children:jsx99(IconX,{size:"0.75rem"})})]}),jsx99("input",{ref:fileInputRef,type:"file",style:{display:"none"},disabled:inputDisabled,onChange:e=>{let file=e.target.files?.[0];file&&(setPendingFile(file),setPendingDocRef(void 0))}}),jsx99(Form,{onSubmit:sendMessageInternal,children:jsx99(TextInput20,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",leftSectionWidth:42,rightSectionWidth:42,disabled:inputDisabled,leftSection:!inputDisabled&&uploadEnabled?jsxs58(Popover,{opened:pickerOpen,onChange:setPickerOpen,position:"top-start",withArrow:!0,shadow:"md",withinPortal:!0,children:[jsx99(Popover.Target,{children:jsx99(ActionIcon8,{onClick:()=>setPickerOpen(o=>!o),size:"1.5rem",radius:"xl",color:pendingFile||pendingDocRef?"blue":"gray",variant:pendingFile||pendingDocRef?"filled":"subtle","aria-label":"Attach file",children:jsx99(IconPaperclip,{size:"1rem",stroke:1.5})})}),jsx99(Popover.Dropdown,{p:0,children:jsx99(DocumentPicker,{subjectRef:attachmentSubjectRef,onSelect:doc=>{setPendingDocRef(doc),setPendingFile(void 0),setPickerOpen(!1)},onUpload:()=>{setPickerOpen(!1),fileInputRef.current?.click()}})})]}):void 0,rightSection:inputDisabled?void 0:jsx99(ActionIcon8,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx99(IconArrowRight,{size:"1rem",stroke:1.5})})})})]})]}):null}function ChatBubble(props){let{communication,alignment,showDelivered}=props,payloads=communication.payload??[],textContent=payloads.find(p=>p.contentString)?.contentString??"",contentRef=payloads.find(p=>p.contentReference)?.contentReference,attachment=payloads.find(p=>p.contentAttachment)?.contentAttachment,sentTime=new Date(communication.sent??-1),seenTime=new Date(communication.received??-1),senderResource=useResource2(communication.sender);return jsxs58("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsxs58(Text22,{fz:"xs",mb:"xs",fw:500,className:alignment==="right"?BaseChat_default.chatBubbleNameRight:void 0,"aria-label":"Sender name",children:[senderResource?getDisplayString4(senderResource):"[Unknown sender]","\xA0\xB7\xA0",jsx99(Text22,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),jsx99("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsxs58("div",{className:BaseChat_default.chatBubble,children:[textContent&&jsx99("span",{children:textContent}),contentRef&&jsx99(ChatBubbleDocumentReference,{reference:contentRef,hasText:!!textContent}),attachment&&jsx99(ChatBubbleAttachment,{attachment,hasText:!!textContent})]})}),showDelivered&&jsxs58("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleAttachment({attachment,hasText}){return jsx99("div",{className:hasText?BaseChat_default.chatBubbleAttachmentWithText:void 0,children:jsxs58(Group30,{gap:4,wrap:"nowrap",children:[jsx99("span",{className:BaseChat_default.chatBubbleAttachmentIcon,children:jsx99(IconPaperclip,{size:"0.75rem"})}),jsx99(Text22,{fz:"xs",truncate:!0,children:attachment.title??"File attached"})]})})}function ChatBubbleDocumentReference({reference,hasText}){let attachment=useResource2(reference)?.content?.[0]?.attachment;return attachment?jsx99(ChatBubbleAttachment,{attachment,hasText}):null}function ChatBubbleMenu({contentRef,contentAttachment,onViewInDocuments}){let docRef=useResource2(contentRef),attachment=contentRef?docRef?.content?.[0]?.attachment:contentAttachment,cachedUrl=useCachedBinaryUrl3(attachment?.url),handleDownload=()=>{let href=toSafeUrl(cachedUrl??attachment?.url);href&&window.open(href,"_blank","noopener,noreferrer")};return jsxs58(Menu4,{withinPortal:!0,position:"bottom-start",shadow:"md",children:[jsx99(Menu4.Target,{children:jsx99(ActionIcon8,{variant:"outline",color:"gray",radius:"xl",size:"sm","aria-label":"Attachment options",children:jsx99(IconDots,{size:"0.75rem"})})}),jsxs58(Menu4.Dropdown,{children:[contentRef&&onViewInDocuments&&jsx99(Menu4.Item,{leftSection:jsx99(IconFileExport,{size:"0.9rem"}),onClick:()=>onViewInDocuments(contentRef),children:"View in Documents"}),jsx99(Menu4.Item,{leftSection:jsx99(IconDownload,{size:"0.9rem"}),onClick:handleDownload,children:"Download"})]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs58("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx99("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx99("div",{style:{position:"relative"},children:jsx99(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx99("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx99("div",{className:BaseChat_default.chatBubble,children:jsx99(Skeleton,{height:14,width:parentWidth*.5,radius:"l"})})})]})}import{ActionIcon as ActionIcon9}from"@mantine/core";import{useMedplumProfile as useMedplumProfile5}from"@medplum/react-hooks";import{useEffect as useEffect17,useState as useState57}from"react";var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};import{Fragment as Fragment32,jsx as jsx100,jsxs as jsxs59}from"react/jsx-runtime";function ChatModal(props){let{open,children}=props,profile=useMedplumProfile5(),[opened,setOpened]=useState57(open??!1);return useEffect17(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?jsxs59(Fragment32,{children:[opened&&jsx100("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx100("div",{className:ChatModal_default.iconContainer,children:jsx100(ActionIcon9,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx100(IconChevronDown,{size:"1.625rem"})})}):jsx100("div",{className:ChatModal_default.iconContainer,children:jsx100(ActionIcon9,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx100(IconChevronUp,{size:"1.625rem"})})})]}):null}import{createReference as createReference3,formatCodeableConcept as formatCodeableConcept2,getReferenceString as getReferenceString6}from"@medplum/core";import{useMedplum as useMedplum27,useMedplumProfile as useMedplumProfile6,usePrevious}from"@medplum/react-hooks";import{useCallback as useCallback12,useEffect as useEffect18,useMemo as useMemo26,useState as useState58}from"react";import{jsx as jsx101}from"react/jsx-runtime";function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,excludeHeader,uploadEnabled,onError,onViewInDocuments}=props,medplum=useMedplum27(),profile=useMedplumProfile6(),prevThreadId=usePrevious(thread?.id),[communications,setCommunications]=useState58([]),profileRef=useMemo26(()=>profile?createReference3(profile):void 0,[profile]),threadRef=useMemo26(()=>createReference3(thread),[thread]);useEffect18(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=useCallback12((message,file,existingDocRef)=>{let profileRefStr=profileRef?getReferenceString6(profileRef):void 0;if(!profileRefStr)return;(async()=>{let payload=[];if(message&&payload.push({contentString:message}),existingDocRef)payload.push({contentReference:createReference3(existingDocRef)});else if(file){let docRef=await medplum.createDocumentReference({data:file,contentType:file.type||"application/octet-stream",filename:file.name,additionalFields:{...thread.subject?{subject:thread.subject}:{},description:file.name}});payload.push({contentReference:createReference3(docRef)})}let communication=await medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>getReferenceString6(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload,partOf:[threadRef],subject:thread.subject});if(setCommunications([...communications,communication]),thread.id)try{await medplum.patchResource("Communication",thread.id,[{op:"add",path:"/sent",value:communication.sent}])}catch(err){onError?.(err)}onMessageSent?.(communication)})().catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent,onError]),onMessageReceived=useMemo26(()=>thread.recipient?.length===2?message=>{message.received&&message.status==="completed"||medplum.updateResource({...message,received:message.received??new Date().toISOString(),status:"completed"}).catch(console.error)}:void 0,[medplum,thread.recipient?.length]);return profile?jsx101(BaseChat,{title:title??(thread?.topic?formatCodeableConcept2(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled,excludeHeader,uploadEnabled,onError,attachmentSubjectRef:thread.subject,onViewInDocuments}):null}import{Button as Button10}from"@mantine/core";import{showNotification as showNotification7}from"@mantine/notifications";import{createReference as createReference5,normalizeErrorString as normalizeErrorString9}from"@medplum/core";import{useMedplum as useMedplum28,useMedplumProfile as useMedplumProfile7}from"@medplum/react-hooks";import{useMemo as useMemo27,useState as useState59}from"react";import{Modal as MantineModal}from"@mantine/core";var Modal_default={modal:"Modal_modal",content:"Modal_content",header:"Modal_header",title:"Modal_title",body:"Modal_body",scroll:"Modal_scroll",footer:"Modal_footer"};import{Fragment as Fragment33,jsx as jsx102,jsxs as jsxs60}from"react/jsx-runtime";var formStyle={display:"flex",flexDirection:"column",flex:"1 1 auto",minHeight:0};function Modal3(props){let{children,actions,onSubmit,bodyHeight,classNames,style,closeButtonProps,centered=!0,padding="lg",radius="md",...modalProps}=props,contents=jsxs60(Fragment33,{children:[jsx102("div",{className:Modal_default.scroll,children}),actions&&jsx102("div",{className:Modal_default.footer,children:actions})]});return jsx102(MantineModal,{...modalProps,centered,padding,radius,closeButtonProps:{"aria-label":"Close",radius:"xl",...closeButtonProps},classNames:{...classNames,root:clsx_default(Modal_default.modal,classNames?.root),content:clsx_default(Modal_default.content,classNames?.content),header:clsx_default(Modal_default.header,classNames?.header),title:clsx_default(Modal_default.title,classNames?.title),body:clsx_default(Modal_default.body,classNames?.body)},style:bodyHeight?[style,{"--medplum-modal-body-height":bodyHeight}]:style,children:onSubmit?jsx102(Form,{onSubmit,style:formStyle,children:contents}):contents})}import{Stack as Stack21,Text as Text23,TextInput as TextInput21}from"@mantine/core";import{createReference as createReference4}from"@medplum/core";import{jsx as jsx103,jsxs as jsxs61}from"react/jsx-runtime";var ThreadMessageForm=props=>{let{defaultPractitioners,onPractitionersChange,topic,onTopicChange,defaultPatient,onPatientChange}=props,allowPatientSelection=props.allowPatientSelection??!1;return jsxs61(Stack21,{gap:"lg",children:[jsxs61(Stack21,{gap:0,children:[jsx103(Text23,{fw:500,children:"Patient"}),allowPatientSelection&&jsx103(Text23,{c:"dimmed",children:"Select a patient"}),jsx103(ResourceInput,{resourceType:"Patient",name:"patient",required:!!onPatientChange,defaultValue:defaultPatient,disabled:!allowPatientSelection&&!!defaultPatient,onChange:value=>{onPatientChange?.(value?createReference4(value):void 0)}})]}),jsxs61(Stack21,{gap:0,children:[jsx103(Text23,{fw:500,children:"Practitioner"}),jsx103(Text23,{c:"dimmed",children:"Select one or more practitioners"}),jsx103(MultiResourceInput,{resourceType:"Practitioner",name:"practitioners",defaultValue:defaultPractitioners,onChange:resources=>onPractitionersChange(resources.map(practitioner=>createReference4(practitioner)))})]}),jsxs61(Stack21,{gap:0,children:[jsx103(Text23,{fw:500,children:"Topic (optional)"}),jsx103(Text23,{c:"dimmed",children:"Enter a topic for the message"}),jsx103(TextInput21,{placeholder:"Enter your topic",value:topic,onChange:e=>onTopicChange(e.target.value)})]})]})};import{jsx as jsx104}from"react/jsx-runtime";var NewTopicDialog=props=>{let{subject,opened,onClose,onSubmit,allowPatientSelection=!1}=props,medplum=useMedplum28(),profile=useMedplumProfile7(),profileRef=useMemo27(()=>profile?createReference5(profile):void 0,[profile]),initialPractitioners=useMemo27(()=>profile?.resourceType==="Practitioner"?[createReference5(profile)]:[],[profile]),[topic,setTopic]=useState59(""),[practitioners,setPractitioners]=useState59(initialPractitioners),[patient,setPatient]=useState59(subject?createReference5(subject):void 0);return jsx104(Modal3,{opened,onClose,title:"New Message",size:"md",actions:jsx104(Button10,{onClick:async()=>{if(!patient||practitioners.length===0)return;let communication={resourceType:"Communication",status:"in-progress",subject:patient,sender:profileRef,recipient:[patient,...practitioners],topic:topic?{text:topic}:void 0};try{let createdCommunication=await medplum.createResource(communication);onClose(),onSubmit?.(createdCommunication)}catch(error){showNotification7({color:"red",message:normalizeErrorString9(error)})}},disabled:!patient||practitioners.length===0,children:"Next"}),children:jsx104(ThreadMessageForm,{defaultPractitioners:initialPractitioners,onPractitionersChange:setPractitioners,topic,onTopicChange:setTopic,defaultPatient:patient,onPatientChange:setPatient,allowPatientSelection})})};import{ActionIcon as ActionIcon10,Checkbox as Checkbox5,CloseButton as CloseButton2,Group as Group31,Indicator,Popover as Popover2,Stack as Stack22,Text as Text24,TextInput as TextInput22,Tooltip as Tooltip5}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback3,useDisclosure}from"@mantine/hooks";import{showNotification as showNotification8}from"@mantine/notifications";import{createReference as createReference6,formatHumanName as formatHumanName7,getReferenceString as getReferenceString7,normalizeErrorString as normalizeErrorString10}from"@medplum/core";import{useMedplum as useMedplum29,useMedplumProfile as useMedplumProfile8,useResource as useResource3}from"@medplum/react-hooks";import{useEffect as useEffect19,useMemo as useMemo28,useState as useState60}from"react";var ParticipantFilter_default={participantItem:"ParticipantFilter_participantItem"};import{jsx as jsx105,jsxs as jsxs62}from"react/jsx-runtime";function ParticipantFilter(props){let{selectedParticipants,onFilterChange}=props,[opened,{open,close}]=useDisclosure(!1),[searchQuery,setSearchQuery]=useState60(""),[searchResults,setSearchResults]=useState60([]),[isSearching,setIsSearching]=useState60(!1),medplum=useMedplum29(),profile=useMedplumProfile8(),currentUserParticipant=useMemo28(()=>{if(profile)return createReference6(profile)},[profile]),additionalParticipants=useMemo28(()=>{let currentUserRef=currentUserParticipant?.reference;return selectedParticipants.filter(p=>p.reference!==currentUserRef)},[selectedParticipants,currentUserParticipant]),debouncedSearch=useDebouncedCallback3(async query=>{if(!query.trim()){setSearchResults([]);return}setIsSearching(!0);try{let bundle=await medplum.search("Patient",{_type:"Patient,Practitioner",name:query,_count:"10"}),currentUserRef=currentUserParticipant?.reference,results=(bundle.entry??[]).map(entry=>entry.resource).filter(resource=>{if(!resource)return!1;let refString=getReferenceString7(resource);return!!refString&&refString!==currentUserRef}).map(resource=>createReference6(resource));setSearchResults(results)}catch(error){showNotification8({color:"red",message:normalizeErrorString10(error)}),setSearchResults([])}finally{setIsSearching(!1)}},300);useEffect19(()=>(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=useMemo28(()=>{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 jsxs62(Popover2,{opened,onChange:o=>!o&&close(),position:"bottom-start",width:360,shadow:"md",radius:"md",withinPortal:!0,children:[jsx105(Popover2.Target,{children:jsx105(Tooltip5,{label:"Message Participants",position:"bottom",openDelay:500,disabled:opened,children:jsx105(Indicator,{disabled:!hasActiveFilter,color:"blue",size:8,offset:4,children:jsx105(ActionIcon10,{variant:"transparent",onClick:opened?close:open,radius:"xl",size:32,className:"outline-icon-button","data-opened":opened||void 0,children:jsx105(IconUsers,{size:16})})})})}),jsx105(Popover2.Dropdown,{p:"md",children:jsxs62(Stack22,{gap:"md",children:[jsx105(Text24,{size:"xs",c:"dimmed",fw:500,children:"Message Participants"}),jsx105(TextInput22,{placeholder:"Search for a Patient or Practitioner...",value:searchQuery,autoFocus:!0,onChange:e=>setSearchQuery(e.target.value),rightSection:searchQuery?jsx105(CloseButton2,{size:"sm",onClick:()=>setSearchQuery("")}):null}),jsxs62(Stack22,{gap:"xs",mah:250,style:{overflowY:"auto"},children:[currentUserParticipant&&jsx105(ParticipantItem,{participant:currentUserParticipant,isSelected:isSelected(currentUserParticipant),isCurrentUser:!0,onToggle:()=>toggleParticipant(currentUserParticipant)}),displayParticipants.map(participant=>jsx105(ParticipantItem,{participant,isSelected:isSelected(participant),isCurrentUser:!1,onToggle:()=>toggleParticipant(participant),onRemove:isSelected(participant)?()=>removeParticipant(participant):void 0},participant.reference)),isSearching&&jsx105(Text24,{size:"sm",c:"dimmed",ta:"center",children:"Searching..."}),searchQuery.trim()&&!isSearching&&searchResults.length===0&&jsx105(Text24,{size:"sm",c:"dimmed",ta:"center",children:"No results found"})]})]})})]})}function ParticipantItem(props){let{participant,isSelected,isCurrentUser,onToggle,onRemove}=props,patientResource=useResource3(participant);return patientResource?jsxs62(Group31,{justify:"space-between",wrap:"nowrap",className:ParticipantFilter_default.participantItem,children:[jsxs62(Group31,{gap:"sm",wrap:"nowrap",style:{flex:1,minWidth:0},children:[jsx105(Checkbox5,{checked:isSelected,onChange:onToggle}),jsx105(ResourceAvatar,{value:participant,radius:"xl",size:32}),jsxs62(Text24,{size:"sm",truncate:!0,style:{flex:1},children:[formatHumanName7(patientResource?.name?.[0]??{}),isCurrentUser&&jsxs62(Text24,{component:"span",c:"dimmed",size:"sm",children:[" ","(you)"]})]})]}),onRemove&&jsx105(CloseButton2,{size:"sm",onClick:onRemove})]}):null}import{ActionIcon as ActionIcon14,Box as Box27,Center as Center5,Flex as Flex25,Skeleton as Skeleton3,Stack as Stack37,Text as Text44,ThemeIcon,Tooltip as Tooltip9}from"@mantine/core";import{useDisclosure as useDisclosure12}from"@mantine/hooks";import{showNotification as showNotification10}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString13,Operator,parseSearchRequest}from"@medplum/core";import{useThreadInbox}from"@medplum/react-hooks";import{useCallback as useCallback27,useEffect as useEffect24,useMemo as useMemo34}from"react";import{Box as Box13,Center as Center4,Divider as Divider7,Flex as Flex13,Group as Group32,Pagination,ScrollArea as ScrollArea3,Stack as Stack24,Tabs,Text as Text25}from"@mantine/core";import{useEffect as useEffect20,useRef as useRef12}from"react";var ListWithDetailPane_default={container:"ListWithDetailPane_container",shell:"ListWithDetailPane_shell",detailBorder:"ListWithDetailPane_detailBorder",list:"ListWithDetailPane_list",item:"ListWithDetailPane_item",selected:"ListWithDetailPane_selected",footer:"ListWithDetailPane_footer",headerText:"ListWithDetailPane_headerText",pillTabs:"ListWithDetailPane_pillTabs",tabLink:"ListWithDetailPane_tabLink"};import{Divider as Divider6,Flex as Flex12,Skeleton as Skeleton2,Stack as Stack23}from"@mantine/core";import{jsx as jsx106,jsxs as jsxs63}from"react/jsx-runtime";var SKELETON_WIDTHS=[["85%","60%","72%"],["70%","80%","55%"],["92%","50%","65%"],["78%","68%","58%"],["88%","45%","75%"],["74%","70%","62%"]];function ListWithDetailPaneSkeleton(){return jsx106(Stack23,{gap:"md",p:"md",children:SKELETON_WIDTHS.map((widths,index)=>jsxs63(Stack23,{children:[jsxs63(Flex12,{direction:"column",gap:"xs",align:"flex-start",children:[jsx106(Skeleton2,{height:16,width:widths[0]}),jsx106(Skeleton2,{height:14,width:widths[1]}),jsx106(Skeleton2,{height:14,width:widths[2]})]}),jsx106(Divider6,{})]},index))})}import{Fragment as Fragment34,jsx as jsx107,jsxs as jsxs64}from"react/jsx-runtime";var DEFAULT_LIST_WIDTH=350,HEADER_HEIGHT2=64;function ListWithDetailPane(props){let{items,loading,selectedKey,renderItem,emptyList,skeleton,listWidth=DEFAULT_LIST_WIDTH,headerText,tabs,activeTab,headerActions,selected,renderDetail,emptyDetail,refresh,onSelectFirst,page,pageCount,onPageChange}=props,onSelectFirstRef=useRef12(onSelectFirst);useEffect20(()=>{onSelectFirstRef.current=onSelectFirst}),useEffect20(()=>{!loading&&selectedKey===void 0&&items.length>0&&onSelectFirstRef.current?.(items[0])},[loading,selectedKey,items]);let headerLeft=jsx107("span",{});return tabs?headerLeft=jsx107(Tabs,{value:activeTab??null,variant:"unstyled",className:ListWithDetailPane_default.pillTabs,children:jsx107(Tabs.List,{children:tabs.map(tab=>jsx107(Tabs.Tab,{value:tab.value,renderRoot:({onClick:_onClick,className,children,...rootProps})=>jsx107(MedplumLink,{to:tab.uri,className:clsx_default(ListWithDetailPane_default.tabLink,className),...rootProps,children}),children:tab.label},tab.value))})}):headerText!==void 0&&(headerLeft=jsx107(Text25,{className:ListWithDetailPane_default.headerText,children:headerText})),jsxs64(Flex13,{direction:"row",h:"100%",w:"100%",className:ListWithDetailPane_default.container,children:[jsxs64(Flex13,{direction:"column",w:listWidth,h:"100%",className:ListWithDetailPane_default.shell,children:[(tabs||headerActions||headerText)&&jsxs64(Fragment34,{children:[jsxs64(Flex13,{h:HEADER_HEIGHT2,align:"center",justify:"space-between",p:"md",children:[headerLeft,headerActions&&jsx107(Group32,{gap:"xs",children:headerActions})]}),jsx107(Divider7,{})]}),jsxs64(ScrollArea3,{flex:1,scrollbarSize:10,type:"hover",scrollHideDelay:250,children:[loading&&(skeleton??jsx107(ListWithDetailPaneSkeleton,{})),!loading&&items.length===0&&(emptyList??jsx107(DefaultEmptyList,{})),!loading&&items.length>0&&jsx107("div",{className:ListWithDetailPane_default.list,children:items.map((item,index)=>{let isSelected=item.id!==void 0&&item.id===selectedKey;return jsx107("div",{className:clsx_default(ListWithDetailPane_default.item,isSelected&&ListWithDetailPane_default.selected),children:renderItem(item,{selected:isSelected,index,items})},item.id??index)})})]}),onPageChange!==void 0&&page!==void 0&&pageCount!==void 0&&pageCount>1&&jsx107("div",{className:ListWithDetailPane_default.footer,children:jsx107(Pagination,{value:page,total:pageCount,onChange:onPageChange,size:"sm",siblings:1,boundaries:1})})]}),selected===void 0?jsx107(Box13,{flex:1,h:"100%",children:emptyDetail??jsx107(DefaultEmptyDetail,{})}):renderDetail(selected,{refresh})]})}function DefaultEmptyList(){return jsx107(Flex13,{direction:"column",h:"100%",justify:"center",align:"center",pt:"xl",children:jsx107(Text25,{c:"dimmed",fw:500,children:"No items found"})})}function DefaultEmptyDetail(){return jsx107(Center4,{h:"100%",w:"100%",children:jsx107(Stack24,{align:"center",gap:"xs",children:jsx107(Text25,{size:"sm",c:"dimmed",ta:"center",children:"Select an item from the list to view details"})})})}import{Button as Button11}from"@mantine/core";import{showNotification as showNotification9}from"@mantine/notifications";import{isReference as isReference3,normalizeErrorString as normalizeErrorString11}from"@medplum/core";import{useMedplum as useMedplum30,useResource as useResource4}from"@medplum/react-hooks";import{useMemo as useMemo29,useState as useState61}from"react";import{jsx as jsx108}from"react/jsx-runtime";var EditThreadDialog=props=>{let{opened,onClose,onSaved}=props,medplum=useMedplum30(),thread=useResource4(props.thread),patientRef=thread?.subject,initialPractitioners=useMemo29(()=>{let fromRecipients=(thread?.recipient??[]).filter(r2=>isReference3(r2,"Practitioner"));if(fromRecipients.length>0)return fromRecipients;let sender=thread?.sender;return isReference3(sender,"Practitioner")?[sender]:[]},[thread?.recipient,thread?.sender]),[topic,setTopic]=useState61(thread?.topic?.text??""),[practitioners,setPractitioners]=useState61(initialPractitioners),[initializedThread,setInitializedThread]=useState61(thread);return thread!==initializedThread&&(setInitializedThread(thread),setTopic(thread?.topic?.text??""),setPractitioners(initialPractitioners)),jsx108(Modal3,{opened,onClose,title:"Message Settings",size:"md",actions:thread&&jsx108(Button11,{onClick:async()=>{if(!thread)return;let preservedRecipients=(thread.recipient??[]).filter(r2=>!isReference3(r2,"Practitioner")),updated={...thread,recipient:[...preservedRecipients,...practitioners],topic:topic?{text:topic}:void 0};try{let saved=await medplum.updateResource(updated);onSaved?.(saved),onClose()}catch(error){showNotification9({color:"red",message:normalizeErrorString11(error)})}},disabled:practitioners.length===0,children:"Save"}),children:thread&&jsx108(ThreadMessageForm,{defaultPractitioners:initialPractitioners,onPractitionersChange:setPractitioners,topic,onTopicChange:setTopic,defaultPatient:patientRef})})};import{ActionIcon as ActionIcon13,Box as Box26,Button as Button14,Divider as Divider10,Flex as Flex24,Group as Group50,Menu as Menu5,Paper as Paper3,ScrollArea as ScrollArea4,Stack as Stack35,Text as Text42,Tooltip as Tooltip8}from"@mantine/core";import{getReferenceString as getReferenceString9}from"@medplum/core";import{Divider as Divider9,Flex as Flex23,Group as Group49,Stack as Stack34,Text as Text41,Tooltip as Tooltip7}from"@mantine/core";import{formatHumanName as formatHumanName9,resolveId}from"@medplum/core";import{useMedplum as useMedplum41,usePatientSummaryData,useResource as useResource9}from"@medplum/react-hooks";import{useEffect as useEffect23,useMemo as useMemo33,useState as useState80}from"react";var PatientSummary_default={panel:"PatientSummary_panel",patientSummaryBadge:"PatientSummary_patientSummaryBadge",patientSummaryAddButton:"PatientSummary_patientSummaryAddButton",patientSummaryHeader:"PatientSummary_patientSummaryHeader",patientSummaryCollapseIcon:"PatientSummary_patientSummaryCollapseIcon",collapsed:"PatientSummary_collapsed"};import{Stack as Stack33}from"@mantine/core";import{calculateAgeString,formatAddress as formatAddress4}from"@medplum/core";import{Box as Box16,Flex as Flex14,Group as Group35,Text as Text27}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{getDisplayString as getDisplayString5}from"@medplum/core";import{useMedplum as useMedplum31}from"@medplum/react-hooks";import{useCallback as useCallback14,useMemo as useMemo30,useState as useState64}from"react";import{Badge}from"@mantine/core";import{jsx as jsx109}from"react/jsx-runtime";var statusToColor={draft:"blue",active:"blue","on-hold":"yellow",revoked:"red",completed:"green","entered-in-error":"red",unknown:"gray",retired:"gray",registered:"blue",preliminary:"blue",final:"green",amended:"yellow",corrected:"yellow",cancelled:"red",requested:"blue",received:"blue",accepted:"blue",rejected:"red",ready:"blue","in-progress":"blue",failed:"red",proposed:"blue",pending:"blue",booked:"blue",arrived:"blue",fulfilled:"green",noshow:"red","checked-in":"blue",waitlist:"gray",routine:"gray",urgent:"red",asap:"red",stat:"red","not-done":"red",connected:"green",disconnected:"red",finished:"green",planned:"gray"};function StatusBadge(props){let{status,...badgeProps}=props;return jsx109(Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}import{Group as Group33,Stack as Stack25,TextInput as TextInput23}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG2,addProfileToResource,createReference as createReference7}from"@medplum/core";import{useCallback as useCallback13,useState as useState62}from"react";import{jsx as jsx110,jsxs as jsxs65}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG2+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState62(allergy?.code),[clinicalStatus,setClinicalStatus]=useState62(allergy?.clinicalStatus),handleSubmit=useCallback13(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference7(patient),encounter:encounter?createReference7(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0},PATIENT_ALLERGY_PROFILE))},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx110(Form,{onSubmit:handleSubmit,children:jsxs65(Stack25,{children:[jsx110(CodeableConceptInput,{name:"allergy",label:"Code",path:"AllergyIntolerance.code","data-autofocus":!0,binding:HTTP+"cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1186.8",maxValues:1,defaultValue:allergy?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx110(TextInput23,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx110(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG2+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx110(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx110(Group33,{justify:"flex-end",gap:4,mt:"md",children:jsx110(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon11,Box as Box14,Collapse,Group as Group34,Text as Text26}from"@mantine/core";import{useState as useState63}from"react";var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title",addButton:"CollapsibleSection_addButton"};import{jsx as jsx111,jsxs as jsxs66}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState63(!1);return jsxs66(Box14,{className:CollapsibleSection_default.root,py:"xs",children:[jsxs66(Group34,{justify:"space-between",align:"center",wrap:"nowrap",className:CollapsibleSection_default.header,children:[jsxs66(Group34,{gap:8,wrap:"nowrap",children:[jsx111(ActionIcon11,{variant:"subtle",color:"gray",radius:"xl",onClick:()=>setCollapsed(c=>!c),"aria-label":collapsed?`Show ${title.toLowerCase()}`:`Hide ${title.toLowerCase()}`,className:CollapsibleSection_default.chevron,"data-collapsed":collapsed||void 0,size:"md",children:jsx111(IconChevronDown,{size:20})}),jsx111(Text26,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx111(ActionIcon11,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",radius:"xl",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx111(IconPlus,{size:18})})]}),jsx111(Collapse,{in:!collapsed,children:jsx111(Box14,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}import{ActionIcon as ActionIcon12,Box as Box15}from"@mantine/core";var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};import{jsx as jsx112,jsxs as jsxs67}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs67(Box15,{className:SummaryItem_default.item,onClick,children:[children,jsx112("div",{className:SummaryItem_default.gradient}),jsx112("div",{className:SummaryItem_default.container,children:jsx112(ActionIcon12,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx112(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment35,jsx as jsx113,jsxs as jsxs68}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum31(),{patient,encounter}=props,[allergies,setAllergies]=useState64(props.allergies),[opened,{open,close}]=useDisclosure2(!1),[editAllergy,setEditAllergy]=useState64(),sortedAllergies=useMemo30(()=>[...allergies].sort((a,b)=>{let aStatus=a.clinicalStatus?.coding?.[0]?.code,bStatus=b.clinicalStatus?.coding?.[0]?.code;return aStatus==="active"&&bStatus!=="active"?-1:aStatus!=="active"&&bStatus==="active"?1:getDisplayString5(a).localeCompare(getDisplayString5(b))}),[allergies]),handleSubmit=useCallback14(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 jsxs68(Fragment35,{children:[jsx113(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx113(Box16,{children:jsx113(Flex14,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx113(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs68(Box16,{children:[jsx113(Text27,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString5(allergy)}),jsx113(Group35,{mt:2,gap:4,children:status&&jsx113(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx113(Text27,{children:"(none)"})}),jsx113(Modal3,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx113(AllergyDialog,{patient,encounter,allergy:editAllergy,onSubmit:handleSubmit})})]})}function getClinicalStatusColor(status){if(!status)return"gray";switch(status){case"active":return"red";case"inactive":return"orange";case"resolved":return"blue";default:return"gray"}}import{Box as Box17,Flex as Flex15,Group as Group36,Text as Text28}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{formatCodeableConcept as formatCodeableConcept3,formatDate}from"@medplum/core";import{useMedplum as useMedplum32}from"@medplum/react-hooks";import{useCallback as useCallback16,useState as useState66}from"react";import{Button as Button12,Stack as Stack26,TextInput as TextInput24}from"@mantine/core";import{createReference as createReference8}from"@medplum/core";import{useCallback as useCallback15,useState as useState65}from"react";import{Fragment as Fragment36,jsx as jsx114,jsxs as jsxs69}from"react/jsx-runtime";var GOAL_STATUS_VALUESET="http://hl7.org/fhir/ValueSet/goal-status";function GoalDialog(props){let{patient,goal,opened,onClose,onSubmit,onDelete}=props,[lifecycleStatus,setLifecycleStatus]=useState65(goal?.lifecycleStatus??"active"),handleSubmit=useCallback15(formData=>{onSubmit({...goal,resourceType:"Goal",lifecycleStatus:lifecycleStatus??"active",description:{text:formData.description??goal?.description?.text??""},subject:createReference8(patient),startDate:formData.startDate||void 0,target:formData.dueDate?[{...goal?.target?.[0],dueDate:formData.dueDate}]:goal?.target})},[patient,goal,lifecycleStatus,onSubmit]);return jsx114(Modal3,{opened,onClose,title:goal?"Edit Goal":"Add Goal",size:"md",onSubmit:handleSubmit,actions:jsxs69(Fragment36,{children:[jsx114(SubmitButton,{children:"Save"}),goal?.id&&onDelete&&jsx114(Button12,{variant:"light",color:"red",leftSection:jsx114(IconTrash,{size:16}),onClick:onDelete,children:"Delete"})]}),children:jsxs69(Stack26,{gap:"md",children:[jsx114(TextInput24,{name:"description",label:"Goal","data-autofocus":!0,required:!0,defaultValue:goal?.description?.text}),jsx114(CodeInput,{name:"lifecycleStatus",label:"Status",binding:GOAL_STATUS_VALUESET,maxValues:1,defaultValue:goal?.lifecycleStatus??"active",onChange:value=>setLifecycleStatus(value??void 0)}),jsx114(TextInput24,{type:"date",name:"startDate",label:"Start Date",defaultValue:goal?.startDate}),jsx114(TextInput24,{type:"date",name:"dueDate",label:"Target Date",defaultValue:goal?.target?.[0]?.dueDate})]})})}import{capitalize as capitalize3,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG3}from"@medplum/core";function isEnteredInError(resource){let candidate=resource;return candidate.status==="entered-in-error"||candidate.lifecycleStatus==="entered-in-error"?!0:!!candidate.verificationStatus?.coding?.some(coding=>coding.code==="entered-in-error")}function getGenderIdentity(patient){return getExtension(patient,`${HTTP_HL7_ORG3}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension(patient,`${HTTP_HL7_ORG3}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension(patient,`${HTTP_HL7_ORG3}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension(patient,`${HTTP_HL7_ORG3}/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?capitalize3(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 ")}function formatStatusLabel(status){return status.split("-").map(word=>capitalize3(word)).join(" ")}var getPreferredLanguage=patient=>{if(!patient.communication?.length)return;let preferred=patient.communication?.find(comm=>comm.preferred===!0);return preferred?.language?.coding?.[0]?.display?preferred.language.coding[0].display:patient.communication[0]?.language?.coding?.[0]?.display};import{Fragment as Fragment37,jsx as jsx115,jsxs as jsxs70}from"react/jsx-runtime";function Goals(props){let medplum=useMedplum32(),{patient}=props,[goals,setGoals]=useState66(props.goals),[opened,{open,close}]=useDisclosure3(!1),[editGoal,setEditGoal]=useState66(),handleSubmit=useCallback16(async goal=>{if(goal.id){let updated=await medplum.updateResource(goal);setGoals(goals.map(g=>g.id===updated.id?updated:g))}else{let created=await medplum.createResource(goal);setGoals([created,...goals])}setEditGoal(void 0),close()},[medplum,goals,close]),visibleGoals=goals.filter(goal=>!isEnteredInError(goal)),handleDelete=useCallback16(async()=>{editGoal?.id&&(await medplum.deleteResource("Goal",editGoal.id),setGoals(goals.filter(g=>g.id!==editGoal.id)),setEditGoal(void 0),close())},[medplum,goals,editGoal,close]);return jsxs70(Fragment37,{children:[jsx115(CollapsibleSection,{title:"Goals",onAdd:()=>{setEditGoal(void 0),open()},children:visibleGoals.length>0?jsx115(Flex15,{direction:"column",gap:8,children:visibleGoals.map(goal=>jsx115(SummaryItem,{onClick:()=>{setEditGoal(goal),open()},children:jsxs70(Box17,{children:[jsx115(Text28,{fw:500,className:SummaryItem_default.itemText,children:getGoalDisplay(goal)}),jsxs70(Group36,{mt:2,gap:4,children:[goal.lifecycleStatus&&jsx115(StatusBadge,{color:getGoalStatusColor(goal.lifecycleStatus),variant:"light",status:goal.lifecycleStatus}),getGoalDateText(goal)&&jsx115(Text28,{size:"xs",fw:500,c:"dimmed",children:getGoalDateText(goal)})]})]})},goal.id))}):jsx115(Text28,{children:"(none)"})}),opened&&jsx115(GoalDialog,{patient,goal:editGoal,opened,onClose:close,onSubmit:handleSubmit,onDelete:handleDelete})]})}function getGoalDisplay(goal){return goal.description&&formatCodeableConcept3(goal.description)||"Goal"}function getGoalDateText(goal){let dueDate=goal.target?.find(target=>target.dueDate)?.dueDate;return dueDate?`Target ${formatDate(dueDate)}`:goal.startDate?`Started ${formatDate(goal.startDate)}`:void 0}function getGoalStatusColor(status){switch(status){case"active":case"accepted":case"completed":return"green";case"on-hold":case"planned":case"proposed":return"yellow";case"cancelled":case"rejected":case"entered-in-error":return"red";default:return"gray"}}import{Box as Box18,Flex as Flex16,Group as Group37,Text as Text29}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{formatCodeableConcept as formatCodeableConcept4,formatDate as formatDate2}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback18,useState as useState68}from"react";import{Button as Button13,Radio,Stack as Stack27}from"@mantine/core";import{createReference as createReference9}from"@medplum/core";import{useCallback as useCallback17,useState as useState67}from"react";import{Fragment as Fragment38,jsx as jsx116,jsxs as jsxs71}from"react/jsx-runtime";var statusValues=["completed","not-done"];function ImmunizationDialog(props){let{patient,encounter,immunization,opened,onClose,onSubmit,onDelete}=props,[vaccineCode,setVaccineCode]=useState67(immunization?.vaccineCode),handleSubmit=useCallback17(formData=>{onSubmit({...immunization,resourceType:"Immunization",status:formData.status??"completed",patient:createReference9(patient),encounter:immunization?.encounter??(encounter&&createReference9(encounter)),vaccineCode:vaccineCode??{text:""},occurrenceDateTime:formData.occurrenceDateTime?convertLocalToIso(formData.occurrenceDateTime):immunization?.occurrenceDateTime??""})},[patient,encounter,immunization,vaccineCode,onSubmit]);return jsx116(Modal3,{opened,onClose,title:immunization?"Edit Immunization":"Add Immunization",size:"md",onSubmit:handleSubmit,actions:jsxs71(Fragment38,{children:[jsx116(SubmitButton,{children:"Save"}),immunization?.id&&onDelete&&jsx116(Button13,{variant:"light",color:"red",leftSection:jsx116(IconTrash,{size:16}),onClick:onDelete,children:"Delete"})]}),children:jsxs71(Stack27,{gap:"md",children:[jsx116(CodeableConceptInput,{name:"vaccineCode",label:"Vaccine",path:"Immunization.vaccineCode","data-autofocus":!0,binding:"http://hl7.org/fhir/ValueSet/vaccine-code",maxValues:1,defaultValue:immunization?.vaccineCode,onChange:value=>setVaccineCode(value),outcome:void 0}),jsx116(DateTimeInput,{name:"occurrenceDateTime",label:"Date Given",defaultValue:immunization?.occurrenceDateTime,required:!0}),jsx116(Radio.Group,{name:"status",label:"Status",required:!0,defaultValue:immunization?.status??"completed",children:statusValues.map(sv=>jsx116(Radio,{value:sv,label:formatStatusLabel(sv),my:"xs",required:!0},sv))})]})})}import{Fragment as Fragment39,jsx as jsx117,jsxs as jsxs72}from"react/jsx-runtime";function Immunizations(props){let medplum=useMedplum33(),{patient,encounter}=props,[immunizations,setImmunizations]=useState68(props.immunizations),[opened,{open,close}]=useDisclosure4(!1),[editImmunization,setEditImmunization]=useState68(),sortedImmunizations=[...immunizations].filter(immunization=>!isEnteredInError(immunization)).sort((a,b)=>(b.occurrenceDateTime??"").localeCompare(a.occurrenceDateTime??"")),handleSubmit=useCallback18(async immunization=>{if(immunization.id){let updated=await medplum.updateResource(immunization);setImmunizations(immunizations.map(i=>i.id===updated.id?updated:i))}else{let created=await medplum.createResource(immunization);setImmunizations([created,...immunizations])}setEditImmunization(void 0),close()},[medplum,immunizations,close]),handleDelete=useCallback18(async()=>{editImmunization?.id&&(await medplum.deleteResource("Immunization",editImmunization.id),setImmunizations(immunizations.filter(i=>i.id!==editImmunization.id)),setEditImmunization(void 0),close())},[medplum,immunizations,editImmunization,close]);return jsxs72(Fragment39,{children:[jsx117(CollapsibleSection,{title:"Immunizations",onAdd:()=>{setEditImmunization(void 0),open()},children:sortedImmunizations.length>0?jsx117(Flex16,{direction:"column",gap:8,children:sortedImmunizations.map(immunization=>jsx117(SummaryItem,{onClick:()=>{setEditImmunization(immunization),open()},children:jsxs72(Box18,{children:[jsx117(Text29,{fw:500,className:SummaryItem_default.itemText,children:getImmunizationDisplay(immunization)}),jsxs72(Group37,{mt:2,gap:4,children:[immunization.status&&jsx117(StatusBadge,{color:getImmunizationStatusColor(immunization.status),variant:"light",status:immunization.status}),immunization.occurrenceDateTime&&jsxs72(Text29,{size:"xs",fw:500,c:"dimmed",children:["Given ",formatDate2(immunization.occurrenceDateTime)]})]})]})},immunization.id))}):jsx117(Text29,{children:"(none)"})}),opened&&jsx117(ImmunizationDialog,{patient,encounter,immunization:editImmunization,opened,onClose:close,onSubmit:handleSubmit,onDelete:handleDelete})]})}function getImmunizationDisplay(immunization){return immunization.vaccineCode&&formatCodeableConcept4(immunization.vaccineCode)||"Immunization"}function getImmunizationStatusColor(status){switch(status){case"completed":return"green";case"not-done":return"gray";case"entered-in-error":return"red";default:return"gray"}}import{Box as Box19,Flex as Flex17,Group as Group38,Text as Text30}from"@mantine/core";import{formatDate as formatDate3}from"@medplum/core";import{useResource as useResource5}from"@medplum/react-hooks";import{jsx as jsx118,jsxs as jsxs73}from"react/jsx-runtime";function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=useResource5(coverage),organizationResource=useResource5(organization),payorName="Unknown Payor";organizationResource&&"name"in organizationResource&&typeof organizationResource.name=="string"&&(payorName=organizationResource.name);let detailsText=`ID: ${coverageResource?.subscriberId??"N/A"}${formatClassInfo(coverageResource)?` \xB7 ${formatClassInfo(coverageResource)}`:""}`;return jsx118(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs73(Box19,{children:[jsx118(Text30,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx118(Text30,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs73(Group38,{mt:2,gap:4,children:[jsx118(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs73(Text30,{size:"xs",fw:500,color:"gray.6",children:["Ends ",formatDate3(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 jsx118(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx118(Flex17,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx118(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx118(Text30,{children:"(none)"})})}function capitalizeWords(str){return str.split(" ").map(word=>word.charAt(0).toUpperCase()+word.slice(1).toLowerCase()).join(" ")}function formatClassInfo(coverage){return coverage?coverage.class?.filter(cls=>cls.type?.coding?.[0]?.code!=="plan").map(cls=>{let type=cls.type?.coding?.[0]?.code??"";return`${capitalizeWords(type)}: ${cls.value}`}).join(" \xB7 ")??"":""}import{Box as Box20,Flex as Flex18,Group as Group41,Text as Text33}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{formatDate as formatDate4,getDisplayString as getDisplayString8}from"@medplum/core";import{useState as useState71}from"react";import{Divider as Divider8,Group as Group40,List,Stack as Stack29,Text as Text32,Title as Title10}from"@mantine/core";import{formatAddress as formatAddress2,formatCodeableConcept as formatCodeableConcept5,formatDateTime as formatDateTime2,formatHumanName as formatHumanName8,formatObservationValue,getDisplayString as getDisplayString7,isReference as isReference4}from"@medplum/core";import{useMedplum as useMedplum34,useResource as useResource7}from"@medplum/react-hooks";import{useEffect as useEffect21,useState as useState70}from"react";import{Blockquote,Stack as Stack28}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx119}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx119(Stack28,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx119(Blockquote,{classNames:{cite:NoteDisplay_default.noteCite,root:NoteDisplay_default.noteRoot},cite:note.authorReference?.display||note.authorString,icon:null,children:note.text},`note-${note.text}`))}):null}import{Group as Group39}from"@mantine/core";import{Text as Text31}from"@mantine/core";import{getDisplayString as getDisplayString6,isOk as isOk2,normalizeErrorString as normalizeErrorString12}from"@medplum/core";import{useResource as useResource6}from"@medplum/react-hooks";import{useState as useState69}from"react";import{jsx as jsx120}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState69(),resource=useResource6(value,setOutcome),text;if(outcome&&!isOk2(outcome))text=`[${normalizeErrorString12(outcome)}]`;else if(resource)text=getDisplayString6(resource);else return null;return link?jsx120(MedplumLink,{to:value,...rest,children:text}):jsx120(Text31,{component:"span",...rest,children:text})}import{jsx as jsx121,jsxs as jsxs74}from"react/jsx-runtime";function ResourceBadge(props){return jsxs74(Group39,{gap:"xs",children:[jsx121(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx121(ResourceName,{value:props.value,link:props.link})]})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",groupHeaderRow:"DiagnosticReportDisplay_groupHeaderRow",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment40,jsx as jsx122,jsxs as jsxs75}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum34(),diagnosticReport=useResource7(props.value),[specimens,setSpecimens]=useState70();if(useEffect21(()=>{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 jsxs75(Stack29,{children:[jsx122(Title10,{children:"Diagnostic Report"}),jsx122(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx122(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx122(NoteDisplay,{value:specimenNotes}),diagnosticReport.conclusion&&jsxs75(Stack29,{mt:"md",children:[jsx122(Text32,{fw:500,size:"sm",c:"dimmed",children:"Conclusion"}),jsx122(Text32,{children:diagnosticReport.conclusion})]}),jsx122(PerformingLabs,{value:diagnosticReport})]})}function DiagnosticReportHeader({value,hideSubject=!1}){let basedOn=useResource7(value.basedOn?.[0]),requester=basedOn?.resourceType==="ServiceRequest"?basedOn.requester:void 0,showSubject=!!(value.subject&&!hideSubject),hasLeftColumn=showSubject||!!requester||!!value.resultsInterpreter?.length,hasRightColumn=!!(value.performer?.length||value.issued||value.status);return jsxs75(Group40,{mt:"md",gap:"xl",align:"stretch",wrap:"nowrap",children:[hasLeftColumn&&jsxs75(Stack29,{gap:"md",style:{flex:1},children:[showSubject&&jsx122(HeaderField,{label:"Subject",children:jsx122(ResourceBadge,{value:value.subject,link:!0})}),requester&&jsx122(HeaderField,{label:"Ordering",children:jsx122(ResourceBadge,{value:requester,link:!0})}),value.resultsInterpreter?.map(interpreter=>jsx122(HeaderField,{label:"Interpreter",children:jsx122(ResourceBadge,{value:interpreter,link:!0})},interpreter.reference))]}),hasLeftColumn&&hasRightColumn&&jsx122(Divider8,{orientation:"vertical"}),hasRightColumn&&jsxs75(Stack29,{gap:"md",style:{flex:1},children:[value.performer?.map(performer=>jsx122(HeaderField,{label:"Performer",children:jsx122(PerformerDisplay,{value:performer})},performer.reference)),value.issued&&jsx122(HeaderField,{label:"Issued",children:jsx122(Text32,{children:formatDateTime2(value.issued)})}),value.status&&jsx122(HeaderField,{label:"Status",children:jsx122(StatusBadge,{status:value.status})})]})]})}function HeaderField({label,children}){return jsxs75(Group40,{gap:"md",align:"flex-start",wrap:"nowrap",children:[jsx122(Text32,{c:"dimmed",w:110,style:{flexShrink:0},children:label}),jsx122("div",{children})]})}function PerformerDisplay({value}){let performer=useResource7(value),address=performer?.resourceType==="Organization"?performer.address?.[0]:void 0;return jsxs75(Fragment40,{children:[jsx122(ResourceBadge,{value,link:!0}),address&&jsx122(Text32,{size:"sm",c:"dimmed",mt:4,ml:34,children:jsx122(AddressDisplay,{value:address})})]})}function SpecimenInfo(specimens){return jsxs75(Stack29,{gap:"xs",children:[jsx122(Title10,{order:2,size:"h6",children:"Specimens"}),jsx122(List,{type:"ordered",children:specimens?.map(specimen=>jsx122(List.Item,{ml:"sm",children:jsxs75(Group40,{gap:20,children:[jsxs75(Group40,{gap:5,children:[jsx122(Text32,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs75(Group40,{gap:5,children:[jsx122(Text32,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs75("table",{className:DiagnosticReportDisplay_default.table,children:[jsx122("thead",{children:jsxs75("tr",{children:[jsx122("th",{children:"Test"}),jsx122("th",{children:"Value"}),jsx122("th",{children:"Reference Range"}),jsx122("th",{children:"Interpretation"}),jsx122("th",{children:"Category"}),jsx122("th",{children:"Performer"}),jsx122("th",{children:"Status"})]})}),jsx122("tbody",{children:jsx122(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx122(Fragment40,{children:props.value?.map(observation=>jsx122(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference4(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource7(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation),depth=props.ancestorIds?.length??0,memberRows=observation.hasMember&&jsx122(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes});return isGroupingObservation(observation)?jsxs75(Fragment40,{children:[jsx122("tr",{className:DiagnosticReportDisplay_default.groupHeaderRow,children:jsx122("td",{colSpan:7,style:indentStyle(depth),children:jsxs75(Group40,{gap:"sm",children:[jsx122(MedplumLink,{to:observation,children:jsx122(CodeableConceptDisplay,{value:observation.code})}),observation.effectiveDateTime&&jsxs75(Text32,{size:"sm",c:"dimmed",fw:400,children:["Collected: ",formatDateTime2(observation.effectiveDateTime)]})]})})}),displayNotes&&jsx122("tr",{children:jsx122("td",{colSpan:7,style:indentStyle(depth+1),children:jsx122(NoteDisplay,{value:observation.note})})}),memberRows]}):jsxs75(Fragment40,{children:[jsxs75("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx122("td",{rowSpan:displayNotes?2:1,style:indentStyle(depth),children:jsx122(MedplumLink,{to:observation,children:jsx122(CodeableConceptDisplay,{value:observation.code})})}),jsx122("td",{children:jsx122(ObservationValueDisplay,{value:observation})}),jsx122("td",{children:jsx122(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx122("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx122(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx122("td",{children:observation.category&&observation.category.length>0&&jsx122(Fragment40,{children:observation.category.map(concept=>jsx122("div",{children:jsx122(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept5(concept)}`))})}),jsx122("td",{children:observation.performer?.map(performer=>jsx122(ObservationPerformerDisplay,{value:performer},performer.reference))}),jsx122("td",{children:observation.status&&jsx122(StatusBadge,{status:observation.status})})]}),memberRows,displayNotes&&jsx122("tr",{children:jsx122("td",{colSpan:6,children:jsx122(NoteDisplay,{value:observation.note})})})]})}function ObservationPerformerDisplay(props){let performer=useResource7(props.value);return performer?jsx122(MedplumLink,{to:props.value,children:getDisplayString7(performer)}):jsx122(ReferenceDisplay,{value:props.value})}function ObservationValueDisplay(props){let obs=props.value;return jsx122(Fragment40,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx122(Fragment40,{children:range.text}):jsx122(RangeDisplay,{value:range}):null}function indentStyle(depth){return depth>0?{paddingInlineStart:`calc(4px + ${depth} * var(--mantine-spacing-md))`}:void 0}function isGroupingObservation(observation){return observation.hasMember?.length?!(formatObservationValue(observation)||observation.dataAbsentReason||observation.interpretation?.length||observation.referenceRange?.length):!1}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;if(code!==void 0)return code==="AA"||code==="LL"||code==="HH"||code==="A";let interpretation=observation.interpretation?.[0].text;return interpretation==="Critical abnormal"||interpretation==="Critical high"||interpretation==="Critical low"||interpretation==="Critical"||interpretation==="Abnormal"}function PerformingLabs({value}){let medplum=useMedplum34(),[labs,setLabs]=useState70();return useEffect21(()=>{getPerformingLabs(medplum,value).then(setLabs).catch(console.error)},[medplum,value]),!labs||labs.length===0?null:jsxs75(Stack29,{gap:"xs",mt:"md",children:[jsx122(Divider8,{}),jsx122(Text32,{fw:500,size:"sm",c:"dimmed",children:"Performing Labs"}),labs.map(lab=>jsxs75(Group40,{justify:"space-between",align:"flex-start",wrap:"nowrap",children:[jsxs75("div",{children:[jsx122(Text32,{children:lab.name}),lab.address?.[0]&&jsx122(Text32,{size:"sm",c:"dimmed",children:jsx122(AddressDisplay,{value:lab.address[0]})})]}),jsx122(LabContactDisplay,{value:lab.contact?.[0]})]},`lab-${lab.id}-${lab.name}`))]})}function LabContactDisplay({value}){return value?jsxs75("div",{style:{textAlign:"right"},children:[value.name&&jsx122(Text32,{children:value.name.text??formatHumanName8(value.name)}),value.telecom?.[0]&&jsx122(Text32,{size:"sm",c:"dimmed",children:jsx122(ContactPointDisplay,{value:value.telecom[0]})})]}):null}async function getPerformingLabs(medplum,report){let observations=[],visited=new Set;async function resolveObservation(ref){let refString=ref.reference;if(!refString||visited.has(refString))return;visited.add(refString);let observation=refString.startsWith("#")?findContained(report,refString,"Observation"):await medplum.readReference(ref).catch(()=>{});if(observation){observations.push(observation);for(let member of observation.hasMember??[])await resolveObservation(member)}}for(let result of report.result??[])await resolveObservation(result);let labs=new Map;for(let performer of observations.flatMap(observation=>observation.performer??[])){let refString=performer.reference,organization;if(refString?.startsWith("#")?organization=findContained(report,refString,"Organization"):refString?.startsWith("Organization/")&&(organization=await medplum.readReference(performer).catch(()=>{})),organization&&(organization.address||organization.contact)){let key=`${organization.name}|${formatAddress2(organization.address?.[0])}`;labs.has(key)||labs.set(key,organization)}}return Array.from(labs.values())}function findContained(report,refString,resourceType){let id=refString.slice(1);return report.contained?.find(resource=>resource.resourceType===resourceType&&resource.id===id)}import{Fragment as Fragment41,jsx as jsx123,jsxs as jsxs76}from"react/jsx-runtime";function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=useState71(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=useDisclosure5(!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 jsxs76(Fragment41,{children:[jsx123(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:jsxs76(Flex18,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>jsx123(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:jsxs76(Box20,{children:[jsx123(Text33,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(serviceRequest)}),jsxs76(Group41,{mt:2,gap:4,children:[serviceRequest.status&&jsx123(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),jsx123(Text33,{size:"xs",fw:500,c:"dimmed",children:formatDate4(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>jsx123(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:jsxs76(Box20,{children:[jsx123(Text33,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(report)}),jsxs76(Group41,{mt:2,gap:4,children:[report.status&&jsx123(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),jsx123(Text33,{size:"xs",fw:500,c:"dimmed",children:formatDate4(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&jsx123(Text33,{children:"(none)"})]})}),jsx123(Modal3,{opened:reportDialogOpened,onClose:closeReportDialog,title:"Lab Results",size:"80%",children:selectedReport&&jsx123(DiagnosticReportDisplay,{value:selectedReport,hideSubject:!0})})]})}var getStatusColor=status=>{switch(status){case"active":return"indigo";case"final":return"teal";case"cancelled":return"red";default:return"gray"}};function hasLaboratoryCategory(category){if(!category.coding||!Array.isArray(category.coding))return!1;for(let coding of category.coding)if(coding.code==="LAB")return!0;return!1}function isLaboratoryReport(report){if(!report.category||!Array.isArray(report.category))return!1;for(let category of report.category)if(hasLaboratoryCategory(category))return!0;return!1}function shouldFilterRequest(request,completedRequisitionNumbers){if(["completed","draft","entered-in-error"].includes(request.status))return!0;let requisitionNumber=request.requisition?.value;return!!(requisitionNumber&&completedRequisitionNumbers.has(requisitionNumber))}import{Box as Box21,Flex as Flex19,Group as Group43,Text as Text34}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{formatCodeableConcept as formatCodeableConcept6,getDisplayString as getDisplayString9}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{useCallback as useCallback20,useState as useState73}from"react";function compareByLastUpdatedDescending(a,b){let aLastUpdated=a.meta?.lastUpdated,bLastUpdated=b.meta?.lastUpdated;return!aLastUpdated&&!bLastUpdated?0:aLastUpdated?bLastUpdated?bLastUpdated.localeCompare(aLastUpdated):-1:1}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}import{Alert as Alert4,Group as Group42,Radio as Radio2,Stack as Stack30}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG4,addProfileToResource as addProfileToResource2,createReference as createReference10}from"@medplum/core";import{useMedplumProfile as useMedplumProfile9}from"@medplum/react-hooks";import{useCallback as useCallback19,useState as useState72}from"react";import{jsx as jsx124,jsxs as jsxs77}from"react/jsx-runtime";var HTTP2="http://",statusValues2=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile9(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState72(medication?.medicationCodeableConcept),handleSubmit=useCallback19(formData=>{if(!me)throw new Error("Not signed in");onSubmit(addProfileToResource2({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&createReference10(encounter)),requester:medication?.requester??createReference10(me),medicationCodeableConcept:code,subject:createReference10(patient)},HTTP_HL7_ORG4+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx124(Form,{onSubmit:handleSubmit,children:jsxs77(Stack30,{children:[jsx124(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}),jsx124(Radio2.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues2.map(sv=>jsx124(Radio2,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx124(Group42,{justify:"flex-end",gap:4,children:jsx124(SubmitButton,{children:"Save"})})]})}):jsx124(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment42,jsx as jsx125,jsxs as jsxs78}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum35(),[medicationRequests,setMedicationRequests]=useState73(props.medicationRequests),[editMedication,setEditMedication]=useState73(),[opened,{open,close}]=useDisclosure6(!1),medications=[...medicationRequests,...props.medicationStatements??[]].sort(compareByLastUpdatedDescending),handleSubmit=useCallback20(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 jsxs78(Fragment42,{children:[jsx125(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medications.length>0?jsx125(Flex19,{direction:"column",gap:8,children:medications.map(medication=>jsx125(SummaryItem,{onClick:()=>{medication.resourceType==="MedicationRequest"?(setEditMedication(medication),open()):props.onClickResource?.(medication)},children:jsxs78(Box21,{children:[jsx125(Text34,{fw:500,className:SummaryItem_default.itemText,children:getMedicationDisplayString(medication)}),jsx125(Group43,{mt:2,gap:4,children:medication.status&&jsx125(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},`${medication.resourceType}/${medication.id}`))}):jsx125(Text34,{children:"(none)"})}),jsx125(Modal3,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx125(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"}}function getMedicationDisplayString(medication){return medication.medicationCodeableConcept?formatCodeableConcept6(medication.medicationCodeableConcept):getDisplayString9(medication)}import{Box as Box22,Group as Group44,Text as Text35,Tooltip as Tooltip6}from"@mantine/core";import{jsx as jsx126,jsxs as jsxs79}from"react/jsx-runtime";var PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return jsx126(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx126(Box22,{className:PatientSummary_default.patientSummaryListItem,children:jsx126(Tooltip6,{label,position:"top-start",openDelay:650,children:jsxs79(Group44,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,jsx126(Text35,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};import{Box as Box23,Flex as Flex20,Group as Group45,Loader as Loader5,Text as Text36}from"@mantine/core";import{useDisclosure as useDisclosure7}from"@mantine/hooks";import{formatAddress as formatAddress3,getReferenceString as getReferenceString8,OperationOutcomeError}from"@medplum/core";import{useMedplum as useMedplum36,useResource as useResource8}from"@medplum/react-hooks";import{useCallback as useCallback21,useEffect as useEffect22,useMemo as useMemo31,useState as useState74}from"react";import{PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,addPreferredPharmacyToPatient,createPreferredPharmacyExtension,getPreferredPharmaciesFromPatient,isAddPharmacyResponse,isOrganizationArray,removePreferredPharmacyFromPatient}from"@medplum/core";import{Fragment as Fragment43,jsx as jsx127,jsxs as jsxs80}from"react/jsx-runtime";function Pharmacies(props){let{patient:patientProp,onClickResource,pharmacyDialogComponent}=props,PharmacyDialogComponent=pharmacyDialogComponent,medplum=useMedplum36(),[opened,{open,close}]=useDisclosure7(!1),[resolvedPharmacies,setResolvedPharmacies]=useState74([]),[loadState,setLoadState]=useState74("loading"),patient=useResource8(patientProp),pharmacyRefs=useMemo31(()=>patient?getPreferredPharmaciesFromPatient(patient):[],[patient]);useEffect22(()=>{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=useCallback21(async _pharmacy=>{patient?.id&&medplum.invalidateUrl(getReferenceString8(patient)),close()},[medplum,patient,close]);return patient?jsxs80(Fragment43,{children:[jsx127(CollapsibleSection,{title:"Pharmacies",onAdd:pharmacyDialogComponent?open:void 0,children:loadState==="loading"?jsx127(Loader5,{size:"sm"}):loadState==="error"?jsx127(Text36,{c:"red",size:"sm",children:"Failed to load pharmacies"}):resolvedPharmacies.length===0?jsx127(Text36,{children:"(none)"}):jsx127(Box23,{children:jsx127(Flex20,{direction:"column",gap:8,children:resolvedPharmacies.map((pharmacy,index)=>jsx127(SummaryItem,{onClick:()=>onClickResource?.(pharmacy),children:jsxs80(Box23,{children:[jsx127(Text36,{fw:500,className:SummaryItem_default.itemText,children:pharmacy.name}),jsxs80(Group45,{mt:2,gap:4,children:[pharmacy.isPrimary&&jsx127(StatusBadge,{color:"blue",variant:"light",status:"primary"}),pharmacy.address?.[0]&&jsx127(Text36,{size:"xs",c:"dimmed",children:formatAddress3(pharmacy.address[0])})]})]})},pharmacy.id||index))})})}),PharmacyDialogComponent?jsx127(Modal3,{opened,onClose:close,title:"Add Pharmacy",size:"lg",children:jsx127(PharmacyDialogComponent,{patient,onSubmit:handleSubmit,onClose:close})}):null]}):jsx127(Fragment43,{})}function isNotFoundError(error){return error instanceof OperationOutcomeError?error.outcome.issue?.some(issue=>issue.code==="not-found")??!1:!1}import{Badge as Badge2,Box as Box24,Flex as Flex21,Group as Group47,Text as Text37,UnstyledButton as UnstyledButton4}from"@mantine/core";import{useDisclosure as useDisclosure8}from"@mantine/hooks";import{formatDate as formatDate5,getDisplayString as getDisplayString10}from"@medplum/core";import{useMedplum as useMedplum37}from"@medplum/react-hooks";import{useCallback as useCallback23,useMemo as useMemo32,useState as useState76}from"react";import{Group as Group46,Stack as Stack31}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference11}from"@medplum/core";import{useCallback as useCallback22,useState as useState75}from"react";import{jsx as jsx128,jsxs as jsxs81}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState75(condition?.code),[clinicalStatus,setClinicalStatus]=useState75(condition?.clinicalStatus),handleSubmit=useCallback22(formData=>{let updatedCondition=addProfileToResource3({...condition,resourceType:"Condition",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:createReference11(patient),encounter:encounter&&createReference11(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG5+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx128(Form,{onSubmit:handleSubmit,children:jsxs81(Stack31,{children:[jsx128(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG5+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx128(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG5+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx128(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx128(Group46,{justify:"flex-end",gap:4,mt:"md",children:jsx128(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment44,jsx as jsx129,jsxs as jsxs82}from"react/jsx-runtime";function getCodeKey(condition){let coding=condition.code?.coding?.[0];return coding?.system&&coding?.code?`${coding.system}|${coding.code}`:coding?.code?coding.code:condition.code?.text??condition.id}function ProblemList(props){let medplum=useMedplum37(),{patient,encounter}=props,[problems,setProblems]=useState76(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=useState76(),[opened,{open,close}]=useDisclosure8(!1),[expandedGroups,setExpandedGroups]=useState76(()=>new Set),groupedProblems=useMemo32(()=>{let groups=new Map;for(let i=0;i<problems.length;i++){let problem=problems[i],key=getCodeKey(problem)??`ungrouped-${i}`,existing=groups.get(key);existing?existing.push(problem):groups.set(key,[problem])}return Array.from(groups.entries())},[problems]),toggleGroup=useCallback23(key=>{setExpandedGroups(prev=>{let next=new Set(prev);return next.has(key)?next.delete(key):next.add(key),next})},[]),handleSubmit=useCallback23(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 jsxs82(Fragment44,{children:[jsx129(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx129(Flex21,{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 jsxs82(Box24,{children:[jsx129(Flex21,{direction:"column",gap:4,id:groupContentId,children:displayProblems.map(problem=>jsx129(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs82(Box24,{children:[jsxs82(Group47,{gap:6,wrap:"nowrap",children:[jsx129(Text37,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString10(problem)}),!isExpanded&&group.length>1&&jsxs82(Badge2,{size:"xs",color:"gray",variant:"light",style:{flexShrink:0},children:["+",group.length-1]})]}),jsxs82(Group47,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx129(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx129(Text37,{size:"xs",fw:500,c:"dimmed",children:formatDate5(problem.onsetDateTime)})]})]})},problem.id))}),group.length>1&&jsx129(UnstyledButton4,{onClick:()=>toggleGroup(key),"aria-expanded":isExpanded,"aria-controls":groupContentId,pl:4,pt:2,style:{fontSize:"var(--mantine-font-size-xs)",color:"var(--mantine-color-dimmed)"},children:isExpanded?"Show less":`Show all ${group.length} entries`})]},key)})}):jsx129(Text37,{children:"(none)"})}),jsx129(Modal3,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx129(ConditionDialog,{patient,encounter,condition:editCondition,onSubmit:handleSubmit})})]})}var getStatusColor3=status=>{if(!status)return"gray";switch(status){case"active":case"recurrence":case"relapse":return"green";case"inactive":return"orange";case"remission":return"blue";case"resolved":return"teal";default:return"gray"}};import{Box as Box25,Flex as Flex22,Radio as Radio3,Text as Text38,UnstyledButton as UnstyledButton5}from"@mantine/core";import{useDisclosure as useDisclosure9}from"@mantine/hooks";import{createReference as createReference12,HTTP_HL7_ORG as HTTP_HL7_ORG6,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum38}from"@medplum/react-hooks";import{useCallback as useCallback24,useState as useState77}from"react";import{Fragment as Fragment45,jsx as jsx130,jsxs as jsxs83}from"react/jsx-runtime";var NULLFLAVOR=HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/v3-NullFlavor",CodesToText={38628009:"Homosexual",20430005:"Heterosexual",42035005:"Bisexual",OTH:"Other",UNK:"Unknown",ASKU:"Asked but no answer"},CodesToSystem={38628009:SNOMED,20430005:SNOMED,42035005:SNOMED,OTH:NULLFLAVOR,UNK:NULLFLAVOR,ASKU:NULLFLAVOR};function SexualOrientation(props){let{patient,encounter}=props,medplum=useMedplum38(),[sexualOrientation,setSexualOrientation]=useState77(props.sexualOrientation),[opened,{open,close}]=useDisclosure9(!1),[hoverIndex,setHoverIndex]=useState77(null),handleSubmit=useCallback24(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG6+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:createReference12(patient),encounter:encounter?createReference12(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 jsxs83(Fragment45,{children:[jsx130(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx130(Flex22,{direction:"column",gap:8,children:jsx130(Box25,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx130(UnstyledButton5,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx130(Box25,{pr:hoverIndex===0?24:0,children:jsx130(Text38,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx130(Text38,{children:"(none)"})}),jsx130(Modal3,{opened,onClose:close,title:"Set Sexual Orientation",size:"md",onSubmit:handleSubmit,actions:jsx130(SubmitButton,{children:"Save"}),children:jsx130(Radio3.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx130(Radio3,{value:code,label:text,my:"xs"},code))})})]})}import{Radio as Radio4,Text as Text39,UnstyledButton as UnstyledButton6}from"@mantine/core";import{useDisclosure as useDisclosure10}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG7,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference13,formatCodeableConcept as formatCodeableConcept7}from"@medplum/core";import{useMedplum as useMedplum39}from"@medplum/react-hooks";import{useCallback as useCallback25,useState as useState78}from"react";import{Fragment as Fragment46,jsx as jsx131,jsxs as jsxs84}from"react/jsx-runtime";var smokingStatusOptions={266919005:"Never smoked tobacco",266927001:"Tobacco smoking consumption unknown","428041000124106":"Occasional tobacco smoker","428061000124105":"Light tobacco smoker","428071000124103":"Heavy tobacco smoker",449868002:"Smokes tobacco daily",77176002:"Smoker",8517006:"Ex-smoker"};function SmokingStatus(props){let medplum=useMedplum39(),[smokingStatus,setSmokingStatus]=useState78(props.smokingStatus),[opened,{open,close}]=useDisclosure10(!1),handleSubmit=useCallback25(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG7+"/fhir/us/core/StructureDefinition/us-core-smokingstatus"]},status:"final",category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC2,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference13(props.patient),encounter:props.encounter?createReference13(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED2,version:SNOMED2+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return jsxs84(Fragment46,{children:[jsx131(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx131(UnstyledButton6,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx131(Text39,{children:formatCodeableConcept7(smokingStatus.valueCodeableConcept)})}):jsx131(Text39,{children:"(none)"})}),jsx131(Modal3,{opened,onClose:close,title:"Set Smoking Status",size:"md",onSubmit:handleSubmit,actions:jsx131(SubmitButton,{children:"Save"}),children:jsx131(Radio4.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx131(Radio4,{value:code,label:text,my:"xs"},code))})})]})}import{Group as Group48,SimpleGrid,Stack as Stack32,Text as Text40,Textarea as Textarea3,TextInput as TextInput25}from"@mantine/core";import{useDisclosure as useDisclosure11}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum40}from"@medplum/react-hooks";import{useCallback as useCallback26,useState as useState79}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference14}from"@medplum/core";function getObservationValue(obs,component){return component?obs.component?.find(c=>c.code?.coding?.[0].code===component)?.valueQuantity:obs.valueQuantity}function createObservation(patient,encounter,code,title,valueQuantity){if(isValidNumber(valueQuantity.value))return{...createBaseObservation(patient,encounter,code,title),valueQuantity}}function createCompoundObservation(patient,encounter,code,title,components){let component=components.filter(c=>isValidNumber(c.valueQuantity?.value));if(component.length!==0)return{...createBaseObservation(patient,encounter,code,title),component}}function createBaseObservation(patient,encounter,code,title){return{resourceType:"Observation",status:"preliminary",subject:createReference14(patient),encounter:encounter?createReference14(encounter):void 0,effectiveDateTime:new Date().toISOString(),category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"vital-signs",display:"Vital Signs"}]}],code:createLoincCode(code,title)}}function createLoincCode(code,display){return{coding:[{code,display,system:LOINC3}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!Number.isNaN(value)&&Number.isFinite(value)}import{Fragment as Fragment47,jsx as jsx132,jsxs as jsxs85}from"react/jsx-runtime";var BP="85354-9",SYSTOLIC="8480-6",DIASTOLIC="8462-4",LOINC_CODES=[{name:"systolic",short:"BP Sys",code:BP,component:SYSTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"diastolic",short:"BP Dias",code:BP,component:DIASTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"heartRate",short:"HR",code:"8867-4",title:"Heart Rate",unit:"/min"},{name:"bodyTemperature",short:"Temp",code:"8310-5",title:"Body Temperature",unit:"Cel"},{name:"respiratoryRate",short:"RR",code:"9279-1",title:"Respiratory Rate",unit:"/min"},{name:"height",short:"Ht",code:"8302-2",title:"Height",unit:"cm"},{name:"weight",short:"Wt",code:"29463-7",title:"Weight",unit:"kg"},{name:"bmi",short:"BMI",code:"39156-5",title:"BMI",unit:"kg/m2"},{name:"oxygen",short:"O2",code:"2708-6",title:"Oxygen",unit:"%"},{name:"headCircumference",short:"HC",code:"9843-4",title:"Head Circumference",unit:"cm"}];function Vitals(props){let medplum=useMedplum40(),{patient,encounter}=props,[vitals,setVitals]=useState79(props.vitals),[opened,{open,close}]=useDisclosure11(!1),handleSubmit=useCallback26(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 jsxs85(Fragment47,{children:[jsx132(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx132(Stack32,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs85(Group48,{align:"center",children:[jsx132(Text40,{c:"dimmed",children:meta.short}),obs&&jsx132(Text40,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx132(Modal3,{opened,onClose:close,title:"Add Vitals",size:"md",onSubmit:handleSubmit,actions:jsx132(SubmitButton,{children:"Save"}),children:jsxs85(Stack32,{children:[jsx132(SimpleGrid,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx132(TextInput25,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx132(Textarea3,{name:"notes",label:"Notes"})]})})]})}import{jsx as jsx133,jsxs as jsxs86}from"react/jsx-runtime";var DemographicsSection={key:"demographics",title:"Demographics",component:({patient,onClickResource})=>{let languageDisplay=getPreferredLanguage(patient);return jsxs86(Stack33,{gap:"xs",py:8,children:[jsx133(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${calculateAgeString(patient.birthDate)})`:void 0,icon:jsx133(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),jsx133(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:jsx133(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),jsx133(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:jsx133(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),jsx133(PatientInfoItem,{patient,value:patient.address?.[0]?formatAddress4(patient.address[0]):void 0,icon:jsx133(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),jsx133(PatientInfoItem,{patient,value:languageDisplay,icon:jsx133(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),jsx133(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:jsx133(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add General Practitioner",label:"General Practitioner",onClickResource})]})}},InsuranceSection={key:"insurance",title:"Insurance",searches:[{key:"coverages",resourceType:"Coverage",patientParam:"beneficiary"}],component:({results,onClickResource})=>jsx133(Insurance,{coverages:results.coverages||[],onClickResource})},AllergiesSection={key:"allergies",title:"Allergies",searches:[{key:"allergies",resourceType:"AllergyIntolerance",patientParam:"patient"}],component:({results,patient,onClickResource})=>jsx133(Allergies,{patient,allergies:results.allergies||[],onClickResource})},ProblemListSection={key:"problemList",title:"Problems",searches:[{key:"conditions",resourceType:"Condition",patientParam:"patient"}],component:({results,patient,onClickResource})=>jsx133(ProblemList,{patient,problems:results.conditions||[],onClickResource})},MedicationsSection={key:"medications",title:"Medications",searches:[{key:"medicationRequests",resourceType:"MedicationRequest",patientParam:"subject"},{key:"medicationStatements",resourceType:"MedicationStatement",patientParam:"subject"}],component:({results,patient,onClickResource})=>jsx133(Medications,{patient,medicationRequests:results.medicationRequests||[],medicationStatements:results.medicationStatements||[],onClickResource})},ImmunizationsSection={key:"immunizations",title:"Immunizations",searches:[{key:"immunizations",resourceType:"Immunization",patientParam:"patient"}],component:({results,patient})=>jsx133(Immunizations,{patient,immunizations:results.immunizations||[]})},GoalsSection={key:"goals",title:"Goals",searches:[{key:"goals",resourceType:"Goal",patientParam:"patient"}],component:({results,patient})=>jsx133(Goals,{patient,goals:results.goals||[]})};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})=>jsx133(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 jsx133(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 jsx133(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 jsx133(Vitals,{patient,vitals:observations,onClickResource})}};function createPharmaciesSection(pharmacyDialogComponent){return{key:"pharmacies",title:"Pharmacies",component:({patient,onClickResource})=>jsx133(Pharmacies,{patient,onClickResource,pharmacyDialogComponent})}}var PharmaciesSection=createPharmaciesSection();function getDefaultSections(onRequestLabs){return[DemographicsSection,InsuranceSection,AllergiesSection,ProblemListSection,MedicationsSection,ImmunizationsSection,createLabsSection(onRequestLabs),SexualOrientationSection,SmokingStatusSection,VitalsSection,GoalsSection,PharmaciesSection]}import{Fragment as Fragment48,jsx as jsx134,jsxs as jsxs87}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum41(),{patient:propsPatient,onClickResource,onRequestLabs}=props,patient=useResource9(propsPatient),[createdDate,setCreatedDate]=useState80(),defaultSections=useMemo33(()=>getDefaultSections(onRequestLabs),[onRequestLabs]),sections=props.sections??defaultSections,{sectionData,loading,error}=usePatientSummaryData(propsPatient,sections);return useEffect23(()=>{let id=resolveId(propsPatient);id&&medplum.readHistory("Patient",id).then(history=>{let lastUpdated=history.entry?.[history.entry.length-1]?.resource?.meta?.lastUpdated;setCreatedDate(typeof lastUpdated=="string"?lastUpdated:"")}).catch(()=>{})},[propsPatient,medplum]),patient?jsxs87(Flex23,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs87(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs87(Group49,{align:"center",gap:"sm",p:16,children:[jsx134(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs87(Stack34,{gap:0,style:{flex:1,minWidth:0},children:[jsx134(Tooltip7,{label:formatHumanName9(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx134(Text41,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:formatHumanName9(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return jsxs87(Text41,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx134(Divider9,{})]}),jsxs87(Stack34,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:[error&&jsxs87(Text41,{c:"red",fz:"sm",children:["Error loading patient summary: ",error.message]}),!loading&&sections.length>0&&jsx134(Fragment48,{children:sections.map((section,index)=>{let SectionComponent=section.component;return jsxs87("div",{children:[jsx134(SectionComponent,{patient,onClickResource,results:sectionData[index]??{}}),jsx134(Divider9,{})]},section.key)})})]})]}):null}var ThreadDetail_default={rightBorder:"ThreadDetail_rightBorder"};import{Fragment as Fragment49,jsx as jsx135,jsxs as jsxs88}from"react/jsx-runtime";function ThreadDetail(props){let{thread,showPatientSummary=!1,sections,uploadEnabled,onViewInDocuments,onStatusChange,onOpenSettings,onMessageSent}=props;return jsxs88(Fragment49,{children:[jsx135(Flex24,{direction:"column",style:{flex:1},h:"100%",className:ThreadDetail_default.rightBorder,children:jsx135(Paper3,{h:"100%",children:jsxs88(Stack35,{h:"100%",gap:0,children:[jsxs88(Flex24,{h:64,align:"center",justify:"space-between",p:"md",children:[jsx135(Text42,{fw:800,truncate:!0,fz:"lg",children:thread.topic?.text??"Messages"}),jsxs88(Group50,{gap:"xs",children:[onOpenSettings&&jsx135(Tooltip8,{label:"Message Settings",position:"bottom",openDelay:500,children:jsx135(ActionIcon13,{"aria-label":"Message settings",variant:"transparent",radius:"xl",size:32,className:"outline-icon-button",onClick:onOpenSettings,children:jsx135(IconInfoCircle,{size:16})})}),jsxs88(Menu5,{position:"bottom-end",shadow:"md",children:[jsx135(Menu5.Target,{children:jsx135(Button14,{variant:"light",color:getStatusColor4(thread.status),rightSection:thread.status==="completed"?void 0:jsx135(IconChevronDown,{size:16}),radius:"xl",size:"sm",children:thread.status.split("-").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")})}),thread.status!=="completed"&&jsx135(Menu5.Dropdown,{children:jsx135(Menu5.Item,{onClick:()=>onStatusChange("completed"),children:"Completed"})})]})]})]}),jsx135(Divider10,{}),jsx135(Box26,{flex:1,h:"100%",children:jsx135(ThreadChat,{title:"Messages",thread,excludeHeader:!0,uploadEnabled,onViewInDocuments,onMessageSent},`${getReferenceString9(thread)}`)})]})})}),thread.subject&&showPatientSummary&&jsx135(Box26,{w:300,h:"100%",children:jsx135(ScrollArea4,{p:0,h:"100%",scrollbarSize:10,type:"hover",scrollHideDelay:250,children:jsx135(PatientSummary,{patient:thread.subject,sections},thread.id)})})]})}function getStatusColor4(status){return status==="completed"?"green":status==="stopped"?"red":"blue"}var ThreadInbox_default={container:"ThreadInbox_container"};import{Group as Group51,Stack as Stack36,Text as Text43}from"@mantine/core";import{formatDateTime as formatDateTime3,formatHumanName as formatHumanName10}from"@medplum/core";import{useResource as useResource10}from"@medplum/react-hooks";var ThreadListItem_default={content:"ThreadListItem_content"};import{jsx as jsx136,jsxs as jsxs89}from"react/jsx-runtime";var ThreadListItem=props=>{let{topic,lastCommunication,getThreadUri}=props,patientResource=useResource10(topic.subject),patientName=formatHumanName10(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 jsx136(MedplumLink,{to:getThreadUri(topic),underline:"never",display:"block",c:"inherit",children:jsxs89(Group51,{p:"xs",align:"center",wrap:"nowrap",children:[jsx136(ResourceAvatar,{value:topic.subject,radius:"xl",size:36}),jsxs89(Stack36,{gap:0,children:[jsx136(Text43,{size:"sm",fw:700,truncate:"end",children:patientName}),jsx136(Text43,{size:"sm",fw:400,lineClamp:2,className:ThreadListItem_default.content,children:topicName}),jsx136(Text43,{size:"xs",style:{marginTop:2},children:lastCommunication?formatDateTime3(lastCommunication.sent):""})]})]})})};import{Fragment as Fragment50,jsx as jsx137,jsxs as jsxs90}from"react/jsx-runtime";function ThreadInbox(props){let{query,threadId,subject,showPatientSummary=!1,sections,onNew,onSelectFirst,getThreadUri,uploadEnabled,onViewInDocuments,onChange,inProgressUri,completedUri,allowPatientSelection=!1,onNewTopicOpen,onNewTopicClose}=props,[internalModalOpened,{open:openInternalModal,close:closeInternalModal}]=useDisclosure12(!1),modalOpened=props.newTopicOpened??internalModalOpened,openModal=onNewTopicOpen??openInternalModal,closeModal=onNewTopicClose??closeInternalModal,[editModalOpened,{open:openEditModal,close:closeEditModal}]=useDisclosure12(!1),currentSearch=useMemo34(()=>parseSearchRequest(`Communication?${query}`),[query]),searchParams=useMemo34(()=>new URLSearchParams(query),[query]),itemsPerPage=Number.parseInt(searchParams.get("_count")||"20",10),currentOffset=Number.parseInt(searchParams.get("_offset")||"0",10),currentPage=Math.floor(currentOffset/itemsPerPage)+1,status=searchParams.get("status")||"in-progress",selectedParticipants=useMemo34(()=>(currentSearch.filters?.filter(f=>f.code==="recipient")??[]).flatMap(f=>f.value.split(",").filter(Boolean).map(ref=>({reference:ref}))),[currentSearch]),{loading,error,threadMessages,selectedThread,total,handleThreadStatusChange,addThreadMessage,refreshThreadMessages}=useThreadInbox({query,threadId}),handleParticipantsChange=useCallback27(participants=>{let otherFilters=currentSearch.filters?.filter(f=>f.code!=="recipient")??[],participantRefs=participants.map(p=>p.reference).filter(Boolean),newFilters=participantRefs.length>0?[...otherFilters,{code:"recipient",operator:Operator.EQUALS,value:participantRefs.join(",")}]:otherFilters;onChange({...currentSearch,filters:newFilters,offset:0})},[currentSearch,onChange]);useEffect24(()=>{error&&showNotification10({color:"red",message:normalizeErrorString13(error)})},[error]);let handleTopicStatusChangeWithErrorHandling=async newStatus=>{handleThreadStatusChange(newStatus);try{await refreshThreadMessages()}catch(error2){showNotification10({color:"red",message:normalizeErrorString13(error2)})}},handleNewTopicCompletion=message=>{addThreadMessage(message),onNew(message)},items=useMemo34(()=>threadMessages.map(([topic])=>topic),[threadMessages]),lastMessageByThreadId=useMemo34(()=>{let map=new Map;for(let[topic,last]of threadMessages)topic.id&&map.set(topic.id,last);return map},[threadMessages]),isDraft=useCallback27(thread=>!!thread.id&&lastMessageByThreadId.has(thread.id)&&!lastMessageByThreadId.get(thread.id),[lastMessageByThreadId]),handleMessageSent=useCallback27(()=>{refreshThreadMessages().catch(err=>showNotification10({color:"red",message:normalizeErrorString13(err)}))},[refreshThreadMessages]),tabs=useMemo34(()=>[{value:"in-progress",label:"In Progress",uri:inProgressUri},{value:"completed",label:"Completed",uri:completedUri}],[inProgressUri,completedUri]),pageCount=total!==void 0?Math.ceil(total/itemsPerPage):0,headerActions=jsxs90(Fragment50,{children:[jsx137(ParticipantFilter,{selectedParticipants,onFilterChange:handleParticipantsChange}),jsx137(Tooltip9,{label:"New Message",position:"bottom",openDelay:500,children:jsx137(ActionIcon14,{radius:"xl",variant:"filled",color:"blue",size:32,onClick:openModal,children:jsx137(IconPlus,{size:16})})})]});return jsxs90(Fragment50,{children:[jsx137("div",{className:ThreadInbox_default.container,children:jsx137(ListWithDetailPane,{items,loading,selectedKey:selectedThread?.id??threadId,selected:selectedThread,onSelectFirst:modalOpened?void 0:onSelectFirst,listWidth:380,tabs,activeTab:status,headerActions,skeleton:jsx137(ThreadListSkeleton,{}),emptyList:jsx137(EmptyMessagesState,{}),emptyDetail:jsx137(NoMessages,{}),refresh:refreshThreadMessages,page:currentPage,pageCount,onPageChange:page=>onChange({...currentSearch,offset:(page-1)*itemsPerPage}),renderItem:item=>jsx137(ThreadListItem,{topic:item,lastCommunication:item.id?lastMessageByThreadId.get(item.id):void 0,getThreadUri}),renderDetail:thread=>jsx137(ThreadDetail,{thread,showPatientSummary,sections,uploadEnabled,onViewInDocuments,onStatusChange:handleTopicStatusChangeWithErrorHandling,onOpenSettings:isDraft(thread)?void 0:openEditModal,onMessageSent:handleMessageSent})})}),modalOpened&&jsx137(NewTopicDialog,{subject,opened:modalOpened,onClose:closeModal,onSubmit:handleNewTopicCompletion,allowPatientSelection}),selectedThread&&editModalOpened&&jsx137(EditThreadDialog,{thread:selectedThread,opened:editModalOpened,onClose:closeEditModal,onSaved:()=>{refreshThreadMessages().catch(err=>showNotification10({color:"red",message:normalizeErrorString13(err)}))}})]})}function NoMessages(){return jsx137(Center5,{h:"100%",w:"100%",children:jsxs90(Stack37,{align:"center",gap:"md",children:[jsx137(ThemeIcon,{size:64,variant:"light",color:"gray",children:jsx137(IconMessageCircle,{size:32})}),jsx137(Stack37,{align:"center",gap:"xs",children:jsx137(Text44,{size:"sm",c:"dimmed",ta:"center",children:"Select a message from the list to view details"})})]})})}function EmptyMessagesState(){return jsx137(Flex25,{direction:"column",h:"100%",justify:"center",align:"center",children:jsxs90(Stack37,{align:"center",gap:"md",pt:"xl",children:[jsx137(IconMessageCircle,{size:64,color:"var(--mantine-color-gray-4)"}),jsx137(Text44,{size:"lg",c:"dimmed",fw:500,children:"No messages found"})]})})}function ThreadListSkeleton(){let titleWidths=[80,72,68,64],subtitleWidths=[85,78,70,60];return jsx137(Stack37,{gap:"md",p:"md",children:Array.from({length:10}).map((_,index)=>{let titleWidth=titleWidths[index%titleWidths.length],subtitleWidth=subtitleWidths[index%subtitleWidths.length];return jsxs90(Flex25,{gap:"sm",align:"flex-start",children:[jsx137(Skeleton3,{height:40,width:40,radius:"50%"}),jsx137(Box27,{style:{flex:1},children:jsxs90(Flex25,{direction:"column",gap:"xs",children:[jsx137(Skeleton3,{height:16,width:`${titleWidth}%`}),jsx137(Skeleton3,{height:14,width:`${subtitleWidth}%`})]})})]},index)})})}import{ActionIcon as ActionIcon16,Button as Button16,Center as Center6,Group as Group53,Loader as Loader6,ScrollArea as ScrollArea5,TextInput as TextInput26}from"@mantine/core";import{showNotification as showNotification11,updateNotification}from"@mantine/notifications";import{createReference as createReference15,normalizeErrorString as normalizeErrorString14}from"@medplum/core";import{useMedplum as useMedplum44,useResource as useResource12}from"@medplum/react-hooks";import{useCallback as useCallback28,useEffect as useEffect27,useLayoutEffect as useLayoutEffect2,useRef as useRef13,useState as useState84}from"react";import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize4,createPatch,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum42}from"@medplum/react-hooks";import{useEffect as useEffect25,useMemo as useMemo35,useState as useState82}from"react";import{Button as Button15,Table}from"@mantine/core";import{useState as useState81}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment51,jsx as jsx138,jsxs as jsxs91}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState81(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx138(Fragment51,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx138(Fragment51,{children:jsxs91(Table.Tr,{children:[jsx138(Table.Td,{children:name}),jsx138(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx138(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx138(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx138(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs91(Table.Tr,{children:[jsx138(Table.Td,{children:name}),jsx138(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx138(Button15,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx139,jsxs as jsxs92}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum42(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState82(!1);useEffect25(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo35(()=>{if(!schemaLoaded)return null;let typedOriginal=[toTypedValue(original)],typedRevised=[toTypedValue(revised)],result=[],patch=mergePatchOperations(createPatch(original,revised));for(let op of patch){let path=op.path,fhirPath=jsonPathToFhirPath(path),property=tryGetElementDefinition(original.resourceType,fhirPath),originalValue=op.op==="add"?void 0:evalFhirPathTyped(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:evalFhirPathTyped(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${capitalize4(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?jsxs92(Table2,{className:ResourceDiffTable_default.root,children:[jsx139(Table2.Thead,{children:jsxs92(Table2.Tr,{children:[jsx139(Table2.Th,{}),jsx139(Table2.Th,{children:"Before"}),jsx139(Table2.Th,{children:"After"})]})}),jsx139(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx139(ResourceDiffRow,{...rest},key)})})]}):null}function mergePatchOperations(patch){let result=[];for(let patchOperation of patch){let{op,path}=patchOperation;if(path.startsWith("/meta/author")||path.startsWith("/meta/compartment")||path.startsWith("/meta/lastUpdated")||path.startsWith("/meta/versionId"))continue;let count=patch.filter(el=>el.op===op&&el.path===path).length,resultOperation={op,path};count>1&&(op==="add"||op==="remove")&&/\/[0-9-]+$/.test(path)&&(resultOperation.op="replace",resultOperation.path=path.replace(/\/[^/]+$/,"")),result.some(el=>el.op===resultOperation.op&&el.path===resultOperation.path)||result.push(resultOperation)}return result}function jsonPathToFhirPath(path){let parts=path.split("/").filter(Boolean),result="";for(let i=0;i<parts.length;i++){let part=parts[i];part==="-"?result+=".last()":/^\d+$/.test(part)?result+=`[${part}]`:(i>0&&(result+="."),result+=part)}return result.endsWith(".url")&&(result=result.replace(/\.url$/,"")),result}function tryGetElementDefinition(resourceType,fhirPath){try{return getSearchParameterDetails(resourceType,{resourceType:"SearchParameter",base:[resourceType],code:resourceType+"."+fhirPath,expression:resourceType+"."+fhirPath})?.elementDefinitions?.[0]}catch(err){console.warn("Failed to get element definition",{resourceType,fhirPath,err});return}}function touchUpValue(property,input){return input&&{type:Array.isArray(input)?input[0].type:input.type,value:fixArray(input,!!property?.isArray)}}function fixArray(input,isArray){let inputValue=arrayify(input).flatMap(v=>v.value);return isArray?inputValue:inputValue[0]}import{AccessPolicyInteraction,satisfiedAccessPolicy,tryGetProfile as tryGetProfile4}from"@medplum/core";import{useMedplum as useMedplum43,useResource as useResource11}from"@medplum/react-hooks";import{useEffect as useEffect26,useMemo as useMemo36,useState as useState83}from"react";import{jsx as jsx140}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum43(),accessPolicy=medplum.getAccessPolicy(),value=useResource11(props.value),[schemaLoaded,setSchemaLoaded]=useState83(!1);useEffect26(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{tryGetProfile4(profileUrl)?setSchemaLoaded(!0):console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)});else{let schemaName=value.resourceType;medplum.requestSchema(schemaName).then(()=>{setSchemaLoaded(!0)}).catch(console.error)}},[medplum,profileUrl,value]);let accessPolicyResource=useMemo36(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx140(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon15,Group as Group52,Menu as Menu6,Text as Text45}from"@mantine/core";import{formatDateTime as formatDateTime4,getReferenceString as getReferenceString10}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx141,jsxs as jsxs93}from"react/jsx-runtime";function Timeline(props){return jsx141(Container,{children:props.children})}function TimelineItem(props){let{resource,profile,padding,popupMenuItems,...others}=props,author=profile??resource.meta?.author,onBehalfOf=resource.meta?.onBehalfOf,dateTime=props.dateTime??resource.meta?.lastUpdated;return jsxs93(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs93(Group52,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx141(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs93("div",{style:{flex:1},children:[jsxs93(Text45,{size:"sm",children:[jsx141(ResourceName,{c:"inherit",fw:500,value:author,link:!0}),onBehalfOf&&jsxs93(Text45,{component:"span",size:"xs",c:"dimmed",children:[" on behalf of ",jsx141(ResourceName,{c:"inherit",value:onBehalfOf,link:!0})]})]}),jsxs93(Text45,{size:"xs",children:[jsx141(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime4(dateTime)}),jsx141(Text45,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx141(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs93(Menu6,{position:"bottom-end",shadow:"md",width:200,children:[jsx141(Menu6.Target,{children:jsx141(ActionIcon15,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString10(props.resource)}`,children:jsx141(IconDots,{})})}),popupMenuItems]})]}),jsx141(ErrorBoundary,{children:jsx141("div",{className:clsx_default(Timeline_default.item,{[Timeline_default.itemPadding]:padding}),children:props.children})})]})}var ResourceTimeline_default={pinnedComment:"ResourceTimeline_pinnedComment"};import{jsx as jsx142,jsxs as jsxs94}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum44(),sender=medplum.getProfile(),inputRef=useRef13(null),resource=useResource12(props.value),[history,setHistory]=useState84(),[items,setItems]=useState84([]),[countToShow,setCountToShow]=useState84(10),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef13(items);useLayoutEffect2(()=>{itemsRef.current=items});let sortAndSetItems=useCallback28(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback28(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=useCallback28(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback28(()=>{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]);useEffect27(()=>loadTimeline(),[loadTimeline]);function createComment(contentString){!resource||!props.createCommunication||medplum.createResource(props.createCommunication(resource,sender,contentString)).then(result=>addResource(result)).catch(console.error)}function createMedia(attachment){!resource||!props.createMedia||medplum.createResource(props.createMedia(resource,sender,attachment)).then(result=>addResource(result)).then(()=>updateNotification({id:"upload-notification",color:"teal",title:"Upload complete",message:"",icon:jsx142(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString14(reason),icon:jsx142(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification11({id:"upload-notification",loading:!0,title:"Initializing upload...",message:"Please wait...",autoClose:!1,withCloseButton:!1})}function onUploadProgress(e){updateNotification({id:"upload-notification",loading:!0,title:"Uploading...",message:getProgressMessage(e),autoClose:!1,withCloseButton:!1})}function onUploadError(outcome){updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString14(outcome),icon:jsx142(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return jsx142(Center6,{style:{width:"100%",height:"100%"},children:jsx142(Loader6,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return jsxs94(Timeline,{children:[props.createCommunication&&jsx142(Panel,{children:jsx142(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs94(Group53,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx142(ResourceAvatar,{value:sender}),jsx142(TextInput26,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx142(ActionIcon16,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx142(IconMessage,{size:16})}),jsx142(AttachmentButton,{securityContext:createReference15(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx142(ActionIcon16,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx142(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 jsx142(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx142(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx142(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx142(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx142(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx142(TimelineItem,{resource:item,padding:!0,children:jsx142(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&jsx142(Group53,{justify:"center",pb:"lg",children:jsx142(Button16,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx142(TimelineItem,{resource,padding:!0,...rest,children:jsx142(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs94(TimelineItem,{resource,padding:!0,...rest,children:[jsx142("h3",{children:"Created"}),jsx142(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 jsx142(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx142("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 jsx142(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx142(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx142(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx142(ScrollArea5,{children:jsx142("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx142(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx142(DiagnosticReportDisplay,{value:props.resource})})}function getProgressMessage(e){if(e.lengthComputable){let percent=100*e.loaded/e.total;return`Uploaded: ${formatFileSize(e.loaded)} / ${formatFileSize(e.total)} ${percent.toFixed(2)}%`}return`Uploaded: ${formatFileSize(e.loaded)}`}function formatFileSize(bytes){if(bytes===0)return"0.00 B";let e=Math.floor(Math.log(bytes)/Math.log(1024));return(bytes/Math.pow(1024,e)).toFixed(2)+" "+" KMGTP".charAt(e)+"B"}import{jsx as jsx143}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx143(ResourceTimeline,{value:resource,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`;return Promise.allSettled([medplum.readHistory(resourceType,id),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count:100})])},...rest})}import{createReference as createReference16}from"@medplum/core";import{jsx as jsx144}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx144(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:createReference16(resource),subject:resource.subject,sender:createReference16(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference16(resource),subject:resource.subject,operator:createReference16(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button20,Loader as Loader8,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome11}from"@medplum/core";import{useMedplum as useMedplum46}from"@medplum/react-hooks";import{memo,useEffect as useEffect31,useState as useState89}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx145}from"react/jsx-runtime";function FhirPathDisplay(props){let value;try{value=evalFhirPath(props.path,props.resource)}catch(err){return console.warn("FhirPathDisplay:",err),null}if(value.length>1)throw new Error(`Component "path" for "FhirPathDisplay" must resolve to a single element.        Received ${value.length} elements        [${JSON.stringify(value,null,2)}]`);return jsx145(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon18,Button as Button19,Center as Center7,Group as Group57,Loader as Loader7,Menu as Menu8,Pagination as Pagination2,Table as Table3,Text as Text47,UnstyledButton as UnstyledButton7}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome10}from"@medplum/core";import{useMedplum as useMedplum45}from"@medplum/react-hooks";import{useCallback as useCallback29,useEffect as useEffect30,useLayoutEffect as useLayoutEffect4,useRef as useRef16,useState as useState88}from"react";import{Button as Button17,Text as Text46}from"@mantine/core";import{Fragment as Fragment52,jsx as jsx146,jsxs as jsxs95}from"react/jsx-runtime";function SearchExportDialog(props){let actions=props.exportCsv||props.exportTransactionBundle?jsxs95(Fragment52,{children:[props.exportCsv&&jsx146(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx146(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}):void 0;return jsx146(Modal3,{title:"Export",opened:props.visible,onClose:props.onCancel,actions,children:jsx146(Text46,{children:"Limited to 1000 records"})})}function ExportButton(props){return jsx146(Button17,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button18,Group as Group54,MultiSelect}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify2}from"@medplum/core";import{useEffect as useEffect28,useMemo as useMemo37,useRef as useRef14,useState as useState85}from"react";import{capitalize as capitalize5,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime5,Operator as Operator2}from"@medplum/core";import{Fragment as Fragment53,jsx as jsx147}from"react/jsx-runtime";var searchParamToOperators={string:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],fulltext:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],token:[Operator2.EQUALS,Operator2.NOT,Operator2.TEXT],reference:[Operator2.EQUALS,Operator2.NOT],numeric:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],quantity:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],date:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],datetime:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],uri:[Operator2.EQUALS,Operator2.NOT,Operator2.ABOVE,Operator2.BELOW]},operatorNames={eq:"equals",ne:"not equals",gt:"greater than",lt:"less than",ge:"greater than or equals",le:"less than or equals",sa:"starts after",eb:"ends before",ap:"approximately",sw:"starts with",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",present:"present",identifier:"identifier",iterate:"iterate"};function setFilters(definition,filters){return{...definition,filters,offset:0,name:void 0}}function clearFilters(definition){return setFilters(definition,[])}function clearFiltersOnField(definition,code){return setFilters(definition,(definition.filters??[]).filter(f=>f.code!==code))}function addFilter(definition,field,op,value,opt_clear){opt_clear&&(definition=clearFiltersOnField(definition,field));let nextFilters=[];return definition.filters&&nextFilters.push(...definition.filters),nextFilters.push({code:field,operator:op,value:value??""}),setFilters(definition,nextFilters)}function addField(definition,field){if(definition.fields?.includes(field))return definition;let newFields=[];return definition.fields&&newFields.push(...definition.fields),newFields.push(field),{...definition,fields:newFields,name:void 0}}function deleteFilter(definition,index){if(!definition.filters)return definition;let newFilters=[...definition.filters];return newFilters.splice(index,1),{...definition,filters:newFilters,name:void 0}}function addYesterdayFilter(definition,field){return addDayFilter(definition,field,-1)}function addTodayFilter(definition,field){return addDayFilter(definition,field,0)}function addTomorrowFilter(definition,field){return addDayFilter(definition,field,1)}function addDayFilter(definition,field,delta){let startTime=new Date;startTime.setDate(startTime.getDate()+delta),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setDate(endTime.getDate()+1),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addNext24HoursFilter(definition,field){let now=new Date,endTime=new Date(now.getTime()+1440*60*1e3);return addDateFilterBetween(definition,field,now,endTime)}function addLastMonthFilter(definition,field){return addMonthFilter(definition,field,-1)}function addThisMonthFilter(definition,field){return addMonthFilter(definition,field,0)}function addNextMonthFilter(definition,field){return addMonthFilter(definition,field,1)}function addMonthFilter(definition,field,delta){let startTime=new Date;startTime.setMonth(startTime.getMonth()+delta),startTime.setDate(1),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setMonth(endTime.getMonth()+1),endTime.setDate(1),endTime.setHours(0,0,0,0),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addYearToDateFilter(definition,field){let startTime=new Date;return startTime.setMonth(0),startTime.setDate(1),startTime.setHours(0,0,0,0),addDateFilterBetween(definition,field,startTime,new Date)}function addDateFilterBetween(definition,field,d1,d2){return definition=clearFiltersOnField(definition,field),definition=addDateFilterImpl(definition,field,Operator2.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator2.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator2.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.replaceAll(/([A-Z])/g," $1"),tmp=tmp.replaceAll(/[-_]/g," "),tmp=tmp.replaceAll(/\s+/g," "),tmp=tmp.trim(),tmp.toLowerCase()==="id"?"ID":tmp.split(/\s/).map(capitalize5).join(" "))}function isMetaSearchParam(code){return code.startsWith("_")}function buildSearchParamFieldLabel(code){return isMetaSearchParam(code)?code:buildFieldNameString(code)}function renderValue(resource,field){let key=field.name;return key==="id"?jsx147(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children:resource.id}):key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?formatDateTime5(resource.meta?.lastUpdated):`${resource.resourceType}.${field.name}`===field.elementDefinition?.path?renderPropertyValue(resource,field.elementDefinition):field.searchParams?.length===1&&field.name===field.searchParams[0].code?renderSearchParameterValue(resource,field.searchParams[0]):null}function renderPropertyValue(resource,elementDefinition){let path=elementDefinition.path?.split(".")?.pop()?.replaceAll("[x]","")??"",[value,propertyType]=getValueAndType({type:resource.resourceType,value:resource},path);return value?jsx147(ResourcePropertyDisplay,{path:elementDefinition.path,property:elementDefinition,propertyType,value,maxWidth:200,ignoreMissingValues:!0,link:!1}):null}function renderSearchParameterValue(resource,searchParam){let value=evalFhirPathTyped2(searchParam.expression,[{type:resource.resourceType,value:resource}]);return!value||value.length===0?null:jsx147(Fragment53,{children:value.map((v,index)=>jsx147(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx148}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef14(!1),[state,setState]=useState85({search:JSON.parse(stringify2(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState85(!1);useEffect28(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo37(()=>{if(!props.visible)return[];let resourceType=props.search.resourceType,typeSchema=getDataType2(resourceType),searchParams=getSearchParameters(resourceType);return sortStringArray(getFieldsList(typeSchema,searchParams)).map(field=>({value:field,label:buildFieldNameString(field)}))},[props.visible,props.search.resourceType]);function handleChange(newFields){setState({search:{...state.search,fields:newFields}})}return jsx148(Modal3,{title:"Fields",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:jsx148("div",{"data-testid":"overlay-child"})},actions:jsx148(Group54,{justify:"flex-end",children:jsx148(Button18,{onClick:()=>props.onOk(state.search),children:"OK"})}),children:jsx148(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})})}function getFieldsList(typeSchema,searchParams){let result=[],keys=new Set,names=new Set;for(let key of Object.keys(typeSchema.elements))result.push(key),keys.add(key.toLowerCase()),names.add(buildFieldNameString(key));if(searchParams)for(let code of Object.keys(searchParams)){let name=buildFieldNameString(code);!keys.has(code)&&!names.has(name)&&(result.push(code),keys.add(code),names.add(name))}return result}import{ActionIcon as ActionIcon17,Group as Group55,NativeSelect as NativeSelect10}from"@mantine/core";import{Operator as Operator3,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect29,useLayoutEffect as useLayoutEffect3,useRef as useRef15,useState as useState86}from"react";import{Checkbox as Checkbox6,TextInput as TextInput27}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx149}from"react/jsx-runtime";function SearchFilterValueInput(props){let details=getSearchParameterDetails2(props.resourceType,props.searchParam),name=props.name??"filter-value";switch(details.type){case SearchParameterType.REFERENCE:return jsx149(ReferenceInput,{name,defaultValue:props.defaultValue?{reference:props.defaultValue}:void 0,targetTypes:props.searchParam.target,autoFocus:props.autoFocus,onChange:newReference=>{newReference?props.onChange(newReference.reference):props.onChange("")}});case SearchParameterType.BOOLEAN:return jsx149(Checkbox6,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType.DATE:return jsx149(TextInput27,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.DATETIME:return jsx149(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx149(TextInput27,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.QUANTITY:return jsx149(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx149(TextInput27,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value),placeholder:"Search value"})}}function tryParseQuantity(value){if(value){let[valueString,systemString,unitString]=value.split("|");if(valueString)return{value:Number.parseFloat(valueString),system:systemString,unit:unitString}}}import{jsx as jsx150,jsxs as jsxs96}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState86(deepClone2(props.search)),searchRef=useRef15(search);useLayoutEffect3(()=>{searchRef.current=search}),useEffect29(()=>{setSearch(deepClone2(props.search))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}let resourceType=props.search.resourceType,searchParams=getSearchParameters2(resourceType)??{},filters=search.filters||[];return jsxs96(Modal3,{title:"Filters",size:900,opened:props.visible,onClose:props.onCancel,onSubmit:()=>props.onOk(searchRef.current),actions:jsx150(Group55,{justify:"flex-end",children:jsx150(SubmitButton,{children:"OK"})}),children:[jsxs96("table",{children:[jsxs96("colgroup",{children:[jsx150("col",{style:{width:200}}),jsx150("col",{style:{width:200}}),jsx150("col",{style:{width:380}}),jsx150("col",{style:{width:40}})]}),jsx150("thead",{children:jsxs96("tr",{children:[jsx150("th",{children:"Field"}),jsx150("th",{children:"Operation"}),jsx150("th",{children:"Value"}),jsx150("th",{})]})}),jsx150("tbody",{children:filters.map((filter,index)=>jsx150(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`))})]}),jsx150(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]})}function FilterRowInput(props){let value=props.value;function setFilterCode(newCode){props.onChange({code:newCode,operator:Operator3.EQUALS,value:""})}function setFilterOperator(newOperator){props.onChange({code:value.code,operator:newOperator,value:""})}function setFilterValue(newFilterValue){props.onChange({code:value.code,operator:value.operator,value:newFilterValue})}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam),fieldOptions=[],metaOptions=[];for(let param of Object.keys(props.searchParams)){let option={value:param,label:buildSearchParamFieldLabel(param)};isMetaSearchParam(param)?metaOptions.push(option):fieldOptions.push(option)}return jsxs96("tr",{children:[jsx150("td",{children:jsx150(NativeSelect10,{"data-testid":`${props.id}-filter-field`,defaultValue:props.value.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...fieldOptions.length>0?[{group:"Fields",items:fieldOptions}]:[],...metaOptions.length>0?[{group:"Metadata",items:metaOptions}]:[]]})}),jsx150("td",{children:operators&&jsx150(NativeSelect10,{"data-testid":`${props.id}-filter-operation`,defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]},`${props.id}-filter-value-${props.value.code}`)}),jsx150("td",{children:searchParam&&value.operator&&jsx150(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}`)}),jsx150("td",{children:props.onDelete&&jsx150(ActionIcon17,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx150(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Group as Group56}from"@mantine/core";import{useState as useState87}from"react";import{jsx as jsx151}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState87(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx151(Modal3,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,onSubmit:onOk,actions:jsx151(Group56,{justify:"flex-end",children:jsx151(SubmitButton,{children:"OK"})}),children:jsx151(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})})}import{formatDateTime as formatDateTime6,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator4,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment54,jsx as jsx152}from"react/jsx-runtime";function SearchFilterValueDisplay(props){let{resourceType,filter}=props,searchParam=globalSchema.types[resourceType].searchParams?.[filter.code];if(searchParam){if(searchParam.type==="reference"&&(filter.operator===Operator4.EQUALS||filter.operator===Operator4.NOT_EQUALS))return jsx152(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx152(Fragment54,{children:formatDateTime6(filter.value)})}return jsx152(Fragment54,{children:filter.value})}import{Menu as Menu7}from"@mantine/core";import{Operator as Operator5}from"@medplum/core";import{Fragment as Fragment55,jsx as jsx153,jsxs as jsxs97}from"react/jsx-runtime";function SearchPopupMenu(props){if(!props.searchParams)return null;function onSort(searchParam,desc){onChange(setSort(props.search,searchParam.code,desc))}function onClear(searchParam){onChange(clearFiltersOnField(props.search,searchParam.code))}function onPrompt(searchParam,operator){props.onPrompt(searchParam,{code:searchParam.code,operator,value:""})}function onChange(definition){props.onChange(definition)}return props.searchParams.length===1?jsx153(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx153(Menu7.Dropdown,{children:props.searchParams.map(searchParam=>jsx153(Menu7.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx153(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx153(NumericFilterSubMenu,{...props});case"reference":return jsx153(ReferenceFilterSubMenu,{...props});case"string":return jsx153(TextFilterSubMenu,{...props});case"token":return jsx153(TokenFilterSubMenu,{...props});case"uri":return jsx153(UriFilterSubMenu,{...props});default:return jsxs97(Fragment55,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs97(Menu7.Dropdown,{children:[jsx153(Menu7.Item,{leftSection:jsx153(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx153(Menu7.Item,{leftSection:jsx153(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.ENDS_BEFORE),children:"Before..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.STARTS_AFTER),children:"After..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Between..."}),jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx153(Menu7.Item,{leftSection:jsx153(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx153(Menu7.Item,{leftSection:jsx153(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx153(Menu7.Item,{leftSection:jsx153(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx153(Menu7.Item,{leftSection:jsx153(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx153(Menu7.Item,{leftSection:jsx153(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx153(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs97(Menu7.Dropdown,{children:[jsx153(Menu7.Item,{leftSection:jsx153(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx153(Menu7.Item,{leftSection:jsx153(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN),children:"Greater than..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN),children:"Less than..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx153(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs97(Menu7.Dropdown,{children:[jsx153(Menu7.Item,{leftSection:jsx153(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx153(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs97(Menu7.Dropdown,{children:[jsx153(Menu7.Item,{leftSection:jsx153(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx153(Menu7.Item,{leftSection:jsx153(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.CONTAINS),children:"Contains..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Does not contain..."}),jsx153(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs97(Menu7.Dropdown,{children:[jsx153(Menu7.Item,{leftSection:jsx153(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.TEXT),children:"Text contains..."}),jsx153(CommonMenuItems,{...props})]})}function UriFilterSubMenu(props){let{searchParam}=props;return jsxs97(Menu7.Dropdown,{children:[jsx153(Menu7.Item,{leftSection:jsx153(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx153(Menu7.Item,{leftSection:jsx153(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx153(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs97(Fragment55,{children:[jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx153(Menu7.Item,{leftSection:jsx153(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx153(Menu7.Divider,{}),jsx153(Menu7.Item,{leftSection:jsx153(IconX,{size:14}),onClick:()=>props.onClear(searchParam),children:"Clear filters"})]})}function getPaginationControlProps(controlName){switch(controlName){case"next":return{"aria-label":"Next page"};case"previous":return{"aria-label":"Previous page"};case"first":return{"aria-label":"First page"};case"last":return{"aria-label":"Last page"};default:return{}}}var SearchControl_default={root:"SearchControl_root",table:"SearchControl_table",tr:"SearchControl_tr",th:"SearchControl_th",control:"SearchControl_control",icon:"SearchControl_icon"};import{getElementDefinition,getSearchParameter,getSearchParameterDetails as getSearchParameterDetails4,getSearchParameters as getSearchParameters3}from"@medplum/core";function getFieldDefinitions(search){let resourceType=search.resourceType,fields=[];for(let name of search.fields||["id","_lastUpdated"])fields.push(getFieldDefinition(resourceType,name));return fields}function getFieldDefinition(resourceType,name){if(name==="_lastUpdated")return{name:"_lastUpdated",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_lastUpdated",name:"_lastUpdated",type:"date",expression:"Resource.meta.lastUpdated"}]};if(name==="meta.versionId")return{name:"meta.versionId",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_versionId",name:"_versionId",type:"token",expression:"Resource.meta.versionId"}]};let exactElementDefinition=getElementDefinition(resourceType,name),exactSearchParam=getSearchParameter(resourceType,name.toLowerCase());if(exactElementDefinition&&exactSearchParam)return{name,elementDefinition:exactElementDefinition,searchParams:[exactSearchParam]};if(exactElementDefinition){let allSearchParams=getSearchParameters3(resourceType),searchParams;if(allSearchParams){let pathRegex=new RegExp(`${resourceType}\\.${name.replaceAll("[x]","")}([^\\w-]|$)`);searchParams=Object.values(allSearchParams).filter(p=>!!p.expression&&pathRegex.test(p?.expression)),searchParams.length===0&&(searchParams=void 0)}return{name,elementDefinition:exactElementDefinition,searchParams}}if(exactSearchParam){let details=getSearchParameterDetails4(resourceType,exactSearchParam);return{name,elementDefinition:details.elementDefinitions?.[0],searchParams:[exactSearchParam]}}return{name}}import{Fragment as Fragment56,jsx as jsx154,jsxs as jsxs98}from"react/jsx-runtime";var SearchChangeEvent=class extends Event{constructor(definition){super("change");__publicField(this,"definition");this.definition=definition}},SearchLoadEvent=class extends Event{constructor(response){super("load");__publicField(this,"response");this.response=response}},SearchClickEvent=class extends Event{constructor(resource,browserEvent){super("click");__publicField(this,"resource");__publicField(this,"browserEvent");this.resource=resource,this.browserEvent=browserEvent}};function SearchControl(props){let medplum=useMedplum45(),[outcome,setOutcome]=useState88(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState88(search);deepEquals(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState88({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef16(state);useLayoutEffect4(()=>{stateRef.current=state});let total=memoizedSearch.total??"accurate",loadResults=useCallback29(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,formatSearchQuery({...memoizedSearch,total,fields:void 0}),options)).then(response=>{setState({...stateRef.current,searchResponse:response}),onLoad&&onLoad(new SearchLoadEvent(response))}).catch(reason=>{setState({...stateRef.current,searchResponse:void 0}),setOutcome(normalizeOperationOutcome10(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback29(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect30(()=>{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 jsx154(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx154(Center7,{style:{width:"100%",height:"100%"},children:jsx154(Loader7,{})});let checkboxColumn=props.checkboxesEnabled,fields=getFieldDefinitions(memoizedSearch),resourceType=memoizedSearch.resourceType,lastResult=state.searchResponse,resources=lastResult?.entry?.map(e=>e.resource),buttonVariant="subtle",buttonColor="gray",iconSize=16,isMobile=window.innerWidth<768;return jsxs98("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs98(Group57,{justify:"space-between",mb:"xl",children:[jsxs98(Group57,{gap:2,children:[jsx154(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx154(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx154(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx154(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx154(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx154(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx154(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx154(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx154(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx154(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx154(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx154(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs98(Group57,{gap:2,children:[lastResult&&jsxs98(Text47,{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()}`]}),jsx154(ActionIcon18,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx154(IconRefresh,{size:iconSize})})]})]}),jsxs98(Table3,{className:SearchControl_default.table,children:[jsxs98(Table3.Thead,{children:[jsxs98(Table3.Tr,{children:[checkboxColumn&&jsx154(Table3.Th,{children:jsx154("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx154(Table3.Th,{children:jsxs98(Menu8,{shadow:"md",width:240,position:"bottom-end",children:[jsx154(Menu8.Target,{children:jsx154(UnstyledButton7,{className:SearchControl_default.control,p:2,children:jsxs98(Group57,{justify:"space-between",wrap:"nowrap",children:[jsx154(Text47,{fw:500,children:buildFieldNameString(field.name)}),jsx154(Center7,{className:SearchControl_default.icon,children:jsx154(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx154(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.additionalColumns?.map(col=>jsx154(Table3.Th,{children:jsx154(Text47,{fw:500,p:2,children:col.name})},col.name))]}),!props.hideFilters&&jsxs98(Table3.Tr,{children:[checkboxColumn&&jsx154(Table3.Th,{}),fields.map(field=>jsx154(Table3.Th,{children:field.searchParams&&jsx154(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name)),props.additionalColumns?.map(col=>jsx154(Table3.Th,{},col.name))]})]}),jsx154(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs98(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx154(Table3.Td,{children:jsx154("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=>jsx154(Table3.Td,{children:renderValue(resource,field)},field.name)),props.additionalColumns?.map(col=>jsx154(Table3.Td,{children:col.renderCell(resource)},col.name))]},resource.id))})]}),!resources?.length&&jsx154(Container,{children:jsx154(Center7,{style:{height:150},children:jsx154(Text47,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx154(Center7,{m:"md",p:"md",children:jsx154(Pagination2,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),jsx154(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}`),jsx154(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}`),jsx154(SearchExportDialog,{visible:state.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx154(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?jsx154("span",{children:"no filters"}):jsx154(Fragment56,{children:filters.map(filter=>jsxs98("div",{children:[getOpString(filter.operator),"\xA0",jsx154(SearchFilterValueDisplay,{resourceType:props.resourceType,filter})]},`filter-${filter.code}-${filter.operator}-${filter.value}`))})}function getPage(search){return Math.floor((search.offset??0)/(search.count??DEFAULT_SEARCH_COUNT2))+1}function getTotalPages(search,lastResult){let pageSize=search.count??DEFAULT_SEARCH_COUNT2,total=getTotal(search,lastResult);return Math.ceil(total/pageSize)}function getStart(search,lastResult){return Math.min(getTotal(search,lastResult),(search.offset??0)+1)}function getEnd(search,lastResult){return Math.max(getStart(search,lastResult)+(lastResult.entry?.length??0)-1,0)}function getTotal(search,lastResult){let total=lastResult.total;return total===void 0&&(total=(search.offset??0)+(lastResult.entry?.length??0)+(lastResult.link?.some(l=>l.relation==="next")?1:0)),total}import{jsx as jsx155,jsxs as jsxs99}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum46(),[schemaLoaded,setSchemaLoaded]=useState89(!1),[outcome,setOutcome]=useState89(),{query,fields}=props,[response,setResponse]=useState89(),[selected,setSelected]=useState89({});useEffect31(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome11(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selected};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=response?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=response?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selected[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if(useEffect31(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx155(Loader8,{});let checkboxColumn=props.checkboxesEnabled;return jsxs99("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs99(Table4,{children:[jsx155(Table4.Thead,{children:jsxs99(Table4.Tr,{children:[checkboxColumn&&jsx155(Table4.Th,{children:jsx155("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx155(Table4.Th,{children:field.name},field.name))]})}),jsx155(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs99(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx155(Table4.Td,{children:jsx155("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=>jsx155(Table4.Td,{children:jsx155(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx155("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx155("div",{"data-testid":"search-error",children:jsx155("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx155(Button20,{onClick:()=>props.onBulk(Object.keys(selected)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo(FhirPathTable);import{ScrollArea as ScrollArea6}from"@mantine/core";var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};import{jsx as jsx156}from"react/jsx-runtime";function InfoBar(props){return jsx156(ScrollArea6,{children:jsx156("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx156("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx156("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx156("div",{className:InfoBar_default.value,children:props.children})};import{Anchor as Anchor10,Tabs as Tabs2}from"@mantine/core";import{isString as isString2,locationUtils as locationUtils5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate5}from"@medplum/react-hooks";import{useState as useState90}from"react";var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};import{jsx as jsx157,jsxs as jsxs100}from"react/jsx-runtime";function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=useMedplumNavigate5(),[currentTab,setCurrentTab]=useState90(()=>{let segment=locationUtils5.getPathname().split("/").pop();if(segment){let segmentLower=segment.toLowerCase(),matched=tabs.find(t=>t.value.split(/[?#]/)[0].toLowerCase()===segmentLower);if(matched)return matched.value}return tabs[0].value});function onTabChange(newTabName){newTabName=newTabName||tabs[0].value,setCurrentTab(newTabName),navigate(`${baseUrl}/${newTabName}`)}return jsxs100(Tabs2,{value:currentTab,onChange:onTabChange,...rest,children:[jsx157(Tabs2.List,{className:LinkTabs_default.list,children:tabs.map(t=>jsx157(Tabs2.Tab,{value:t.value,children:jsx157(Anchor10,{className:LinkTabs_default.link,href:`${baseUrl}/${t.value}`,onClick:onLinkClick,children:t.label})},t.value))}),children]})}function normalizeTabDefinitions(tabs){return tabs.map(t=>isString2(t)?{label:t,value:t.toLowerCase()}:t)}function onLinkClick(e){isAuxClick(e)||e.preventDefault()}import{Box as Box29,SimpleGrid as SimpleGrid2}from"@mantine/core";import{useResource as useResource13,useSearchOne}from"@medplum/react-hooks";import{Box as Box28,Flex as Flex26,Group as Group58,Paper as Paper4,RingProgress,Text as Text48,Title as Title11}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept8}from"@medplum/core";import{Fragment as Fragment57,jsx as jsx158,jsxs as jsxs101}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx158(Paper4,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs101(Group58,{children:[group.measureScore&&jsx158(MeasureScore,{group}),!group.measureScore&&jsx158(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs101(Fragment57,{children:[jsx158(Text48,{fz:"md",fw:500,mb:8,children:measure.title}),jsx158(Text48,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept8(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept8(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs101(Box28,{children:[jsx158(Title11,{order:3,children:"Not Applicable"}),jsx158(Text48,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs101(Box28,{children:[jsx158(Title11,{order:3,children:"Insufficient Data"}),jsx158(Text48,{children:`Numerator: ${numeratorCount}`}),jsx158(Text48,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx158(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx158(Flex26,{justify:"center",children:jsxs101(Text48,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx158(Fragment57,{children:unit==="%"?jsx158(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx158(Flex26,{justify:"center",children:jsx158(Text48,{fw:700,fz:18,children:jsx158(QuantityDisplay,{value:group.measureScore})})})}):jsx158(Flex26,{h:120,align:"center",children:jsx158(Title11,{order:3,children:jsx158(QuantityDisplay,{value:group.measureScore})})})})}function groupValue(group){let score=group.measureScore?.value,unit=group.measureScore?.unit;return score?score<=1&&unit==="%"?score*100:score:0}function groupColor(score){return score<=33?"red":score<=67?"yellow":"green"}import{jsx as jsx159,jsxs as jsxs102}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource13(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs102(Box29,{children:[measure&&jsx159(MeasureTitle,{measure}),jsx159(SimpleGrid2,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx159(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon19,Indicator as Indicator2,Tooltip as Tooltip10}from"@mantine/core";import{useNotificationCount as useNotificationCount2}from"@medplum/react-hooks";import{jsx as jsx160}from"react/jsx-runtime";function NotificationIcon(props){let{resourceType,countCriteria,subscriptionCriteria}=props,unreadCount=useNotificationCount2({resourceType,countCriteria,subscriptionCriteria}),result=props.iconComponent;return props.onClick&&(result=jsx160(ActionIcon19,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=jsx160(Tooltip10,{label:props.tooltip,children:result})),unreadCount>0&&(result=jsx160(Indicator2,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}import{ActionIcon as ActionIcon20,Alert as Alert5,Badge as Badge3,Box as Box30,Button as Button21,Checkbox as Checkbox7,Divider as Divider11,Group as Group59,Modal as Modal4,Stack as Stack38,Table as Table5,Text as Text49,Title as Title12}from"@mantine/core";import{notifications}from"@mantine/notifications";import{extractAccountReferences,normalizeErrorString as normalizeErrorString15}from"@medplum/core";import{useMedplum as useMedplum47}from"@medplum/react-hooks";import{useCallback as useCallback30,useMemo as useMemo38,useState as useState91}from"react";import{Fragment as Fragment58,jsx as jsx161,jsxs as jsxs103}from"react/jsx-runtime";var NOTIFICATION_ID="patient-accounts",NOTIFICATION_TITLE="Patient Accounts",ACCOUNT_TARGET_TYPES=["Organization","HealthcareService","CareTeam"];function PatientAccountsForm(props){let{patient}=props,medplum=useMedplum47(),isAdmin=medplum.isProjectAdmin()||medplum.isSuperAdmin(),originalAccounts=useMemo38(()=>extractAccountReferences(patient.meta)??[],[patient.meta]),[pendingAccounts,setPendingAccounts]=useState91(originalAccounts),[confirmModalOpen,setConfirmModalOpen]=useState91(!1),[propagate,setPropagate]=useState91(!0),[saving,setSaving]=useState91(!1),changes=useMemo38(()=>{let result=[];for(let account of pendingAccounts)originalAccounts.some(o=>o.reference===account.reference)||result.push({reference:account,type:"addition"});for(let account of originalAccounts)pendingAccounts.some(p=>p.reference===account.reference)||result.push({reference:account,type:"removal"});return result},[originalAccounts,pendingAccounts]),hasChanges=changes.length>0,handleAddAccount=useCallback30(value=>{value?.reference&&(pendingAccounts.some(a=>a.reference===value.reference)||setPendingAccounts(prev=>[...prev,value]))},[pendingAccounts]),handleRemoveAccount=useCallback30(referenceString=>{setPendingAccounts(prev=>prev.filter(a=>a.reference!==referenceString))},[]),handleSave=useCallback30(async()=>{let patientId=patient.id;if(!patientId){notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:"Cannot update accounts: Patient resource has no ID.",icon:jsx161(IconX,{size:"1rem"}),autoClose:!1,withCloseButton:!0});return}setSaving(!0),setConfirmModalOpen(!1);let url=medplum.fhirUrl("Patient",patientId,"$set-accounts"),parameters={resourceType:"Parameters",parameter:[...pendingAccounts.map(account=>({name:"accounts",valueReference:{reference:account.reference}})),{name:"propagate",valueBoolean:propagate}]};notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,loading:!0,message:propagate?"Saving account changes and propagating to compartment...":"Saving account changes...",autoClose:!1,withCloseButton:!1});try{let headers={};propagate&&(headers.Prefer="respond-async"),await medplum.post(url,parameters,void 0,{headers}),medplum.invalidateUrl(medplum.fhirUrl("Patient",patientId)),notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"green",message:propagate?"Account changes saved. Compartment updates are being applied.":"Account changes saved.",icon:jsx161(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0}),props.onSaved?.()}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString15(err),icon:jsx161(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}finally{setSaving(!1)}},[medplum,patient,pendingAccounts,propagate,props]);return isAdmin?jsxs103(Fragment58,{children:[jsxs103(Stack38,{children:[jsx161(Title12,{order:3,children:"Current Accounts"}),pendingAccounts.length===0?jsx161(Text49,{c:"dimmed",children:"No accounts assigned to this patient."}):jsxs103(Table5,{children:[jsx161(Table5.Thead,{children:jsxs103(Table5.Tr,{children:[jsx161(Table5.Th,{children:"Type"}),jsx161(Table5.Th,{children:"Account"}),jsx161(Table5.Th,{})]})}),jsx161(Table5.Tbody,{children:pendingAccounts.map(account=>jsxs103(Table5.Tr,{children:[jsx161(Table5.Td,{children:jsx161(AccountTypeBadge,{reference:account})}),jsx161(Table5.Td,{children:jsx161(ResourceBadge,{value:account,link:!0})}),jsx161(Table5.Td,{children:jsx161(ActionIcon20,{variant:"subtle",color:"red","aria-label":`Remove ${account.reference}`,onClick:()=>handleRemoveAccount(account.reference),children:jsx161(IconX,{size:16})})})]},account.reference))})]}),jsx161(Divider11,{}),jsx161(Title12,{order:4,children:"Add Account"}),jsx161(ReferenceInput,{name:"newAccount",placeholder:"Search for Organization, HealthcareService, or CareTeam...",targetTypes:ACCOUNT_TARGET_TYPES,onChange:value=>{value&&handleAddAccount(value)}}),hasChanges&&jsxs103(Fragment58,{children:[jsx161(Divider11,{}),jsx161(Title12,{order:4,children:"Pending Changes"}),jsx161(Stack38,{gap:"xs",children:changes.map(change=>jsxs103(Group59,{gap:"xs",children:[change.type==="addition"?jsx161(Badge3,{color:"green",variant:"light",leftSection:jsx161(IconPlus,{size:12}),children:"Add"}):jsx161(Badge3,{color:"red",variant:"light",leftSection:jsx161(IconMinus,{size:12}),children:"Remove"}),jsx161(ResourceBadge,{value:change.reference,link:!0})]},`${change.type}-${change.reference.reference}`))})]}),jsx161(Box30,{children:jsx161(Button21,{disabled:!hasChanges||saving,onClick:()=>setConfirmModalOpen(!0),children:"Save Changes"})})]}),jsx161(Modal4,{opened:confirmModalOpen,onClose:()=>setConfirmModalOpen(!1),title:"Confirm Account Changes",size:"md",keepMounted:!0,children:jsxs103(Stack38,{children:[jsxs103(Text49,{children:["The following changes will be applied to Patient"," ",jsxs103("strong",{children:[patient.name?.[0]?.given?.join(" ")," ",patient.name?.[0]?.family]}),":"]}),changes.filter(c=>c.type==="addition").length>0&&jsxs103(Box30,{children:[jsx161(Text49,{fw:600,c:"green",children:"Adding:"}),jsx161(Stack38,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="addition").map(c=>jsxs103(Group59,{gap:"xs",children:[jsx161(IconPlus,{size:14,color:"green"}),jsx161(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),changes.filter(c=>c.type==="removal").length>0&&jsxs103(Box30,{children:[jsx161(Text49,{fw:600,c:"red",children:"Removing:"}),jsx161(Stack38,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="removal").map(c=>jsxs103(Group59,{gap:"xs",children:[jsx161(IconMinus,{size:14,color:"red"}),jsx161(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),jsx161(Checkbox7,{label:"Propagate changes to all resources in this patient's compartment",checked:propagate,onChange:event=>setPropagate(event.currentTarget.checked)}),jsxs103(Group59,{justify:"right",mt:"md",children:[jsx161(Button21,{variant:"default",onClick:()=>setConfirmModalOpen(!1),children:"Cancel"}),jsx161(Button21,{onClick:handleSave,loading:saving,children:"Confirm"})]})]})})]}):jsx161(Alert5,{color:"blue",title:"Admin access required",children:"You need project admin access to manage patient account assignments."})}function AccountTypeBadge({reference}){let type=reference.reference?.split("/")[0]??"Unknown";return jsx161(Badge3,{variant:"light",color:{Organization:"blue",HealthcareService:"teal",CareTeam:"violet"}[type]??"gray",size:"sm",children:type})}import{Checkbox as Checkbox8,Group as Group60,SegmentedControl as SegmentedControl2,Stack as Stack39}from"@mantine/core";import{notifications as notifications2}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString16,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum48}from"@medplum/react-hooks";import{useCallback as useCallback31,useState as useState92}from"react";import{jsx as jsx162,jsxs as jsxs104}from"react/jsx-runtime";var NOTIFICATION_ID2="patient-export",NOTIFICATION_TITLE2="Patient Export",formats={everything:{operation:"$everything",extension:"json",contentType:ContentType3.FHIR_JSON},summary:{operation:"$summary",extension:"json",contentType:ContentType3.FHIR_JSON},ccda:{operation:"$ccda-export",extension:"xml",contentType:ContentType3.CDA_XML},ccdaReferral:{operation:"$ccda-export",type:"referral",extension:"xml",contentType:ContentType3.CDA_XML}};function PatientExportForm(props){let medplum=useMedplum48(),{patient}=props,[format,setFormat]=useState92("everything"),[inlineAttachments,setInlineAttachments]=useState92(!1),handleSubmit=useCallback31(async data2=>{let patientId=resolveId2(patient),{operation,type,contentType,extension}=formats[format],url=medplum.fhirUrl("Patient",patientId,operation),params={};format==="everything"&&inlineAttachments&&url.searchParams.set("_inlineAttachments","true"),type&&(params.type=type),data2.author&&(params.author={reference:data2.author}),data2.authoredOn&&(params.authoredOn=convertLocalToIso(data2.authoredOn)),data2.startDate&&(params.start=data2.startDate),data2.endDate&&(params.end=data2.endDate),notifications2.show({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,loading:!0,message:"Exporting...",autoClose:!1,withCloseButton:!1});try{let response=await medplum.post(url,params,void 0,{cache:"no-cache",headers:{Accept:contentType}}),fileName=`Patient-export-${patientId}-${new Date().toISOString().replaceAll(":","-")}.${extension}`;saveData(response,fileName,contentType),notifications2.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"green",message:"Done",icon:jsx162(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications2.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"red",message:normalizeErrorString16(err),icon:jsx162(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient,format,inlineAttachments]);return jsx162(Form,{onSubmit:handleSubmit,children:jsxs104(Stack39,{children:[jsx162(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx162(SegmentedControl2,{name:"format",value:format,onChange:setFormat,data:[{label:"FHIR Everything",value:"everything"},{label:"Patient Summary",value:"summary"},{label:"C-CDA",value:"ccda"},{label:"C-CDA Referral",value:"ccdaReferral"}],fullWidth:!0})}),jsx162(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx162(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx162(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx162(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx162(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:jsx162(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx162(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:jsx162(DateTimeInput,{name:"endDate",placeholder:"End date"})}),format==="everything"&&jsx162(FormSection,{title:"Inline Attachments",description:"Embed DocumentReference file attachments as base64-encoded data instead of storage URLs.",children:jsx162(Stack39,{gap:"xs",children:jsx162(Checkbox8,{label:"Inline attachments",checked:inlineAttachments,onChange:e=>setInlineAttachments(e.currentTarget.checked)})})}),jsx162(Group60,{justify:"right",children:jsx162(SubmitButton,{children:"Request Export"})})]})})}function saveData(data2,fileName,contentType){let content=typeof data2=="string"?data2:JSON.stringify(data2,null,2),blob=new Blob([content],{type:contentType}),url=window.URL.createObjectURL(blob),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=url,a.download=fileName,a.click(),window.URL.revokeObjectURL(url)}import{calculateAgeString as calculateAgeString2}from"@medplum/core";import{useResource as useResource14}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment59,jsx as jsx163,jsxs as jsxs105}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource14(props.patient);return patient?jsxs105(InfoBar,{children:[jsx163(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs105(InfoBar.Entry,{children:[jsx163(InfoBar.Key,{children:"Name"}),jsx163(InfoBar.Value,{children:jsx163(MedplumLink,{to:patient,fw:500,children:patient.name?jsx163(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs105(Fragment59,{children:[jsxs105(InfoBar.Entry,{children:[jsx163(InfoBar.Key,{children:"DoB"}),jsx163(InfoBar.Value,{children:patient.birthDate})]}),jsxs105(InfoBar.Entry,{children:[jsx163(InfoBar.Key,{children:"Age"}),jsx163(InfoBar.Value,{children:calculateAgeString2(patient.birthDate)})]})]}),patient.gender&&jsxs105(InfoBar.Entry,{children:[jsx163(InfoBar.Key,{children:"Gender"}),jsx163(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs105(InfoBar.Entry,{children:[jsx163(InfoBar.Key,{children:"State"}),jsx163(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs105(InfoBar.Entry,{children:[jsx163(InfoBar.Key,{children:identifier?.system}),jsx163(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Box as Box31,Button as Button22,Checkbox as Checkbox9,Flex as Flex27,Group as Group61,Loader as Loader9,Radio as Radio5,Stack as Stack40,Text as Text50,TextInput as TextInput28}from"@mantine/core";import{showNotification as showNotification12}from"@mantine/notifications";import{formatAddress as formatAddress5,normalizeErrorString as normalizeErrorString17}from"@medplum/core";import{useCallback as useCallback32,useMemo as useMemo39,useState as useState93}from"react";var PharmacyDialog_default={pharmacyItem:"PharmacyDialog_pharmacyItem",pharmacyItemSelected:"PharmacyDialog_pharmacyItemSelected"};import{jsx as jsx164,jsxs as jsxs106}from"react/jsx-runtime";var DEFAULT_SEARCH_PLACEHOLDERS={name:"Enter pharmacy name (min 3 chars)",city:"City (min 3 chars)",state:"State (min 3 chars)",zip:"Zip code (min 3 chars)",phoneOrFax:"Phone or fax number",address:"Street address (min 3 chars)",ncpdpID:"National Council for Prescription Drug Programs ID"};function getPharmacyKey(pharmacy,index){return pharmacy.identifier?.[0]?.value||`pharmacy-${index}`}function SearchForm({onSearch,searching,renderBeforeSearchButton,placeholders}){return jsx164("form",{onSubmit:e=>{e.preventDefault();let formData=new FormData(e.currentTarget);onSearch(formData)},children:jsxs106(Stack40,{gap:"md",children:[jsx164(TextInput28,{name:"name",label:"Pharmacy Name",placeholder:placeholders.name}),jsxs106(Group61,{grow:!0,children:[jsx164(TextInput28,{name:"city",label:"City",placeholder:placeholders.city}),jsx164(TextInput28,{name:"state",label:"State",placeholder:placeholders.state})]}),jsxs106(Group61,{grow:!0,children:[jsx164(TextInput28,{name:"zip",label:"Zip Code",placeholder:placeholders.zip}),jsx164(TextInput28,{name:"phoneOrFax",label:"Phone or Fax",placeholder:placeholders.phoneOrFax})]}),jsx164(TextInput28,{name:"address",label:"Address",placeholder:placeholders.address}),jsx164(TextInput28,{name:"ncpdpID",label:"NCPDP ID",placeholder:placeholders.ncpdpID}),renderBeforeSearchButton,jsx164(Button22,{type:"submit",loading:searching,children:"Search"})]})})}function PharmacyItem({pharmacy,pharmacyKey,isSelected,onSelect}){return jsx164(Box31,{p:"sm",className:isSelected?PharmacyDialog_default.pharmacyItemSelected:PharmacyDialog_default.pharmacyItem,onClick:onSelect,children:jsx164(Radio5,{value:pharmacyKey,label:jsxs106(Box31,{children:[jsx164(Text50,{fw:500,size:"sm",children:pharmacy.name}),pharmacy.address?.[0]&&jsx164(Text50,{size:"xs",c:"dimmed",children:formatAddress5(pharmacy.address[0])}),pharmacy.telecom?.find(t=>t.system==="phone")&&jsxs106(Text50,{size:"xs",c:"dimmed",children:["Phone: ",pharmacy.telecom.find(t=>t.system==="phone")?.value]}),pharmacy.telecom?.find(t=>t.system==="fax")&&jsxs106(Text50,{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 jsxs106(Box31,{mt:"xl",children:[jsxs106(Text50,{fw:600,mb:"md",children:["Search Results (",searchResults.length,")"]}),jsx164(Radio5.Group,{value:selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy)):"",onChange:value=>{let selected=searchResults.find((p,i)=>getPharmacyKey(p,i)===value);selected&&onSelectPharmacy(selected)},children:jsx164(Stack40,{gap:"sm",children:searchResults.map((pharmacy,index)=>{let pharmacyKey=getPharmacyKey(pharmacy,index),isSelected=selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy))===pharmacyKey:!1;return jsx164(PharmacyItem,{pharmacy,pharmacyKey,isSelected,onSelect:()=>onSelectPharmacy(pharmacy)},pharmacyKey)})})}),jsxs106(Flex27,{mt:"lg",gap:"md",align:"center",justify:"space-between",children:[jsx164(Checkbox9,{label:"Set as primary pharmacy",checked:setAsPrimary,onChange:e=>onSetAsPrimary(e.currentTarget.checked)}),jsxs106(Group61,{children:[jsx164(Button22,{variant:"subtle",onClick:onClose,children:"Cancel"}),jsx164(Button22,{onClick:onAddFavorite,disabled:!selectedPharmacy,loading:adding,children:"Add to Favorites"})]})]})]})}function PharmacyDialog(props){let{patient,onSubmit,onClose,onSearch,onAddToFavorites,renderBeforeSearchButton,getExtraSearchParams,searchPlaceholders}=props,placeholders=useMemo39(()=>({...DEFAULT_SEARCH_PLACEHOLDERS,...searchPlaceholders}),[searchPlaceholders]),[searchResults,setSearchResults]=useState93([]),[searching,setSearching]=useState93(!1),[selectedPharmacy,setSelectedPharmacy]=useState93(),[setAsPrimary,setSetAsPrimary]=useState93(!1),[adding,setAdding]=useState93(!1),handleSearch=useCallback32(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()!=="")),extraParams=getExtraSearchParams?.()??{},mergedParams={...cleanParams,...extraParams},hasTextCriteria=Object.keys(cleanParams).length>0,hasExtraCriteria=Object.entries(extraParams).some(([,value])=>Array.isArray(value)?value.length>0:value!=null&&value!=="");if(!hasTextCriteria&&!hasExtraCriteria){showNotification12({color:"yellow",title:"Search Required",message:"Please enter at least one search criterion"});return}setSearching(!0),setSelectedPharmacy(void 0);try{let results=await onSearch(mergedParams);setSearchResults(results),results.length===0&&showNotification12({color:"blue",title:"No Results",message:"No pharmacies found matching your search criteria"})}catch(error){showNotification12({color:"red",title:"Search Error",message:normalizeErrorString17(error)})}finally{setSearching(!1)}},[getExtraSearchParams,onSearch]),handleAddFavorite=useCallback32(async()=>{if(!(!selectedPharmacy||!patient.id)){setAdding(!0);try{let response=await onAddToFavorites({patientId:patient.id,pharmacy:selectedPharmacy,setAsPrimary});response.success?(showNotification12({color:"green",title:"Success",message:response.message}),onSubmit(response.organization||selectedPharmacy)):showNotification12({color:"red",title:"Error",message:response.message})}catch(error){showNotification12({color:"red",title:"Error",message:normalizeErrorString17(error)})}finally{setAdding(!1)}}},[selectedPharmacy,patient.id,setAsPrimary,onAddToFavorites,onSubmit]);return jsxs106(Box31,{children:[jsx164(SearchForm,{onSearch:formData=>handleSearch(formData).catch(console.error),searching,renderBeforeSearchButton,placeholders}),searching&&jsx164(Flex27,{justify:"center",mt:"xl",children:jsx164(Loader9,{})}),searchResults.length>0&&!searching&&jsx164(SearchResults,{searchResults,selectedPharmacy,onSelectPharmacy:setSelectedPharmacy,setAsPrimary,onSetAsPrimary:setSetAsPrimary,onAddFavorite:handleAddFavorite,onClose,adding})]})}import{Box as Box32,Flex as Flex28,Group as Group62,Text as Text51}from"@mantine/core";import{getDisplayString as coreGetDisplayString}from"@medplum/core";import{jsx as jsx165,jsxs as jsxs107}from"react/jsx-runtime";function summaryResourceListSection(options){return{key:options.key,title:options.title,searches:[{key:options.key,resourceType:options.search.resourceType,patientParam:options.search.patientParam,query:options.search.query}],component:context=>jsx165(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),jsx165(CollapsibleSection,{title:options.title,onAdd:options.onAdd,children:resources.length>0?jsx165(Flex28,{direction:"column",gap:8,children:resources.map(resource=>{let displayString=options.getDisplayString?options.getDisplayString(resource):coreGetDisplayString(resource),status=options.getStatus?.(resource),secondaryText=options.getSecondaryText?.(resource);return jsx165(SummaryItem,{onClick:()=>context.onClickResource?.(resource),children:jsxs107(Box32,{children:[jsx165(Text51,{fw:500,className:SummaryItem_default.itemText,children:displayString}),(status||secondaryText)&&jsxs107(Group62,{mt:2,gap:4,children:[status&&jsx165(StatusBadge,{color:status.color,variant:"light",status:status.label}),secondaryText&&jsx165(Text51,{size:"xs",fw:500,c:"dimmed",children:secondaryText})]})]})},resource.id)})}):jsx165(Text51,{children:"(none)"})})}import{createReference as createReference17}from"@medplum/core";import{useCallback as useCallback33}from"react";import{jsx as jsx166}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback33((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 jsx166(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference17(resource),sender:createReference17(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference17(resource),operator:createReference17(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor11,Box as Box33,Button as Button23,CloseButton as CloseButton3,Flex as Flex29,Group as Group63,Loader as Loader10,NativeSelect as NativeSelect11,Paper as Paper5,Stack as Stack41,Text as Text52,TextInput as TextInput29}from"@mantine/core";import{getReferenceString as getReferenceString11}from"@medplum/core";import{useMedplum as useMedplum49,useResource as useResource15}from"@medplum/react-hooks";import{useEffect as useEffect32,useState as useState94}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx167,jsxs as jsxs108}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum49(),defaultValue2=useResource15(props.value),[schemaLoaded,setSchemaLoaded]=useState94(!1),[selectedKey,setSelectedKey]=useState94(),[hoverKey,setHoverKey]=useState94(),[value,setValue]=useState94();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}if(useEffect32(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect32(()=>(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 jsx167("div",{children:jsxs108(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx167(TextInput29,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx167(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx167(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 jsxs108(Stack41,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx167(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx167("div",{children:jsx167(Button23,{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 jsx167("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx167(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState94(),medplum=useMedplum49(),[loading,setLoading]=useState94(!1),[resource,setResource]=useState94(),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 useEffect32(()=>{(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?jsx167(Loader10,{}):jsxs108(Paper5,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs108(Flex29,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx167(TextInput29,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx167(CloseButton3,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs108(Stack41,{gap:"xl",p:"md",children:[jsx167(Box33,{children:jsx167(TextInput29,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx167(Box33,{children:jsx167(NativeSelect11,{label:"Type of Action",value:actionType,onChange:e=>{let value=e.currentTarget.value==="standard"?void 0:e.currentTarget.value;setActionType(value),props.onChange({...props.action,definitionCanonical:value==="standard"?void 0:props.action.definitionCanonical})},data:[{value:"standard",label:"Standard task"},{value:"questionnaire",label:"Task with Questionnaire"},{value:"activitydefinition",label:"Task with Activity Definition"}]})}),actionType==="questionnaire"&&jsxs108(Stack41,{gap:0,children:[jsxs108(Group63,{gap:0,mb:"xs",children:[jsx167(Text52,{fw:600,children:"Select questionnaire"}),jsx167(Text52,{c:"red",children:"*"})]}),jsxs108(Text52,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx167(Anchor11,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx167(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&jsxs108(Stack41,{gap:0,children:[jsxs108(Group63,{gap:0,mb:"xs",children:[jsx167(Text52,{fw:600,children:"Select activity definition"}),jsx167(Text52,{c:"red",children:"*"})]}),jsxs108(Text52,{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"," ",jsx167(Anchor11,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx167(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return jsx167(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:getReferenceString11(newValue)}):props.onChange({...props.action,definitionCanonical:void 0})}})}function getInitialActionType(resource){return resource===void 0?"standard":resource.resourceType.toLowerCase()}var nextId=1;function generateId(existing){if(existing){if(existing.startsWith("id-")){let existingNum=Number.parseInt(existing.substring(3),10);Number.isNaN(existingNum)||(nextId=Math.max(nextId,existingNum+1))}return existing}return"id-"+nextId++}function ensurePlanDefinitionKeys(planDefinition){return{...planDefinition,action:ensurePlanDefinitionActionKeys(planDefinition.action)}}function ensurePlanDefinitionActionKeys(actions){if(actions)return actions.map(action=>({...action,id:generateId(action.id),action:ensurePlanDefinitionActionKeys(action.action)}))}import{Alert as Alert6,Box as Box34,Center as Center8,Loader as Loader11,Stack as Stack42,Text as Text53}from"@mantine/core";import{normalizeErrorString as normalizeErrorString18}from"@medplum/core";import{useEffect as useEffect33,useRef as useRef17,useState as useState95}from"react";import{jsx as jsx168,jsxs as jsxs109}from"react/jsx-runtime";var SCAN_INTERVAL_MS=150,jsQrPromise;function QrCodeScanner({onScan,onError,scanOnce=!0}){let videoRef=useRef17(null),canvasRef=useRef17(null),onScanRef=useRef17(onScan),onErrorRef=useRef17(onError),[loading,setLoading]=useState95(!0),[error,setError]=useState95();return useEffect33(()=>{onScanRef.current=onScan},[onScan]),useEffect33(()=>{onErrorRef.current=onError},[onError]),useEffect33(()=>{let video=videoRef.current,canvasElement=canvasRef.current,ctx=canvasElement?.getContext("2d",{willReadFrequently:!0});if(!video||!canvasElement||!ctx)return;let videoElement=video,scanCanvas=canvasElement,scanCtx=ctx,rafId=0,stream,cancelled=!1,scanned=!1,lastScanTime=0,jsQr;function stopStream(){stream?.getTracks().forEach(t=>t.stop())}function fail(err){let normalized=err instanceof Error?err:new Error(String(err));cancelled||(setLoading(!1),setError(normalizeErrorString18(normalized)),onErrorRef.current?.(normalized))}function tick(timestamp){if(!(cancelled||scanned||!jsQr)){if(videoElement.readyState===videoElement.HAVE_ENOUGH_DATA&&(setLoading(!1),timestamp-lastScanTime>=SCAN_INTERVAL_MS)){lastScanTime=timestamp,scanCanvas.height=videoElement.videoHeight,scanCanvas.width=videoElement.videoWidth,scanCtx.drawImage(videoElement,0,0,scanCanvas.width,scanCanvas.height);let imageData=scanCtx.getImageData(0,0,scanCanvas.width,scanCanvas.height),code=jsQr(imageData.data,imageData.width,imageData.height,{inversionAttempts:"attemptBoth"});if(code?.data&&(scanned=scanOnce,onScanRef.current(code.data),scanOnce)){stopStream();return}}rafId=requestAnimationFrame(tick)}}async function start(){try{if(jsQr=await loadJsQr(),cancelled)return;if(!navigator.mediaDevices?.getUserMedia)throw new Error("Camera access is not available in this browser.");let mediaStream=await navigator.mediaDevices.getUserMedia({video:{facingMode:"environment"}});if(cancelled){mediaStream.getTracks().forEach(t=>t.stop());return}stream=mediaStream,videoElement.srcObject=mediaStream,videoElement.setAttribute("playsinline","true"),await videoElement.play(),cancelled||(rafId=requestAnimationFrame(tick))}catch(err){fail(err)}}return start().catch(fail),()=>{cancelled=!0,cancelAnimationFrame(rafId),stopStream()}},[scanOnce]),jsxs109(Stack42,{gap:"sm",children:[error&&jsx168(Alert6,{color:"red",children:error}),jsxs109(Box34,{pos:"relative",style:{aspectRatio:"4 / 3",display:error?"none":"block",width:"100%",maxHeight:"70vh",overflow:"hidden",borderRadius:"var(--mantine-radius-default)",background:"black"},children:[jsx168("video",{ref:videoRef,width:640,height:480,muted:!0,style:{display:"block",width:"100%",height:"100%",objectFit:"cover"}}),loading&&!error&&jsx168(Center8,{pos:"absolute",top:0,left:0,right:0,bottom:0,style:{pointerEvents:"none"},children:jsxs109(Stack42,{gap:"xs",align:"center",children:[jsx168(Loader11,{size:"sm",color:"gray.3"}),jsx168(Text53,{c:"gray.3",size:"sm",children:"Loading camera..."})]})})]}),jsx168("canvas",{ref:canvasRef,hidden:!0})]})}async function loadJsQr(){return jsQrPromise||(jsQrPromise=import("jsqr").then(module=>module.default).catch(err=>{throw jsQrPromise=void 0,new Error(`QR code scanning requires the optional "jsqr" dependency. Install jsqr to use QrCodeScanner. ${normalizeErrorString18(err)}`)})),jsQrPromise}import{Anchor as Anchor12,Box as Box35,Group as Group65,NativeSelect as NativeSelect13,Space,Textarea as Textarea5,TextInput as TextInput31,Title as Title13}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{getQuestionnaireItemReferenceTargetTypes as getQuestionnaireItemReferenceTargetTypes2,isChoiceQuestion,QUESTIONNAIRE_ITEM_CONTROL_URL as QUESTIONNAIRE_ITEM_CONTROL_URL2,QuestionnaireItemType as QuestionnaireItemType2,setQuestionnaireItemReferenceTargetTypes,useMedplum as useMedplum51,useResource as useResource16}from"@medplum/react-hooks";import{useEffect as useEffect35,useLayoutEffect as useLayoutEffect5,useRef as useRef18,useState as useState97}from"react";import{Checkbox as Checkbox10,Group as Group64,MultiSelect as MultiSelect2,NativeSelect as NativeSelect12,Radio as Radio6,Text as Text54,Textarea as Textarea4,TextInput as TextInput30}from"@mantine/core";import{capitalize as capitalize6,deepEquals as deepEquals2,formatCoding as formatCoding2,getElementDefinition as getElementDefinition2,getExtension as getExtension2,HTTP_HL7_ORG as HTTP_HL7_ORG8,stringify as stringify3,typedValueToString}from"@medplum/core";import{getItemAnswerOptionValue,getItemInitialValue,getNewMultiSelectValues,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,isValueSetUnavailableError,QUESTIONNAIRE_ITEM_CONTROL_URL,QuestionnaireItemType,useMedplum as useMedplum50}from"@medplum/react-hooks";import{useEffect as useEffect34,useState as useState96}from"react";import{Fragment as Fragment60,jsx as jsx169,jsxs as jsxs110}from"react/jsx-runtime";var MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS=30,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS=50;function QuestionnaireFormItem(props){let formState=props.formState,item=props.item,response=props.responseItem;function onChangeAnswer(newResponseAnswer){if(formState&&props.context)if(item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice){let updatedAnswers=[...response.answer||[]];newResponseAnswer.length===0?updatedAnswers.splice(props.index,1):updatedAnswers[props.index]=newResponseAnswer[0],formState.onChangeAnswer(props.context,props.item,updatedAnswers)}else formState.onChangeAnswer(props.context,props.item,newResponseAnswer)}let type=item.type;if(!type)return null;let name=item.linkId;if(!name)return null;let inputId=item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice?`${name}-${props.index}`:name,initial;item.initial&&item.initial.length>0?initial=item.initial[0]:item.answerOption&&item.answerOption.length>0&&(initial=item.answerOption.find(option=>option.initialSelected));let defaultValue2=getCurrentAnswer(response,props.index)??getItemInitialValue(initial),validationError=getExtension2(response,`${HTTP_HL7_ORG8}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx169("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx169(CheckboxFormSection,{title:props.item.text,htmlFor:inputId,children:jsx169(Checkbox10,{id:inputId,name,required:props.required??item.required,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueBoolean:e.currentTarget.checked}])})},props.item.linkId);break;case QuestionnaireItemType.decimal:formComponent=jsx169(TextInput30,{type:"number",step:"any",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueDecimal:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.integer:formComponent=jsx169(TextInput30,{type:"number",step:1,id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueInteger:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.date:formComponent=jsx169(TextInput30,{type:"date",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueDate:e.currentTarget.value}])});break;case QuestionnaireItemType.dateTime:formComponent=jsx169(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case QuestionnaireItemType.time:formComponent=jsx169(TextInput30,{type:"time",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueTime:e.currentTarget.value}])});break;case QuestionnaireItemType.string:case QuestionnaireItemType.url:formComponent=jsx169(TextInput30,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.text:formComponent=jsx169(Textarea4,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.attachment:formComponent=jsx169(Group64,{py:4,children:jsx169(AttachmentInput,{path:"",name:inputId,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case QuestionnaireItemType.reference:formComponent=jsx169(ReferenceInput,{name:inputId,required:props.required??item.required,targetTypes:getQuestionnaireItemReferenceTargetTypes(item),searchCriteria:getQuestionnaireItemReferenceFilter(item,formState?.subject,formState?.encounter),defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueReference:newValue}])});break;case QuestionnaireItemType.quantity:formComponent=jsx169(QuantityInput,{path:"",name:inputId,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueQuantity:newValue}]),disableWheel:!0});break;case QuestionnaireItemType.choice:case QuestionnaireItemType.openChoice:{let{widget,multiselect}=resolveChoiceControl(item),sharedProps={name:inputId,item,required:props.required??item.required,initial,response,multiselect,onChangeAnswer};widget==="check-box"?formComponent=jsx169(QuestionnaireCheckboxInput,{...sharedProps}):widget==="drop-down"?formComponent=jsx169(QuestionnaireDropdownInput,{...sharedProps}):formComponent=jsx169(QuestionnaireRadioButtonInput,{...sharedProps})}break;default:return null}return jsxs110(Fragment60,{children:[formComponent,validationError?.valueString&&jsx169(Text54,{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 jsx169(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||multiselect;if(item.answerValueSet)return jsx169(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 jsx169(MultiSelect2,{data:data2,placeholder:"Select items",searchable:!0,value:currentAnswer,required,onChange:selected=>{if(selected.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(selected,propertyName,item);onChangeAnswer(values)}}})}else{let data2=[""];if(item.answerOption)for(let option of item.answerOption){let optionValue=getItemAnswerOptionValue(option);data2.push(typedValueToString(optionValue))}return jsx169(NativeSelect12,{id:name,name,required,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){onChangeAnswer([{}]);return}let option=item.answerOption[index-1],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize6(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])},defaultValue:formatCoding2(defaultValue2?.value)||defaultValue2?.value,data:data2})}}function getValueSetOptions(valueSetUrl,medplum){return valueSetUrl?medplum.valueSetExpand({url:valueSetUrl,count:MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS+1}).then(valueSet=>valueSet.expansion?.contains??[]):Promise.resolve([])}function useValueSetOptions(valueSetUrl){let medplum=useMedplum50(),[valueSetOptions,setValueSetOptions]=useState96([]),[isLoading,setIsLoading]=useState96(!1),[isAvailable,setIsAvailable]=useState96(()=>valueSetUrl?void 0:!0);return useEffect34(()=>{async function loadValueSet(){if(!valueSetUrl){setIsAvailable(!0);return}setIsLoading(!0),setIsAvailable(void 0);try{let options=await getValueSetOptions(valueSetUrl,medplum);setValueSetOptions(options),setIsAvailable(!0)}catch(err){let unavailable=isValueSetUnavailableError(err);setIsAvailable(!unavailable),unavailable||console.error("Error loading value set:",err)}finally{setIsLoading(!1)}}loadValueSet().catch(console.error)},[valueSetUrl,medplum]),{options:valueSetOptions,loading:isLoading,available:isAvailable}}function SuggestionsUnavailableDisplay({valueSetUrl}){return jsx169(UnavailableNote,{text:"Suggestions unavailable",color:"yellow.9",message:`Value set ${valueSetUrl} is unavailable`})}function getOptionsFromValueSet(valueSetOptions,name){return valueSetOptions.map((option,i)=>{let optionName=`${name}-valueset-${i}`,optionValue={type:"Coding",value:{system:option.system,code:option.code,display:option.display}};return[optionName,optionValue]})}function QuestionnaireRadioButtonInput(props){let{name,item,required,initial,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition2("QuestionnaireItemAnswerOption","value[x]"),initialValue=getItemInitialValue(initial),{options:valueSetOptions,loading:isLoading,available:isValueSetAvailable}=useValueSetOptions(item.answerValueSet),options=[],defaultValue2;if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?(initialValue&&stringify3(optionValue)===stringify3(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return jsx169(Text54,{children:"Loading options..."});if(options.length===0)return isValueSetAvailable===!1?jsx169(SuggestionsUnavailableDisplay,{valueSetUrl:item.answerValueSet}):jsx169(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs110(Fragment60,{children:[jsx169(Radio6.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+capitalize6(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>jsx169(Radio6,{id:optionName,value:optionName,py:4,required,label:jsx169(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)&&jsxs110(Text54,{size:"sm",c:"dimmed",mt:"xs",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function QuestionnaireCheckboxInput(props){let{name,item,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition2("QuestionnaireItemAnswerOption","value[x]"),{options:valueSetOptions,loading:isLoading,available:isValueSetAvailable}=useValueSetOptions(item.answerValueSet),selectedValues=item.answerValueSet?(response?.answer?.map(a=>a.valueCoding)||[]).filter(c=>c!==void 0):getCurrentMultiSelectAnswer(response),options=[];if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?[optionName,optionValue]:null}).filter(option=>option!==null);options.push(...mappedOptions)}if(isLoading)return jsx169(Text54,{children:"Loading options..."});if(options.length===0)return isValueSetAvailable===!1?jsx169(SuggestionsUnavailableDisplay,{valueSetUrl:item.answerValueSet}):jsx169(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS),handleCheckboxChange=(optionValue,selected)=>{if(item.answerValueSet){let currentCodings=selectedValues,newCodings;selected?newCodings=[...currentCodings,optionValue.value]:newCodings=currentCodings.filter(c=>!deepEquals2(c,optionValue.value)),newCodings.length===0?onChangeAnswer([{}]):onChangeAnswer(newCodings.map(coding=>({valueCoding:coding})))}else{let currentValues=selectedValues,optionValueStr=typedValueToString(optionValue),newValues;if(selected?newValues=[...currentValues,optionValueStr]:newValues=currentValues.filter(v=>v!==optionValueStr),newValues.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(newValues,"value"+capitalize6(optionValue.type),item);onChangeAnswer(values)}}};return jsxs110(Group64,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=typedValueToString(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>deepEquals2(coding,optionValue.value)):selectedValues.includes(optionValueStr);return jsx169(Checkbox10,{id:optionName,label:jsx169(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)&&jsxs110(Text54,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx169(TextInput30,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){return getItemAnswerOptionValue(response?.answer?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response?.answer;return results?results.map(a=>getItemAnswerOptionValue(a)).map(type=>formatCoding2(type?.value)||type?.value).filter(Boolean):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals2(option[1].value,defaultAnswer?.value))?.[0]}var choiceTypes=["drop-down","radio-button","check-box"];function resolveChoiceControl(item){let widget="radio-button",multiselect=!1;item.answerValueSet&&(widget="drop-down");for(let ext of item.extension??[]){if(ext.url!==QUESTIONNAIRE_ITEM_CONTROL_URL)continue;let code=ext.valueCodeableConcept?.coding?.[0]?.code;choiceTypes.includes(code)&&(widget=code),code==="multi-select"&&(multiselect=!0)}return widget==="radio-button"&&multiselect&&(widget="check-box"),{widget,multiselect}}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize6(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};import{Fragment as Fragment61,jsx as jsx170,jsxs as jsxs111}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum51(),defaultValue2=useResource16(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState97(!1),[value,setValue]=useState97(),[selectedKey,setSelectedKey]=useState97(),[hoverKey,setHoverKey]=useState97();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect35(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect35(()=>(setValue(ensureQuestionnaireKeys(defaultValue2??{resourceType:"Questionnaire",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]);let handleChange=(questionnaire,disableSubmit)=>{setValue(questionnaire),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire)};return!schemaLoaded||!value?null:jsx170("div",{children:jsxs111(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx170(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx170(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource4=isResourceType(props.item),isContainer=isResource4||item.type===QuestionnaireItemType2.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef18(props.item);useLayoutEffect5(()=>{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 jsxs111("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx170("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs111(Fragment61,{children:[isResource4&&jsx170(TextInput31,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource4&&jsx170(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx170(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx170(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs111(Fragment61,{children:[resource.title&&jsx170(Title13,{children:resource.title}),item.text&&jsx170("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx170(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx170("div",{children:jsx170(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&&jsx170("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs111(Fragment61,{children:[jsx170(TextInput31,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx170(NativeSelect13,{size:"xs",className:QuestionnaireBuilder_default.typeSelect,defaultValue:item.type,onChange:e=>changeProperty("type",e.currentTarget.value),data:[{value:"display",label:"Display"},{value:"boolean",label:"Boolean"},{value:"decimal",label:"Decimal"},{value:"integer",label:"Integer"},{value:"date",label:"Date"},{value:"dateTime",label:"Date/Time"},{value:"time",label:"Time"},{value:"string",label:"String"},{value:"text",label:"Text"},{value:"url",label:"URL"},{value:"choice",label:"Choice"},{value:"open-choice",label:"Open Choice"},{value:"attachment",label:"Attachment"},{value:"reference",label:"Reference"},{value:"quantity",label:"Quantity"}]})]}):jsx170("div",{children:linkId})}),!isResource4&&jsx170(Box35,{className:QuestionnaireBuilder_default.movementActions,children:jsxs111(Box35,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx170(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx170(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx170(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx170(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs111("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs111(Fragment61,{children:[jsx170(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx170(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource4&&jsx170(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource4&&jsxs111(Fragment61,{children:[jsx170(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx170(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),props.onRemove&&props.onRemove()},children:"Remove"})]})]})]})}function AnswerBuilder(props){let property=getElementDefinition3("QuestionnaireItemAnswerOption","value[x]"),options=props.item.answerOption??[];return jsxs111("div",{children:[props.item.answerValueSet!==void 0?jsx170(TextInput31,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx170(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs111(Box35,{display:"flex",children:[jsx170(Anchor12,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),jsx170(Space,{w:"lg"}),jsx170(Anchor12,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx170("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs111("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx170("div",{children:jsx170(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)}),jsx170("div",{children:jsx170(Anchor12,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:props.options.filter(o=>o.id!==option.id)})},children:"Remove"})})]},option.id)})})}function ReferenceProfiles(props){let targetTypes=getQuestionnaireItemReferenceTargetTypes2(props.item)??[];return jsxs111(Fragment61,{children:[targetTypes.map((targetType,index)=>jsxs111(Group65,{children:[jsx170(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx170(Anchor12,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx170(Anchor12,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId2=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId2(){return"id-"+nextId2++}function ensureQuestionnaireKeys(questionnaire){return{...questionnaire,id:questionnaire.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId2=Math.max(nextId2,Number.parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,Number.parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId2(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId2()}))}function createPage(){return{id:generateId2(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:QUESTIONNAIRE_ITEM_CONTROL_URL2,valueCodeableConcept:{coding:[{system:"http://hl7.org/fhir/questionnaire-item-control",code:"page"}]}}]}}function reorderItems(items,itemIndex,delta){let currentItems=items??[],newIndex=itemIndex+delta;if(newIndex<0||newIndex>=currentItems.length)return currentItems;let updatedItems=[...currentItems];return[updatedItems[itemIndex],updatedItems[newIndex]]=[updatedItems[newIndex],updatedItems[itemIndex]],updatedItems}import{ActionIcon as ActionIcon21,Box as Box36,Button as Button26,Collapse as Collapse2,Divider as Divider14,Flex as Flex30,Loader as Loader12,Stack as Stack46,Text as Text56}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback4}from"@mantine/hooks";import{showNotification as showNotification13}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString19}from"@medplum/core";import{useMedplum as useMedplum54,useWhisper}from"@medplum/react-hooks";import{useCallback as useCallback35,useEffect as useEffect38,useRef as useRef21,useState as useState99}from"react";var AIRealTimeQuestionnaireForm_default={banner:"AIRealTimeQuestionnaireForm_banner",headerRow:"AIRealTimeQuestionnaireForm_headerRow",statusRow:"AIRealTimeQuestionnaireForm_statusRow",iconWrapper:"AIRealTimeQuestionnaireForm_iconWrapper",recordingPulse:"AIRealTimeQuestionnaireForm_recordingPulse",statusLabel:"AIRealTimeQuestionnaireForm_statusLabel",statusLabelPrimary:"AIRealTimeQuestionnaireForm_statusLabelPrimary",statusLabelFinishing:"AIRealTimeQuestionnaireForm_statusLabelFinishing",dictationButton:"AIRealTimeQuestionnaireForm_dictationButton",dictationButtonLoading:"AIRealTimeQuestionnaireForm_dictationButtonLoading",instructions:"AIRealTimeQuestionnaireForm_instructions",panelGrid:"AIRealTimeQuestionnaireForm_panelGrid",panelColumn:"AIRealTimeQuestionnaireForm_panelColumn",transcriptWrapper:"AIRealTimeQuestionnaireForm_transcriptWrapper",transcriptArea:"AIRealTimeQuestionnaireForm_transcriptArea",transcriptText:"AIRealTimeQuestionnaireForm_transcriptText"};import{Divider as Divider13,Group as Group67,Stack as Stack45,Text as Text55,Title as Title15}from"@mantine/core";import{createReference as createReference19,getExtension as getExtension3,getReferenceString as getReferenceString12}from"@medplum/core";import{QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,useMedplum as useMedplum53,useQuestionnaireForm}from"@medplum/react-hooks";import{useCallback as useCallback34,useEffect as useEffect37,useLayoutEffect as useLayoutEffect7,useMemo as useMemo40,useRef as useRef20,useState as useState98}from"react";import{Button as Button24,Paper as Paper6}from"@mantine/core";import{createReference as createReference18,HTTP_HL7_ORG as HTTP_HL7_ORG9}from"@medplum/core";import{useMedplum as useMedplum52}from"@medplum/react-hooks";import{useEffect as useEffect36,useLayoutEffect as useLayoutEffect6,useRef as useRef19}from"react";var Point=class{constructor(x,y,pressure,time){__publicField(this,"x");__publicField(this,"y");__publicField(this,"pressure");__publicField(this,"time");if(isNaN(x)||isNaN(y))throw new Error(`Point is invalid: (${x}, ${y})`);this.x=+x,this.y=+y,this.pressure=pressure||0,this.time=time||Date.now()}distanceTo(start){return Math.sqrt(Math.pow(this.x-start.x,2)+Math.pow(this.y-start.y,2))}equals(other){return this.x===other.x&&this.y===other.y&&this.pressure===other.pressure&&this.time===other.time}velocityFrom(start){return this.time!==start.time?this.distanceTo(start)/(this.time-start.time):0}},Bezier=class _Bezier{constructor(startPoint,control2,control1,endPoint,startWidth,endWidth){__publicField(this,"startPoint");__publicField(this,"control2");__publicField(this,"control1");__publicField(this,"endPoint");__publicField(this,"startWidth");__publicField(this,"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,"canvas");__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._drawLine.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()}_getDotSize(options){return options.dotSize>0?options.dotSize:(options.minWidth+options.maxWidth)/2}_drawDot(point,options){let ctx=this._ctx,width=this._getDotSize(options);ctx.beginPath(),this._drawCurveSegment(point.x,point.y,width),ctx.closePath(),ctx.fillStyle=options.penColor,ctx.fill()}_drawLine(startPoint,endPoint,options){let ctx=this._ctx;ctx.save(),ctx.beginPath(),ctx.moveTo(startPoint.x,startPoint.y),ctx.lineTo(endPoint.x,endPoint.y),ctx.lineWidth=this._getDotSize(options)*2,ctx.lineCap="round",ctx.strokeStyle=options.penColor,ctx.stroke(),ctx.restore(),this._isEmpty=!1}_fromData(pointGroups,drawCurve,drawDot,drawLine){for(let group of pointGroups){let{points}=group,pointGroupOptions=this._getPointGroupOptions(group);if(points.length>2)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 points.length===2?(this._reset(pointGroupOptions),drawLine(points[0],points[1],pointGroupOptions)):(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)},(startPoint,endPoint,options)=>{let line=document.createElement("line");line.setAttribute("x1",startPoint.x.toString()),line.setAttribute("y1",startPoint.y.toString()),line.setAttribute("x2",endPoint.x.toString()),line.setAttribute("y2",endPoint.y.toString()),line.setAttribute("stroke",options.penColor),line.setAttribute("stroke-width",(this._getDotSize(options)*2).toString()),line.setAttribute("stroke-linecap","round"),svg.appendChild(line)}),svg.outerHTML}};import{jsx as jsx171,jsxs as jsxs112}from"react/jsx-runtime";function SignatureInput(props){let medplum=useMedplum52(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=useRef19(null),signaturePadRef=useRef19(null),onChangeRef=useRef19(onChange);return useLayoutEffect6(()=>{onChangeRef.current=onChange}),useEffect36(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:HTTP_HL7_ORG9+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??createReference18(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]),jsxs112(Paper6,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[jsx171("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),jsx171(Button24,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:jsx171(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}import{Divider as Divider12,Stack as Stack44}from"@mantine/core";import{isQuestionEnabled,QuestionnaireItemType as QuestionnaireItemType4}from"@medplum/react-hooks";import{Fragment as Fragment63}from"react";import{Title as Title14}from"@mantine/core";import{jsx as jsx172,jsxs as jsxs113}from"react/jsx-runtime";function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return jsxs113("div",{children:[props.item.text&&jsx172(Title14,{order:4,mb:"md",children:props.item.text}),jsx172(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}import{Anchor as Anchor13}from"@mantine/core";import{Fragment as Fragment62,jsx as jsx173,jsxs as jsxs114}from"react/jsx-runtime";function QuestionnaireFormRepeatableGroup(props){return jsxs114(Fragment62,{children:[props.responseItems.map(response=>jsx173(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),jsx173(Anchor13,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}import{Anchor as Anchor14,Stack as Stack43}from"@mantine/core";import{QuestionnaireItemType as QuestionnaireItemType3}from"@medplum/react-hooks";import{jsx as jsx174,jsxs as jsxs115}from"react/jsx-runtime";function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,isChoiceType=item.type===QuestionnaireItemType3.choice||item.type===QuestionnaireItemType3.openChoice,showAddButton=!isChoiceType,answers=!isChoiceType&&responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return jsxs115(FormSection,{title:props.item.text,withAsterisk:props.item.required,children:[jsx174(Stack43,{gap:"xs",children:answers?.map((_,index)=>jsx174(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&jsx174(Anchor14,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}import{jsx as jsx175,jsxs as jsxs116}from"react/jsx-runtime";function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props,isTopLevel=context.length===0,hasRenderedSection=!1;return jsx175(Stack44,{gap:"xl",children:items.map((item,index)=>{if(!isQuestionEnabled(item,formState.questionnaireResponse))return null;let isGroup=item.type===QuestionnaireItemType4.group,showSectionDivider=isTopLevel&&isGroup&&hasRenderedSection;if(isGroup&&(hasRenderedSection=!0),item.type===QuestionnaireItemType4.display)return jsx175("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===QuestionnaireItemType4.group&&item.repeats?jsxs116(Fragment63,{children:[showSectionDivider&&jsx175(Divider12,{color:"var(--mantine-color-gray-2)"}),jsx175(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems})]},`repeating-group-${item.id}-${index}`):item.type===QuestionnaireItemType4.group?jsxs116(Fragment63,{children:[showSectionDivider&&jsx175(Divider12,{color:"var(--mantine-color-gray-2)"}),jsx175(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]})]},`group-${item.id}-${index}`):item.type===QuestionnaireItemType4.boolean?jsx175(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?jsx175(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):jsx175(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:jsx175(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}import{Button as Button25,Group as Group66,Stepper}from"@mantine/core";import{Fragment as Fragment64,jsx as jsx176,jsxs as jsxs117}from"react/jsx-runtime";function QuestionnaireFormStepper(props){let{formState,submitButtonText,excludeButtons,children}=props,pages=formState.pages,activePage=formState.activePage,showBackButton=activePage>0,showNextButton=activePage<pages.length-1,showSubmitButton=activePage===pages.length-1;return jsxs117(Fragment64,{children:[jsx176(Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>jsx176(Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&jsxs117(Group66,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx176(Button25,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&jsx176(Button25,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&jsx176(SubmitButton,{children:submitButtonText??"Submit"})]})]})}import{Fragment as Fragment65,jsx as jsx177,jsxs as jsxs118}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum53(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=useState98(!1),propsRef=useRef20(props),pendingChangeRef=useRef20(void 0);useLayoutEffect7(()=>{propsRef.current=props});let onFormChange=useCallback34(response=>{pendingChangeRef.current=response},[]),formState=useQuestionnaireForm({questionnaire:props.questionnaire,defaultValue:props.questionnaireResponse,subject:props.subject,encounter:props.encounter,source:props.source,disablePagination:props.disablePagination,onChange:onFormChange}),formStateRef=useRef20(formState);useLayoutEffect7(()=>{formStateRef.current=formState}),useEffect37(()=>{let pendingChange=pendingChangeRef.current;pendingChange&&(pendingChangeRef.current=void 0,setSignatureRequiredSubmitted(!1),propsRef.current.onChange?.(pendingChange))});let isSignatureRequired=useMemo40(()=>formState.loading?!1:!!getExtension3(formState.questionnaire,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=useMemo40(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=useCallback34(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=createReference19(profile))}onSubmit({...response,questionnaire:questionnaire.url??getReferenceString12(questionnaire),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:jsxs118(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&jsx177(Title15,{order:1,fz:"1.625rem",fw:700,lh:1.3,mb:"xl",children:formState.questionnaire.title}),props.afterHeader&&jsxs118(Stack45,{gap:"xl",mb:"xl",children:[props.afterHeader,jsx177(Divider13,{color:"var(--mantine-color-gray-2)"})]}),formState.pagination?jsx177(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:jsx177(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):jsxs118(Fragment65,{children:[jsx177(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&jsxs118(Stack45,{mt:"md",gap:0,children:[jsx177(Text55,{size:"sm",fw:500,children:"Signature"}),jsx177(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&jsx177(Text55,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&jsx177(Group67,{justify:"flex-end",mt:"xl",gap:"xs",children:jsx177(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}import{Fragment as Fragment66,jsx as jsx178,jsxs as jsxs119}from"react/jsx-runtime";var DEFAULT_SILENCE_DEBOUNCE_MS=500,DEFAULT_IDLE_LABEL="Start Dictation to complete this form with your voice",TRANSCRIPT_PLACEHOLDER="Start speaking to see your transcribed words...",VOICE_TRANSCRIPT_EXTENSION_URL="https://medplum.com/ai-voice-transcript",botIdentifier={system:"https://www.medplum.com/bots",value:"ai-realtime-questionnaire"};function getStoredTranscript(response){return response?.extension?.find(e=>e.url===VOICE_TRANSCRIPT_EXTENSION_URL)?.valueString??""}var DEFAULT_INSTRUCTIONS=jsxs119(Stack46,{gap:"xs",children:[jsx178(Text56,{children:"To fill out the form, just speak naturally and the dictation tool will map your spoken answers to the form fields."}),jsx178(Text56,{children:"Pause briefly between thoughts to start processing."})]});function AIRealTimeQuestionnaireForm(props){let{aiModel,onTranscript,voiceInstructions,silenceDebounceMs,...questionnaireFormProps}=props,medplum=useMedplum54(),[questionnaireResponse,setQuestionnaireResponse]=useState99(props.questionnaireResponse),[isProcessing,setIsProcessing]=useState99(!1),[transcript,setTranscript]=useState99(""),[displayTranscript,setDisplayTranscript]=useState99(()=>getStoredTranscript(props.questionnaireResponse)),[expanded,setExpanded]=useState99(!1),[isStopping,setIsStopping]=useState99(!1),[responseVersion,setResponseVersion]=useState99(0),questionnaireRef=useRef21(null),inputRef=useRef21(""),inFlightRef=useRef21(!1),responseRef=useRef21(questionnaireResponse),flushTranscriptRef=useRef21(async()=>{}),transcriptViewportRef=useRef21(null),fullTranscriptRef=useRef21(getStoredTranscript(questionnaireResponse));useEffect38(()=>{responseRef.current=questionnaireResponse},[questionnaireResponse]);let[botAvailability,setBotAvailability]=useState99("loading");useEffect38(()=>{let cancelled=!1;async function checkBotAvailability(){try{let bot=await medplum.searchOne("Bot",{identifier:`${botIdentifier.system??""}|${botIdentifier.value??""}`});cancelled||setBotAvailability(bot?"available":"unavailable")}catch(err){console.error("Error checking bot availability:",err),cancelled||setBotAvailability("unavailable")}}return checkBotAvailability().catch(console.error),()=>{cancelled=!0}},[medplum]);let isProjectVoiceEnabled=medplum.getProject()?.features?.includes("ai-realtime")??!1,isVoiceEnabled=isProjectVoiceEnabled&&botAvailability==="available",idleLabel=DEFAULT_IDLE_LABEL;isProjectVoiceEnabled?botAvailability==="unavailable"&&(idleLabel=jsxs119(Fragment66,{children:["Voice dictation unavailable: bot '",botIdentifier.value??"","' is not deployed",jsx178("br",{}),"Please contact support"]})):idleLabel=jsxs119(Fragment66,{children:["Voice dictation is not enabled for this project",jsx178("br",{}),"Please contact support"]});let{start,stop,status}=useWhisper({model:"gpt-4o-transcribe",onTranscript:text=>{let trimmed=text.trim();if(!trimmed)return;let previous=inputRef.current.trim(),next=previous?`${previous} ${trimmed}`:trimmed;inputRef.current=next,setTranscript(next),onTranscript?.(next,trimmed)}}),statusRef=useRef21(status);useEffect38(()=>{statusRef.current=status},[status]);let processTranscript=useCallback35(async transcript2=>{if(!(!questionnaireRef.current||!transcript2.trim())){setIsProcessing(!0);try{let existingResponse=responseRef.current,parameter=[{name:"questionnaire",valueString:JSON.stringify(questionnaireRef.current)},{name:"transcript",valueString:transcript2}];existingResponse?.item&&existingResponse.item.length>0&&parameter.push({name:"questionnaireResponse",valueString:JSON.stringify(existingResponse)}),aiModel&&parameter.push({name:"model",valueString:aiModel});let responseParam=(await medplum.executeBot(botIdentifier,{resourceType:"Parameters",parameter})).parameter?.find(p=>p.name==="questionnaireResponse");if(responseParam?.valueString)try{let aiQuestionnaireResponse=JSON.parse(responseParam.valueString),preservedExtensions=(aiQuestionnaireResponse.extension??[]).filter(e=>e.url!==VOICE_TRANSCRIPT_EXTENSION_URL);aiQuestionnaireResponse.extension=[...preservedExtensions,{url:VOICE_TRANSCRIPT_EXTENSION_URL,valueString:fullTranscriptRef.current}],responseRef.current=aiQuestionnaireResponse,setQuestionnaireResponse(aiQuestionnaireResponse),setResponseVersion(v=>v+1)}catch(parseError){console.error("Failed to parse bot response as QuestionnaireResponse:",parseError),showNotification13({color:"red",message:`Failed to parse bot response as QuestionnaireResponse: ${normalizeErrorString19(parseError)}`})}}catch(error){console.error("Error processing transcript with AI:",error)}finally{setIsProcessing(!1)}}},[medplum,aiModel]);useEffect38(()=>{flushTranscriptRef.current=async()=>{if(inFlightRef.current)return;let pending=inputRef.current.trim();if(pending){inputRef.current="",setTranscript(""),onTranscript?.("",""),fullTranscriptRef.current=fullTranscriptRef.current?`${fullTranscriptRef.current} ${pending}`:pending,setDisplayTranscript(fullTranscriptRef.current),inFlightRef.current=!0;try{await processTranscript(pending)}finally{inFlightRef.current=!1}inputRef.current.trim()&&statusRef.current!=="speech_started"&&flushTranscriptRef.current().catch(err=>console.error("Error draining transcript:",err))}}},[processTranscript,onTranscript]);let debouncedFlush=useDebouncedCallback4(()=>{statusRef.current!=="speech_started"&&flushTranscriptRef.current().catch(err=>showNotification13({color:"red",message:`Error flushing transcript: ${normalizeErrorString19(err)}`}))},silenceDebounceMs??DEFAULT_SILENCE_DEBOUNCE_MS);useEffect38(()=>{status==="speech_stopped"&&debouncedFlush()},[status,debouncedFlush]),useEffect38(()=>{let viewport=transcriptViewportRef.current;viewport&&viewport.scrollTo({top:viewport.scrollHeight,behavior:"smooth"})},[transcript,displayTranscript]);let isConnecting=status==="requesting_microphone"||status==="connecting"||status==="connected",isRecording=status==="listening"||status==="speech_started"||status==="speech_stopped",handleStartDictation=useCallback35(()=>{setExpanded(!0),start().catch(err=>console.error("Error starting voice input:",err))},[start]),handleStopDictation=useCallback35(()=>{setIsStopping(!0),stop(),debouncedFlush.cancel(),flushTranscriptRef.current().catch(err=>showNotification13({color:"red",message:`Error flushing transcript: ${normalizeErrorString19(err)}`}))},[stop,debouncedFlush]),handleToggleExpanded=useCallback35(()=>{setExpanded(prev=>!prev)},[]),handleClearTranscript=useCallback35(()=>{inputRef.current="",fullTranscriptRef.current="",setTranscript(""),setDisplayTranscript(""),onTranscript?.("","");let existing=responseRef.current;if(existing?.extension?.some(e=>e.url===VOICE_TRANSCRIPT_EXTENSION_URL)){let next={...existing,extension:existing.extension.filter(e=>e.url!==VOICE_TRANSCRIPT_EXTENSION_URL)};responseRef.current=next,setQuestionnaireResponse(next)}},[onTranscript]);useEffect38(()=>{isStopping&&!isConnecting&&!isRecording&&setIsStopping(!1)},[isStopping,isProcessing,isConnecting,isRecording]),useEffect38(()=>{typeof props.questionnaire=="object"&&"resourceType"in props.questionnaire&&(questionnaireRef.current=props.questionnaire)},[props.questionnaire]);let isActive=isRecording&&!isStopping,isButtonLoading=isConnecting||isStopping,showStopButton=isActive&&!isButtonLoading,showButtonLoader=isButtonLoading,dictationLabel="Start Dictation";isStopping?dictationLabel="Stopping\u2026":isConnecting?dictationLabel="Starting\u2026":showStopButton&&(dictationLabel="Stop Dictation");let isFinishing=(isProcessing||isStopping)&&!isRecording&&!isConnecting,activeStatusLabel;isProcessing||isStopping?activeStatusLabel="Processing\u2026":isRecording&&(activeStatusLabel="Listening\u2026");let statusState="idle",statusIcon=jsx178(IconMicrophone,{size:20});isFinishing?(statusState="finishing",statusIcon=jsx178(Loader12,{size:16,color:"blue"})):activeStatusLabel&&(statusState="recording",statusIcon=jsx178(IconCircleFilled,{size:16}));let afterHeader=jsxs119(Box36,{className:AIRealTimeQuestionnaireForm_default.banner,children:[jsxs119(Flex30,{align:"center",justify:"space-between",gap:"sm",p:"md",className:AIRealTimeQuestionnaireForm_default.headerRow,children:[jsxs119("div",{className:AIRealTimeQuestionnaireForm_default.statusRow,"data-state":statusState,children:[jsx178("span",{className:AIRealTimeQuestionnaireForm_default.iconWrapper,"aria-hidden":!0,children:statusIcon}),jsx178("span",{className:AIRealTimeQuestionnaireForm_default.statusLabel,"aria-live":"polite",children:activeStatusLabel?jsx178("span",{className:isFinishing?AIRealTimeQuestionnaireForm_default.statusLabelFinishing:AIRealTimeQuestionnaireForm_default.statusLabelPrimary,children:activeStatusLabel}):idleLabel})]}),jsxs119(Flex30,{align:"center",gap:"xs",children:[jsx178(Button26,{className:clsx_default(AIRealTimeQuestionnaireForm_default.dictationButton,showButtonLoader&&AIRealTimeQuestionnaireForm_default.dictationButtonLoading),variant:showStopButton?"light":"filled",color:showStopButton?"red":"blue",size:"sm",leftSection:showButtonLoader?jsx178(Loader12,{size:14,color:"dimmed"}):void 0,disabled:showButtonLoader||!isVoiceEnabled&&!showStopButton,onClick:showStopButton?handleStopDictation:handleStartDictation,children:dictationLabel}),jsx178(ActionIcon21,{variant:"subtle",color:"gray",size:"lg",radius:"xl","aria-label":expanded?"Collapse transcript":"Expand transcript","aria-expanded":expanded,onClick:handleToggleExpanded,children:expanded?jsx178(IconChevronUp,{size:18}):jsx178(IconChevronDown,{size:18})})]})]}),jsxs119(Collapse2,{in:expanded,children:[jsx178(Box36,{px:"md",children:jsx178(Divider14,{color:"var(--mantine-color-gray-2)"})}),jsx178(Box36,{p:"md",children:jsxs119("div",{className:AIRealTimeQuestionnaireForm_default.panelGrid,children:[jsxs119("div",{className:AIRealTimeQuestionnaireForm_default.panelColumn,children:[jsx178(Text56,{size:"sm",fw:700,children:"How to Use"}),jsx178("div",{className:AIRealTimeQuestionnaireForm_default.instructions,children:voiceInstructions??DEFAULT_INSTRUCTIONS})]}),jsxs119("div",{className:AIRealTimeQuestionnaireForm_default.panelColumn,children:[jsxs119(Flex30,{align:"center",justify:"space-between",gap:"xs",children:[jsx178(Text56,{size:"sm",fw:700,children:"Transcript"}),jsx178(Button26,{variant:"subtle",color:"red",size:"compact-xs",leftSection:jsx178(IconTrash,{size:14}),disabled:!displayTranscript&&!transcript,onClick:handleClearTranscript,children:"Clear"})]}),jsx178("div",{className:AIRealTimeQuestionnaireForm_default.transcriptWrapper,children:jsx178("div",{ref:transcriptViewportRef,className:AIRealTimeQuestionnaireForm_default.transcriptArea,children:jsx178(Text56,{component:"pre",className:AIRealTimeQuestionnaireForm_default.transcriptText,children:(displayTranscript&&transcript?`${displayTranscript} ${transcript}`:displayTranscript||transcript)||TRANSCRIPT_PLACEHOLDER})})})]})]})})]})]});return jsx178(QuestionnaireForm,{...questionnaireFormProps,questionnaireResponse,afterHeader,onChange:response=>{setQuestionnaireResponse(response),props.onChange?.(response)}},responseVersion)}import{Stack as Stack48}from"@mantine/core";import{useResource as useResource17}from"@medplum/react-hooks";import{Stack as Stack47,Text as Text57}from"@mantine/core";import{formatDate as formatDate6}from"@medplum/core";import{useMemo as useMemo41}from"react";import{Fragment as Fragment67,jsx as jsx179,jsxs as jsxs120}from"react/jsx-runtime";function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=useMemo41(()=>answer&&answer.length>0?jsx179(Fragment67,{children:answer.map((ans,index)=>jsx179(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?jsx179(Fragment67,{children:nestedAnswers.map((nestedAnswer,index)=>jsx179(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):jsx179(Text57,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return jsxs120(Stack47,{gap:0,pb:"xs",children:[jsx179(Text57,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return jsx179(Text57,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return jsx179(Text57,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return jsx179(Text57,{children:value});case"valueQuantity":return jsx179(QuantityDisplay,{value});case"valueString":return jsx179(Text57,{children:value});case"valueCoding":return jsx179(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return jsx179(RangeDisplay,{value});case"valueDateTime":return jsx179(Text57,{children:formatDate6(value)});case"valueBoolean":return jsx179(Text57,{children:value?"True":"False"});case"valueReference":return jsx179(Text57,{children:value.display??value.reference});default:return jsx179(Text57,{children:value.toString()})}}import{jsx as jsx180}from"react/jsx-runtime";function QuestionnaireResponseDisplay(props){let questionnaireResponse=useResource17(props.questionnaireResponse);return jsx180(Stack48,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>jsx180(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}import{ActionIcon as ActionIcon22,Divider as Divider15,Group as Group68,NativeSelect as NativeSelect14,Stack as Stack49,Text as Text58,TextInput as TextInput32}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect39,useState as useState100}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx181,jsxs as jsxs121}from"react/jsx-runtime";var intervalFilters=["gender","age","gestationalAge","context","appliesTo","category"],defaultProps={definition:{resourceType:"ObservationDefinition",code:{text:""}},onSubmit:()=>{}};function ReferenceRangeEditor(props){props=Object.assign(defaultProps,props);let defaultDefinition=props.definition,[intervalGroups,setIntervalGroups]=useState100([]),[groupId,setGroupId]=useState100(1),[intervalId,setIntervalId]=useState100(1);return useEffect39(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs121(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx181(Stack49,{children:intervalGroups.map(intervalGroup=>jsx181(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx181(ActionIcon22,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx181(IconCirclePlus,{})}),jsx181(Group68,{justify:"flex-end",children:jsx181(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 jsx181(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs121(Stack49,{gap:"lg",children:[jsx181(Group68,{justify:"flex-end",children:jsx181(ActionIcon22,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx181(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx181(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx181(Divider15,{}),intervalGroup.intervals.map(interval=>jsxs121(Stack49,{gap:"xs",children:[jsxs121(Group68,{children:[jsx181(TextInput32,{"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}`),jsx181(ActionIcon22,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx181(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx181(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx181(ActionIcon22,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx181(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 jsxs121(Stack49,{style:{maxWidth:"50%"},children:[jsx181(Group68,{children:jsx181(NativeSelect14,{data:["","male","female"],label:"Gender:",defaultValue:intervalGroup.filters.gender||"",onChange:e=>{for(let interval of intervalGroup.intervals){let newGender=e.currentTarget.value;newGender===""&&(newGender=void 0),onChange(intervalGroup.id,{...interval,gender:newGender})}}})}),jsxs121(Group68,{gap:"xs",children:[jsx181(Text58,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx181("div",{id:`div-age-${intervalGroup.id}`,children:jsx181(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}`)})]}),jsx181(NativeSelect14,{data:["","pre-puberty","follicular","midcycle","luteal","postmenopausal"],label:"Endocrine:",defaultValue:intervalGroup.filters.context?.text||"",onChange:e=>{for(let interval of intervalGroup.intervals){let newEndocrine=e.currentTarget.value;newEndocrine===""?(newEndocrine=void 0,onChange(intervalGroup.id,{...interval,context:void 0})):onChange(intervalGroup.id,{...interval,context:{text:newEndocrine,coding:[{code:newEndocrine,system:"http://terminology.hl7.org/CodeSystem/referencerange-meaning"}]}})}}}),jsx181(NativeSelect14,{data:["","reference","critical","absolute"],label:"Category: ",defaultValue:intervalGroup.filters.category,onChange:e=>{for(let interval of intervalGroup.intervals){let newCategory=e.currentTarget.value;newCategory===""?onChange(intervalGroup.id,{...interval,category:void 0}):onChange(intervalGroup.id,{...interval,category:newCategory})}}})]})}function ensureQualifiedIntervalKeys(definition,setIntervalId){let intervals=definition.qualifiedInterval||[],nextId3=Math.max(...intervals.map(interval=>{let existingNum=Number.parseInt(interval.id?.substring(3)||"",10);return Number.isNaN(existingNum)?Number.NEGATIVE_INFINITY:existingNum}))+1;return Number.isFinite(nextId3)||(nextId3=1),definition={...definition,qualifiedInterval:intervals.map(interval=>({...interval,id:interval.id||`id-${nextId3++}`}))},setIntervalId(nextId3),definition}function groupQualifiedIntervals(intervals,setGroupId){let groupId=1,groups={};for(let interval of intervals){let groupKey=generateGroupKey(interval);groupKey in groups||(groups[groupKey]={id:`group-id-${groupId++}`,filters:Object.fromEntries(intervalFilters.map(f=>[f,interval[f]])),intervals:[]}),groups[groupKey].intervals.push(interval)}return setGroupId(groupId),Object.values(groups)}function generateGroupKey(interval){return[`gender=${interval.gender}`,`age=${formatRange2(interval.age)}`,`gestationalAge=${formatRange2(interval.gestationalAge)}`,`context=${interval.context?.text}`,`appliesTo=${interval.appliesTo?.map(c=>c.text).join("+")}`,`category=${interval.category}`].join(":")}function getUnitString(unit){return unit&&(getCodeBySystem(unit,"http://unitsofmeasure.org")||unit.text)}function isEmptyInterval(interval){return interval.range?.low?.value===void 0&&interval.range?.high?.value===void 0}import{Button as Button27,Grid,Text as Text59}from"@mantine/core";import{formatDateTime as formatDateTime7,getReferenceString as getReferenceString13}from"@medplum/core";import{useMedplum as useMedplum55,useResource as useResource18}from"@medplum/react-hooks";import{Fragment as Fragment68,useEffect as useEffect40,useState as useState101}from"react";import{jsx as jsx182,jsxs as jsxs122}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum55(),requestGroup=useResource18(props.value),[startedLoading,setStartedLoading]=useState101(!1),[responseBundle,setResponseBundle]=useState101();if(useEffect40(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx182(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 jsxs122(Fragment68,{children:[jsx182(Grid.Col,{span:1,p:"md",children:task?.status==="completed"?jsx182(IconCheckbox,{}):jsx182(IconSquare,{color:"gray"})}),jsxs122(Grid.Col,{span:9,p:"xs",children:[jsx182(Text59,{fw:500,children:action.title}),action.description&&jsx182("div",{children:action.description}),jsxs122("div",{children:["Last edited by\xA0",jsx182(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime7(task?.meta?.lastUpdated)]}),jsxs122("div",{children:["Status: ",jsx182(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs122(Grid.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx182(Button27,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx182(Button27,{onClick:()=>props.onEdit(task,taskInput,taskOutput),children:"Edit"})]})]},`action-${index}`)})});function buildBatchRequest(request){let batchEntries=[];if(request.action)for(let action of request.action)action.resource?.reference&&batchEntries.push({request:{method:"GET",url:action.resource.reference}});return{resourceType:"Bundle",type:"batch",entry:batchEntries}}function findBundleEntry(reference){for(let entry of responseBundle?.entry??[])if(entry.resource&&reference.reference===getReferenceString13(entry.resource))return entry.resource}}import{useMedplum as useMedplum56}from"@medplum/react-hooks";import{useEffect as useEffect41,useState as useState102}from"react";import{stringify as stringify4}from"@medplum/core";function diff(original,revised){let path=buildPath(original,revised);return buildRevisions(path,original,revised)}function buildPath(orig,rev){let N=orig.length,M=rev.length,MAX=N+M+1,size=1+2*MAX,middle=Math.trunc(size/2),diagonal=new Array(size);diagonal[middle+1]={i:0,j:-1,prev:void 0,snake:!0};for(let d=0;d<MAX;d++){for(let k=-d;k<=d;k+=2){let kmiddle=middle+k,kplus=kmiddle+1,kminus=kmiddle-1,kplusNode=diagonal[kplus],kminusNode=diagonal[kminus],prev,i=0;k===-d||k!==d&&kminusNode.i<kplusNode.i?(i=kplusNode.i,prev=kplusNode):(i=kminusNode.i+1,prev=kminusNode),diagonal[kminus]=void 0;let j=i-k,node={i,j,prev:previousSnake(prev),snake:!1};for(;i<N&&j<M&&orig[i]===rev[j];)i++,j++;if(i>node.i&&(node={i,j,prev:node,snake:!0}),diagonal[kmiddle]=node,i>=N&&j>=M)return diagonal[kmiddle]}diagonal[middle+d-1]=void 0}}function buildRevisions(startNode,orig,rev){let deltas=[],path=startNode;for(path.snake&&(path=path.prev);path?.prev&&path.prev.j>=0;){let i=path.i,j=path.j;path=path.prev;let ianchor=path.i,janchor=path.j,original={position:ianchor,lines:orig.slice(ianchor,i)},revised={position:janchor,lines:rev.slice(janchor,j)},type;original.lines.length===0&&revised.lines.length>0?type="insert":original.lines.length>0&&revised.lines.length===0?type="delete":type="change",deltas.push({original,revised,type}),path.snake&&(path=path.prev)}return deltas}function previousSnake(node){return node&&!node.snake&&node.prev?node.prev:node}function blame(history){let versions=(history.entry??[]).filter(entry=>!!entry.resource).map(entry=>({meta:entry.resource?.meta,lines:stringify4(entry.resource,!0).match(/[^\r\n]+/g)})).sort((a,b)=>a.meta.lastUpdated.localeCompare(b.meta.lastUpdated));if(!versions.length)return[];let table=versions[0].lines.map(line=>({id:versions[0].meta.versionId,meta:versions[0].meta,value:line,span:1}));return compareVersions(table,versions),combineSpans(table),table}function compareVersions(table,versions){for(let i=1;i<versions.length;i++){let revisions=diff(versions[i-1].lines,versions[i].lines);for(let revision of revisions){let position=revision.original.position,oldLines=revision.original.lines,newLines=revision.revised.lines;if((revision.type==="delete"||revision.type==="change")&&table.splice(position,oldLines.length),revision.type==="insert"||revision.type==="change")for(let k=0;k<revision.revised.lines.length;k++)table.splice(position+k,0,{id:versions[i].meta.versionId,meta:versions[i].meta,value:newLines[k],span:1})}}}function combineSpans(table){let start=0;for(;start<table.length;){let curr=start;for(;curr<table.length&&table[curr].id===table[start].id;)table[curr].span=-1,curr++;table[start].span=curr-start,start=curr}}var ResourceBlame_default={container:"ResourceBlame_container",root:"ResourceBlame_root",startRow:"ResourceBlame_startRow",normalRow:"ResourceBlame_normalRow",author:"ResourceBlame_author",onBehalfOf:"ResourceBlame_onBehalfOf",dateTime:"ResourceBlame_dateTime",lineNumber:"ResourceBlame_lineNumber",line:"ResourceBlame_line",pre:"ResourceBlame_pre"};function getVersionUrl(resource,versionId){return`/${resource.resourceType}/${resource.id}/_history/${versionId}`}function getTimeString(lastUpdated){let seconds=Math.floor((Date.now()-Date.parse(lastUpdated))/1e3),years=Math.floor(seconds/31536e3);if(years>0)return pluralizeTime(years,"year");let months=Math.floor(seconds/2592e3);if(months>0)return pluralizeTime(months,"month");let days=Math.floor(seconds/86400);if(days>0)return pluralizeTime(days,"day");let hours=Math.floor(seconds/3600);if(hours>0)return pluralizeTime(hours,"hour");let minutes=Math.floor(seconds/60);return minutes>0?pluralizeTime(minutes,"minute"):pluralizeTime(seconds,"second")}function pluralizeTime(count,noun){return`${count} ${count===1?noun:noun+"s"} ago`}import{Fragment as Fragment69,jsx as jsx183,jsxs as jsxs123}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum56(),[value,setValue]=useState102(props.history);if(useEffect41(()=>{!props.history&&props.resourceType&&props.id&&medplum.readHistory(props.resourceType,props.id).then(setValue).catch(console.log)},[medplum,props.history,props.resourceType,props.id]),!value)return jsx183("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx183("div",{className:ResourceBlame_default.container,children:jsx183("table",{className:ResourceBlame_default.root,children:jsx183("tbody",{children:table.map((row,index)=>jsxs123("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs123(Fragment69,{children:[jsxs123("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:[jsx183(ResourceName,{value:row.meta.author,link:!0,fz:"xs"}),row.meta.onBehalfOf&&jsxs123("div",{className:ResourceBlame_default.onBehalfOf,children:["on behalf of ",jsx183(ResourceName,{value:row.meta.onBehalfOf,link:!0,fz:"xs",c:"dimmed"})]})]}),jsx183("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx183(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),fz:"xs",children:getTimeString(row.meta.lastUpdated)})})]}),jsx183("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx183("td",{className:ResourceBlame_default.line,children:jsx183("pre",{className:ResourceBlame_default.pre,children:row.value})})]},"row-"+index))})})})}import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT3}from"@medplum/core";import{useResourceBoard}from"@medplum/react-hooks";import{jsx as jsx184}from"react/jsx-runtime";function ResourceBoard(props){let{search,selectedId,loadItems,resolveSelected,reloadKey,headerText,tabs,activeTab,headerActions,renderItem,emptyList,skeleton,listWidth,renderDetail,emptyDetail,onChange,onSelectFirst,onLoad,onError}=props,{items,total,loading,selected,search:memoizedSearch,refresh}=useResourceBoard({search,selectedId,loadItems,resolveSelected,reloadKey,onLoad,onError}),count=memoizedSearch.count??DEFAULT_SEARCH_COUNT3,offset=memoizedSearch.offset??0,currentPage=Math.floor(offset/count)+1,pageCount=total!==void 0?Math.ceil(total/count):0,selectedKey=selected?.id??selectedId;return jsx184(ListWithDetailPane,{items,loading,selectedKey,renderItem,emptyList,skeleton,listWidth,...tabs?{tabs,activeTab}:{headerText},headerActions,selected,renderDetail,emptyDetail,refresh,onSelectFirst,page:currentPage,pageCount,onPageChange:onChange?page=>{onChange?.({...memoizedSearch,offset:(page-1)*count})}:void 0})}import{stringify as stringify5}from"@medplum/core";var ResourceDiff_default={removed:"ResourceDiff_removed",added:"ResourceDiff_added"};import{Fragment as Fragment70,jsx as jsx185,jsxs as jsxs124}from"react/jsx-runtime";function ResourceDiff(props){let originalResource=props.original,revisedResource=props.revised;props.ignoreMeta&&(originalResource={...originalResource,meta:void 0},revisedResource={...revisedResource,meta:void 0});let original=stringify5(originalResource,!0).match(/[^\r\n]+/g)??["{","}"],revised=stringify5(revisedResource,!0).match(/[^\r\n]+/g)??["{","}"],deltas=diff(original,revised);return jsx185("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx185(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs124(Fragment70,{children:["...",jsx185("br",{}),props.delta.original.lines.length>0&&jsx185("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
`)}),props.delta.revised.lines.length>0&&jsx185("div",{className:ResourceDiff_default.added,children:props.delta.revised.lines.join(`
`)}),"...",jsx185("br",{})]})}import{ActionIcon as ActionIcon23,Alert as Alert7,Button as Button28,Group as Group69,Menu as Menu9,Stack as Stack50,TextInput as TextInput33,useMantineTheme}from"@mantine/core";import{AccessPolicyInteraction as AccessPolicyInteraction2,applyDefaultValuesToResource,canWriteResourceType,isPopulated as isPopulated11,satisfiedAccessPolicy as satisfiedAccessPolicy2,tryGetProfile as tryGetProfile5}from"@medplum/core";import{useMedplum as useMedplum57,useResource as useResource19}from"@medplum/react-hooks";import{useEffect as useEffect42,useMemo as useMemo42,useState as useState103}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx186,jsxs as jsxs125}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum57(),defaultValue2=useResource19(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState103(!1),[value,setValue]=useState103(),accessPolicy=medplum.getAccessPolicy(),theme=useMantineTheme();useEffect42(()=>{if(defaultValue2)if(props.profileUrl){let profileUrl=props.profileUrl;medplum.requestProfileSchema(props.profileUrl,{expandProfile:!0}).then(()=>{let profile=tryGetProfile5(profileUrl);if(profile){setSchemaLoaded(!0);let modifiedDefaultValue=applyDefaultValuesToResource(defaultValue2,profile);setValue(modifiedDefaultValue)}else console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)})}else medplum.requestSchema(resourceType).then(()=>{setValue(defaultValue2),setSchemaLoaded(!0)}).catch(console.log)},[medplum,defaultValue2,resourceType,props.profileUrl]);let accessPolicyResource=useMemo42(()=>defaultValue2&&satisfiedAccessPolicy2(defaultValue2,AccessPolicyInteraction2.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=useMemo42(()=>medplum.isSuperAdmin()||!accessPolicy||!isPopulated11(value?.resourceType)?!0:canWriteResourceType(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?jsx186("div",{children:"Loading..."}):canWrite?jsxs125("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs125(Stack50,{mb:"xl",children:[jsx186(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx186(TextInput33,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx186(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx186(TextInput33,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx186(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:resourceType,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl,accessPolicyResource}),jsxs125(Group69,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx186(Button28,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs125(Menu9,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx186(Menu9.Target,{children:jsx186(ActionIcon23,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx186(IconChevronDown,{size:14,stroke:1.5})})}),jsxs125(Menu9.Dropdown,{children:[props.onPatch&&jsx186(Menu9.Item,{leftSection:jsx186(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx186(Menu9.Item,{color:"red",leftSection:jsx186(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs125(Alert7,{color:"red",title:"Permission denied",icon:jsx186(IconAlertCircle,{}),children:["Your access level prevents you from editing and creating ",value.resourceType," resources."]})}import{Table as Table6}from"@mantine/core";import{formatDateTime as formatDateTime8,normalizeErrorString as normalizeErrorString20}from"@medplum/core";import{useMedplum as useMedplum58}from"@medplum/react-hooks";import{useEffect as useEffect43,useState as useState104}from"react";import{jsx as jsx187,jsxs as jsxs126}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum58(),[value,setValue]=useState104(props.history);return useEffect43(()=>{!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?jsxs126(Table6,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx187(Table6.Thead,{children:jsxs126(Table6.Tr,{children:[jsx187(Table6.Th,{children:"Author"}),jsx187(Table6.Th,{children:"On Behalf Of"}),jsx187(Table6.Th,{children:"Date"}),jsx187(Table6.Th,{children:"Version"})]})}),jsx187(Table6.Tbody,{children:value.entry?.map((entry,index)=>jsx187(HistoryRow,{entry},"entry-"+index))})]}):jsx187("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs126(Table6.Tr,{children:[jsx187(Table6.Td,{children:jsx187(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx187(Table6.Td,{children:resource.meta?.onBehalfOf&&jsx187(ResourceBadge,{value:resource.meta.onBehalfOf,link:!0})}),jsx187(Table6.Td,{children:formatDateTime8(resource.meta?.lastUpdated)}),jsx187(Table6.Td,{children:jsx187(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx187(Table6.Tr,{children:jsx187(Table6.Td,{colSpan:4,children:normalizeErrorString20(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button29,Loader as Loader13,Stack as Stack51,Text as Text60}from"@mantine/core";import{showNotification as showNotification14}from"@mantine/notifications";import{arrayify as arrayify2,getReferenceString as getReferenceString14,isDefined,isReference as isReference5,isResource as isResource3,normalizeErrorString as normalizeErrorString21}from"@medplum/core";import{useMedplum as useMedplum59}from"@medplum/react-hooks";import{useCallback as useCallback36,useEffect as useEffect44,useMemo as useMemo43,useState as useState105}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx188,jsxs as jsxs127}from"react/jsx-runtime";function BaseScheduler(props){let[month,setMonth]=useState105(getStartMonth),[date,setDate]=useState105(),[options,setOptions]=useState105(),[selectedOption,setSelectedOption]=useState105(),{fetchOptions,onSelectOption}=props;useEffect44(()=>{let active=!0;async function doSearch(){let start=getStart2(month),end=getEnd2(month),options2=await fetchOptions({start,end});active&&setOptions(options2)}return doSearch().catch(console.error),()=>{active=!1}},[fetchOptions,month]);let handleSelectOption=useCallback36(option=>{setSelectedOption(option),onSelectOption?.(...option)},[onSelectOption]),filteredOptions=useMemo43(()=>{if(!date||!options)return[];let start=date.getTime(),end=start+1440*60*1e3,seen=new Set;return options.filter(([_,optionDate])=>{let optionTime=optionDate.getTime();return seen.has(optionTime)?!1:(seen.add(optionTime),start<=optionTime&&optionTime<end)})},[date,options]);return options?jsxs127("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs127("div",{className:Scheduler_default.info,children:[props.actor&&jsx188(ResourceAvatar,{value:props.actor,size:"xl"}),props.actor&&jsx188(Text60,{size:"xl",fw:500,children:jsx188(ResourceName,{value:props.actor})}),jsx188("p",{children:"1 hour"}),date&&jsx188("p",{children:date.toLocaleDateString()}),selectedOption&&jsx188("p",{children:formatTime(selectedOption[1])})]}),jsxs127("div",{className:Scheduler_default.selection,children:[!date&&jsxs127("div",{children:[jsx188("h3",{children:"Select date"}),jsx188(CalendarDateInput,{availableDates:options.map(opt=>opt[1]),onChangeMonth:setMonth,onClick:setDate})]}),date&&!selectedOption&&jsxs127("div",{children:[jsx188("h3",{children:"Select time"}),jsx188(Stack51,{children:filteredOptions.map(option=>jsx188("div",{children:jsx188(Button29,{variant:"outline",style:{width:150},onClick:()=>handleSelectOption(option),children:formatTime(option[1])})},option[1].toISOString()))})]}),props.children]})]}):jsx188("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:jsx188(Loader13,{})})}function onlyPractitioner(schedule){let refs=schedule.actor.filter(ref=>isReference5(ref,"Practitioner"));if(refs.length===1)return refs[0]}function Scheduler(props){let medplum=useMedplum59(),{fetchSlots,schedule}=props,[actor,setActor]=useState105(),fetchOptions=useCallback36(async period=>{if(fetchSlots)return(await fetchSlots(period)).map(slot=>[slot,new Date(slot.start)]);let scheduleRefs=arrayify2(schedule??[]).map(getReferenceString14).filter(isDefined),slotSearchParams=new URLSearchParams([["_count","720"],["schedule",scheduleRefs.join(",")],["start","gt"+period.start],["start","lt"+period.end]]);return(await medplum.searchResources("Slot",slotSearchParams)).map(slot=>[slot,new Date(slot.start)])},[medplum,fetchSlots,schedule]);return useEffect44(()=>{let schedules=arrayify2(props.schedule);if(schedules?.length!==1)return;let schedule2=schedules[0];isResource3(schedule2)?setActor(onlyPractitioner(schedule2)):medplum.readReference(schedule2).then(schedule3=>{setActor(onlyPractitioner(schedule3))}).catch(error=>{showNotification14({color:"red",title:"Error",message:normalizeErrorString21(error)})})},[medplum,props.schedule]),jsx188(BaseScheduler,{fetchOptions,onSelectOption:props.onSelectSlot,actor,children:props.children})}function getStart2(month){return formatSlotInstant(month.getTime())}function getEnd2(month){return formatSlotInstant(month.getTime()+744*60*60*1e3)}function formatSlotInstant(time){let date=new Date(Math.max(Date.now(),time));return date.setHours(0,0,0,0),date.toISOString()}function formatTime(date){return date.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})}import{useEffect as useEffect45}from"react";import{useLocation}from"react-router";function ScrollToTop(){let{pathname}=useLocation();return useEffect45(()=>{window.scrollTo(0,0)},[pathname]),null}import{createReference as createReference20}from"@medplum/core";import{jsx as jsx189}from"react/jsx-runtime";function ServiceRequestTimeline(props){let{serviceRequest,...rest}=props;return jsx189(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:[createReference20(resource)],subject:resource.subject,sender:createReference20(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference20(resource)],subject:resource.subject,operator:createReference20(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor15}from"@mantine/core";import{showNotification as showNotification15}from"@mantine/notifications";import{ensureTrailingSlash,normalizeErrorString as normalizeErrorString22}from"@medplum/core";import{useMedplum as useMedplum60,useResource as useResource20}from"@medplum/react-hooks";import{jsx as jsx190}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum60(),{client,patient,encounter,children,...rest}=props,patientResource=useResource20(patient),encounterResource=useResource20(encounter);function launchApp(){let patientRef=patient,encounterRef=encounter;if(client.launchIdentifierSystems?.length){let patientIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Patient");if(patientRef&&patientResource&&patientIdentifierConfig?.system){let identifier=patientResource.identifier?.find(i=>i.system===patientIdentifierConfig.system);identifier&&(patientRef={...patient,identifier})}let encounterIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Encounter");if(encounterRef&&encounterResource&&encounterIdentifierConfig?.system){let identifier=encounterResource.identifier?.find(i=>i.system===encounterIdentifierConfig.system);identifier&&(encounterRef={...encounter,identifier})}}medplum.createResource({resourceType:"SmartAppLaunch",patient:patientRef,encounter:encounterRef,fhirContext:props.fhirContext}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",ensureTrailingSlash(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),window.open(url.toString(),"_blank")}).catch(err=>showNotification15({color:"red",message:normalizeErrorString22(err),autoClose:!1}))}return jsx190(Anchor15,{onClick:()=>launchApp(),...rest,children})}export{AIRealTimeQuestionnaireForm,AddressDisplay,AddressInput,AllergiesSection,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,BaseScheduler,CalendarDateInput,CalendarInput,ChangePasswordForm,ChatModal,CheckboxFormSection,ChooseScopeForm,CodeInput,CodeableConceptDisplay,CodeableConceptInput,CodingDisplay,CodingInput,ContactDetailDisplay,ContactDetailInput,ContactPointDisplay,ContactPointInput,Container,DateTimeInput,DefaultResourceItemComponent,DefaultResourceTimeline,DemographicsSection,DescriptionList,DescriptionListEntry,DiagnosticReportDisplay,Document,ElementDefinitionInputSelector,ElementDefinitionTypeInput,EncounterTimeline,ErrorBoundary,FhirPathTable,Form,FormSection,GoalsSection,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,ImmunizationsSection,InfoBar,InsuranceSection,LabsSection,LinkTabs,ListWithDetailPane,Loading,Logo,MeasureReportDisplay,MedicationsSection,MedplumLink,MemoizedFhirPathTable,MfaEnrollForm,MfaForm,MfaVerificationForm,Modal3 as Modal,MoneyDisplay,MoneyInput,MultiResourceInput,Navbar,NewTopicDialog,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,Panel,ParticipantFilter,PasswordInput,PatientAccountsForm,PatientExportForm,PatientHeader,PatientSummary,PatientTimeline,Pharmacies,PharmaciesSection,PharmacyDialog,PlanDefinitionBuilder,ProblemListSection,QrCodeScanner,QuantityDisplay,QuantityInput,QuestionnaireBuilder,QuestionnaireForm,QuestionnaireResponseDisplay,RangeDisplay,RangeInput,RatioInput,ReferenceDisplay,ReferenceInput,ReferenceRangeEditor,ReferenceRangeGroupEditor,RegisterForm,RequestGroupDisplay,ResetPasswordForm,ResourceArrayDisplay,ResourceArrayInput,ResourceAvatar,ResourceBadge,ResourceBlame,ResourceBoard,ResourceDiff,ResourceDiffTable,ResourceForm,ResourceHistoryTable,ResourceInput,ResourceName,ResourcePropertyDisplay,ResourcePropertyInput,ResourceTable,ResourceTimeline,Scheduler,ScrollToTop,SearchChangeEvent,SearchClickEvent,SearchControl,SearchFieldEditor,SearchFilterEditor,SearchLoadEvent,ServiceRequestTimeline,SetPasswordForm,SexualOrientationSection,SignInForm,SignatureInput,SmartAppLaunchLink,SmokingStatusSection,Spotlight,StatusBadge,SubmitButton,ThreadChat,ThreadInbox,Timeline,TimelineItem,TimingInput,UnavailableNote,ValueSetAutocomplete,VitalsSection,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNext24HoursFilter,addNextMonthFilter,addPreferredPharmacyToPatient,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,buildSearchParamFieldLabel,clearFilters,clearFiltersOnField,codingToValueSetElement,compareByLastUpdatedDescending,convertIsoToLocal,convertLocalToIso,createLabsSection,createPharmaciesSection,createPreferredPharmacyExtension,createScriptTag,deleteFilter,exportJsonFile,getAppName,getDefaultSections,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getOpString,getPaginationControlProps,getPreferredPharmaciesFromPatient,getRecaptcha,getSearchOperators,getSortField,getValuePath,initRecaptcha,isAddPharmacyResponse,isAuxClick,isCheckboxCell,isMetaSearchParam,isOrganizationArray,isSortDescending,isSupportedProfileStructureDefinition,killEvent,parseForm,removePreferredPharmacyFromPatient,renderValue,sendCommand,setFilters,setOffset,setPage,setPropertyValue,setSort,sortByDateAndPriority,summaryResourceListSection,toggleSort,valueSetElementToCoding};
/*! Bundled license information:

@tabler/icons-react/dist/esm/defaultAttributes.mjs:
@tabler/icons-react/dist/esm/createReactComponent.mjs:
@tabler/icons-react/dist/esm/icons/IconAdjustmentsHorizontal.mjs:
@tabler/icons-react/dist/esm/icons/IconAlertCircle.mjs:
@tabler/icons-react/dist/esm/icons/IconArrowDown.mjs:
@tabler/icons-react/dist/esm/icons/IconArrowRight.mjs:
@tabler/icons-react/dist/esm/icons/IconArrowUp.mjs:
@tabler/icons-react/dist/esm/icons/IconBinaryTree.mjs:
@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs:
@tabler/icons-react/dist/esm/icons/IconBleach.mjs:
@tabler/icons-react/dist/esm/icons/IconBookmark.mjs:
@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs:
@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs:
@tabler/icons-react/dist/esm/icons/IconBriefcase.mjs:
@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs:
@tabler/icons-react/dist/esm/icons/IconBucket.mjs:
@tabler/icons-react/dist/esm/icons/IconCake.mjs:
@tabler/icons-react/dist/esm/icons/IconCalendar.mjs:
@tabler/icons-react/dist/esm/icons/IconCheck.mjs:
@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs:
@tabler/icons-react/dist/esm/icons/IconChevronDown.mjs:
@tabler/icons-react/dist/esm/icons/IconChevronRight.mjs:
@tabler/icons-react/dist/esm/icons/IconChevronUp.mjs:
@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs:
@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs:
@tabler/icons-react/dist/esm/icons/IconCloudUpload.mjs:
@tabler/icons-react/dist/esm/icons/IconColumns.mjs:
@tabler/icons-react/dist/esm/icons/IconCopy.mjs:
@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs:
@tabler/icons-react/dist/esm/icons/IconDeviceDesktop.mjs:
@tabler/icons-react/dist/esm/icons/IconDots.mjs:
@tabler/icons-react/dist/esm/icons/IconDownload.mjs:
@tabler/icons-react/dist/esm/icons/IconEdit.mjs:
@tabler/icons-react/dist/esm/icons/IconEmpathize.mjs:
@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs:
@tabler/icons-react/dist/esm/icons/IconEqual.mjs:
@tabler/icons-react/dist/esm/icons/IconEyeOff.mjs:
@tabler/icons-react/dist/esm/icons/IconEye.mjs:
@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs:
@tabler/icons-react/dist/esm/icons/IconFileExport.mjs:
@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs:
@tabler/icons-react/dist/esm/icons/IconFileText.mjs:
@tabler/icons-react/dist/esm/icons/IconFilter.mjs:
@tabler/icons-react/dist/esm/icons/IconInfoCircle.mjs:
@tabler/icons-react/dist/esm/icons/IconLanguage.mjs:
@tabler/icons-react/dist/esm/icons/IconLayoutSidebar.mjs:
@tabler/icons-react/dist/esm/icons/IconLogout.mjs:
@tabler/icons-react/dist/esm/icons/IconMapPin.mjs:
@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs:
@tabler/icons-react/dist/esm/icons/IconMathLower.mjs:
@tabler/icons-react/dist/esm/icons/IconMessageCircle.mjs:
@tabler/icons-react/dist/esm/icons/IconMessage.mjs:
@tabler/icons-react/dist/esm/icons/IconMicrophone.mjs:
@tabler/icons-react/dist/esm/icons/IconMinus.mjs:
@tabler/icons-react/dist/esm/icons/IconMoon.mjs:
@tabler/icons-react/dist/esm/icons/IconPalette.mjs:
@tabler/icons-react/dist/esm/icons/IconPaperclip.mjs:
@tabler/icons-react/dist/esm/icons/IconPencil.mjs:
@tabler/icons-react/dist/esm/icons/IconPlus.mjs:
@tabler/icons-react/dist/esm/icons/IconRefresh.mjs:
@tabler/icons-react/dist/esm/icons/IconSearch.mjs:
@tabler/icons-react/dist/esm/icons/IconSettings.mjs:
@tabler/icons-react/dist/esm/icons/IconSortAscending.mjs:
@tabler/icons-react/dist/esm/icons/IconSortDescending.mjs:
@tabler/icons-react/dist/esm/icons/IconSquare.mjs:
@tabler/icons-react/dist/esm/icons/IconStethoscope.mjs:
@tabler/icons-react/dist/esm/icons/IconSunHigh.mjs:
@tabler/icons-react/dist/esm/icons/IconSwitchHorizontal.mjs:
@tabler/icons-react/dist/esm/icons/IconTableExport.mjs:
@tabler/icons-react/dist/esm/icons/IconTable.mjs:
@tabler/icons-react/dist/esm/icons/IconTrash.mjs:
@tabler/icons-react/dist/esm/icons/IconUsers.mjs:
@tabler/icons-react/dist/esm/icons/IconX.mjs:
@tabler/icons-react/dist/esm/icons/IconCircleFilled.mjs:
@tabler/icons-react/dist/esm/tabler-icons-react.mjs:
  (**
   * @license @tabler/icons-react v3.46.0 - MIT
   *
   * This source code is licensed under the MIT license.
   * See the LICENSE file in the root directory of this source tree.
   *)

signature_pad/dist/signature_pad.js:
  (*!
   * Signature Pad v5.1.4 | https://github.com/szimek/signature_pad
   * (c) 2026 Szymon Nowak | Released under the MIT license
   *)
*/
//# sourceMappingURL=index.mjs.map