@medplum/react 5.1.26 → 5.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/dist/cjs/index.cjs +12 -11
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/cjs/index.css +1 -1
- package/dist/cjs/index.css.map +4 -4
- package/dist/cjs/index.d.ts +292 -70
- package/dist/esm/index.css +1 -1
- package/dist/esm/index.css.map +4 -4
- package/dist/esm/index.d.ts +292 -70
- package/dist/esm/index.mjs +12 -11
- package/dist/esm/index.mjs.map +4 -4
- package/package.json +19 -32
package/dist/esm/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__reExport=(target,mod,secondTarget)=>(__copyProps(target,mod,"default"),secondTarget&&__copyProps(secondTarget,mod,"default"));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 useState11}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:"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",__iconNode42);var __iconNode43=[["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",__iconNode43);var __iconNode44=[["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",__iconNode44);var __iconNode45=[["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",__iconNode45);var __iconNode46=[["path",{d:"M5 18l14 -6l-14 -6",key:"svg-0"}]],IconMathGreater=createReactComponent("outline","math-greater","MathGreater",__iconNode46);var __iconNode47=[["path",{d:"M19 18l-14 -6l14 -6",key:"svg-0"}]],IconMathLower=createReactComponent("outline","math-lower","MathLower",__iconNode47);var __iconNode48=[["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",__iconNode48);var __iconNode49=[["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",__iconNode49);var __iconNode50=[["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",__iconNode50);var __iconNode51=[["path",{d:"M5 12l14 0",key:"svg-0"}]],IconMinus=createReactComponent("outline","minus","Minus",__iconNode51);var __iconNode52=[["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",__iconNode52);var __iconNode53=[["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",__iconNode53);var __iconNode54=[["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",__iconNode54);var __iconNode55=[["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",__iconNode55);var __iconNode56=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]],IconPlus=createReactComponent("outline","plus","Plus",__iconNode56);var __iconNode57=[["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",__iconNode57);var __iconNode58=[["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",__iconNode58);var __iconNode59=[["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",__iconNode59);var __iconNode60=[["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",__iconNode60);var __iconNode61=[["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",__iconNode61);var __iconNode62=[["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",__iconNode62);var __iconNode63=[["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",__iconNode63);var __iconNode64=[["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",__iconNode64);var __iconNode65=[["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",__iconNode65);var __iconNode66=[["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",__iconNode66);var __iconNode67=[["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",__iconNode67);var __iconNode68=[["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",__iconNode68);var __iconNode69=[["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",__iconNode69);var __iconNode70=[["path",{d:"M18 6l-12 12",key:"svg-0"}],["path",{d:"M6 6l12 12",key:"svg-1"}]],IconX=createReactComponent("outline","x","X",__iconNode70);var __iconNode71=[["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",__iconNode71);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",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",c:"dimmed",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)?`{
|
|
1
|
+
var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__reExport=(target,mod,secondTarget)=>(__copyProps(target,mod,"default"),secondTarget&&__copyProps(secondTarget,mod,"default"));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)?`{
|
|
2
2
|
Patients1: PatientList(_id: ${escaped}, _count: 1) {
|
|
3
3
|
resourceType
|
|
4
4
|
id
|
|
@@ -61,7 +61,7 @@ var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDe
|
|
|
61
61
|
display
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
-
}`.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 Box5,Divider as Divider2,AppShell as MantineAppShell2,Menu as Menu3,ScrollArea,Stack as Stack4,Text as Text8,Tooltip,UnstyledButton as UnstyledButton2}from"@mantine/core";import{spotlight}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 Fragment4,useState as useState10}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 useState8}from"react";import{useState as useState7}from"react";import{Group as Group8,Text as Text6}from"@mantine/core";import{useMedplum as useMedplum4}from"@medplum/react-hooks";import{forwardRef as forwardRef3,useCallback as useCallback3}from"react";import{jsx as jsx17,jsxs as jsxs9}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,...rest}=props,loadValues=useCallback3(async(input,signal)=>{if(!binding)return[];let valueSetElements=(await medplum.valueSetExpand({count:10,...expandParams,url:binding,filter:input},{signal})).expansion?.contains??[],newData=[];for(let valueSetElement of valueSetElements)valueSetElement.code&&!newData.some(item=>item.code===valueSetElement.code)&&newData.push(valueSetElement);return newData},[medplum,expandParams,binding]);return jsx17(AsyncAutocomplete,{...rest,creatable:creatable??!0,clearable:clearable??!0,toOption:toOption2,loadOptions:loadValues,onCreate:createValue,itemComponent:withHelpText?ItemComponent2:void 0})}var ItemComponent2=forwardRef3(({label,resource,active,...others},ref)=>jsx17("div",{ref,...others,children:jsxs9(Group8,{wrap:"nowrap",gap:"xs",children:[active&&jsx17(IconCheck,{size:12}),jsxs9("div",{children:[jsx17(Text6,{children:label}),jsx17(Text6,{size:"xs",c:"dimmed",children:`${resource.system}#${resource.code}`})]})]})}));import{jsx as jsx18}from"react/jsx-runtime";function CodeInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,...rest}=props,[value,setValue]=useState7(defaultValue2);function handleChange(newValues){let newValue=newValues[0],newCode=valueSetElementToCode(newValue);setValue(newCode),onChange&&onChange(newCode)}return jsx18(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 jsx19}from"react/jsx-runtime";function ResourceTypeInput(props){let[resourceType,setResourceType]=useState8(props.defaultValue),onChange=props.onChange,setResourceTypeWrapper=useCallback4(newResourceType=>{setResourceType(newResourceType),onChange&&onChange(newResourceType)},[onChange]);return jsx19(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{Kbd,Stack as Stack3,Text as Text7}from"@mantine/core";import{useDebouncedCallback}from"@mantine/hooks";import{Spotlight as MantineSpotlight}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 useState9}from"react";var Spotlight_default={actionSection:"Spotlight_actionSection",action:"Spotlight_action",actionDescription:"Spotlight_actionDescription",actionsGroup:"Spotlight_actionsGroup",actionsList:"Spotlight_actionsList",content:"Spotlight_content"};import{jsx as jsx20,jsxs as jsxs10}from"react/jsx-runtime";var DEBOUNCE_MS=200;function KeyboardHint(){return jsxs10(Stack3,{gap:"xs",py:"lg",children:[jsxs10(Text7,{size:"sm",c:"dimmed",children:["Press ",jsx20(Kbd,{children:"\u2318"})," + ",jsx20(Kbd,{children:"K"})," to open Search next time."]}),jsxs10(Text7,{size:"sm",c:"dimmed",children:["(",jsx20(Kbd,{children:"Ctrl"})," + ",jsx20(Kbd,{children:"K"})," on Windows)"]})]})}function Spotlight({patientsOnly}){let medplum=useMedplum5(),navigate=useMedplumNavigate3(),[nothingFoundMessage,setNothingFoundMessage]=useState9(jsx20(KeyboardHint,{})),[actions,setActions]=useState9([]),debouncedSearch=useDebouncedCallback(query=>{let graphqlQuery=buildGraphQLQuery2(query);patientsOnly?medplum.graphql(graphqlQuery).then(response=>{let patients=getResourcesFromResponse2(response).filter(r2=>r2.resourceType==="Patient");setActions(patientsToActions(patients,navigate))}).catch(console.error).finally(()=>setNothingFoundMessage("No results found")):Promise.all([medplum.graphql(graphqlQuery),medplum.valueSetExpand({url:"https://medplum.com/fhir/ValueSet/resource-types",filter:query,count:5})]).then(([graphqlResponse,valueSetResult])=>{let resources=getResourcesFromResponse2(graphqlResponse),resourceTypes=valueSetResult.expansion?.contains??[];setActions(resourcesToActions(resources,resourceTypes,navigate))}).catch(console.error).finally(()=>setNothingFoundMessage("No results found"))},DEBOUNCE_MS),handleQueryChange=query=>{if(!query){debouncedSearch.cancel(),setNothingFoundMessage(jsx20(KeyboardHint,{})),setActions([]);return}setNothingFoundMessage("Searching..."),debouncedSearch(query)};return jsx20(MantineSpotlight,{actions,nothingFound:nothingFoundMessage,radius:"md",highlightQuery:!0,searchProps:{leftSection:jsx20(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)"}}},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},onQueryChange:handleQueryChange})}function buildGraphQLQuery2(input){let escaped=JSON.stringify(input);return isUUID2(input)?`{
|
|
64
|
+
}`.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}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{Kbd,Stack as Stack3,Text as Text8}from"@mantine/core";import{useDebouncedCallback}from"@mantine/hooks";import{Spotlight as MantineSpotlight}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"};import{jsx as jsx21,jsxs as jsxs11}from"react/jsx-runtime";var DEBOUNCE_MS=200;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}){let medplum=useMedplum5(),navigate=useMedplumNavigate3(),[nothingFoundMessage,setNothingFoundMessage]=useState10(jsx21(KeyboardHint,{})),[actions,setActions]=useState10([]),debouncedSearch=useDebouncedCallback(query=>{let graphqlQuery=buildGraphQLQuery2(query);patientsOnly?medplum.graphql(graphqlQuery).then(response=>{let patients=getResourcesFromResponse2(response).filter(r2=>r2.resourceType==="Patient");setActions(patientsToActions(patients,navigate))}).catch(console.error).finally(()=>setNothingFoundMessage("No results found")):Promise.all([medplum.graphql(graphqlQuery),medplum.valueSetExpand({url:"https://medplum.com/fhir/ValueSet/resource-types",filter:query,count:5})]).then(([graphqlResponse,valueSetResult])=>{let resources=getResourcesFromResponse2(graphqlResponse),resourceTypes=valueSetResult.expansion?.contains??[];setActions(resourcesToActions(resources,resourceTypes,navigate))}).catch(console.error).finally(()=>setNothingFoundMessage("No results found"))},DEBOUNCE_MS),handleQueryChange=query=>{if(!query){debouncedSearch.cancel(),setNothingFoundMessage(jsx21(KeyboardHint,{})),setActions([]);return}setNothingFoundMessage("Searching..."),debouncedSearch(query)};return jsx21(MantineSpotlight,{actions,nothingFound:nothingFoundMessage,radius:"md",highlightQuery:!0,searchProps:{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)"}}},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},onQueryChange:handleQueryChange})}function buildGraphQLQuery2(input){let escaped=JSON.stringify(input);return isUUID2(input)?`{
|
|
65
65
|
Patients1: PatientList(_id: ${escaped}, _count: 1) {
|
|
66
66
|
resourceType
|
|
67
67
|
id
|
|
@@ -99,16 +99,16 @@ var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDe
|
|
|
99
99
|
identifier { system value }
|
|
100
100
|
subject { display }
|
|
101
101
|
}
|
|
102
|
-
}`.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 patientsToActions(patients,navigate){let patientActions=patients.filter(p=>!!p.id).map(patient=>({id:patient.id,label:patient.name?formatHumanName4(patient.name[0]):patient.id,description:patient.birthDate,leftSection:jsx20(ResourceAvatar,{value:patient,radius:"xl",size:24}),onClick:()=>navigate(`/Patient/${patient.id}`)}));return patientActions.length>0?[{group:"Patients",actions:patientActions}]:[]}function resourcesToActions(resources,resourceTypes,navigate){let result=[],resourceTypeActions=resourceTypes.map(rt=>({id:`resource-type-${rt.code}`,label:rt.display??rt.code??"",description:"Resource Type",onClick:()=>navigate(`/${rt.code}`)}));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({id:resource.id,label:resource.name?formatHumanName4(resource.name[0]):resource.id,description:resource.birthDate,leftSection:jsx20(ResourceAvatar,{value:resource,radius:"xl",size:24}),onClick:()=>navigate(`/Patient/${resource.id}`)}):resource.resourceType==="ServiceRequest"&&resource.id&&serviceRequestActions.push({id:resource.id,label:resource.id,description:resource.subject?.display,onClick:()=>navigate(`/ServiceRequest/${resource.id}`)});return patientActions.length>0&&result.push({group:"Patients",actions:patientActions}),serviceRequestActions.length>0&&result.push({group:"Service Requests",actions:serviceRequestActions}),result}import{Fragment as Fragment5,jsx as jsx21,jsxs as jsxs11}from"react/jsx-runtime";function Navbar(props){let medplum=useMedplum6(),navigate=useMedplumNavigate4(),profile=useMedplumProfile3(),activeLink=getActiveLink(props.pathname,props.searchParams,props.menus),[userMenuOpened,setUserMenuOpened]=useState10(!1),[bookmarkDialogVisible,setBookmarkDialogVisible]=useState10(!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 jsxs11(Fragment5,{children:[jsxs11(MantineAppShell2.Navbar,{id:"navbar",className:Navbar_default.navbar,children:[props.logo&&jsx21(MantineAppShell2.Section,{px:"xs",pt:"xs",pb:"4px",children:jsx21(UnstyledButton2,{className:Navbar_default.logoButton,onClick:props.navbarToggle,"aria-expanded":opened,"aria-controls":"navbar","aria-label":"Medplum Logo",children:props.logo})}),jsx21(ScrollArea,{px:"xs",pb:"xs",pt:"sm",h:"100%",children:jsxs11(MantineAppShell2.Section,{grow:!0,children:[props.spotlightEnabled&&jsx21(Box5,{mb:2,children:jsx21(Tooltip,{label:"Search",position:"right",transitionProps:{duration:0},disabled:opened,children:jsxs11(UnstyledButton2,{className:Navbar_default.link,onClick:()=>spotlight.open(),"aria-label":"Search",children:[jsx21(IconSearch,{size:"1.2rem"}),jsx21("span",{className:Navbar_default.linkLabel,"data-opened":opened||void 0,children:"Search"})]})})}),props.spotlightEnabled&&jsx21(Spotlight,{patientsOnly:props.patientsOnly}),!props.resourceTypeSearchDisabled&&jsx21(MantineAppShell2.Section,{mb:"sm",children:jsx21(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",maxValues:0,onChange:newValue=>navigateResourceType(newValue)},window.location.pathname)}),props.menus?.map((menu,index)=>jsxs11(Fragment4,{children:[menu.title&&jsx21(Text8,{className:Navbar_default.menuTitle,"data-opened":opened||void 0,children:menu.title}),jsx21(Stack4,{gap:"2",children:menu.links?.map(link=>link.notificationCount?jsx21(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):jsx21(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&&jsx21(Tooltip,{label:"Add Bookmark",position:"right",transitionProps:{duration:0},disabled:opened,children:jsxs11(UnstyledButton2,{className:`${Navbar_default.link} ${Navbar_default.addBookmarkLink}`,onClick:()=>setBookmarkDialogVisible(!0),children:[jsx21(IconCirclePlus,{}),jsx21("span",{className:Navbar_default.linkLabel,"data-opened":opened||void 0,children:"Add Bookmark"})]})})]})}),props.userMenuEnabled&&jsxs11(MantineAppShell2.Section,{px:"xs",py:"xs",children:[jsx21(Tooltip,{label:opened?"Close Sidebar":"Open Sidebar",position:"right",transitionProps:{duration:0},children:jsx21(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:jsx21(IconLayoutSidebar,{})})}),jsx21(Divider2,{my:"xs",className:Navbar_default.divider}),jsxs11(Menu3,{width:260,shadow:"md",radius:"md",position:"top-start",transitionProps:{transition:"fade-up"},opened:userMenuOpened,onClose:()=>setUserMenuOpened(!1),children:[jsx21(Menu3.Target,{children:jsxs11(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:[jsx21(ResourceAvatar,{value:profile,radius:"xl",size:24}),jsxs11("span",{className:Navbar_default.userLinkLabel,"data-opened":opened||void 0,children:[jsx21(Text8,{span:!0,inherit:!0,truncate:!0,children:formatHumanName5(profile?.name?.[0])}),projectDisplay&&jsx21(Text8,{span:!0,inherit:!0,fz:"xs",c:"dimmed",truncate:!0,title:projectDisplay,children:projectDisplay})]})]})}),jsx21(Menu3.Dropdown,{className:HeaderDropdown_default.dropdown,children:jsx21(HeaderDropdown,{version:props.version,showLayoutVersionToggle:props.showLayoutVersionToggle})})]})]})]}),props.pathname&&props.searchParams&&jsx21(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??jsx21(IconBookmark,{}),showDot=showCount&&alert&&!opened;function handleDismiss(e){e.preventDefault(),e.stopPropagation(),onDismiss?.()}return jsx21(Tooltip,{label,position:"right",transitionProps:{duration:0},disabled:opened,children:jsxs11(MedplumLink,{to,onClick,className:Navbar_default.link,"data-active":active||void 0,children:[jsxs11("span",{className:Navbar_default.iconWrapper,children:[iconElement,showDot&&jsx21("span",{className:Navbar_default.alertDot})]}),jsx21("span",{className:Navbar_default.linkLabel,"data-opened":opened||void 0,children:label}),showCount&&jsx21("span",{className:Navbar_default.linkCount,"data-opened":opened||void 0,"data-alert":alert||void 0,children:count.toLocaleString()}),onDismiss&&opened&&jsx21(Tooltip,{label:"Dismiss",openDelay:500,children:jsx21(UnstyledButton2,{"aria-label":"Dismiss",className:Navbar_default.dismissButton,onClick:handleDismiss,children:jsx21(IconX,{size:14})})})]})})}function NavbarLinkWithSubscription(props){let count=useNotificationCount(props.notificationCount);return jsx21(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)&¤tSearchParams.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 jsx22,jsxs as jsxs12}from"react/jsx-runtime";var OPEN_WIDTH=250,CLOSED_WIDTH=59,HEADER_HEIGHT=60,ANNOUNCEMENT_HEIGHT=36;function AppShell(props){let[navbarOpen,setNavbarOpen]=useState11(localStorage.navbarOpen==="true"),[layoutVersion]=useState11(props.layoutVersion??localStorage.appShellLayoutVersion??"v1"),medplum=useMedplum7(),profile=useMedplumProfile4(),[dismissedAnnouncementIds,setDismissedAnnouncementIds]=useState11(()=>{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 jsx22(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?jsx22(MantineAppShell3.Header,{style:{zIndex:101},children:jsx22(AnnouncementBanners,{announcements:visibleAnnouncements,onDismiss:dismissAnnouncement})}):void 0,navbarComponent=profile?jsx22(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,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&&jsx22(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?jsx22(Navbar,{pathname:props.pathname,searchParams:props.searchParams,menus:props.menus,navbarToggle:toggleNavbar,closeNavbar,displayAddBookmark:props.displayAddBookmark,resourceTypeSearchDisabled:props.resourceTypeSearchDisabled,patientsOnly:props.spotlightPatientsOnly}):void 0),jsxs12(MantineAppShell3,{header:headerProp,navbar:navbarProp,padding:0,children:[headerComponent,navbarComponent,jsx22(MantineAppShell3.Main,{className:AppShell_default.main,children:jsx22(ErrorBoundary,{children:jsx22(Suspense,{fallback:jsx22(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 useState12}from"react";import{Fragment as Fragment6,jsx as jsx23,jsxs as jsxs13}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]=useState12(!1),iframeRef=useRef2(null),[validationResult,setValidationResult]=useState12(),[validating,setValidating]=useState12(!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?jsxs13("div",{"data-testid":"ccda-iframe",style:{maxWidth:props.maxWidth},children:[jsx23("div",{style:{minHeight:400},children:jsx23("iframe",{title:"C-CDA Viewer",width:"100%",height:"400",ref:iframeRef,src:CCDA_VIEWER_URL,allowFullScreen:!0,frameBorder:0,seamless:!0,onLoad:()=>setShouldSend(!0)})}),jsxs13("div",{style:{marginTop:"10px",marginBottom:"10px",display:"flex",alignItems:"center"},children:[jsx23(Button2,{type:"button",onClick:validateCcda,disabled:validating,children:validating?"Validating...":"Validate"}),validationResult&&jsxs13(Fragment6,{children:[jsxs13("div",{style:{marginLeft:"15px"},children:[jsx23("strong",{children:"Validation Results:"})," ",getErrorCount()," errors found"]}),jsx23(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 useState13}from"react";import{jsx as jsx24}from"react/jsx-runtime";function ScannedImage(props){let{maxRetries=5,...rest}=props,[attempt,setAttempt]=useState13(0),[status,setStatus]=useState13("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"?jsx24("div",{className:"image-placeholder",children:"Image unavailable"}):status==="backoff"?jsx24(Loader3,{}):jsx24("img",{onLoad:()=>setStatus("loaded"),onError:handleError,...rest})}import{jsx as jsx25,jsxs as jsxs14}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 jsxs14("div",{"data-testid":"attachment-display",children:[contentType?.startsWith("image/")&&jsx25(ScannedImage,{"data-testid":"attachment-image",style:{maxWidth:props.maxWidth},src:url,alt:title}),contentType?.startsWith("video/")&&jsx25("video",{"data-testid":"attachment-video",style:{maxWidth:props.maxWidth},controls:!0,children:jsx25("source",{type:contentType,src:url})}),(contentType?.startsWith("text/")||contentType==="application/json"||contentType==="application/pdf")&&jsx25("div",{"data-testid":"attachment-iframe",style:{maxWidth:props.maxWidth,minHeight:400},children:jsx25("iframe",{title:"Attachment",width:"100%",height:"400",src:url+"#navpanes=0",allowFullScreen:!0,frameBorder:0,seamless:!0})}),contentType===ContentType2.CDA_XML&&jsx25(CcdaDisplay,{url}),jsx25("div",{"data-testid":"download-link",style:{padding:"2px 16px 16px 16px"},children:jsx25(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 Fragment7,jsx as jsx26,jsxs as jsxs15}from"react/jsx-runtime";function DescriptionList(props){let{children,compact}=props;return jsx26("dl",{className:clsx_default(DescriptionList_default.root,{[DescriptionList_default.compact]:compact}),children})}function DescriptionListEntry(props){return jsxs15(Fragment7,{children:[jsx26("dt",{children:props.term}),jsx26("dd",{children:props.children})]})}import{Fragment as Fragment8,jsx as jsx27}from"react/jsx-runtime";function AttachmentArrayDisplay(props){let attachmentElements=props.values?.map((v,index)=>jsx27("div",{children:jsx27(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=jsx27(DescriptionListEntry,{term:getPathDisplayName(key),children:attachmentElements})}else content=jsx27(Fragment8,{children:attachmentElements});return content}import{ActionIcon}from"@mantine/core";import{useState as useState14}from"react";import{normalizeOperationOutcome}from"@medplum/core";import{useMedplum as useMedplum8}from"@medplum/react-hooks";import{useRef as useRef4}from"react";import{Fragment as Fragment9,jsx as jsx28,jsxs as jsxs16}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 jsxs16(Fragment9,{children:[jsx28("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 jsx29,jsxs as jsxs17}from"react/jsx-runtime";function AttachmentArrayInput(props){let[values,setValues]=useState14(props.defaultValue??[]);function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}return jsxs17("table",{style:{width:"100%"},children:[jsxs17("colgroup",{children:[jsx29("col",{width:"97%"}),jsx29("col",{width:"3%"})]}),jsxs17("tbody",{children:[values.map((v,index)=>jsxs17("tr",{children:[jsx29("td",{children:jsx29(AttachmentDisplay,{value:v,maxWidth:200})}),jsx29("td",{children:jsx29(ActionIcon,{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:jsx29(IconCircleMinus,{})})})]},`${index}-${values.length}`)),jsxs17("tr",{children:[jsx29("td",{}),jsx29("td",{children:jsx29(AttachmentButton,{disabled:props.disabled,onUpload:attachment=>{setValuesWrapper([...values,attachment])},children:props2=>jsx29(ActionIcon,{...props2,title:"Add",variant:"subtle",size:"sm",color:props2.disabled?"gray":"green",children:jsx29(IconCloudUpload,{})})})})]})]})]})}import{Button as Button3}from"@mantine/core";import{useState as useState15}from"react";import{Fragment as Fragment10,jsx as jsx30,jsxs as jsxs18}from"react/jsx-runtime";function AttachmentInput(props){let[value,setValue]=useState15(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return value?jsxs18(Fragment10,{children:[jsx30(AttachmentDisplay,{value,maxWidth:200}),jsx30(Button3,{disabled:props.disabled,onClick:e=>{killEvent(e),setValueWrapper(void 0)},children:"Remove"})]}):jsx30(AttachmentButton,{disabled:props.disabled,securityContext:props.securityContext,onUpload:setValueWrapper,children:props2=>jsx30(Button3,{...props2,children:"Upload..."})})}import{Button as Button4,Flex as Flex2,Group as Group9,PasswordInput,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 useState16}from"react";import{Container as MantineContainer}from"@mantine/core";var Container_default={root:"Container_root"};import{jsx as jsx31}from"react/jsx-runtime";function Container(props){let{children,...others}=props;return jsx31(MantineContainer,{className:Container_default.root,...others,children})}import{Paper}from"@mantine/core";var Panel_default={paper:"Panel_paper",fill:"Panel_fill"};import{jsx as jsx32}from"react/jsx-runtime";function Panel(props){let{width,fill,className,children,...rest}=props,style=width?{maxWidth:width}:void 0;return jsx32(Paper,{className:clsx_default(Panel_default.paper,fill&&Panel_default.fill,className),style,shadow:"sm",radius:"sm",withBorder:!0,...rest,children})}import{jsx as jsx33}from"react/jsx-runtime";function Document(props){let{children,...others}=props;return jsx33(Container,{children:jsx33(Panel,{...others,children})})}import{jsx as jsx34,jsxs as jsxs19}from"react/jsx-runtime";function Logo(props){let overrideUrl=import.meta.env.MEDPLUM_LOGO_URL;return overrideUrl?jsx34("img",{src:overrideUrl,alt:"Logo",style:{maxHeight:props.size}}):jsxs19("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 180 180",style:{width:props.size,height:props.size},children:[jsx34("title",{children:"Medplum Logo"}),jsx34("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"})]})}function getErrorsForInput(outcome,expression){return outcome?.issue?.filter(issue=>isExpressionMatch(issue.expression?.[0],expression))?.map(issue=>issue.details?.text)?.join(`
|
|
103
|
-
`)}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 jsx35,jsxs as jsxs20}from"react/jsx-runtime";function ChangePasswordForm(props){let{onSuccess}=props,medplum=useMedplum9(),[outcome,setOutcome]=useState16(),[success,setSuccess]=useState16(!1);return jsx35(Document,{width:450,children:jsxs20(Form,{onSubmit:formData=>{setOutcome(void 0),medplum.post("auth/changepassword",formData).then(()=>{setSuccess(!0),onSuccess?.()}).catch(err=>setOutcome(normalizeOperationOutcome2(err)))},children:[jsxs20(Flex2,{direction:"column",align:"center",justify:"center",children:[jsx35(Logo,{size:32}),jsx35(Title,{children:"Change password"})]}),!success&&jsxs20(Stack5,{gap:"xl",mt:"xl",children:[jsx35(PasswordInput,{name:"oldPassword",label:"Old password",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"oldPassword")}),jsx35(PasswordInput,{name:"newPassword",label:"New password",required:!0,error:getErrorsForInput(outcome,"newPassword")}),jsx35(PasswordInput,{name:"confirmPassword",label:"Confirm new password",required:!0,error:getErrorsForInput(outcome,"confirmPassword")}),jsx35(Group9,{justify:"flex-end",mt:"xl",wrap:"nowrap",children:jsx35(Button4,{type:"submit",children:"Change password"})})]}),success&&jsx35("div",{"data-testid":"success",children:"Password changed successfully"})]})})}import{Checkbox,Flex as Flex3,Group as Group10,Stack as Stack6,Title as Title2}from"@mantine/core";import{useMedplum as useMedplum10}from"@medplum/react-hooks";import{Fragment as Fragment11}from"react/jsx-runtime";import{jsx as jsx36,jsxs as jsxs21}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 jsx36(Form,{onSubmit:formData=>{medplum.post("auth/scope",{login:props.login,scope:Object.keys(formData).join(" ")}).then(props.handleAuthResponse).catch(console.log)},children:jsxs21(Stack6,{children:[jsxs21(Flex3,{direction:"column",align:"center",justify:"center",children:[props.logo??jsx36(Logo,{size:32}),jsx36(Title2,{order:3,py:"lg",children:props.title??"Choose scope"}),props.children]}),jsx36(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]),jsxs21(Fragment11,{children:[jsx36(Checkbox,{id:scopeName,name:scopeName,label:scopeName,defaultChecked:!0},scopeName),additionalScopes?.map(scope=>jsx36(Checkbox,{id:scope,name:scope,label:scope},scope))]},scopeName+"_group")})}),jsx36(Group10,{justify:"flex-end",mt:"xl",children:jsx36(SubmitButton,{fullWidth:!0,children:props.submitLabel??"Set Scope"})})]})})}import{Button as Button5,Center as Center3,Stack as Stack8,Text as Text10,Title as Title4}from"@mantine/core";import{useState as useState18}from"react";import{Alert as Alert2,Center as Center2,Image as Image2,Stack as Stack7,Text as Text9,TextInput as TextInput4,Title as Title3}from"@mantine/core";import{normalizeErrorString as normalizeErrorString4}from"@medplum/core";import{useState as useState17}from"react";import{jsx as jsx37,jsxs as jsxs22}from"react/jsx-runtime";function MfaForm(props){let[errorMessage,setErrorMessage]=useState17();return jsxs22(Form,{onSubmit:formData=>{setErrorMessage(void 0),props.onSubmit(formData)?.catch(err=>setErrorMessage(normalizeErrorString4(err)))},children:[jsxs22(Center2,{style:{flexDirection:"column"},children:[jsx37(Logo,{size:32}),jsx37(Title3,{order:3,py:"lg",children:props.title}),!props.qrCodeUrl&&props.description&&jsx37(Text9,{c:"dimmed",mb:"lg",mt:"-lg",ta:"center",children:props.description})]}),errorMessage&&jsx37(Alert2,{icon:jsx37(IconAlertCircle,{size:16}),title:"Error",color:"red",mb:"lg",children:errorMessage}),props.qrCodeUrl&&jsx37(Center2,{children:jsxs22(Stack7,{mb:"xl",justify:"center",children:[props.description&&jsx37(Text9,{c:"dimmed",mb:"md",mt:"-lg",ta:"center",children:props.description}),jsx37(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))"}})]})}),jsx37(Stack7,{gap:"sm",children:jsx37(TextInput4,{name:"token",label:"MFA code",autoComplete:"one-time-code",required:!0,autoFocus:!0})}),jsxs22(Stack7,{gap:"xs",pt:"md",children:[jsx37(SubmitButton,{fullWidth:!0,children:props.buttonText}),props.footer]})]})}import{jsx as jsx38,jsxs as jsxs23}from"react/jsx-runtime";function MfaEnrollForm(props){let{allowedMethods,qrCodeUrl,onEnrollEmail,onEnrollTotp}=props,[selected,setSelected]=useState18(),emailAllowed=allowedMethods.includes("email"),totpAllowed=allowedMethods.includes("totp");return emailAllowed&&totpAllowed&&!selected?jsxs23(Center3,{style:{flexDirection:"column"},children:[jsx38(Logo,{size:32}),jsx38(Title4,{order:3,py:"lg",ta:"center",children:"Set up multi-factor authentication"}),jsxs23(Stack8,{w:"100%",children:[jsx38(Text10,{c:"dimmed",ta:"center",children:"Choose how you want to verify your identity when you sign in."}),jsx38(Button5,{fullWidth:!0,onClick:()=>setSelected("totp"),children:"Use an authenticator app (recommended)"}),jsx38(Button5,{fullWidth:!0,variant:"default",onClick:onEnrollEmail,children:"Continue with email-based MFA"})]})]}):emailAllowed&&!totpAllowed?jsxs23(Center3,{style:{flexDirection:"column"},children:[jsx38(Logo,{size:32}),jsx38(Title4,{order:3,py:"lg",children:"Set up email-based MFA"}),jsxs23(Stack8,{w:"100%",children:[jsx38(Text10,{c:"dimmed",ta:"center",children:"When you sign in, we'll email you a verification code to confirm your identity."}),jsx38(Button5,{fullWidth:!0,onClick:onEnrollEmail,children:"Enable email-based MFA"})]})]}):jsx38(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 normalizeErrorString5}from"@medplum/core";import{useState as useState19}from"react";import{Fragment as Fragment12,jsx as jsx39,jsxs as jsxs24}from"react/jsx-runtime";function MfaVerificationForm(props){let{methods,email,onRequestEmailCode,onSubmit}=props,[emailMode,setEmailMode]=useState19(!!props.initialEmailMode),requestEmailCode=()=>{Promise.resolve(onRequestEmailCode()).then(()=>setEmailMode(!0)).catch(err=>showNotification3({color:"red",message:normalizeErrorString5(err)}))},footer;return emailMode?footer=jsx39(Anchor3,{component:"button",type:"button",size:"sm",ta:"center",onClick:requestEmailCode,children:"Resend code"}):methods.includes("email")&&(footer=jsx39(Anchor3,{component:"button",type:"button",size:"sm",ta:"center",onClick:requestEmailCode,children:"Get a code by email instead"})),jsx39(MfaForm,{title:emailMode?"Enter verification code":"Enter MFA code",description:emailMode?jsxs24(Fragment12,{children:["Enter the 6-digit code we emailed",email?" to ":"",email&&jsx39("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 useState23}from"react";import{Alert as Alert3}from"@mantine/core";import{operationOutcomeIssueToString}from"@medplum/core";import{jsx as jsx40}from"react/jsx-runtime";function OperationOutcomeAlert(props){let{outcome,issues:issuesProp,...spacingProps}=props,issues=outcome?.issue||issuesProp;return!issues||issues.length===0?null:jsx40(Alert3,{icon:jsx40(IconAlertCircle,{size:16}),color:"red",...spacingProps,children:issues.map(issue=>jsx40("div",{"data-testid":"text-field-error",children:operationOutcomeIssueToString(issue)},issue.details?.text))})}import{Anchor as Anchor4,Flex as Flex4,Stack as Stack9,Text as Text11,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 useState20}from"react";import{jsx as jsx41,jsxs as jsxs25}from"react/jsx-runtime";function NewProjectForm(props){let medplum=useMedplum11(),[outcome,setOutcome]=useState20(),issues=getIssuesForExpression(outcome,void 0);return jsxs25(Form,{onSubmit:async formData=>{try{props.handleAuthResponse(await medplum.startNewProject({login:props.login,projectName:formData.projectName}))}catch(err){setOutcome(normalizeOperationOutcome3(err))}},children:[jsxs25(Flex4,{direction:"column",align:"center",justify:"center",children:[jsx41(Logo,{size:32}),jsx41(Title5,{order:3,py:"lg",children:"Create a new project"})]}),jsx41(OperationOutcomeAlert,{issues,mb:"lg"}),jsx41(Stack9,{gap:"sm",children:jsx41(TextInput5,{name:"projectName",label:"Project Name",placeholder:"My Project",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"projectName")})}),jsxs25(Stack9,{gap:"xs",mt:"md",children:[jsx41(SubmitButton,{fullWidth:!0,children:"Create Project"}),jsxs25(Text11,{c:"dimmed",size:"xs",pt:"lg",ta:"center",children:['By clicking "Create Project" you agree to the Medplum'," ",jsx41(Anchor4,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx41(Anchor4,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]})]})]})}import{Anchor as Anchor5,Box as Box7,Checkbox as Checkbox2,Divider as Divider3,Flex as Flex5,PasswordInput as PasswordInput2,Stack as Stack10,Text as Text12,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 useState22}from"react";import{Box as Box6}from"@mantine/core";import{useEffect as useEffect4,useRef as useRef5,useState as useState21}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 jsx42}from"react/jsx-runtime";function GoogleButton(props){let{googleClientId,handleGoogleCredential}=props,parentRef=useRef5(null),[scriptLoaded,setScriptLoaded]=useState21(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?jsx42(Box6,{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 Fragment13,jsx as jsx43,jsxs as jsxs26}from"react/jsx-runtime";function NewUserForm(props){let googleClientId=getGoogleClientId(props.googleClientId),recaptchaSiteKey=props.recaptchaSiteKey,medplum=useMedplum12(),[outcome,setOutcome]=useState22(),issues=getIssuesForExpression(outcome,void 0);return useEffect5(()=>{recaptchaSiteKey&&initRecaptcha(recaptchaSiteKey)},[recaptchaSiteKey]),jsxs26(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:[jsx43(Flex5,{direction:"column",align:"center",justify:"center",children:props.children}),jsx43(OperationOutcomeAlert,{issues,mb:"lg"}),googleClientId&&jsxs26(Fragment13,{children:[jsx43(Box7,{style:{minHeight:40},children:jsx43(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))}}})}),jsx43(Divider3,{label:"or",labelPosition:"center",my:"lg"})]}),jsxs26(Stack10,{gap:"sm",children:[jsx43(TextInput6,{name:"firstName",type:"text",label:"First name",placeholder:"First name",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"firstName")}),jsx43(TextInput6,{name:"lastName",type:"text",label:"Last name",placeholder:"Last name",required:!0,error:getErrorsForInput(outcome,"lastName")}),jsx43(TextInput6,{name:"email",type:"email",label:"Email",placeholder:"name@domain.com",required:!0,error:getErrorsForInput(outcome,"email")}),jsx43(PasswordInput2,{name:"password",label:"Password",autoComplete:"off",required:!0,error:getErrorsForInput(outcome,"password")})]}),jsxs26(Stack10,{gap:"xs",children:[jsx43(Checkbox2,{id:"remember",name:"remember",label:"Remember me",size:"xs",style:{lineHeight:1},pt:"md",pb:"xs"}),jsx43(SubmitButton,{fullWidth:!0,children:"Register Account"}),jsxs26(Text12,{c:"dimmed",size:"xs",pt:"lg",ta:"center",children:['By clicking "Register Account" you agree to the Medplum'," ",jsx43(Anchor5,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx43(Anchor5,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]}),jsxs26(Text12,{c:"dimmed",size:"xs",ta:"center",children:["This site is protected by reCAPTCHA and the Google"," ",jsx43(Anchor5,{href:"https://policies.google.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx43(Anchor5,{href:"https://policies.google.com/terms",children:"Terms\xA0of\xA0Service"})," apply."]})]})]})}import{jsx as jsx44,jsxs as jsxs27}from"react/jsx-runtime";function RegisterForm(props){let{type,projectId,clientId,googleClientId,recaptchaSiteKey,onSuccess}=props,medplum=useMedplum13(),[login,setLogin]=useState23(props.login),[outcome,setOutcome]=useState23(),[emailVerificationRequired,setEmailVerificationRequired]=useState23(!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 jsxs27(Document,{width:400,px:"xl",py:"xl",bdrs:"md",children:[jsx44(OperationOutcomeAlert,{issues,mb:"lg"}),!login&&jsx44(NewUserForm,{projectId,clientId,googleClientId,recaptchaSiteKey,handleAuthResponse,children:props.children}),emailVerificationRequired&&jsx44("div",{children:"Please check your email for a verification link. Click the link to continue setting up your account."}),login&&!emailVerificationRequired&&type==="project"&&jsx44(NewProjectForm,{login,handleAuthResponse})]})}import{Anchor as Anchor6,Flex as Flex6,Stack as Stack11,Text as Text13,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 useState24}from"react";import{Fragment as Fragment14,jsx as jsx45,jsxs as jsxs28}from"react/jsx-runtime";function ResetPasswordForm(props){let{projectId,recaptchaSiteKey,onSuccess,onSignIn,onRegister}=props,medplum=useMedplum14(),[outcome,setOutcome]=useState24(),[success,setSuccess]=useState24(!1);return useEffect7(()=>{recaptchaSiteKey&&initRecaptcha(recaptchaSiteKey)},[recaptchaSiteKey]),jsx45(Document,{width:400,px:"xl",py:"xl",bdrs:"md",children:jsxs28(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:[jsxs28(Flex6,{direction:"column",align:"center",justify:"center",children:[jsx45(Logo,{size:32}),jsx45(Title6,{order:3,py:"lg",children:"Reset your password"})]}),jsx45(OperationOutcomeAlert,{issues:getIssuesForExpression(outcome,void 0),mb:"lg"}),!success&&jsxs28(Fragment14,{children:[jsx45(Stack11,{gap:"sm",mb:"md",children:jsx45(TextInput7,{name:"email",type:"email",label:"Email",placeholder:"name@domain.com",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"email")})}),jsxs28(Stack11,{gap:"xs",children:[jsx45(SubmitButton,{fullWidth:!0,children:"Reset Password"}),onSignIn&&jsx45(Text13,{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:jsx45(Anchor6,{onClick:onSignIn,children:"Back to Sign In"})}),onRegister&&jsxs28(Text13,{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? ",jsx45(Anchor6,{onClick:onRegister,children:"Sign Up"})]})]})]}),success&&jsx45(Text13,{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 Group11,PasswordInput as PasswordInput3,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 useState25}from"react";import{jsx as jsx46,jsxs as jsxs29}from"react/jsx-runtime";function SetPasswordForm(props){let{id,secret,onSuccess,onSignIn}=props,medplum=useMedplum15(),[outcome,setOutcome]=useState25(),[success,setSuccess]=useState25(!1),issues=getIssuesForExpression(outcome,void 0);return jsxs29(Document,{width:450,children:[jsx46(OperationOutcomeAlert,{issues}),jsxs29(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:[jsxs29(Flex7,{direction:"column",align:"center",justify:"center",children:[jsx46(Logo,{size:32}),jsx46(Title7,{children:"Set password"})]}),!success&&jsxs29(Stack12,{children:[jsx46(PasswordInput3,{name:"password",label:"New password",required:!0,error:getErrorsForInput(outcome,"password")}),jsx46(PasswordInput3,{name:"confirmPassword",label:"Confirm new password",required:!0,error:getErrorsForInput(outcome,"confirmPassword")}),jsx46(Group11,{justify:"flex-end",mt:"xl",children:jsx46(Button6,{type:"submit",children:"Set password"})})]}),success&&jsxs29("div",{"data-testid":"success",children:["Password set. You can now\xA0",onSignIn?jsx46(Anchor7,{component:"button",type:"button",onClick:onSignIn,children:"sign in"}):"sign in","."]})]})]})}import{showNotification as showNotification4}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString6}from"@medplum/core";import{useMedplum as useMedplum18}from"@medplum/react-hooks";import{useCallback as useCallback6,useEffect as useEffect8,useRef as useRef6,useState as useState28}from"react";import{ActionIcon as ActionIcon2,Anchor as Anchor8,Box as Box8,Checkbox as Checkbox3,Divider as Divider4,Flex as Flex8,PasswordInput as PasswordInput4,Stack as Stack13,Text as Text14,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 useState26}from"react";import{Fragment as Fragment15,jsx as jsx47,jsxs as jsxs30}from"react/jsx-runtime";function AuthenticationForm(props){let[email,setEmail]=useState26();return email?jsx47(PasswordForm,{email,resetEmail:()=>setEmail(void 0),...props}):jsx47(EmailForm,{setEmail,...props})}function EmailForm(props){let{setEmail,onRegister,handleAuthResponse,children,disableEmailAuth,...baseLoginRequest}=props,medplum=useMedplum16(),googleClientId=!props.disableGoogleAuth&&getGoogleClientId(props.googleClientId),[outcome,setOutcome]=useState26(),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 jsxs30(Form,{onSubmit:handleSubmit,children:[jsx47(Flex8,{direction:"column",align:"center",justify:"center",children}),jsx47(OperationOutcomeAlert,{issues,mb:"lg"}),googleClientId&&jsxs30(Fragment15,{children:[jsx47(Box8,{style:{minHeight:40},children:jsx47(GoogleButton,{googleClientId,handleGoogleCredential})}),!disableEmailAuth&&jsx47(Divider4,{label:"or",labelPosition:"center",my:"lg"})]}),!disableEmailAuth&&jsx47(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"}),jsxs30(Stack13,{gap:"xs",children:[!disableEmailAuth&&jsx47(SubmitButton,{fullWidth:!0,children:"Continue"}),onRegister&&jsxs30(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:["Don\u2019t have an account? ",jsx47(Anchor8,{onClick:onRegister,children:"Register"})]})]})]})}function PasswordForm(props){let{onForgotPassword,handleAuthResponse,children,...baseLoginRequest}=props,medplum=useMedplum16(),[outcome,setOutcome]=useState26(),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 jsxs30(Form,{onSubmit:handleSubmit,children:[jsx47(Flex8,{direction:"column",align:"center",justify:"center",children}),jsx47(OperationOutcomeAlert,{issues,mb:"lg"}),jsxs30(Stack13,{gap:"sm",children:[jsx47(TextInput8,{label:"Email",value:props.email,disabled:!0,rightSectionWidth:36,rightSection:jsx47(ActionIcon2,{variant:"subtle",color:"gray",onClick:props.resetEmail,"aria-label":"Change email",children:jsx47(IconPencil,{size:"1rem",stroke:1.5})})}),jsx47(PasswordInput4,{name:"password",label:"Password",autoComplete:"off",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"password"),"data-testid":"auth.password"})]}),jsxs30(Stack13,{gap:"xs",children:[jsx47(Checkbox3,{id:"remember",name:"remember",label:"Remember me",size:"xs",style:{lineHeight:1},pt:"md",pb:"xs"}),jsx47(SubmitButton,{children:"Sign In"}),onForgotPassword&&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(Anchor8,{onClick:onForgotPassword,children:"Reset Password"})})]})]})}import{Anchor as Anchor9,Combobox as Combobox2,Flex as Flex9,Stack as Stack14,Text as Text15,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 useState27}from"react";import{jsx as jsx48,jsxs as jsxs31}from"react/jsx-runtime";function ChooseProfileForm(props){let medplum=useMedplum17(),combobox=useCombobox2(),[search,setSearch]=useState27(""),[outcome,setOutcome]=useState27();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=>jsx48(Combobox2.Option,{value:item.id,className:ProjectLoginOption_default.interactive,children:jsx48(ProjectMembershipLoginOption,{membership:item,label:getMembershipLabel(item)})},item.id));return jsxs31(Stack14,{gap:"0",children:[jsxs31(Flex9,{justify:"center",align:"center",direction:"column",wrap:"nowrap",children:[jsx48(Logo,{size:32}),jsx48(Title8,{order:3,py:"lg",children:"Choose a Project"})]}),jsx48(OperationOutcomeAlert,{outcome,mb:"lg"}),jsxs31(Combobox2,{store:combobox,onOptionSubmit:handleValueSelect,children:[jsx48(Combobox2.EventsTarget,{children:jsx48(TextInput9,{placeholder:"Search",value:search,mb:"md",autoFocus:!0,leftSection:jsx48(IconSearch,{size:16}),onChange:event=>{setSearch(event.currentTarget.value),combobox.updateSelectedOptionIndex()}})}),jsx48("div",{children:jsx48(Combobox2.Options,{style:{marginLeft:"-10px",marginRight:"-10px",marginBottom:"-10px"},children:options.length>0?options:jsx48(Combobox2.Empty,{children:"Nothing found..."})})})]}),jsx48(Text15,{size:"sm",ta:"center",mt:"md",children:jsx48(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 jsx49}from"react/jsx-runtime";function SignInForm(props){let{login:loginCode,chooseScopes,chooseScopeFormProps,onSuccess,onForgotPassword,onRegister,onCode,...baseLoginRequest}=props,medplum=useMedplum18(),[login,setLogin]=useState28(),loginRequested=useRef6(!1),[mfaEnrollRequired,setMfaEnrollRequired]=useState28(!1),[enrollQrCode,setEnrollQrCode]=useState28(),[enrollMethods,setEnrollMethods]=useState28(),[mfaRequired,setMfaRequired]=useState28(!1),[mfaMethods,setMfaMethods]=useState28(),[mfaEmail,setMfaEmail]=useState28(),[mfaEmailMode,setMfaEmailMode]=useState28(!1),[memberships,setMemberships]=useState28(),handleCode=useCallback6(code=>{onCode?onCode(code):medplum.processCode(code).then(()=>{onSuccess&&onSuccess()}).catch(err=>showNotification4({color:"red",message:normalizeErrorString6(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:normalizeErrorString6(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:normalizeErrorString6(err)})))},[medplum,loginCode,loginRequested,login,handleAuthResponse]),jsx49(Document,{width:400,px:"xl",py:"xl",bdrs:"md",children:login?mfaEnrollRequired?jsx49(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?jsx49(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"?jsx49(NewProjectForm,{login,handleAuthResponse}):memberships?jsx49(ChooseProfileForm,{login,memberships,handleAuthResponse}):props.chooseScopes?jsx49(ChooseScopeForm,{login,scope:props.scope,handleAuthResponse:handleScopeResponse,...chooseScopeFormProps}):jsx49("div",{children:"Success"}):jsx49(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 ActionIcon3,CopyButton,Flex as Flex10,Tooltip as Tooltip2}from"@mantine/core";import{formatDateTime,formatPeriod,formatTiming,formatWallTime,isEmpty,isObject,isString,PropertyType}from"@medplum/core";import{useState as useState31}from"react";import{formatCodeableConcept}from"@medplum/core";import{Fragment as Fragment16,jsx as jsx50}from"react/jsx-runtime";function CodeableConceptDisplay(props){return jsx50(Fragment16,{children:formatCodeableConcept(props.value)})}import{formatCoding}from"@medplum/core";import{Fragment as Fragment17,jsx as jsx51}from"react/jsx-runtime";function CodingDisplay(props){return jsx51(Fragment17,{children:formatCoding(props.value,props.includeCode)})}import{Fragment as Fragment18,jsx as jsx52}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("]")),jsx52(Fragment18,{children:builder.join("").trim()})}import{Fragment as Fragment19,jsx as jsx53,jsxs as jsxs32}from"react/jsx-runtime";function ContactDetailDisplay(props){let contactDetail=props.value;return contactDetail?jsxs32(Fragment19,{children:[contactDetail.name,contactDetail.name&&": ",contactDetail.telecom?.map(telecom=>jsx53(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 useState29}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 jsx54}from"react/jsx-runtime";function ExtensionDisplay(props){let{elementDefinitionType}=props,medplum=useMedplum19(),ctx=useContext3(ElementsContext),[typeSchema,setTypeSchema]=useState29(getDataType("Extension")),profileUrl=useMemo3(()=>{if(isPopulated3(elementDefinitionType?.profile))return elementDefinitionType.profile[0]},[elementDefinitionType]),[loadingProfile,setLoadingProfile]=useState29(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 jsx54("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 jsx54(ResourcePropertyDisplay,{propertyType,value:propertyValue})}return jsx54(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 Fragment20,jsx as jsx55}from"react/jsx-runtime";function HumanNameDisplay(props){let name=props.value;return name?jsx55(Fragment20,{children:formatHumanName6(name,props.options)}):null}import{jsxs as jsxs33}from"react/jsx-runtime";function IdentifierDisplay(props){return jsxs33("div",{children:[props.value?.system,": ",props.value?.value]})}import{formatMoney}from"@medplum/core";import{Fragment as Fragment21,jsx as jsx56}from"react/jsx-runtime";function MoneyDisplay(props){return jsx56(Fragment21,{children:formatMoney(props.value)})}import{formatQuantity}from"@medplum/core";import{Fragment as Fragment22,jsx as jsx57}from"react/jsx-runtime";function QuantityDisplay(props){return jsx57(Fragment22,{children:formatQuantity(props.value,props.precision)})}import{formatRange}from"@medplum/core";import{Fragment as Fragment23,jsx as jsx58}from"react/jsx-runtime";function RangeDisplay(props){return jsx58(Fragment23,{children:formatRange(props.value,props.precision,props.exclusive)})}import{Fragment as Fragment24,jsx as jsx59,jsxs as jsxs34}from"react/jsx-runtime";function RatioDisplay(props){let value=props.value;return value?jsxs34(Fragment24,{children:[jsx59(QuantityDisplay,{value:value.numerator,precision:props.precision}),"\xA0/\xA0",jsx59(QuantityDisplay,{value:value.denominator,precision:props.precision})]}):null}import{stringify}from"@medplum/core";import{Fragment as Fragment25,jsx as jsx60}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?jsx60(MedplumLink,{to:props.value,children:displayString}):jsx60(Fragment25,{children:displayString})}import{Group as Group12,Text as Text16}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 useState30}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 jsx61}from"react/jsx-runtime";function maybeWrapWithContext(ContextProvider,contextValue,contents){return contextValue!==void 0?jsx61(ContextProvider,{value:contextValue,children:contents}):contents}import{Fragment as Fragment26,jsx as jsx62}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,jsx62(Fragment26,{children:props.value.map((value,valueIndex)=>jsx62("div",{children:jsx62(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 Fragment27,jsx as jsx63,jsxs as jsxs35}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]=useState30(!0),[slices,setSlices]=useState30([]),[slicedValues,setSlicedValues]=useState30(()=>[values]),[valuesLength,setValuesLength]=useState30(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 jsx63("div",{children:"Loading..."});let nonSliceContent;if(property.type[0]?.code!=="Extension"){let nonSliceValues=slicedValues[slices.length],nonSliceElements=nonSliceValues.map((value,valueIndex)=>jsx63("div",{children:jsx63(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=jsx63(DescriptionListEntry,{term:getPathDisplayName2(key),children:nonSliceElements})}else nonSliceContent=jsx63(Fragment27,{children:nonSliceElements})}return jsxs35(Fragment27,{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=jsx63(SliceDisplay,{path:props.path,slice,property,value:slicedValues[sliceIndex],ignoreMissingValues:props.ignoreMissingValues,link:props.link},slice.name);return props.includeDescriptionListEntry&&(sliceDisplay=jsx63(DescriptionListEntry,{term:getPathDisplayName2(slice.name),children:sliceDisplay},slice.name)),sliceDisplay}),nonSliceContent,valuesLength>MAX_ARRAY_SIZE&&jsx63(Group12,{justify:"right",children:jsxs35(Text16,{children:["... ",valuesLength," total values"]})})]})}import{Fragment as Fragment28,jsx as jsx64,jsxs as jsxs36}from"react/jsx-runtime";function ResourcePropertyDisplay(props){let{property,propertyType,value}=props;if(property?.path?.endsWith(".id"))return jsxs36(Flex10,{gap:3,align:"center",children:[value,!isEmpty(value)&&jsx64(CopyButton,{value,timeout:2e3,children:({copied,copy})=>jsx64(Tooltip2,{label:copied?"Copied":"Copy",withArrow:!0,position:"right",children:jsx64(ActionIcon3,{variant:"subtle",color:copied?"teal":"gray",onClick:copy,children:copied?jsx64(IconCheck,{size:"1rem"}):jsx64(IconCopy,{size:"1rem"})})})})]});if(property&&(property.isArray||property.max>1)&&!props.arrayElement)return propertyType===PropertyType.Attachment?jsx64(AttachmentArrayDisplay,{values:value,maxWidth:props.maxWidth,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,property,path:props.path}):jsx64(ResourceArrayDisplay,{path:props.path,property,propertyType,values:value,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,ignoreMissingValues:props.ignoreMissingValues,link:props.link});switch(propertyType){case PropertyType.boolean:return jsx64(Fragment28,{children:value===void 0?"":(!!value).toString()});case PropertyType.SystemString:case PropertyType.string:return props.property?.path?.toLowerCase().includes("secret")?jsx64(SecretFieldDisplay,{value}):jsx64("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):jsx64(Fragment28,{children:value?.toString()});case PropertyType.canonical:return jsx64(ReferenceDisplay,{value:{reference:value},link:props.link});case PropertyType.dateTime:case PropertyType.instant:return jsx64(Fragment28,{children:formatDateTime(value)});case PropertyType.time:return jsx64(Fragment28,{children:formatWallTime(value)});case PropertyType.markdown:return jsx64("pre",{children:value});case PropertyType.Address:return jsx64(AddressDisplay,{value});case PropertyType.Annotation:return jsx64(Fragment28,{children:value?.text});case PropertyType.Attachment:return jsx64(AttachmentDisplay,{value,maxWidth:props.maxWidth});case PropertyType.CodeableConcept:return jsx64(CodeableConceptDisplay,{value});case PropertyType.Coding:return jsx64(CodingDisplay,{value});case PropertyType.ContactDetail:return jsx64(ContactDetailDisplay,{value});case PropertyType.ContactPoint:return jsx64(ContactPointDisplay,{value});case PropertyType.HumanName:return jsx64(HumanNameDisplay,{value});case PropertyType.Identifier:return jsx64(IdentifierDisplay,{value});case PropertyType.Money:return jsx64(MoneyDisplay,{value});case PropertyType.Period:return jsx64(Fragment28,{children:formatPeriod(value)});case PropertyType.Quantity:case PropertyType.Duration:return jsx64(QuantityDisplay,{value});case PropertyType.Range:return jsx64(RangeDisplay,{value});case PropertyType.Ratio:return jsx64(RatioDisplay,{value});case PropertyType.Reference:return jsx64(ReferenceDisplay,{value,link:props.link});case PropertyType.Timing:return jsx64(Fragment28,{children:formatTiming(value)});case PropertyType.Dosage:case PropertyType.UsageContext:if(!props.path)throw new Error(`Displaying property of type ${props.propertyType} requires path`);return jsx64(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 jsx64(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 jsx64(BackboneElementDisplay,{path:props.path,value:{type:property.type[0].code,value},compact:!0,ignoreMissingValues:props.ignoreMissingValues})}}function SecretFieldDisplay(props){let[isVisible,setIsVisible]=useState31(!1),secretValue=props.value??"",hasValue=!isEmpty(secretValue),MASK="\u2022".repeat(8);return jsxs36(Flex10,{gap:3,align:"center",children:[isVisible?jsx64("div",{style:{whiteSpace:"pre-wrap"},children:secretValue}):jsx64("div",{style:{whiteSpace:"pre-wrap"},"aria-hidden":"true",children:hasValue?MASK:""}),hasValue&&jsxs36(Fragment28,{children:[jsx64(CopyButton,{value:props.value,timeout:2e3,children:({copied,copy})=>jsx64(Tooltip2,{label:copied?"Copied":"Copy secret",withArrow:!0,position:"right",children:jsx64(ActionIcon3,{variant:"subtle",color:copied?"teal":"gray",onClick:copy,"aria-label":copied?"Copied":"Copy secret",children:copied?jsx64(IconCheck,{size:"1rem"}):jsx64(IconCopy,{size:"1rem"})})})}),jsx64(Tooltip2,{label:isVisible?"Hide secret":"Show secret",withArrow:!0,position:"right",children:jsx64(ActionIcon3,{variant:"subtle",color:"gray",onClick:()=>setIsVisible(!isVisible),"aria-label":isVisible?"Hide secret":"Show secret",children:isVisible?jsx64(IconEyeOff,{size:"1rem"}):jsx64(IconEye,{size:"1rem"})})})]})]})}import{jsx as jsx65,jsxs as jsxs37}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 jsxs37("div",{children:[typeName,"\xA0not implemented"]});if(typeof value=="object"&&"name"in value&&Object.keys(value).length===1&&typeof value.name=="string")return jsx65("div",{children:value.name});let elementsContext=newElementsContext??parentElementsContext;return maybeWrapWithContext(ElementsContext.Provider,newElementsContext,jsx65(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=jsx65(ResourcePropertyDisplay,{property,propertyType,path:props.path+"."+key,value:propertyValue,ignoreMissingValues:props.ignoreMissingValues,includeArrayDescriptionListEntry:isArrayProperty,link:props.link},key);return isArrayProperty?resourcePropertyDisplay:jsx65(DescriptionListEntry,{term:getPathDisplayName3(key),children:resourcePropertyDisplay},key)})}))}import{Box as Box10}from"@mantine/core";import{buildElementsContext as buildElementsContext4,tryGetDataType as tryGetDataType2}from"@medplum/core";import{useContext as useContext23,useMemo as useMemo22,useState as useState52}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 useState51}from"react";import{Group as Group13,Input}from"@mantine/core";import{useContext as useContext7}from"react";var FormSection_default={dimmed:"FormSection_dimmed",preserveBreaks:"FormSection_preserveBreaks"};import{Tooltip as Tooltip3}from"@mantine/core";import{jsx as jsx66}from"react/jsx-runtime";var READ_ONLY_TOOLTIP_TEXT="Read Only";function maybeWrapWithTooltip(tooltipText,children){return tooltipText?jsx66(Tooltip3.Floating,{label:tooltipText,children}):children}import{jsx as jsx67,jsxs as jsxs38}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,jsxs38(Group13,{wrap:"nowrap","data-testid":props.testId,children:[jsx67("div",{children:props.children}),jsx67("div",{children:jsx67(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 jsx68}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,jsx68(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 Group27,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 useState50}from"react";import{useState as useState32}from"react";import{jsx as jsx69}from"react/jsx-runtime";function CodeableConceptInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,outcome:_outcome,path:_path,valuePath:_valuePath,...rest}=props,[value,setValue]=useState32(defaultValue2);function handleChange(newValues){let newConcept=valueSetElementToCodeableConcept(newValues);setValue(newConcept),onChange&&onChange(newConcept)}return jsx69(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 useState33}from"react";import{jsx as jsx70}from"react/jsx-runtime";function CodingInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,response,...rest}=props,[value,setValue]=useState33(response?.answer?.[0]?.valueCoding??defaultValue2);function handleChange(newValues){let newValue=newValues[0],newConcept=newValue&&valueSetElementToCoding(newValue);setValue(newConcept),onChange&&onChange(newConcept)}return jsx70(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 Group15,TextInput as TextInput11}from"@mantine/core";import{useContext as useContext10,useMemo as useMemo8,useState as useState35}from"react";import{Group as Group14,NativeSelect as NativeSelect3,TextInput as TextInput10}from"@mantine/core";import{useContext as useContext9,useMemo as useMemo7,useState as useState34}from"react";import{jsx as jsx71,jsxs as jsxs39}from"react/jsx-runtime";function ContactPointInput(props){let{path,outcome}=props,{elementsByPath,getExtendedProps}=useContext9(ElementsContext),[contactPoint,setContactPoint]=useState34(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 jsxs39(Group14,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx71(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")}),jsx71(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")}),jsx71(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 jsx72,jsxs as jsxs40}from"react/jsx-runtime";function ContactDetailInput(props){let[contactDetail,setContactDetail]=useState35(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 jsxs40(Group15,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx72(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)}),jsx72(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 jsx73}from"react/jsx-runtime";function DateTimeInput(props){return jsx73(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 useState36}from"react";import{jsx as jsx74}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]=useState36(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))?jsx74("div",{children:"Loading..."}):jsx74(BackboneElementInput,{profileUrl,path:props.path,typeName:"Extension",defaultValue:props.defaultValue,onChange:props.onChange})}import{Group as Group16,NativeSelect as NativeSelect4,TextInput as TextInput13}from"@mantine/core";import{useContext as useContext11,useMemo as useMemo10,useState as useState37}from"react";import{jsx as jsx75,jsxs as jsxs41}from"react/jsx-runtime";function HumanNameInput(props){let{outcome,path}=props,[value,setValue]=useState37(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 jsxs41(Group16,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx75(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")}),jsx75(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")}),jsx75(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")}),jsx75(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")}),jsx75(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 Group17,TextInput as TextInput14}from"@mantine/core";import{useContext as useContext12,useMemo as useMemo11,useState as useState38}from"react";import{jsx as jsx76,jsxs as jsxs42}from"react/jsx-runtime";function IdentifierInput(props){let[value,setValue]=useState38(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 jsxs42(Group17,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx76(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")}),jsx76(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 useState39}from"react";import{jsx as jsx77}from"react/jsx-runtime";var data=["USD","EUR","CAD","GBP","AUD"];function MoneyInput(props){let{onChange}=props,[value,setValue]=useState39(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=jsx77(NativeSelect5,{disabled:props.disabled||currencyProps?.readonly,defaultValue:value?.currency,data,styles:{input:{fontWeight:500,borderTopLeftRadius:0,borderBottomLeftRadius:0,width:92}},onChange:handleCurrencyChange});return jsx77(TextInput15,{disabled:props.disabled||valueProps?.readonly,type:"number",name:props.name,label:props.label,placeholder:props.placeholder??"Value",defaultValue:value?.value?.toString()??"USD",leftSection:jsx77(IconCurrencyDollar,{size:14}),rightSection:select,rightSectionWidth:92,onChange:handleValueChange})}import{Group as Group18}from"@mantine/core";import{useContext as useContext14,useMemo as useMemo13,useState as useState40}from"react";import{jsx as jsx78,jsxs as jsxs43}from"react/jsx-runtime";function PeriodInput(props){let[value,setValue]=useState40(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 jsxs43(Group18,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx78(DateTimeInput,{disabled:props.disabled||startProps?.readonly,name:props.name+".start",placeholder:"Start",defaultValue:value?.start,onChange:newValue=>setValueWrapper({...value,start:newValue})}),jsx78(DateTimeInput,{disabled:props.disabled||endProps?.readonly,name:props.name+".end",placeholder:"End",defaultValue:value?.end,onChange:newValue=>setValueWrapper({...value,end:newValue})})]})}import{Group as Group19,NativeSelect as NativeSelect6,TextInput as TextInput16}from"@mantine/core";import{useContext as useContext15,useMemo as useMemo14,useState as useState41}from"react";import{jsx as jsx79,jsxs as jsxs44}from"react/jsx-runtime";function QuantityInput(props){let[value,setValue]=useState41(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 jsxs44(Group19,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx79(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})}),jsx79(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)})}}),jsx79(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 Group20}from"@mantine/core";import{useContext as useContext16,useMemo as useMemo15,useState as useState42}from"react";import{jsx as jsx80,jsxs as jsxs45}from"react/jsx-runtime";function RangeInput(props){let[value,setValue]=useState42(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 jsxs45(Group20,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx80(QuantityInput,{path:props.path+".low",disabled:props.disabled||lowProps?.readonly,name:props.name+"-low",defaultValue:value?.low,onChange:v=>setValueWrapper({...value,low:v})}),jsx80(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 Group21}from"@mantine/core";import{useContext as useContext17,useMemo as useMemo16,useState as useState43}from"react";import{jsx as jsx81,jsxs as jsxs46}from"react/jsx-runtime";function RatioInput(props){let[value,setValue]=useState43(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 jsxs46(Group21,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81(QuantityInput,{path:props.path+".numerator",disabled:props.disabled||numeratorProps?.readonly,name:props.name+"-numerator",defaultValue:value?.numerator,onChange:v=>setValueWrapper({...value,numerator:v})}),jsx81(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 Group23,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 useState45}from"react";import{useCallback as useCallback9}from"react";import{Group as Group22,Text as Text17}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 useState44}from"react";import{jsx as jsx82,jsxs as jsxs47}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)=>jsx82("div",{ref,...others,children:jsxs47(Group22,{wrap:"nowrap",children:[jsx82(ResourceAvatar,{value:resource}),jsxs47("div",{children:[jsx82(Text17,{children:label}),jsx82(Text17,{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]=useState44(!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:jsx82(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 jsx83}from"react/jsx-runtime";function ResourceInput(props){let onChange=props.onChange,handleChange=useCallback9(newResources=>{onChange&&onChange(newResources[0])},[onChange]);return jsx83(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 Fragment29,jsx as jsx84,jsxs as jsxs48}from"react/jsx-runtime";function ReferenceInput(props){let{onChange}=props,medplum=useMedplum23(),[value,setValue]=useState45(props.defaultValue),[targetTypes,setTargetTypes]=useState45(()=>createTargetTypes(props.targetTypes)),[targetType,setTargetType]=useState45(()=>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 jsxs48(Fragment29,{children:[props.name&&jsx84("input",{type:"hidden",name:props.name,value:value?.reference??""}),jsxs48(Group23,{gap:"xs",grow:!0,wrap:"nowrap",children:[targetTypes&&targetTypes.length>1&&jsx84(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&&jsx84(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"}),jsx84(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=`{
|
|
102
|
+
}`.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 patientsToActions(patients,navigate){let patientActions=patients.filter(p=>!!p.id).map(patient=>({id:patient.id,label:patient.name?formatHumanName4(patient.name[0]):patient.id,description:patient.birthDate,leftSection:jsx21(ResourceAvatar,{value:patient,radius:"xl",size:24}),onClick:()=>navigate(`/Patient/${patient.id}`)}));return patientActions.length>0?[{group:"Patients",actions:patientActions}]:[]}function resourcesToActions(resources,resourceTypes,navigate){let result=[],resourceTypeActions=resourceTypes.map(rt=>({id:`resource-type-${rt.code}`,label:rt.display??rt.code??"",description:"Resource Type",onClick:()=>navigate(`/${rt.code}`)}));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({id:resource.id,label:resource.name?formatHumanName4(resource.name[0]):resource.id,description:resource.birthDate,leftSection:jsx21(ResourceAvatar,{value:resource,radius:"xl",size:24}),onClick:()=>navigate(`/Patient/${resource.id}`)}):resource.resourceType==="ServiceRequest"&&resource.id&&serviceRequestActions.push({id:resource.id,label:resource.id,description:resource.subject?.display,onClick:()=>navigate(`/ServiceRequest/${resource.id}`)});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:()=>spotlight.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}),!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)&¤tSearchParams.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,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}):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 Group9,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(`
|
|
103
|
+
`)}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(Group9,{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 Group10,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(Group10,{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 Group11,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(Group11,{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 Group12,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(Group12,{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 Group13,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(Group13,{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 Group27,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 Group15,TextInput as TextInput11}from"@mantine/core";import{useContext as useContext10,useMemo as useMemo8,useState as useState36}from"react";import{Group as Group14,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(Group14,{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(Group15,{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 Group16,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(Group16,{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 Group17,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(Group17,{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 Group18}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(Group18,{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 Group19,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(Group19,{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 Group20}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(Group20,{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 Group21}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(Group21,{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 Group23,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 Group22,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(Group22,{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(Group23,{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=`{
|
|
104
104
|
StructureDefinitionList(url: "${profileUrl}", _sort: "_lastUpdated", _count: 1) {
|
|
105
105
|
type,
|
|
106
106
|
name,
|
|
107
107
|
title,
|
|
108
108
|
}
|
|
109
|
-
}`.replaceAll(/\s+/g," ");return(await medplum.graphql(query)).data.StructureDefinitionList[0]}function shouldFetchResourceType(targetType){return targetType.type==="profile"&&!targetType?.error&&isEmpty4(targetType.resourceType)}import{Group as Group25,Stack as Stack16,Text as Text19}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 useState47}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group24,Stack as Stack15,Text as Text18}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 useState46}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon4,Button as Button7}from"@mantine/core";import{jsx as jsx85}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx85(Button7,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx85(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx85(ActionIcon4,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx85(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon5}from"@mantine/core";import{jsx as jsx86}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx86(ActionIcon5,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx86(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx87,jsxs as jsxs49}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState46(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,jsx87(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx87(Text18,{c:"dimmed",children:"(empty)"}):jsxs49(Stack15,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs49(Group24,{wrap:"nowrap",children:[jsx87("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx87(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&&jsx87(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&&jsx87(Group24,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx87(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx88,jsxs as jsxs50}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum24(),[loading,setLoading]=useState47(!0),[slices,setSlices]=useState47([]),[defaultValue2]=useState47(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState47(()=>[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 jsx88("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 jsxs50(Stack16,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx88(Text19,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx88(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)=>jsxs50(Group25,{wrap:"nowrap",style:{flexGrow:1},children:[jsx88("div",{style:{flexGrow:1},children:jsx88(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&&jsx88(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&&jsx88(Group25,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx88(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.push(void 0),setValuesWrapper(newNonSliceValues,nonSliceIndex)},testId:"nonsliced-add"})})]})}function addPlaceholderValues(slicedValues,slices){for(let sliceIndex=0;sliceIndex<slices.length;sliceIndex++){let slice=slices[sliceIndex],sliceValues=slicedValues[sliceIndex];for(;sliceValues.length<slice.min;)sliceValues.push(void 0)}}import{ActionIcon as ActionIcon6,Flex as Flex11,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification5}from"@mantine/notifications";import{useRef as useRef9,useState as useState48}from"react";import{jsx as jsx89,jsxs as jsxs51}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState48(!1),clipboard=useClipboard(),ref=useRef9(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs51(Flex11,{gap:"xs",children:[jsx89(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx89(ActionIcon6,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification5({color:"green",message:"Copied"})},children:jsx89(IconCopy,{})})]})}import{Box as Box9,Button as Button8,Chip,Group as Group26,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 useState49}from"react";import{Fragment as Fragment30,jsx as jsx90,jsxs as jsxs52}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState49(props.defaultValue),[open,setOpen]=useState49(!props.disabled&&(props.defaultModalOpen??!1));return jsxs52(Fragment30,{children:[jsxs52(Group26,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx90("span",{"data-testid":"timinginput-display",children:formatTiming2(value)||"No repeat"}),jsx90(Button8,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx90(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]=useState49(props.defaultValue||defaultValue),[timeOfDayItems,setTimeOfDayItems]=useState49(()=>(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 jsx90(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs52(Stack17,{gap:"md",children:[jsx90(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx90(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx90(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs52(Fragment30,{children:[jsx90(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs52(Group26,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx90(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)}),jsx90(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"&&jsx90(FormSection,{title:"Repeat on",children:jsx90(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,value:value.repeat?.dayOfWeek,children:jsx90(Group26,{justify:"space-between",mt:"xs",gap:"xs",children:daysOfWeek.map(day=>jsx90(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,checked:(value.repeat?.dayOfWeek??[]).includes(day),children:day.charAt(0).toUpperCase()},day))})})}),jsx90(FormSection,{title:"At times",children:jsxs52(Stack17,{mt:"xs",children:[timeOfDayItems.map((item,idx)=>jsxs52(Group26,{children:[jsx90(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}}),jsx90(ArrayRemoveButton,{testId:`timing-repeat-timeOfDay-remove-${idx}`,onClick:()=>setTimeOfDay(items=>items.toSpliced(idx,1))})]},item.id)),jsx90(Box9,{children:jsx90(ArrayAddButton,{propertyDisplayName:"Time of Day",onClick:()=>setTimeOfDay(items=>{let id=nextTimeOfDayId.current++;return items.concat({id,value:"00:00:00"})})})})]})})]}),jsx90(Group26,{justify:"flex-end",children:jsx90(Button8,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx91,jsxs as jsxs53}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 jsx91(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx91(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx91(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx91(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]=useState50(initialPropertyType);return jsxs53(Group27,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx91(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}))}),jsx91(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 jsx91("div",{children:"Property type not specified "});function getComplexInputProps(){return{name,defaultValue:defaultValue2,onChange,outcome,path,valuePath,disabled:readOnly}}function getPrimitiveInputProps(){let error=getErrorsForInput(props.outcome,valuePath??path);return{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,error,disabled:readOnly}}switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.string:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"||props.path==="ClientApplication.certificateTrustStore"?jsx91(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx91(TextInput18,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx91(TextInput18,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.time:return jsx91(TextInput18,{...getPrimitiveInputProps(),type:"time",step:1,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx91(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx91(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 jsx91(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx91(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:case PropertyType2.xhtml:return jsx91(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx91(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx91(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx91(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx91(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx91(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx91(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx91(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx91(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx91(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx91(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx91(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx91(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx91(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx91(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx91(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx91(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx91(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx91(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 jsx92}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState51(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 jsx92(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=jsx92(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"?jsx92(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx92(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 jsx93,jsxs as jsxs54}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState52(()=>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 jsxs54("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx93(Box10,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:jsx93(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}import{Button as Button9,Group as Group28}from"@mantine/core";import{useMemo as useMemo23,useState as useState53}from"react";var CalendarDateInput_default={table:"CalendarDateInput_table"};function getMonthString(date){return date.toLocaleString("default",{month:"long"})+" "+date.getFullYear()}function getStartMonth(){let result=new Date;return result.setDate(1),result.setHours(0,0,0,0),result}import{jsx as jsx94,jsxs as jsxs55}from"react/jsx-runtime";function CalendarDateInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState53(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth);return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=useMemo23(()=>buildGrid(month,props.availableDates),[month,props.availableDates]);return jsxs55("div",{children:[jsxs55(Group28,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx94("p",{style:{flex:1},children:getMonthString(month)}),jsxs55(Group28,{justify:"flex-end",gap:"xs",children:[jsx94(Button9,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx94(Button9,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs55("table",{className:CalendarDateInput_default.table,children:[jsx94("thead",{children:jsxs55("tr",{children:[jsx94("th",{children:"SUN"}),jsx94("th",{children:"MON"}),jsx94("th",{children:"TUE"}),jsx94("th",{children:"WED"}),jsx94("th",{children:"THU"}),jsx94("th",{children:"FRI"}),jsx94("th",{children:"SAT"})]})}),jsx94("tbody",{children:grid.map((week,weekIndex)=>jsx94("tr",{children:week.map((day,dayIndex)=>jsx94("td",{children:day&&jsx94(Button9,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,availableDates){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d),available:isDayAvailable(d,availableDates)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,availableDates){for(let availableDate of availableDates)if(availableDate.getFullYear()===day.getFullYear()&&availableDate.getMonth()===day.getMonth()&&availableDate.getDate()===day.getDate())return!0;return!1}import{useMemo as useMemo24}from"react";import{jsx as jsx95}from"react/jsx-runtime";function CalendarInput(props){let{slots,...rest}=props,availableDates=useMemo24(()=>slots.map(slot=>new Date(slot.start)),[slots]);return jsx95(CalendarDateInput,{...rest,availableDates})}import{ActionIcon as ActionIcon7,Group as Group29,LoadingOverlay,Menu as Menu4,Paper as Paper2,Popover,ScrollArea as ScrollArea2,Skeleton,Stack as Stack20,Text as Text21,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 normalizeErrorString7}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 useState55}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 Box11,Divider as Divider5,Loader as Loader4,Stack as Stack19,Text as Text20,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 useState54}from"react";import{jsx as jsx96,jsxs as jsxs56}from"react/jsx-runtime";function DocumentPicker({subjectRef,onSelect,onUpload}){let medplum=useMedplum25(),[search,setSearch]=useState54(""),[docs,setDocs]=useState54([]),[loading,setLoading]=useState54(!0),subjectRefStr=subjectRef?getReferenceString4(subjectRef):void 0,fetchDocs=useDebouncedCallback2(async query=>{setLoading(!0);try{let params=new URLSearchParams;subjectRefStr&¶ms.set("subject",subjectRefStr),query.trim()&¶ms.set("description:contains",query.trim()),params.set("_sort","-date"),params.set("_count","5");let results=await medplum.searchResources("DocumentReference",params);setDocs([...results])}catch(err){console.error(err)}finally{setLoading(!1)}},300);useEffect15(()=>{fetchDocs(search)},[fetchDocs,search]);let getDocName=doc=>doc.description??doc.content?.[0]?.attachment?.title??"Untitled";return jsxs56(Stack19,{gap:0,w:280,children:[jsx96(Text20,{fw:500,fz:"sm",px:"sm",pt:"sm",pb:"xs",children:"Attachments"}),jsx96(Box11,{px:"sm",pb:"xs",children:jsx96(TextInput19,{placeholder:"Search for a Document...",size:"xs",value:search,onChange:e=>setSearch(e.currentTarget.value)})}),jsx96(Divider5,{}),loading?jsx96(Box11,{py:"sm",style:{display:"flex",justifyContent:"center"},children:jsx96(Loader4,{size:"xs"})}):jsxs56(Stack19,{gap:0,children:[docs.map(doc=>jsxs56(UnstyledButton3,{px:"sm",py:"xs",onClick:()=>onSelect(doc),style:{display:"flex",alignItems:"center",gap:8},children:[jsx96(IconFileText,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-blue-6)"}}),jsx96(Text20,{fz:"sm",truncate:!0,children:getDocName(doc)})]},doc.id)),docs.length===0&&jsx96(Text20,{fz:"xs",c:"dimmed",px:"sm",py:"xs",children:"No documents found"})]}),jsx96(Divider5,{}),jsxs56(UnstyledButton3,{px:"sm",py:"xs",onClick:onUpload,style:{display:"flex",alignItems:"center",gap:8},children:[jsx96(IconPaperclip,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-gray-6)"}}),jsx96(Text20,{fz:"sm",c:"dimmed",children:"Upload an image, pdf, etc."})]})]})}import{jsx as jsx97,jsxs as jsxs57}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]=useState55(medplum.getProfile()),[reconnecting,setReconnecting]=useState55(!1),[loading,setLoading]=useState55(!0),[pendingFile,setPendingFile]=useState55(void 0),[pendingDocRef,setPendingDocRef]=useState55(void 0),[pickerOpen,setPickerOpen]=useState55(!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:normalizeErrorString7(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:normalizeErrorString7(err)})),setReconnecting(!1))},[reconnecting,searchMessages]),onError:useCallback11(err=>{onError?onError(err):showError(normalizeErrorString7(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?jsxs57(Paper2,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[!excludeHeader&&jsx97(Title9,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx97("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs57(Stack20,{align:"stretch",mt:"lg",children:[jsxs57(Group29,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx97(Skeleton,{height:38,circle:!0,ml:"md"}),jsx97(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs57(Group29,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx97(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx97(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs57(Group29,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx97(Skeleton,{height:38,circle:!0,ml:"md"}),jsx97(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs57(ScrollArea2,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx97(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?jsx97(ChatBubbleMenu,{contentRef,contentAttachment,onViewInDocuments}):null;return jsxs57(Stack20,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx97(Text21,{fz:"xs",ta:"center",children:currCommTime}),isSender?jsxs57(Group29,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx97("div",{className:BaseChat_default.chatBubbleMenu,children:menu}),jsx97(ChatBubble,{alignment:"right",communication:c,showDelivered}),jsx97(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender,mb:showDelivered?void 0:"sm"})]}):jsxs57(Group29,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx97(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),jsx97(ChatBubble,{alignment:"left",communication:c}),jsx97("div",{className:BaseChat_default.chatBubbleMenu,children:menu})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsxs57("div",{className:BaseChat_default.chatInputContainer,children:[(pendingFile||pendingDocRef)&&jsxs57(Group29,{className:BaseChat_default.chatPendingFile,gap:4,align:"center",wrap:"nowrap",children:[pendingDocRef?jsx97(IconFileText,{size:"0.75rem"}):jsx97(IconPaperclip,{size:"0.75rem"}),jsx97(Text21,{fz:"xs",c:"dimmed",flex:1,truncate:!0,children:pendingDocRef?pendingDocRef.description??pendingDocRef.content?.[0]?.attachment?.title??"Document":pendingFile?.name}),jsx97(ActionIcon7,{size:"xs",variant:"subtle",color:"red",onClick:()=>{setPendingDocRef(void 0),setPendingFile(void 0),fileInputRef.current&&(fileInputRef.current.value="")},"aria-label":"Remove attachment",children:jsx97(IconX,{size:"0.75rem"})})]}),jsx97("input",{ref:fileInputRef,type:"file",style:{display:"none"},disabled:inputDisabled,onChange:e=>{let file=e.target.files?.[0];file&&(setPendingFile(file),setPendingDocRef(void 0))}}),jsx97(Form,{onSubmit:sendMessageInternal,children:jsx97(TextInput20,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",leftSectionWidth:42,rightSectionWidth:42,disabled:inputDisabled,leftSection:!inputDisabled&&uploadEnabled?jsxs57(Popover,{opened:pickerOpen,onChange:setPickerOpen,position:"top-start",withArrow:!0,shadow:"md",withinPortal:!0,children:[jsx97(Popover.Target,{children:jsx97(ActionIcon7,{onClick:()=>setPickerOpen(o=>!o),size:"1.5rem",radius:"xl",color:pendingFile||pendingDocRef?"blue":"gray",variant:pendingFile||pendingDocRef?"filled":"subtle","aria-label":"Attach file",children:jsx97(IconPaperclip,{size:"1rem",stroke:1.5})})}),jsx97(Popover.Dropdown,{p:0,children:jsx97(DocumentPicker,{subjectRef:attachmentSubjectRef,onSelect:doc=>{setPendingDocRef(doc),setPendingFile(void 0),setPickerOpen(!1)},onUpload:()=>{setPickerOpen(!1),fileInputRef.current?.click()}})})]}):void 0,rightSection:inputDisabled?void 0:jsx97(ActionIcon7,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx97(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 jsxs57("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsxs57(Text21,{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",jsx97(Text21,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),jsx97("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsxs57("div",{className:BaseChat_default.chatBubble,children:[textContent&&jsx97("span",{children:textContent}),contentRef&&jsx97(ChatBubbleDocumentReference,{reference:contentRef,hasText:!!textContent}),attachment&&jsx97(ChatBubbleAttachment,{attachment,hasText:!!textContent})]})}),showDelivered&&jsxs57("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleAttachment({attachment,hasText}){return jsx97("div",{className:hasText?BaseChat_default.chatBubbleAttachmentWithText:void 0,children:jsxs57(Group29,{gap:4,wrap:"nowrap",children:[jsx97("span",{className:BaseChat_default.chatBubbleAttachmentIcon,children:jsx97(IconPaperclip,{size:"0.75rem"})}),jsx97(Text21,{fz:"xs",truncate:!0,children:attachment.title??"File attached"})]})})}function ChatBubbleDocumentReference({reference,hasText}){let attachment=useResource2(reference)?.content?.[0]?.attachment;return attachment?jsx97(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 jsxs57(Menu4,{withinPortal:!0,position:"bottom-start",shadow:"md",children:[jsx97(Menu4.Target,{children:jsx97(ActionIcon7,{variant:"outline",color:"gray",radius:"xl",size:"sm","aria-label":"Attachment options",children:jsx97(IconDots,{size:"0.75rem"})})}),jsxs57(Menu4.Dropdown,{children:[contentRef&&onViewInDocuments&&jsx97(Menu4.Item,{leftSection:jsx97(IconFileExport,{size:"0.9rem"}),onClick:()=>onViewInDocuments(contentRef),children:"View in Documents"}),jsx97(Menu4.Item,{leftSection:jsx97(IconDownload,{size:"0.9rem"}),onClick:handleDownload,children:"Download"})]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs57("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx97("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx97("div",{style:{position:"relative"},children:jsx97(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx97("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx97("div",{className:BaseChat_default.chatBubble,children:jsx97(Skeleton,{height:14,width:parentWidth*.5,radius:"l"})})})]})}import{ActionIcon as ActionIcon8}from"@mantine/core";import{useMedplumProfile as useMedplumProfile5}from"@medplum/react-hooks";import{useEffect as useEffect17,useState as useState56}from"react";var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};import{Fragment as Fragment31,jsx as jsx98,jsxs as jsxs58}from"react/jsx-runtime";function ChatModal(props){let{open,children}=props,profile=useMedplumProfile5(),[opened,setOpened]=useState56(open??!1);return useEffect17(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?jsxs58(Fragment31,{children:[opened&&jsx98("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx98("div",{className:ChatModal_default.iconContainer,children:jsx98(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx98(IconChevronDown,{size:"1.625rem"})})}):jsx98("div",{className:ChatModal_default.iconContainer,children:jsx98(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx98(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 useState57}from"react";import{jsx as jsx99}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]=useState57([]),profileRef=useMemo26(()=>profile?createReference3(profile):void 0,[profile]),threadRef=useMemo26(()=>createReference3(thread),[thread]);useEffect18(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=useCallback12((message,file,existingDocRef)=>{let profileRefStr=profileRef?getReferenceString6(profileRef):void 0;if(!profileRefStr)return;(async()=>{let payload=[];if(message&&payload.push({contentString:message}),existingDocRef)payload.push({contentReference:createReference3(existingDocRef)});else if(file){let docRef=await medplum.createDocumentReference({data:file,contentType:file.type||"application/octet-stream",filename:file.name,additionalFields:{...thread.subject?{subject:thread.subject}:{},description:file.name}});payload.push({contentReference:createReference3(docRef)})}let communication=await medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>getReferenceString6(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload,partOf:[threadRef],subject:thread.subject});setCommunications([...communications,communication]),onMessageSent?.(communication)})().catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent]),onMessageReceived=useMemo26(()=>thread.recipient?.length===2?message=>{message.received&&message.status==="completed"||medplum.updateResource({...message,received:message.received??new Date().toISOString(),status:"completed"}).catch(console.error)}:void 0,[medplum,thread.recipient?.length]);return profile?jsx99(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 Button12,Modal as Modal3,Stack as Stack24,Text as Text24,TextInput as TextInput22}from"@mantine/core";import{showNotification as showNotification7}from"@mantine/notifications";import{createReference as createReference6,HTTP_HL7_ORG as HTTP_HL7_ORG4,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useMedplum as useMedplum31,useMedplumProfile as useMedplumProfile7}from"@medplum/react-hooks";import{useMemo as useMemo28,useState as useState60}from"react";import{Divider as Divider7,Group as Group32,Stack as Stack23,Text as Text23,Title as Title11}from"@mantine/core";import{createReference as createReference5,getExtension as getExtension2,getReferenceString as getReferenceString7}from"@medplum/core";import{QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,useMedplum as useMedplum30,useQuestionnaireForm}from"@medplum/react-hooks";import{useCallback as useCallback13,useEffect as useEffect21,useLayoutEffect as useLayoutEffect3,useMemo as useMemo27,useRef as useRef13,useState as useState59}from"react";import{Button as Button10,Paper as Paper3}from"@mantine/core";import{createReference as createReference4,HTTP_HL7_ORG as HTTP_HL7_ORG2}from"@medplum/core";import{useMedplum as useMedplum28}from"@medplum/react-hooks";import{useEffect as useEffect19,useLayoutEffect as useLayoutEffect2,useRef as useRef12}from"react";var Point=class{constructor(x,y,pressure,time){__publicField(this,"x");__publicField(this,"y");__publicField(this,"pressure");__publicField(this,"time");if(isNaN(x)||isNaN(y))throw new Error(`Point is invalid: (${x}, ${y})`);this.x=+x,this.y=+y,this.pressure=pressure||0,this.time=time||Date.now()}distanceTo(start){return Math.sqrt(Math.pow(this.x-start.x,2)+Math.pow(this.y-start.y,2))}equals(other){return this.x===other.x&&this.y===other.y&&this.pressure===other.pressure&&this.time===other.time}velocityFrom(start){return this.time!==start.time?this.distanceTo(start)/(this.time-start.time):0}},Bezier=class _Bezier{constructor(startPoint,control2,control1,endPoint,startWidth,endWidth){this.startPoint=startPoint,this.control2=control2,this.control1=control1,this.endPoint=endPoint,this.startWidth=startWidth,this.endWidth=endWidth}static fromPoints(points,widths){let c2=this.calculateControlPoints(points[0],points[1],points[2]).c2,c3=this.calculateControlPoints(points[1],points[2],points[3]).c1;return new _Bezier(points[1],c2,c3,points[2],widths.start,widths.end)}static calculateControlPoints(s1,s2,s3){let dx1=s1.x-s2.x,dy1=s1.y-s2.y,dx2=s2.x-s3.x,dy2=s2.y-s3.y,m1={x:(s1.x+s2.x)/2,y:(s1.y+s2.y)/2},m2={x:(s2.x+s3.x)/2,y:(s2.y+s3.y)/2},l1=Math.sqrt(dx1*dx1+dy1*dy1),l2=Math.sqrt(dx2*dx2+dy2*dy2),dxm=m1.x-m2.x,dym=m1.y-m2.y,k=l1+l2==0?0:l2/(l1+l2),cm={x:m2.x+dxm*k,y:m2.y+dym*k},tx=s2.x-cm.x,ty=s2.y-cm.y;return{c1:new Point(m1.x+tx,m1.y+ty),c2:new Point(m2.x+tx,m2.y+ty)}}length(){let length=0,px,py;for(let i=0;i<=10;i+=1){let t=i/10,cx=this.point(t,this.startPoint.x,this.control1.x,this.control2.x,this.endPoint.x),cy=this.point(t,this.startPoint.y,this.control1.y,this.control2.y,this.endPoint.y);if(i>0){let xdiff=cx-px,ydiff=cy-py;length+=Math.sqrt(xdiff*xdiff+ydiff*ydiff)}px=cx,py=cy}return length}point(t,start,c1,c2,end){return start*(1-t)*(1-t)*(1-t)+3*c1*(1-t)*(1-t)*t+3*c2*(1-t)*t*t+end*t*t*t}},SignatureEventTarget=class{constructor(){__publicField(this,"_et");try{this._et=new EventTarget}catch{this._et=document}}addEventListener(type,listener,options){this._et.addEventListener(type,listener,options)}dispatchEvent(event){return this._et.dispatchEvent(event)}removeEventListener(type,callback,options){this._et.removeEventListener(type,callback,options)}};function throttle(fn,wait=250){let previous=0,timeout=null,result,storedContext,storedArgs,later=()=>{previous=Date.now(),timeout=null,result=fn.apply(storedContext,storedArgs),timeout||(storedContext=null,storedArgs=[])};return function(...args){let now=Date.now(),remaining=wait-(now-previous);return storedContext=this,storedArgs=args,remaining<=0||remaining>wait?(timeout&&(clearTimeout(timeout),timeout=null),previous=now,result=fn.apply(storedContext,storedArgs),timeout||(storedContext=null,storedArgs=[])):timeout||(timeout=window.setTimeout(later,remaining)),result}}var SignaturePad=class _SignaturePad extends SignatureEventTarget{constructor(canvas,options={}){super();__publicField(this,"dotSize");__publicField(this,"minWidth");__publicField(this,"maxWidth");__publicField(this,"penColor");__publicField(this,"minDistance");__publicField(this,"velocityFilterWeight");__publicField(this,"compositeOperation");__publicField(this,"backgroundColor");__publicField(this,"throttle");__publicField(this,"canvasContextOptions");__publicField(this,"_ctx");__publicField(this,"_drawingStroke",!1);__publicField(this,"_isEmpty",!0);__publicField(this,"_dataUrl");__publicField(this,"_dataUrlOptions");__publicField(this,"_lastPoints",[]);__publicField(this,"_data",[]);__publicField(this,"_lastVelocity",0);__publicField(this,"_lastWidth",0);__publicField(this,"_strokeMoveUpdate");__publicField(this,"_strokePointerId");this.canvas=canvas,this.velocityFilterWeight=options.velocityFilterWeight||.7,this.minWidth=options.minWidth||.5,this.maxWidth=options.maxWidth||2.5,this.throttle=options.throttle??16,this.minDistance=options.minDistance??5,this.dotSize=options.dotSize||0,this.penColor=options.penColor||"black",this.backgroundColor=options.backgroundColor||"rgba(0,0,0,0)",this.compositeOperation=options.compositeOperation||"source-over",this.canvasContextOptions=options.canvasContextOptions??{},this._strokeMoveUpdate=this.throttle?throttle(_SignaturePad.prototype._strokeUpdate,this.throttle):_SignaturePad.prototype._strokeUpdate,this._handleMouseDown=this._handleMouseDown.bind(this),this._handleMouseMove=this._handleMouseMove.bind(this),this._handleMouseUp=this._handleMouseUp.bind(this),this._handleTouchStart=this._handleTouchStart.bind(this),this._handleTouchMove=this._handleTouchMove.bind(this),this._handleTouchEnd=this._handleTouchEnd.bind(this),this._handlePointerDown=this._handlePointerDown.bind(this),this._handlePointerMove=this._handlePointerMove.bind(this),this._handlePointerUp=this._handlePointerUp.bind(this),this._handlePointerCancel=this._handlePointerCancel.bind(this),this._handleTouchCancel=this._handleTouchCancel.bind(this),this._ctx=canvas.getContext("2d",this.canvasContextOptions),this.clear(),this.on()}clear(){let{_ctx:ctx,canvas}=this;ctx.fillStyle=this.backgroundColor,ctx.clearRect(0,0,canvas.width,canvas.height),ctx.fillRect(0,0,canvas.width,canvas.height),this._data=[],this._reset(this._getPointGroupOptions()),this._isEmpty=!0,this._dataUrl=void 0,this._dataUrlOptions=void 0,this._strokePointerId=void 0}redraw(){let data2=this._data,dataUrl=this._dataUrl,dataUrlOptions=this._dataUrlOptions;this.clear(),dataUrl&&this.fromDataURL(dataUrl,dataUrlOptions),this.fromData(data2,{clear:!1})}fromDataURL(dataUrl,options={}){return new Promise((resolve,reject)=>{let image=new Image,ratio=options.ratio||window.devicePixelRatio||1,width=options.width||this.canvas.width/ratio,height=options.height||this.canvas.height/ratio,xOffset=options.xOffset||0,yOffset=options.yOffset||0;this._reset(this._getPointGroupOptions()),image.onload=()=>{this._ctx.drawImage(image,xOffset,yOffset,width,height),resolve()},image.onerror=error=>{reject(error)},image.crossOrigin="anonymous",image.src=dataUrl,this._isEmpty=!1,this._dataUrl=dataUrl,this._dataUrlOptions={...options}})}toDataURL(type="image/png",encoderOptions){return type==="image/svg+xml"?(typeof encoderOptions!="object"&&(encoderOptions=void 0),`data:image/svg+xml;base64,${btoa(this.toSVG(encoderOptions))}`):(typeof encoderOptions!="number"&&(encoderOptions=void 0),this.canvas.toDataURL(type,encoderOptions))}on(){this.canvas.style.touchAction="none",this.canvas.style.msTouchAction="none",this.canvas.style.userSelect="none",this.canvas.style.webkitUserSelect="none";let isIOS=/Macintosh/.test(navigator.userAgent)&&"ontouchstart"in document;window.PointerEvent&&!isIOS?this._handlePointerEvents():(this._handleMouseEvents(),"ontouchstart"in window&&this._handleTouchEvents())}off(){this.canvas.style.touchAction="auto",this.canvas.style.msTouchAction="auto",this.canvas.style.userSelect="auto",this.canvas.style.webkitUserSelect="auto",this.canvas.removeEventListener("pointerdown",this._handlePointerDown),this.canvas.removeEventListener("mousedown",this._handleMouseDown),this.canvas.removeEventListener("touchstart",this._handleTouchStart),this._removeMoveUpEventListeners()}_getListenerFunctions(){let canvasWindow=window.document===this.canvas.ownerDocument?window:this.canvas.ownerDocument.defaultView??this.canvas.ownerDocument;return{addEventListener:canvasWindow.addEventListener.bind(canvasWindow),removeEventListener:canvasWindow.removeEventListener.bind(canvasWindow)}}_removeMoveUpEventListeners(){let{removeEventListener}=this._getListenerFunctions();removeEventListener("pointermove",this._handlePointerMove),removeEventListener("pointerup",this._handlePointerUp),removeEventListener("pointercancel",this._handlePointerCancel),removeEventListener("mousemove",this._handleMouseMove),removeEventListener("mouseup",this._handleMouseUp),removeEventListener("touchmove",this._handleTouchMove),removeEventListener("touchend",this._handleTouchEnd),removeEventListener("touchcancel",this._handleTouchCancel)}isEmpty(){return this._isEmpty}fromData(pointGroups,{clear=!0}={}){clear&&this.clear(),this._fromData(pointGroups,this._drawCurve.bind(this),this._drawDot.bind(this)),this._data=this._data.concat(pointGroups)}toData(){return this._data}_isLeftButtonPressed(event,only){return only?event.buttons===1:(event.buttons&1)===1}_pointerEventToSignatureEvent(event){return{event,type:event.type,x:event.clientX,y:event.clientY,pressure:"pressure"in event?event.pressure:0}}_touchEventToSignatureEvent(event){let touch=event.changedTouches[0];return{event,type:event.type,x:touch.clientX,y:touch.clientY,pressure:touch.force}}_handleMouseDown(event){!this._isLeftButtonPressed(event,!0)||this._drawingStroke||this._strokeBegin(this._pointerEventToSignatureEvent(event))}_handleMouseMove(event){if(!this._isLeftButtonPressed(event,!0)||!this._drawingStroke){this._strokeEnd(this._pointerEventToSignatureEvent(event),!1);return}this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event))}_handleMouseUp(event){this._isLeftButtonPressed(event)||this._strokeEnd(this._pointerEventToSignatureEvent(event))}_handleTouchStart(event){event.targetTouches.length!==1||this._drawingStroke||(event.cancelable&&event.preventDefault(),this._strokeBegin(this._touchEventToSignatureEvent(event)))}_handleTouchMove(event){if(event.targetTouches.length===1){if(event.cancelable&&event.preventDefault(),!this._drawingStroke){this._strokeEnd(this._touchEventToSignatureEvent(event),!1);return}this._strokeMoveUpdate(this._touchEventToSignatureEvent(event))}}_handleTouchEnd(event){event.targetTouches.length===0&&(event.cancelable&&event.preventDefault(),this._strokeEnd(this._touchEventToSignatureEvent(event)))}_handlePointerCancel(event){this._allowPointerId(event)&&(event.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(event),!1))}_handleTouchCancel(event){event.cancelable&&event.preventDefault(),this._strokeEnd(this._touchEventToSignatureEvent(event),!1)}_getPointerId(event){return event.persistentDeviceId||event.pointerId}_allowPointerId(event,allowUndefined=!1){return typeof this._strokePointerId>"u"?allowUndefined:this._getPointerId(event)===this._strokePointerId}_handlePointerDown(event){this._drawingStroke||!this._isLeftButtonPressed(event)||!this._allowPointerId(event,!0)||(this._strokePointerId=this._getPointerId(event),event.preventDefault(),this._strokeBegin(this._pointerEventToSignatureEvent(event)))}_handlePointerMove(event){if(this._allowPointerId(event)){if(!this._isLeftButtonPressed(event,!0)||!this._drawingStroke){this._strokeEnd(this._pointerEventToSignatureEvent(event),!1);return}event.preventDefault(),this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event))}}_handlePointerUp(event){this._isLeftButtonPressed(event)||!this._allowPointerId(event)||(event.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(event)))}_getPointGroupOptions(group){return{penColor:group&&"penColor"in group?group.penColor:this.penColor,dotSize:group&&"dotSize"in group?group.dotSize:this.dotSize,minWidth:group&&"minWidth"in group?group.minWidth:this.minWidth,maxWidth:group&&"maxWidth"in group?group.maxWidth:this.maxWidth,velocityFilterWeight:group&&"velocityFilterWeight"in group?group.velocityFilterWeight:this.velocityFilterWeight,compositeOperation:group&&"compositeOperation"in group?group.compositeOperation:this.compositeOperation}}_strokeBegin(event){if(!this.dispatchEvent(new CustomEvent("beginStroke",{detail:event,cancelable:!0})))return;let{addEventListener}=this._getListenerFunctions();switch(event.event.type){case"mousedown":addEventListener("mousemove",this._handleMouseMove,{passive:!1}),addEventListener("mouseup",this._handleMouseUp,{passive:!1});break;case"touchstart":addEventListener("touchmove",this._handleTouchMove,{passive:!1}),addEventListener("touchend",this._handleTouchEnd,{passive:!1}),addEventListener("touchcancel",this._handleTouchCancel,{passive:!1});break;case"pointerdown":addEventListener("pointermove",this._handlePointerMove,{passive:!1}),addEventListener("pointerup",this._handlePointerUp,{passive:!1}),addEventListener("pointercancel",this._handlePointerCancel,{passive:!1});break;default:}this._drawingStroke=!0;let pointGroupOptions=this._getPointGroupOptions(),newPointGroup={...pointGroupOptions,points:[]};this._data.push(newPointGroup),this._reset(pointGroupOptions),this._strokeUpdate(event)}_strokeUpdate(event){if(!this._drawingStroke)return;if(this._data.length===0){this._strokeBegin(event);return}this.dispatchEvent(new CustomEvent("beforeUpdateStroke",{detail:event}));let point=this._createPoint(event.x,event.y,event.pressure),lastPointGroup=this._data[this._data.length-1],lastPoints=lastPointGroup.points,lastPoint=lastPoints.length>0&&lastPoints[lastPoints.length-1],isLastPointTooClose=lastPoint?point.distanceTo(lastPoint)<=this.minDistance:!1,pointGroupOptions=this._getPointGroupOptions(lastPointGroup);if(!lastPoint||!(lastPoint&&isLastPointTooClose)){let curve=this._addPoint(point,pointGroupOptions);lastPoint?curve&&this._drawCurve(curve,pointGroupOptions):this._drawDot(point,pointGroupOptions),lastPoints.push({time:point.time,x:point.x,y:point.y,pressure:point.pressure})}this.dispatchEvent(new CustomEvent("afterUpdateStroke",{detail:event}))}_strokeEnd(event,shouldUpdate=!0){this._removeMoveUpEventListeners(),this._drawingStroke&&(shouldUpdate&&this._strokeUpdate(event),this._drawingStroke=!1,this._strokePointerId=void 0,this.dispatchEvent(new CustomEvent("endStroke",{detail:event})))}_handlePointerEvents(){this._drawingStroke=!1,this.canvas.addEventListener("pointerdown",this._handlePointerDown,{passive:!1})}_handleMouseEvents(){this._drawingStroke=!1,this.canvas.addEventListener("mousedown",this._handleMouseDown,{passive:!1})}_handleTouchEvents(){this.canvas.addEventListener("touchstart",this._handleTouchStart,{passive:!1})}_reset(options){this._lastPoints=[],this._lastVelocity=0,this._lastWidth=(options.minWidth+options.maxWidth)/2,this._ctx.fillStyle=options.penColor,this._ctx.globalCompositeOperation=options.compositeOperation}_createPoint(x,y,pressure){let rect=this.canvas.getBoundingClientRect();return new Point(x-rect.left,y-rect.top,pressure,new Date().getTime())}_addPoint(point,options){let{_lastPoints}=this;if(_lastPoints.push(point),_lastPoints.length>2){_lastPoints.length===3&&_lastPoints.unshift(_lastPoints[0]);let widths=this._calculateCurveWidths(_lastPoints[1],_lastPoints[2],options),curve=Bezier.fromPoints(_lastPoints,widths);return _lastPoints.shift(),curve}return null}_calculateCurveWidths(startPoint,endPoint,options){let velocity=options.velocityFilterWeight*endPoint.velocityFrom(startPoint)+(1-options.velocityFilterWeight)*this._lastVelocity,newWidth=this._strokeWidth(velocity,options),widths={end:newWidth,start:this._lastWidth};return this._lastVelocity=velocity,this._lastWidth=newWidth,widths}_strokeWidth(velocity,options){return Math.max(options.maxWidth/(velocity+1),options.minWidth)}_drawCurveSegment(x,y,width){let ctx=this._ctx;ctx.moveTo(x,y),ctx.arc(x,y,width,0,2*Math.PI,!1),this._isEmpty=!1}_drawCurve(curve,options){let ctx=this._ctx,widthDelta=curve.endWidth-curve.startWidth,drawSteps=Math.ceil(curve.length())*2;ctx.beginPath(),ctx.fillStyle=options.penColor;for(let i=0;i<drawSteps;i+=1){let t=i/drawSteps,tt=t*t,ttt=tt*t,u=1-t,uu=u*u,uuu=uu*u,x=uuu*curve.startPoint.x;x+=3*uu*t*curve.control1.x,x+=3*u*tt*curve.control2.x,x+=ttt*curve.endPoint.x;let y=uuu*curve.startPoint.y;y+=3*uu*t*curve.control1.y,y+=3*u*tt*curve.control2.y,y+=ttt*curve.endPoint.y;let width=Math.min(curve.startWidth+ttt*widthDelta,options.maxWidth);this._drawCurveSegment(x,y,width)}ctx.closePath(),ctx.fill()}_drawDot(point,options){let ctx=this._ctx,width=options.dotSize>0?options.dotSize:(options.minWidth+options.maxWidth)/2;ctx.beginPath(),this._drawCurveSegment(point.x,point.y,width),ctx.closePath(),ctx.fillStyle=options.penColor,ctx.fill()}_fromData(pointGroups,drawCurve,drawDot){for(let group of pointGroups){let{points}=group,pointGroupOptions=this._getPointGroupOptions(group);if(points.length>1)for(let j=0;j<points.length;j+=1){let basicPoint=points[j],point=new Point(basicPoint.x,basicPoint.y,basicPoint.pressure,basicPoint.time);j===0&&this._reset(pointGroupOptions);let curve=this._addPoint(point,pointGroupOptions);curve&&drawCurve(curve,pointGroupOptions)}else this._reset(pointGroupOptions),drawDot(points[0],pointGroupOptions)}}toSVG({includeBackgroundColor=!1,includeDataUrl=!1}={}){let pointGroups=this._data,ratio=Math.max(window.devicePixelRatio||1,1),minX=0,minY=0,maxX=this.canvas.width/ratio,maxY=this.canvas.height/ratio,svg=document.createElementNS("http://www.w3.org/2000/svg","svg");if(svg.setAttribute("xmlns","http://www.w3.org/2000/svg"),svg.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink"),svg.setAttribute("viewBox",`${minX} ${minY} ${maxX} ${maxY}`),svg.setAttribute("width",maxX.toString()),svg.setAttribute("height",maxY.toString()),includeBackgroundColor&&this.backgroundColor){let rect=document.createElement("rect");rect.setAttribute("width","100%"),rect.setAttribute("height","100%"),rect.setAttribute("fill",this.backgroundColor),svg.appendChild(rect)}if(includeDataUrl&&this._dataUrl){let ratio2=this._dataUrlOptions?.ratio||window.devicePixelRatio||1,width=this._dataUrlOptions?.width||this.canvas.width/ratio2,height=this._dataUrlOptions?.height||this.canvas.height/ratio2,xOffset=this._dataUrlOptions?.xOffset||0,yOffset=this._dataUrlOptions?.yOffset||0,image=document.createElement("image");image.setAttribute("x",xOffset.toString()),image.setAttribute("y",yOffset.toString()),image.setAttribute("width",width.toString()),image.setAttribute("height",height.toString()),image.setAttribute("preserveAspectRatio","none"),image.setAttribute("href",this._dataUrl),svg.appendChild(image)}return this._fromData(pointGroups,(curve,{penColor})=>{let path=document.createElement("path");if(!isNaN(curve.control1.x)&&!isNaN(curve.control1.y)&&!isNaN(curve.control2.x)&&!isNaN(curve.control2.y)){let attr=`M ${curve.startPoint.x.toFixed(3)},${curve.startPoint.y.toFixed(3)} C ${curve.control1.x.toFixed(3)},${curve.control1.y.toFixed(3)} ${curve.control2.x.toFixed(3)},${curve.control2.y.toFixed(3)} ${curve.endPoint.x.toFixed(3)},${curve.endPoint.y.toFixed(3)}`;path.setAttribute("d",attr),path.setAttribute("stroke-width",(curve.endWidth*2.25).toFixed(3)),path.setAttribute("stroke",penColor),path.setAttribute("fill","none"),path.setAttribute("stroke-linecap","round"),svg.appendChild(path)}},(point,{penColor,dotSize,minWidth,maxWidth})=>{let circle=document.createElement("circle"),size=dotSize>0?dotSize:(minWidth+maxWidth)/2;circle.setAttribute("r",size.toString()),circle.setAttribute("cx",point.x.toString()),circle.setAttribute("cy",point.y.toString()),circle.setAttribute("fill",penColor),svg.appendChild(circle)}),svg.outerHTML}};import{jsx as jsx100,jsxs as jsxs59}from"react/jsx-runtime";function SignatureInput(props){let medplum=useMedplum28(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=useRef12(null),signaturePadRef=useRef12(null),onChangeRef=useRef12(onChange);return useLayoutEffect2(()=>{onChangeRef.current=onChange}),useEffect19(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:HTTP_HL7_ORG2+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??createReference4(medplum.getProfile()),data:signaturePadRef.current?.toDataURL().split(",")[1]})}if(canvasRef.current){let signaturePad=new SignaturePad(canvasRef.current);defaultValue2?.data&&signaturePad.fromDataURL(defaultValue2.data).catch(console.error),signaturePad.addEventListener("endStroke",handleEndStroke),signaturePadRef.current=signaturePad}return()=>{signaturePadRef.current&&signaturePadRef.current.removeEventListener("beginStroke",handleEndStroke)}},[medplum,defaultValue2,who]),jsxs59(Paper3,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[jsx100("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),jsx100(Button10,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:jsx100(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}import{Divider as Divider6,Stack as Stack22}from"@mantine/core";import{isQuestionEnabled,QuestionnaireItemType as QuestionnaireItemType3}from"@medplum/react-hooks";import{Fragment as Fragment34}from"react";import{Title as Title10}from"@mantine/core";import{jsx as jsx101,jsxs as jsxs60}from"react/jsx-runtime";function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return jsxs60("div",{children:[props.item.text&&jsx101(Title10,{order:4,mb:"md",children:props.item.text}),jsx101(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}import{Checkbox as Checkbox5,Group as Group30,MultiSelect,NativeSelect as NativeSelect10,Radio,Text as Text22,Textarea as Textarea3,TextInput as TextInput21}from"@mantine/core";import{capitalize as capitalize3,deepEquals,formatCoding as formatCoding2,getElementDefinition,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG3,stringify as stringify2,typedValueToString}from"@medplum/core";import{getItemAnswerOptionValue,getItemInitialValue,getNewMultiSelectValues,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,QUESTIONNAIRE_ITEM_CONTROL_URL,QuestionnaireItemType,useMedplum as useMedplum29}from"@medplum/react-hooks";import{useEffect as useEffect20,useState as useState58}from"react";import{Fragment as Fragment32,jsx as jsx102,jsxs as jsxs61}from"react/jsx-runtime";var MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS=30,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS=50;function QuestionnaireFormItem(props){let formState=props.formState,item=props.item,response=props.responseItem;function onChangeAnswer(newResponseAnswer){if(formState&&props.context)if(item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice){let updatedAnswers=[...response.answer||[]];newResponseAnswer.length===0?updatedAnswers.splice(props.index,1):updatedAnswers[props.index]=newResponseAnswer[0],formState.onChangeAnswer(props.context,props.item,updatedAnswers)}else formState.onChangeAnswer(props.context,props.item,newResponseAnswer)}let type=item.type;if(!type)return null;let name=item.linkId;if(!name)return null;let inputId=item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice?`${name}-${props.index}`:name,initial;item.initial&&item.initial.length>0?initial=item.initial[0]:item.answerOption&&item.answerOption.length>0&&(initial=item.answerOption.find(option=>option.initialSelected));let defaultValue2=getCurrentAnswer(response,props.index)??getItemInitialValue(initial),validationError=getExtension(response,`${HTTP_HL7_ORG3}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx102("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx102(CheckboxFormSection,{title:props.item.text,htmlFor:inputId,children:jsx102(Checkbox5,{id:inputId,name,required:props.required??item.required,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueBoolean:e.currentTarget.checked}])})},props.item.linkId);break;case QuestionnaireItemType.decimal:formComponent=jsx102(TextInput21,{type:"number",step:"any",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueDecimal:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.integer:formComponent=jsx102(TextInput21,{type:"number",step:1,id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueInteger:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.date:formComponent=jsx102(TextInput21,{type:"date",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueDate:e.currentTarget.value}])});break;case QuestionnaireItemType.dateTime:formComponent=jsx102(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case QuestionnaireItemType.time:formComponent=jsx102(TextInput21,{type:"time",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueTime:e.currentTarget.value}])});break;case QuestionnaireItemType.string:case QuestionnaireItemType.url:formComponent=jsx102(TextInput21,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.text:formComponent=jsx102(Textarea3,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.attachment:formComponent=jsx102(Group30,{py:4,children:jsx102(AttachmentInput,{path:"",name:inputId,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case QuestionnaireItemType.reference:formComponent=jsx102(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=jsx102(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=jsx102(QuestionnaireCheckboxInput,{...sharedProps}):widget==="drop-down"?formComponent=jsx102(QuestionnaireDropdownInput,{...sharedProps}):formComponent=jsx102(QuestionnaireRadioButtonInput,{...sharedProps})}break;default:return null}return jsxs61(Fragment32,{children:[formComponent,validationError?.valueString&&jsx102(Text22,{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 jsx102(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||multiselect;if(item.answerValueSet)return jsx102(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 jsx102(MultiSelect,{data:data2,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[typedValueToString(initialValue)],required,onChange:selected=>{if(selected.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(selected,propertyName,item);onChangeAnswer(values)}}})}else{let data2=[""];if(item.answerOption)for(let option of item.answerOption){let optionValue=getItemAnswerOptionValue(option);data2.push(typedValueToString(optionValue))}return jsx102(NativeSelect10,{id:name,name,required,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){onChangeAnswer([{}]);return}let option=item.answerOption[index-1],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize3(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])},defaultValue:formatCoding2(defaultValue2?.value)||defaultValue2?.value,data:data2})}}function getValueSetOptions(valueSetUrl,medplum){return valueSetUrl?medplum.valueSetExpand({url:valueSetUrl,count:MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS+1}).then(valueSet=>valueSet.expansion?.contains??[]):Promise.resolve([])}function useValueSetOptions(valueSetUrl){let medplum=useMedplum29(),[valueSetOptions,setValueSetOptions]=useState58([]),[isLoading,setIsLoading]=useState58(!1);return useEffect20(()=>{async function loadValueSet(){if(valueSetUrl){setIsLoading(!0);try{let options=await getValueSetOptions(valueSetUrl,medplum);setValueSetOptions(options)}catch(err){console.error("Error loading value set:",err)}finally{setIsLoading(!1)}}}loadValueSet().catch(console.error)},[valueSetUrl,medplum]),[valueSetOptions,isLoading]}function getOptionsFromValueSet(valueSetOptions,name){return valueSetOptions.map((option,i)=>{let optionName=`${name}-valueset-${i}`,optionValue={type:"Coding",value:{system:option.system,code:option.code,display:option.display}};return[optionName,optionValue]})}function QuestionnaireRadioButtonInput(props){let{name,item,required,initial,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition("QuestionnaireItemAnswerOption","value[x]"),initialValue=getItemInitialValue(initial),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),options=[],defaultValue2;if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?(initialValue&&stringify2(optionValue)===stringify2(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return jsx102(Text22,{children:"Loading options..."});if(options.length===0)return jsx102(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs61(Fragment32,{children:[jsx102(Radio.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+capitalize3(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>jsx102(Radio,{id:optionName,value:optionName,py:4,required,label:jsx102(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)&&jsxs61(Text22,{size:"sm",c:"dimmed",mt:"xs",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function QuestionnaireCheckboxInput(props){let{name,item,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition("QuestionnaireItemAnswerOption","value[x]"),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),initialSelectedValues=item.answerValueSet?(response?.answer?.map(a=>a.valueCoding)||[]).filter(c=>c!==void 0):getCurrentMultiSelectAnswer(response),[selectedValues,setSelectedValues]=useState58(initialSelectedValues),options=[];if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?[optionName,optionValue]:null}).filter(option=>option!==null);options.push(...mappedOptions)}if(isLoading)return jsx102(Text22,{children:"Loading options..."});if(options.length===0)return jsx102(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS),handleCheckboxChange=(optionValue,selected)=>{if(item.answerValueSet){let currentCodings=selectedValues,newCodings;selected?newCodings=[...currentCodings,optionValue.value]:newCodings=currentCodings.filter(c=>!deepEquals(c,optionValue.value)),setSelectedValues(newCodings),newCodings.length===0?onChangeAnswer([{}]):onChangeAnswer(newCodings.map(coding=>({valueCoding:coding})))}else{let currentValues=selectedValues,optionValueStr=typedValueToString(optionValue),newValues;if(selected?newValues=[...currentValues,optionValueStr]:newValues=currentValues.filter(v=>v!==optionValueStr),setSelectedValues(newValues),newValues.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(newValues,"value"+capitalize3(optionValue.type),item);onChangeAnswer(values)}}};return jsxs61(Group30,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=typedValueToString(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>deepEquals(coding,optionValue.value)):selectedValues.includes(optionValueStr);return jsx102(Checkbox5,{id:optionName,label:jsx102(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)&&jsxs61(Text22,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx102(TextInput21,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){return getItemAnswerOptionValue(response?.answer?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response?.answer;return results?results.map(a=>getItemAnswerOptionValue(a)).map(type=>formatCoding2(type?.value)||type?.value).filter(Boolean):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals(option[1].value,defaultAnswer?.value))?.[0]}var choiceTypes=["drop-down","radio-button","check-box"];function resolveChoiceControl(item){let widget="radio-button",multiselect=!1;item.answerValueSet&&(widget="drop-down");for(let ext of item.extension??[]){if(ext.url!==QUESTIONNAIRE_ITEM_CONTROL_URL)continue;let code=ext.valueCodeableConcept?.coding?.[0]?.code;choiceTypes.includes(code)&&(widget=code),code==="multi-select"&&(multiselect=!0)}return widget==="radio-button"&&multiselect&&(widget="check-box"),{widget,multiselect}}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize3(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}import{Anchor as Anchor10}from"@mantine/core";import{Fragment as Fragment33,jsx as jsx103,jsxs as jsxs62}from"react/jsx-runtime";function QuestionnaireFormRepeatableGroup(props){return jsxs62(Fragment33,{children:[props.responseItems.map(response=>jsx103(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),jsx103(Anchor10,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}import{Anchor as Anchor11,Stack as Stack21}from"@mantine/core";import{QuestionnaireItemType as QuestionnaireItemType2}from"@medplum/react-hooks";import{jsx as jsx104,jsxs as jsxs63}from"react/jsx-runtime";function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,isChoiceType=item.type===QuestionnaireItemType2.choice||item.type===QuestionnaireItemType2.openChoice,showAddButton=!isChoiceType,answers=!isChoiceType&&responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return jsxs63(FormSection,{title:props.item.text,withAsterisk:props.item.required,children:[jsx104(Stack21,{gap:"xs",children:answers?.map((_,index)=>jsx104(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&jsx104(Anchor11,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}import{jsx as jsx105,jsxs as jsxs64}from"react/jsx-runtime";function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props,isTopLevel=context.length===0,hasRenderedSection=!1;return jsx105(Stack22,{gap:"xl",children:items.map((item,index)=>{if(!isQuestionEnabled(item,formState.questionnaireResponse))return null;let isGroup=item.type===QuestionnaireItemType3.group,showSectionDivider=isTopLevel&&isGroup&&hasRenderedSection;if(isGroup&&(hasRenderedSection=!0),item.type===QuestionnaireItemType3.display)return jsx105("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===QuestionnaireItemType3.group&&item.repeats?jsxs64(Fragment34,{children:[showSectionDivider&&jsx105(Divider6,{color:"var(--mantine-color-gray-2)"}),jsx105(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems})]},`repeating-group-${item.id}-${index}`):item.type===QuestionnaireItemType3.group?jsxs64(Fragment34,{children:[showSectionDivider&&jsx105(Divider6,{color:"var(--mantine-color-gray-2)"}),jsx105(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]})]},`group-${item.id}-${index}`):item.type===QuestionnaireItemType3.boolean?jsx105(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?jsx105(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):jsx105(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:jsx105(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}import{Button as Button11,Group as Group31,Stepper}from"@mantine/core";import{Fragment as Fragment35,jsx as jsx106,jsxs as jsxs65}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 jsxs65(Fragment35,{children:[jsx106(Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>jsx106(Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&jsxs65(Group31,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx106(Button11,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&jsx106(Button11,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&jsx106(SubmitButton,{children:submitButtonText??"Submit"})]})]})}import{Fragment as Fragment36,jsx as jsx107,jsxs as jsxs66}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum30(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=useState59(!1),propsRef=useRef13(props),pendingChangeRef=useRef13(void 0);useLayoutEffect3(()=>{propsRef.current=props});let onFormChange=useCallback13(response=>{pendingChangeRef.current=response},[]),formState=useQuestionnaireForm({questionnaire:props.questionnaire,defaultValue:props.questionnaireResponse,subject:props.subject,encounter:props.encounter,source:props.source,disablePagination:props.disablePagination,onChange:onFormChange}),formStateRef=useRef13(formState);useLayoutEffect3(()=>{formStateRef.current=formState}),useEffect21(()=>{let pendingChange=pendingChangeRef.current;pendingChange&&(pendingChangeRef.current=void 0,setSignatureRequiredSubmitted(!1),propsRef.current.onChange?.(pendingChange))});let isSignatureRequired=useMemo27(()=>formState.loading?!1:!!getExtension2(formState.questionnaire,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=useMemo27(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=useCallback13(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire2=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=createReference5(profile))}onSubmit({...response,questionnaire:questionnaire2.url??getReferenceString7(questionnaire2),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:jsxs66(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&jsx107(Title11,{order:1,fz:"1.625rem",fw:700,lh:1.3,mb:"xl",children:formState.questionnaire.title}),props.afterHeader&&jsxs66(Stack23,{gap:"xl",mb:"xl",children:[props.afterHeader,jsx107(Divider7,{color:"var(--mantine-color-gray-2)"})]}),formState.pagination?jsx107(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:jsx107(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):jsxs66(Fragment36,{children:[jsx107(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&jsxs66(Stack23,{mt:"md",gap:0,children:[jsx107(Text23,{size:"sm",fw:500,children:"Signature"}),jsx107(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&jsx107(Text23,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&jsx107(Group32,{justify:"flex-end",mt:"xl",gap:"xs",children:jsx107(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}import{jsx as jsx108,jsxs as jsxs67}from"react/jsx-runtime";var NewTopicDialog=props=>{let{subject,opened,onClose,onSubmit,allowPatientSelection=!1}=props,medplum=useMedplum31(),profile=useMedplumProfile7(),profileRef=useMemo28(()=>profile?createReference6(profile):void 0,[profile]),[topic,setTopic]=useState60(""),[practitioners,setPractitioners]=useState60(profile?.resourceType==="Practitioner"?[createReference6(profile)]:[]),[patient,setPatient]=useState60(subject?createReference6(subject):void 0),initialResponse=useMemo28(()=>{if(profile?.resourceType==="Practitioner")return{resourceType:"QuestionnaireResponse",status:"in-progress",item:[{linkId:"q1",answer:[{valueReference:createReference6(profile)}]}]}},[profile]);return jsx108(Modal3,{opened,onClose,title:"New Message",size:"md",children:jsxs67(Stack24,{gap:"xl",children:[jsxs67(Stack24,{gap:0,children:[jsx108(Text24,{fw:500,children:"Patient"}),allowPatientSelection&&jsx108(Text24,{c:"dimmed",children:"Select a patient"}),jsx108(ResourceInput,{resourceType:"Patient",name:"patient",required:!0,defaultValue:patient,disabled:!allowPatientSelection&&!!patient,onChange:value=>{setPatient(value?createReference6(value):void 0)}})]}),jsxs67(Stack24,{gap:0,children:[jsx108(Text24,{fw:500,children:"Practitioner (optional)"}),jsx108(Text24,{c:"dimmed",children:"Select one or more practitioners"}),jsx108(QuestionnaireForm,{questionnaire,questionnaireResponse:initialResponse,excludeButtons:!0,onChange:value=>{let references=value.item?.[0].answer?.map(item=>item.valueReference).filter(ref=>ref!==void 0)??[];setPractitioners(references)}})]}),jsxs67(Stack24,{gap:0,children:[jsx108(Text24,{fw:500,children:"Topic (optional)"}),jsx108(Text24,{c:"dimmed",children:"Enter a topic for the message"}),jsx108(TextInput22,{placeholder:"Enter your topic",value:topic,onChange:e=>setTopic(e.target.value)})]}),jsx108(Button12,{onClick:async()=>{if(!patient){showNotification7({title:"Error",message:"Please select a patient",color:"red"});return}let communication={resourceType:"Communication",status:"in-progress",subject:patient,sender:profileRef,recipient:[patient,...practitioners.map(practitioner=>({reference:practitioner.reference}))],topic:{text:topic}};try{let createdCommunication=await medplum.createResource(communication);onSubmit?.(createdCommunication),onClose()}catch(error){showNotification7({title:"Error",message:normalizeErrorString8(error),color:"red"})}},children:"Next"})]})})},questionnaire={resourceType:"Questionnaire",status:"active",item:[{linkId:"q1",type:"reference",repeats:!0,extension:[{url:`${HTTP_HL7_ORG4}/fhir/StructureDefinition/questionnaire-referenceResource`,valueCodeableConcept:{coding:[{system:`${HTTP_HL7_ORG4}/fhir/fhir-types`,display:"Practitioner",code:"Practitioner"}]}}]}]};import{ActionIcon as ActionIcon9,Checkbox as Checkbox6,CloseButton as CloseButton2,Group as Group33,Indicator,Popover as Popover2,Stack as Stack25,Text as Text25,TextInput as TextInput23,Tooltip as Tooltip4}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback3,useDisclosure}from"@mantine/hooks";import{showNotification as showNotification8}from"@mantine/notifications";import{createReference as createReference7,formatHumanName as formatHumanName7,getReferenceString as getReferenceString8,normalizeErrorString as normalizeErrorString9}from"@medplum/core";import{useMedplum as useMedplum32,useMedplumProfile as useMedplumProfile8,useResource as useResource3}from"@medplum/react-hooks";import{useEffect as useEffect22,useMemo as useMemo29,useState as useState61}from"react";var ParticipantFilter_default={participantItem:"ParticipantFilter_participantItem"};import{jsx as jsx109,jsxs as jsxs68}from"react/jsx-runtime";function ParticipantFilter(props){let{selectedParticipants,onFilterChange}=props,[opened,{open,close}]=useDisclosure(!1),[searchQuery,setSearchQuery]=useState61(""),[searchResults,setSearchResults]=useState61([]),[isSearching,setIsSearching]=useState61(!1),medplum=useMedplum32(),profile=useMedplumProfile8(),currentUserParticipant=useMemo29(()=>{if(profile)return createReference7(profile)},[profile]),additionalParticipants=useMemo29(()=>{let currentUserRef=currentUserParticipant?.reference;return selectedParticipants.filter(p=>p.reference!==currentUserRef)},[selectedParticipants,currentUserParticipant]),debouncedSearch=useDebouncedCallback3(async query=>{if(!query.trim()){setSearchResults([]);return}setIsSearching(!0);try{let bundle=await medplum.search("Patient",{_type:"Patient,Practitioner",name:query,_count:"10"}),currentUserRef=currentUserParticipant?.reference,results=(bundle.entry??[]).map(entry=>entry.resource).filter(resource=>{if(!resource)return!1;let refString=getReferenceString8(resource);return!!refString&&refString!==currentUserRef}).map(resource=>createReference7(resource));setSearchResults(results)}catch(error){showNotification8({title:"Error",message:normalizeErrorString9(error),color:"red"}),setSearchResults([])}finally{setIsSearching(!1)}},300);useEffect22(()=>(debouncedSearch(searchQuery),debouncedSearch.cancel),[searchQuery,debouncedSearch]);let isSelected=participant=>selectedParticipants.some(p=>p.reference===participant.reference),toggleParticipant=participant=>{let newParticipants=isSelected(participant)?selectedParticipants.filter(p=>p.reference!==participant.reference):[...selectedParticipants,participant];onFilterChange(newParticipants)},removeParticipant=participant=>{let newParticipants=selectedParticipants.filter(p=>p.reference!==participant.reference);onFilterChange(newParticipants)},displayParticipants=useMemo29(()=>{let result=[];for(let p of additionalParticipants)result.some(r2=>r2.reference===p.reference)||result.push(p);if(searchQuery.trim()&&searchResults.length>0)for(let p of searchResults)currentUserParticipant?.reference!==p.reference&&(result.some(r2=>r2.reference===p.reference)||result.push(p));return result},[additionalParticipants,searchQuery,searchResults,currentUserParticipant]),hasActiveFilter=selectedParticipants.length>0;return jsxs68(Popover2,{opened,onChange:o=>!o&&close(),position:"bottom-start",width:360,shadow:"md",radius:"md",withinPortal:!0,children:[jsx109(Popover2.Target,{children:jsx109(Tooltip4,{label:"Message Participants",position:"bottom",openDelay:500,disabled:opened,children:jsx109(Indicator,{disabled:!hasActiveFilter,color:"blue",size:8,offset:4,children:jsx109(ActionIcon9,{variant:"transparent",onClick:opened?close:open,radius:"xl",size:32,className:"outline-icon-button","data-opened":opened||void 0,children:jsx109(IconUsers,{size:16})})})})}),jsx109(Popover2.Dropdown,{p:"md",children:jsxs68(Stack25,{gap:"md",children:[jsx109(Text25,{size:"xs",c:"dimmed",fw:500,children:"Message Participants"}),jsx109(TextInput23,{placeholder:"Search for a Patient or Practitioner...",value:searchQuery,autoFocus:!0,onChange:e=>setSearchQuery(e.target.value),rightSection:searchQuery?jsx109(CloseButton2,{size:"sm",onClick:()=>setSearchQuery("")}):null}),jsxs68(Stack25,{gap:"xs",mah:250,style:{overflowY:"auto"},children:[currentUserParticipant&&jsx109(ParticipantItem,{participant:currentUserParticipant,isSelected:isSelected(currentUserParticipant),isCurrentUser:!0,onToggle:()=>toggleParticipant(currentUserParticipant)}),displayParticipants.map(participant=>jsx109(ParticipantItem,{participant,isSelected:isSelected(participant),isCurrentUser:!1,onToggle:()=>toggleParticipant(participant),onRemove:isSelected(participant)?()=>removeParticipant(participant):void 0},participant.reference)),isSearching&&jsx109(Text25,{size:"sm",c:"dimmed",ta:"center",children:"Searching..."}),searchQuery.trim()&&!isSearching&&searchResults.length===0&&jsx109(Text25,{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?jsxs68(Group33,{justify:"space-between",wrap:"nowrap",className:ParticipantFilter_default.participantItem,children:[jsxs68(Group33,{gap:"sm",wrap:"nowrap",style:{flex:1,minWidth:0},children:[jsx109(Checkbox6,{checked:isSelected,onChange:onToggle}),jsx109(ResourceAvatar,{value:participant,radius:"xl",size:32}),jsxs68(Text25,{size:"sm",truncate:!0,style:{flex:1},children:[formatHumanName7(patientResource?.name?.[0]??{}),isCurrentUser&&jsxs68(Text25,{component:"span",c:"dimmed",size:"sm",children:[" ","(you)"]})]})]}),onRemove&&jsx109(CloseButton2,{size:"sm",onClick:onRemove})]}):null}import{ActionIcon as ActionIcon12,Box as Box22,Button as Button13,Center as Center4,Divider as Divider11,Flex as Flex20,Group as Group52,Menu as Menu5,Pagination,Paper as Paper4,ScrollArea as ScrollArea3,Skeleton as Skeleton2,Stack as Stack38,Tabs,Text as Text41,ThemeIcon,Tooltip as Tooltip7}from"@mantine/core";import{useDisclosure as useDisclosure10}from"@mantine/hooks";import{showNotification as showNotification9}from"@mantine/notifications";import{getReferenceString as getReferenceString10,normalizeErrorString as normalizeErrorString11,Operator,parseSearchRequest}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate5,useThreadInbox}from"@medplum/react-hooks";import{useCallback as useCallback24,useEffect as useEffect26,useMemo as useMemo34}from"react";import{Divider as Divider9,Flex as Flex19,Group as Group50,Stack as Stack35,Text as Text39,Tooltip as Tooltip6}from"@mantine/core";import{formatHumanName as formatHumanName8,resolveId}from"@medplum/core";import{useMedplum as useMedplum41,usePatientSummaryData,useResource as useResource8}from"@medplum/react-hooks";import{useEffect as useEffect25,useMemo as useMemo33,useState as useState76}from"react";var PatientSummary_default={panel:"PatientSummary_panel",patientSummaryBadge:"PatientSummary_patientSummaryBadge",patientSummaryAddButton:"PatientSummary_patientSummaryAddButton",patientSummaryHeader:"PatientSummary_patientSummaryHeader",patientSummaryCollapseIcon:"PatientSummary_patientSummaryCollapseIcon",collapsed:"PatientSummary_collapsed"};import{Stack as Stack34}from"@mantine/core";import{calculateAgeString,formatAddress as formatAddress3}from"@medplum/core";import{Box as Box14,Flex as Flex12,Group as Group36,Modal as Modal4,Text as Text27}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{getDisplayString as getDisplayString5}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback15,useMemo as useMemo30,useState as useState64}from"react";import{Badge}from"@mantine/core";import{jsx as jsx110}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 jsx110(Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}import{Group as Group34,Stack as Stack26,TextInput as TextInput24}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,addProfileToResource,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback14,useState as useState62}from"react";import{jsx as jsx111,jsxs as jsxs69}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG5+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState62(allergy?.code),[clinicalStatus,setClinicalStatus]=useState62(allergy?.clinicalStatus),handleSubmit=useCallback14(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference8(patient),encounter:encounter?createReference8(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0},PATIENT_ALLERGY_PROFILE))},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx111(Form,{onSubmit:handleSubmit,children:jsxs69(Stack26,{children:[jsx111(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}),jsx111(TextInput24,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx111(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG5+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx111(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx111(Group34,{justify:"flex-end",gap:4,mt:"md",children:jsx111(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon10,Box as Box12,Collapse,Group as Group35,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 jsx112,jsxs as jsxs70}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState63(!1);return jsxs70(Box12,{className:CollapsibleSection_default.root,children:[jsxs70(Group35,{justify:"space-between",className:CollapsibleSection_default.header,children:[jsxs70(Group35,{gap:8,children:[jsx112(ActionIcon10,{variant:"subtle",onClick:()=>setCollapsed(c=>!c),"aria-label":collapsed?`Show ${title.toLowerCase()}`:`Hide ${title.toLowerCase()}`,className:CollapsibleSection_default.chevron,"data-collapsed":collapsed||void 0,size:"md",children:jsx112(IconChevronDown,{size:20})}),jsx112(Text26,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx112(ActionIcon10,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx112(IconPlus,{size:18})})]}),jsx112(Collapse,{in:!collapsed,children:jsx112(Box12,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}import{ActionIcon as ActionIcon11,Box as Box13}from"@mantine/core";var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};import{jsx as jsx113,jsxs as jsxs71}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs71(Box13,{className:SummaryItem_default.item,onClick,children:[children,jsx113("div",{className:SummaryItem_default.gradient}),jsx113("div",{className:SummaryItem_default.container,children:jsx113(ActionIcon11,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx113(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment37,jsx as jsx114,jsxs as jsxs72}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum33(),{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=useCallback15(async allergy=>{if(allergy.id){let updatedAllergy=await medplum.updateResource(allergy);setAllergies(allergies.map(a=>a.id===updatedAllergy.id?updatedAllergy:a))}else{let newAllergy=await medplum.createResource(allergy);setAllergies([...allergies,newAllergy])}setEditAllergy(void 0),close()},[medplum,allergies,close]);return jsxs72(Fragment37,{children:[jsx114(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx114(Box14,{children:jsx114(Flex12,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx114(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs72(Box14,{children:[jsx114(Text27,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString5(allergy)}),jsx114(Group36,{mt:2,gap:4,children:status&&jsx114(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx114(Text27,{children:"(none)"})}),jsx114(Modal4,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx114(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 Box15,Flex as Flex13,Group as Group37,Text as Text28}from"@mantine/core";import{formatDate}from"@medplum/core";import{useResource as useResource4}from"@medplum/react-hooks";import{jsx as jsx115,jsxs as jsxs73}from"react/jsx-runtime";function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=useResource4(coverage),organizationResource=useResource4(organization),payorName="Unknown Payor";organizationResource&&"name"in organizationResource&&typeof organizationResource.name=="string"&&(payorName=organizationResource.name);let detailsText=`ID: ${coverageResource?.subscriberId??"N/A"}${formatClassInfo(coverageResource)?` \xB7 ${formatClassInfo(coverageResource)}`:""}`;return jsx115(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs73(Box15,{children:[jsx115(Text28,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx115(Text28,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs73(Group37,{mt:2,gap:4,children:[jsx115(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs73(Text28,{size:"xs",fw:500,color:"gray.6",children:["Ends ",formatDate(coverageResource?.period?.end)]})]})]})})}function Insurance(props){let{coverages,onClickResource}=props,activeCoverages=coverages.filter(coverage=>coverage.status==="active"&&!coverage.type?.coding?.some(coding=>coding.code==="SELFPAY"));return jsx115(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx115(Flex13,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx115(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx115(Text28,{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 Box16,Flex as Flex14,Group as Group40,Modal as Modal5,Text as Text31}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{formatDate as formatDate2,getDisplayString as getDisplayString7}from"@medplum/core";import{useState as useState67}from"react";import{Divider as Divider8,Group as Group39,List,Stack as Stack28,Text as Text30,Title as Title12}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime2,formatObservationValue,isReference as isReference3}from"@medplum/core";import{useMedplum as useMedplum34,useResource as useResource6}from"@medplum/react-hooks";import{useEffect as useEffect23,useState as useState66}from"react";import{Blockquote,Stack as Stack27}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx116}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx116(Stack27,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx116(Blockquote,{classNames:{cite:NoteDisplay_default.noteCite,root:NoteDisplay_default.noteRoot},cite:note.authorReference?.display||note.authorString,icon:null,children:note.text},`note-${note.text}`))}):null}import{Group as Group38}from"@mantine/core";import{Text as Text29}from"@mantine/core";import{getDisplayString as getDisplayString6,isOk,normalizeErrorString as normalizeErrorString10}from"@medplum/core";import{useResource as useResource5}from"@medplum/react-hooks";import{useState as useState65}from"react";import{jsx as jsx117}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState65(),resource=useResource5(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString10(outcome)}]`;else if(resource)text=getDisplayString6(resource);else return null;return link?jsx117(MedplumLink,{to:value,...rest,children:text}):jsx117(Text29,{component:"span",...rest,children:text})}import{jsx as jsx118,jsxs as jsxs74}from"react/jsx-runtime";function ResourceBadge(props){return jsxs74(Group38,{gap:"xs",children:[jsx118(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx118(ResourceName,{value:props.value,link:props.link})]})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment38,jsx as jsx119,jsxs as jsxs75}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum34(),diagnosticReport=useResource6(props.value),[specimens,setSpecimens]=useState66();if(useEffect23(()=>{diagnosticReport?.specimen&&Promise.allSettled(diagnosticReport.specimen.map(ref=>medplum.readReference(ref))).then(outcomes=>outcomes.filter(outcome=>outcome.status==="fulfilled").map(outcome=>outcome.value)).then(setSpecimens).catch(console.error)},[medplum,diagnosticReport]),!diagnosticReport)return null;let specimenNotes=specimens?.flatMap(spec=>spec.note||[])||[];if(diagnosticReport.presentedForm&&diagnosticReport.presentedForm.length>0){let pf=diagnosticReport.presentedForm[0];pf.contentType?.startsWith("text/plain")&&pf.data&&specimenNotes.push({text:window.atob(pf.data)})}return jsxs75(Stack28,{children:[jsx119(Title12,{children:"Diagnostic Report"}),jsx119(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx119(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx119(NoteDisplay,{value:specimenNotes}),diagnosticReport.conclusion&&jsxs75(Stack28,{mt:"md",children:[jsx119(Text30,{fw:500,size:"sm",c:"dimmed",children:"Conclusion"}),jsx119(Text30,{children:diagnosticReport.conclusion})]})]})}function DiagnosticReportHeader({value,hideSubject=!1}){let showSubject=!!(value.subject&&!hideSubject),hasLeftColumn=showSubject||!!value.resultsInterpreter?.length,hasRightColumn=!!(value.performer?.length||value.issued||value.status);return jsxs75(Group39,{mt:"md",gap:"xl",align:"stretch",wrap:"nowrap",children:[hasLeftColumn&&jsxs75(Stack28,{gap:"md",style:{flex:1},children:[showSubject&&jsx119(HeaderField,{label:"Subject",children:jsx119(ResourceBadge,{value:value.subject,link:!0})}),value.resultsInterpreter?.map(interpreter=>jsx119(HeaderField,{label:"Interpreter",children:jsx119(ResourceBadge,{value:interpreter,link:!0})},interpreter.reference))]}),hasLeftColumn&&hasRightColumn&&jsx119(Divider8,{orientation:"vertical"}),hasRightColumn&&jsxs75(Stack28,{gap:"md",style:{flex:1},children:[value.performer?.map(performer=>jsx119(HeaderField,{label:"Performer",children:jsx119(PerformerDisplay,{value:performer})},performer.reference)),value.issued&&jsx119(HeaderField,{label:"Issued",children:jsx119(Text30,{children:formatDateTime2(value.issued)})}),value.status&&jsx119(HeaderField,{label:"Status",children:jsx119(StatusBadge,{status:value.status})})]})]})}function HeaderField({label,children}){return jsxs75(Group39,{gap:"md",align:"flex-start",wrap:"nowrap",children:[jsx119(Text30,{c:"dimmed",w:110,style:{flexShrink:0},children:label}),jsx119("div",{children})]})}function PerformerDisplay({value}){let performer=useResource6(value),address=performer?.resourceType==="Organization"?performer.address?.[0]:void 0;return jsxs75(Fragment38,{children:[jsx119(ResourceBadge,{value,link:!0}),address&&jsx119(Text30,{size:"sm",c:"dimmed",mt:4,ml:34,children:jsx119(AddressDisplay,{value:address})})]})}function SpecimenInfo(specimens){return jsxs75(Stack28,{gap:"xs",children:[jsx119(Title12,{order:2,size:"h6",children:"Specimens"}),jsx119(List,{type:"ordered",children:specimens?.map(specimen=>jsx119(List.Item,{ml:"sm",children:jsxs75(Group39,{gap:20,children:[jsxs75(Group39,{gap:5,children:[jsx119(Text30,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs75(Group39,{gap:5,children:[jsx119(Text30,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs75("table",{className:DiagnosticReportDisplay_default.table,children:[jsx119("thead",{children:jsxs75("tr",{children:[jsx119("th",{children:"Test"}),jsx119("th",{children:"Value"}),jsx119("th",{children:"Reference Range"}),jsx119("th",{children:"Interpretation"}),jsx119("th",{children:"Category"}),jsx119("th",{children:"Performer"}),jsx119("th",{children:"Status"})]})}),jsx119("tbody",{children:jsx119(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx119(Fragment38,{children:props.value?.map(observation=>jsx119(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference3(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource6(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs75(Fragment38,{children:[jsxs75("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx119("td",{rowSpan:displayNotes?2:1,children:jsx119(MedplumLink,{to:observation,children:jsx119(CodeableConceptDisplay,{value:observation.code})})}),jsx119("td",{children:jsx119(ObservationValueDisplay,{value:observation})}),jsx119("td",{children:jsx119(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx119("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx119(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx119("td",{children:observation.category&&observation.category.length>0&&jsx119(Fragment38,{children:observation.category.map(concept=>jsx119("div",{children:jsx119(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx119("td",{children:observation.performer?.map(performer=>jsx119(ReferenceDisplay,{value:performer},performer.reference))}),jsx119("td",{children:observation.status&&jsx119(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx119(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx119("tr",{children:jsx119("td",{colSpan:6,children:jsx119(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx119(Fragment38,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx119(Fragment38,{children:range.text}):jsx119(RangeDisplay,{value:range}):null}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;return code==="AA"||code==="LL"||code==="HH"||code==="A"}import{Fragment as Fragment39,jsx as jsx120,jsxs as jsxs76}from"react/jsx-runtime";function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=useState67(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=useDisclosure3(!1),diagnosticReportsRequests=new Set,filteredDiagnosticReports=diagnosticReports.filter(report=>{let flag=isLaboratoryReport(report);return flag&&report.basedOn&&report.basedOn.forEach(basedOn=>{if(basedOn.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn.reference.split("/");diagnosticReportsRequests.add(id)}}),flag}),completedRequisitionNumbers=new Set,filteredServiceRequests=serviceRequests.filter(request=>{if(request.id&&diagnosticReportsRequests.has(request.id)||request.basedOn&&request.basedOn.find(basedOn2=>{if(basedOn2.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn2.reference.split("/");return diagnosticReportsRequests.has(id)}return!1}))return!1;let shouldFilter=shouldFilterRequest(request,completedRequisitionNumbers);return!shouldFilter&&request.requisition?.value&&completedRequisitionNumbers.add(request.requisition?.value),!shouldFilter}),handleDiagnosticReportClick=report=>{setSelectedReport(report),openReportDialog()};return jsxs76(Fragment39,{children:[jsx120(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:jsxs76(Flex14,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>jsx120(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:jsxs76(Box16,{children:[jsx120(Text31,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(serviceRequest)}),jsxs76(Group40,{mt:2,gap:4,children:[serviceRequest.status&&jsx120(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),jsx120(Text31,{size:"xs",fw:500,c:"dimmed",children:formatDate2(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>jsx120(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:jsxs76(Box16,{children:[jsx120(Text31,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(report)}),jsxs76(Group40,{mt:2,gap:4,children:[report.status&&jsx120(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),jsx120(Text31,{size:"xs",fw:500,c:"dimmed",children:formatDate2(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&jsx120(Text31,{children:"(none)"})]})}),jsx120(Modal5,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&jsx120(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 Box17,Flex as Flex15,Group as Group42,Modal as Modal6,Text as Text32}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{formatCodeableConcept as formatCodeableConcept4,getDisplayString as getDisplayString8}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{useCallback as useCallback17,useState as useState69}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 Group41,Radio as Radio2,Stack as Stack29}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG6,addProfileToResource as addProfileToResource2,createReference as createReference9}from"@medplum/core";import{useMedplumProfile as useMedplumProfile9}from"@medplum/react-hooks";import{useCallback as useCallback16,useState as useState68}from"react";import{jsx as jsx121,jsxs as jsxs77}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile9(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState68(medication?.medicationCodeableConcept),handleSubmit=useCallback16(formData=>{if(!me)throw new Error("Not signed in");onSubmit(addProfileToResource2({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&createReference9(encounter)),requester:medication?.requester??createReference9(me),medicationCodeableConcept:code,subject:createReference9(patient)},HTTP_HL7_ORG6+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx121(Form,{onSubmit:handleSubmit,children:jsxs77(Stack29,{children:[jsx121(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}),jsx121(Radio2.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx121(Radio2,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx121(Group41,{justify:"flex-end",gap:4,children:jsx121(SubmitButton,{children:"Save"})})]})}):jsx121(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment40,jsx as jsx122,jsxs as jsxs78}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum35(),[medicationRequests,setMedicationRequests]=useState69(props.medicationRequests),[editMedication,setEditMedication]=useState69(),[opened,{open,close}]=useDisclosure4(!1),medications=[...medicationRequests,...props.medicationStatements??[]].sort(compareByLastUpdatedDescending),handleSubmit=useCallback17(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m=>m.id===updatedMedication.id?updatedMedication:m))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs78(Fragment40,{children:[jsx122(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medications.length>0?jsx122(Flex15,{direction:"column",gap:8,children:medications.map(medication=>jsx122(SummaryItem,{onClick:()=>{medication.resourceType==="MedicationRequest"?(setEditMedication(medication),open()):props.onClickResource?.(medication)},children:jsxs78(Box17,{children:[jsx122(Text32,{fw:500,className:SummaryItem_default.itemText,children:getMedicationDisplayString(medication)}),jsx122(Group42,{mt:2,gap:4,children:medication.status&&jsx122(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},`${medication.resourceType}/${medication.id}`))}):jsx122(Text32,{children:"(none)"})}),jsx122(Modal6,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx122(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?formatCodeableConcept4(medication.medicationCodeableConcept):getDisplayString8(medication)}import{Box as Box18,Group as Group43,Text as Text33,Tooltip as Tooltip5}from"@mantine/core";import{jsx as jsx123,jsxs as jsxs79}from"react/jsx-runtime";var PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return jsx123(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx123(Box18,{className:PatientSummary_default.patientSummaryListItem,children:jsx123(Tooltip5,{label,position:"top-start",openDelay:650,children:jsxs79(Group43,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,jsx123(Text33,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};import{capitalize as capitalize4,getExtension as getExtension3,HTTP_HL7_ORG as HTTP_HL7_ORG7}from"@medplum/core";function getGenderIdentity(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-ethnicity`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getGeneralPractitioner(patient){return patient.generalPractitioner?.[0]?.display}function formatPatientGenderDisplay(patient){let capitalizedGender=patient.gender?capitalize4(patient.gender):"",genderIdentity=getGenderIdentity(patient),birthSex=getBirthSex(patient),parts=[];return capitalizedGender&&parts.push(capitalizedGender),genderIdentity&&parts.push(genderIdentity),birthSex&&parts.push(`Born as ${birthSex}`),parts.join(" \xB7 ")}function formatPatientRaceEthnicityDisplay(patient){let race=getRace(patient),ethnicity=getEthnicity(patient),parts=[];return race&&parts.push(race),ethnicity&&parts.push(ethnicity),parts.join(" \xB7 ")}var getPreferredLanguage=patient=>{if(!patient.communication?.length)return;let preferred=patient.communication?.find(comm=>comm.preferred===!0);return preferred?.language?.coding?.[0]?.display?preferred.language.coding[0].display:patient.communication[0]?.language?.coding?.[0]?.display};import{Box as Box19,Flex as Flex16,Group as Group44,Loader as Loader5,Modal as Modal7,Text as Text34}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{formatAddress as formatAddress2,getReferenceString as getReferenceString9,OperationOutcomeError}from"@medplum/core";import{useMedplum as useMedplum36,useResource as useResource7}from"@medplum/react-hooks";import{useCallback as useCallback18,useEffect as useEffect24,useMemo as useMemo31,useState as useState70}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 Fragment41,jsx as jsx124,jsxs as jsxs80}from"react/jsx-runtime";function Pharmacies(props){let{patient:patientProp,onClickResource,pharmacyDialogComponent}=props,PharmacyDialogComponent=pharmacyDialogComponent,medplum=useMedplum36(),[opened,{open,close}]=useDisclosure5(!1),[resolvedPharmacies,setResolvedPharmacies]=useState70([]),[loadState,setLoadState]=useState70("loading"),patient=useResource7(patientProp),pharmacyRefs=useMemo31(()=>patient?getPreferredPharmaciesFromPatient(patient):[],[patient]);useEffect24(()=>{let cancelled=!1;return(async()=>{if(props.pharmacies){cancelled||(setResolvedPharmacies(props.pharmacies),setLoadState("loaded"));return}if(pharmacyRefs.length===0){cancelled||(setResolvedPharmacies([]),setLoadState("loaded"));return}setLoadState("loading");try{let results=await Promise.all(pharmacyRefs.map(async pharmacyRef=>{try{return{...await medplum.readReference(pharmacyRef.organizationRef),isPrimary:pharmacyRef.isPrimary}}catch(error){return isNotFoundError(error),null}}));if(!cancelled){let validResults=results.filter(result=>result!==null);setResolvedPharmacies(validResults),setLoadState(validResults.length===0&&pharmacyRefs.length>0?"error":"loaded")}}catch{cancelled||setLoadState("error")}})().catch(()=>{}),()=>{cancelled=!0}},[medplum,pharmacyRefs,props.pharmacies]);let handleSubmit=useCallback18(async _pharmacy=>{patient?.id&&medplum.invalidateUrl(getReferenceString9(patient)),close()},[medplum,patient,close]);return patient?jsxs80(Fragment41,{children:[jsx124(CollapsibleSection,{title:"Pharmacies",onAdd:pharmacyDialogComponent?open:void 0,children:loadState==="loading"?jsx124(Loader5,{size:"sm"}):loadState==="error"?jsx124(Text34,{c:"red",size:"sm",children:"Failed to load pharmacies"}):resolvedPharmacies.length===0?jsx124(Text34,{children:"(none)"}):jsx124(Box19,{children:jsx124(Flex16,{direction:"column",gap:8,children:resolvedPharmacies.map((pharmacy,index)=>jsx124(SummaryItem,{onClick:()=>onClickResource?.(pharmacy),children:jsxs80(Box19,{children:[jsx124(Text34,{fw:500,className:SummaryItem_default.itemText,children:pharmacy.name}),jsxs80(Group44,{mt:2,gap:4,children:[pharmacy.isPrimary&&jsx124(StatusBadge,{color:"blue",variant:"light",status:"primary"}),pharmacy.address?.[0]&&jsx124(Text34,{size:"xs",c:"dimmed",children:formatAddress2(pharmacy.address[0])})]})]})},pharmacy.id||index))})})}),PharmacyDialogComponent?jsx124(Modal7,{opened,onClose:close,title:"Add Pharmacy",size:"lg",children:jsx124(PharmacyDialogComponent,{patient,onSubmit:handleSubmit,onClose:close})}):null]}):jsx124(Fragment41,{})}function isNotFoundError(error){return error instanceof OperationOutcomeError?error.outcome.issue?.some(issue=>issue.code==="not-found")??!1:!1}import{Badge as Badge2,Box as Box20,Flex as Flex17,Group as Group46,Modal as Modal8,Text as Text35,UnstyledButton as UnstyledButton4}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{formatDate as formatDate3,getDisplayString as getDisplayString9}from"@medplum/core";import{useMedplum as useMedplum37}from"@medplum/react-hooks";import{useCallback as useCallback20,useMemo as useMemo32,useState as useState72}from"react";import{Group as Group45,Stack as Stack30}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG8,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference10}from"@medplum/core";import{useCallback as useCallback19,useState as useState71}from"react";import{jsx as jsx125,jsxs as jsxs81}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState71(condition?.code),[clinicalStatus,setClinicalStatus]=useState71(condition?.clinicalStatus),handleSubmit=useCallback19(formData=>{let updatedCondition=addProfileToResource3({...condition,resourceType:"Condition",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:createReference10(patient),encounter:encounter&&createReference10(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG8+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx125(Form,{onSubmit:handleSubmit,children:jsxs81(Stack30,{children:[jsx125(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG8+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx125(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG8+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx125(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx125(Group45,{justify:"flex-end",gap:4,mt:"md",children:jsx125(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment42,jsx as jsx126,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]=useState72(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=useState72(),[opened,{open,close}]=useDisclosure6(!1),[expandedGroups,setExpandedGroups]=useState72(()=>new Set),groupedProblems=useMemo32(()=>{let groups=new Map;for(let i=0;i<problems.length;i++){let problem=problems[i],key=getCodeKey(problem)??`ungrouped-${i}`,existing=groups.get(key);existing?existing.push(problem):groups.set(key,[problem])}return Array.from(groups.entries())},[problems]),toggleGroup=useCallback20(key=>{setExpandedGroups(prev=>{let next=new Set(prev);return next.has(key)?next.delete(key):next.add(key),next})},[]),handleSubmit=useCallback20(async condition=>{if(condition.id){let updatedCondition=await medplum.updateResource(condition);setProblems(problems.map(p=>p.id===updatedCondition.id?updatedCondition:p))}else{let newCondition=await medplum.createResource(condition);setProblems([newCondition,...problems])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs82(Fragment42,{children:[jsx126(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx126(Flex17,{direction:"column",gap:8,children:groupedProblems.map(([key,group],groupIndex)=>{let isExpanded=expandedGroups.has(key),displayProblems=isExpanded?group:[group[0]],groupContentId=`problem-group-content-${groupIndex}`;return jsxs82(Box20,{children:[jsx126(Flex17,{direction:"column",gap:4,id:groupContentId,children:displayProblems.map(problem=>jsx126(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs82(Box20,{children:[jsxs82(Group46,{gap:6,wrap:"nowrap",children:[jsx126(Text35,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString9(problem)}),!isExpanded&&group.length>1&&jsxs82(Badge2,{size:"xs",color:"gray",variant:"light",style:{flexShrink:0},children:["+",group.length-1]})]}),jsxs82(Group46,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx126(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx126(Text35,{size:"xs",fw:500,c:"dimmed",children:formatDate3(problem.onsetDateTime)})]})]})},problem.id))}),group.length>1&&jsx126(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)})}):jsx126(Text35,{children:"(none)"})}),jsx126(Modal8,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx126(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 Box21,Flex as Flex18,Group as Group47,Modal as Modal9,Radio as Radio3,Stack as Stack31,Text as Text36,UnstyledButton as UnstyledButton5}from"@mantine/core";import{useDisclosure as useDisclosure7}from"@mantine/hooks";import{createReference as createReference11,HTTP_HL7_ORG as HTTP_HL7_ORG9,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum38}from"@medplum/react-hooks";import{useCallback as useCallback21,useState as useState73}from"react";import{Fragment as Fragment43,jsx as jsx127,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]=useState73(props.sexualOrientation),[opened,{open,close}]=useDisclosure7(!1),[hoverIndex,setHoverIndex]=useState73(null),handleSubmit=useCallback21(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG9+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:createReference11(patient),encounter:encounter?createReference11(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:CodesToSystem[code],code:formData.sexualOrientation}],text:CodesToText[code]}}).then(newSexualOrientation=>{setSexualOrientation(newSexualOrientation),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs83(Fragment43,{children:[jsx127(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx127(Flex18,{direction:"column",gap:8,children:jsx127(Box21,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx127(UnstyledButton5,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx127(Box21,{pr:hoverIndex===0?24:0,children:jsx127(Text36,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx127(Text36,{children:"(none)"})}),jsx127(Modal9,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx127(Form,{onSubmit:handleSubmit,children:jsxs83(Stack31,{children:[jsx127(Radio3.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx127(Radio3,{value:code,label:text,my:"xs"},code))}),jsx127(Group47,{justify:"flex-end",gap:4,mt:"md",children:jsx127(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group48,Modal as Modal10,Radio as Radio4,Stack as Stack32,Text as Text37,UnstyledButton as UnstyledButton6}from"@mantine/core";import{useDisclosure as useDisclosure8}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG10,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference12,formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{useMedplum as useMedplum39}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState74}from"react";import{Fragment as Fragment44,jsx as jsx128,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]=useState74(props.smokingStatus),[opened,{open,close}]=useDisclosure8(!1),handleSubmit=useCallback22(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG10+"/fhir/us/core/StructureDefinition/us-core-smokingstatus"]},status:"final",category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC2,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference12(props.patient),encounter:props.encounter?createReference12(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED2,version:SNOMED2+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return jsxs84(Fragment44,{children:[jsx128(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx128(UnstyledButton6,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx128(Text37,{children:formatCodeableConcept5(smokingStatus.valueCodeableConcept)})}):jsx128(Text37,{children:"(none)"})}),jsx128(Modal10,{opened,onClose:close,title:"Set Smoking Status",children:jsx128(Form,{onSubmit:handleSubmit,children:jsxs84(Stack32,{children:[jsx128(Radio4.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx128(Radio4,{value:code,label:text,my:"xs"},code))}),jsx128(Group48,{justify:"flex-end",gap:4,mt:"md",children:jsx128(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group49,Modal as Modal11,SimpleGrid,Stack as Stack33,Text as Text38,Textarea as Textarea4,TextInput as TextInput25}from"@mantine/core";import{useDisclosure as useDisclosure9}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum40}from"@medplum/react-hooks";import{useCallback as useCallback23,useState as useState75}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference13}from"@medplum/core";function getObservationValue(obs,component){return component?obs.component?.find(c=>c.code?.coding?.[0].code===component)?.valueQuantity:obs.valueQuantity}function createObservation(patient,encounter,code,title,valueQuantity){if(isValidNumber(valueQuantity.value))return{...createBaseObservation(patient,encounter,code,title),valueQuantity}}function createCompoundObservation(patient,encounter,code,title,components){let component=components.filter(c=>isValidNumber(c.valueQuantity?.value));if(component.length!==0)return{...createBaseObservation(patient,encounter,code,title),component}}function createBaseObservation(patient,encounter,code,title){return{resourceType:"Observation",status:"preliminary",subject:createReference13(patient),encounter:encounter?createReference13(encounter):void 0,effectiveDateTime:new Date().toISOString(),category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"vital-signs",display:"Vital Signs"}]}],code:createLoincCode(code,title)}}function createLoincCode(code,display){return{coding:[{code,display,system:LOINC3}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!Number.isNaN(value)&&Number.isFinite(value)}import{Fragment as Fragment45,jsx as jsx129,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]=useState75(props.vitals),[opened,{open,close}]=useDisclosure9(!1),handleSubmit=useCallback23(formData=>{let newObservations=[];newObservations.push(createCompoundObservation(patient,encounter,BP,"Blood pressure",[{code:createLoincCode(SYSTOLIC,"Systolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.systolic),"mm[Hg]")},{code:createLoincCode(DIASTOLIC,"Diastolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.diastolic),"mm[Hg]")}]));for(let meta of LOINC_CODES)meta.component||newObservations.push(createObservation(patient,encounter,meta.code,meta.title,createQuantity(Number.parseFloat(formData[meta.name]),meta.unit)));Promise.all(newObservations.filter(Boolean).map(obs=>medplum.createResource(obs))).then(newVitals=>setVitals([...newVitals,...vitals])).catch(console.error),close()},[medplum,patient,encounter,vitals,close]);return jsxs85(Fragment45,{children:[jsx129(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx129(Stack33,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs85(Group49,{align:"center",children:[jsx129(Text38,{c:"dimmed",children:meta.short}),obs&&jsx129(Text38,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx129(Modal11,{opened,onClose:close,title:"Add Vitals",children:jsxs85(Form,{onSubmit:handleSubmit,children:[jsx129(SimpleGrid,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx129(TextInput25,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx129(Textarea4,{name:"notes",label:"Notes"}),jsx129(Group49,{justify:"flex-end",gap:4,mt:"md",children:jsx129(SubmitButton,{children:"Save"})})]})})]})}import{jsx as jsx130,jsxs as jsxs86}from"react/jsx-runtime";var DemographicsSection={key:"demographics",title:"Demographics",component:({patient,onClickResource})=>{let languageDisplay=getPreferredLanguage(patient);return jsxs86(Stack34,{gap:"xs",py:8,children:[jsx130(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${calculateAgeString(patient.birthDate)})`:void 0,icon:jsx130(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),jsx130(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:jsx130(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),jsx130(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:jsx130(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),jsx130(PatientInfoItem,{patient,value:patient.address?.[0]?formatAddress3(patient.address[0]):void 0,icon:jsx130(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),jsx130(PatientInfoItem,{patient,value:languageDisplay,icon:jsx130(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),jsx130(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:jsx130(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})=>jsx130(Insurance,{coverages:results.coverages||[],onClickResource})},AllergiesSection={key:"allergies",title:"Allergies",searches:[{key:"allergies",resourceType:"AllergyIntolerance",patientParam:"patient"}],component:({results,patient,onClickResource})=>jsx130(Allergies,{patient,allergies:results.allergies||[],onClickResource})},ProblemListSection={key:"problemList",title:"Problems",searches:[{key:"conditions",resourceType:"Condition",patientParam:"patient"}],component:({results,patient,onClickResource})=>jsx130(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})=>jsx130(Medications,{patient,medicationRequests:results.medicationRequests||[],medicationStatements:results.medicationStatements||[],onClickResource})};function createLabsSection(onRequestLabs){return{key:"labs",title:"Labs",searches:[{key:"serviceRequests",resourceType:"ServiceRequest",patientParam:"subject"},{key:"diagnosticReports",resourceType:"DiagnosticReport",patientParam:"subject"}],component:({results,patient,onClickResource})=>jsx130(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 jsx130(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 jsx130(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 jsx130(Vitals,{patient,vitals:observations,onClickResource})}};function createPharmaciesSection(pharmacyDialogComponent){return{key:"pharmacies",title:"Pharmacies",component:({patient,onClickResource})=>jsx130(Pharmacies,{patient,onClickResource,pharmacyDialogComponent})}}var PharmaciesSection=createPharmaciesSection();function getDefaultSections(onRequestLabs){return[DemographicsSection,InsuranceSection,AllergiesSection,ProblemListSection,MedicationsSection,createLabsSection(onRequestLabs),SexualOrientationSection,SmokingStatusSection,VitalsSection,PharmaciesSection]}import{Fragment as Fragment46,jsx as jsx131,jsxs as jsxs87}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum41(),{patient:propsPatient,onClickResource,onRequestLabs}=props,patient=useResource8(propsPatient),[createdDate,setCreatedDate]=useState76(),defaultSections=useMemo33(()=>getDefaultSections(onRequestLabs),[onRequestLabs]),sections=props.sections??defaultSections,{sectionData,loading,error}=usePatientSummaryData(propsPatient,sections);return useEffect25(()=>{let id=resolveId(propsPatient);id&&medplum.readHistory("Patient",id).then(history=>{let lastUpdated=history.entry?.[history.entry.length-1]?.resource?.meta?.lastUpdated;setCreatedDate(typeof lastUpdated=="string"?lastUpdated:"")}).catch(()=>{})},[propsPatient,medplum]),patient?jsxs87(Flex19,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs87(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs87(Group50,{align:"center",gap:"sm",p:16,children:[jsx131(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs87(Stack35,{gap:0,style:{flex:1,minWidth:0},children:[jsx131(Tooltip6,{label:formatHumanName8(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx131(Text39,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:formatHumanName8(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return jsxs87(Text39,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx131(Divider9,{})]}),jsxs87(Stack35,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:[error&&jsxs87(Text39,{c:"red",fz:"sm",children:["Error loading patient summary: ",error.message]}),!loading&§ions.length>0&&jsx131(Fragment46,{children:sections.map((section,index)=>{let SectionComponent=section.component;return jsxs87("div",{children:[jsx131(SectionComponent,{patient,onClickResource,results:sectionData[index]??{}}),jsx131(Divider9,{})]},section.key)})})]})]}):null}import{Divider as Divider10,Stack as Stack37}from"@mantine/core";import{Fragment as Fragment47}from"react";import{Group as Group51,Stack as Stack36,Text as Text40}from"@mantine/core";import{formatDateTime as formatDateTime3,formatHumanName as formatHumanName9}from"@medplum/core";import{useResource as useResource9}from"@medplum/react-hooks";var ChatListItem_default={content:"ChatListItem_content",contentContainer:"ChatListItem_contentContainer",selected:"ChatListItem_selected"};import{jsx as jsx132,jsxs as jsxs88}from"react/jsx-runtime";var ChatListItem=props=>{let{topic,lastCommunication,isSelected,getThreadUri}=props,patientResource=useResource9(topic.subject),patientName=formatHumanName9(patientResource?.name?.[0]),lastMsg=lastCommunication?.payload?.[0]?.contentString,trimmedMsg=lastMsg?.length&&lastMsg.length>100?lastMsg.slice(0,100)+"...":lastMsg,senderName=lastCommunication?.sender?.display?`${lastCommunication?.sender?.display}: `:"",content=trimmedMsg?`${senderName} ${trimmedMsg}`:"No messages available",topicName=topic.topic?.text??content;return jsx132(MedplumLink,{to:getThreadUri(topic),underline:"never",children:jsxs88(Group51,{p:"xs",align:"center",wrap:"nowrap",className:clsx_default(ChatListItem_default.contentContainer,{[ChatListItem_default.selected]:isSelected}),children:[jsx132(ResourceAvatar,{value:topic.subject,radius:"xl",size:36}),jsxs88(Stack36,{gap:0,children:[jsx132(Text40,{size:"sm",fw:700,truncate:"end",children:patientName}),jsx132(Text40,{size:"sm",fw:400,lineClamp:2,className:ChatListItem_default.content,children:topicName}),jsx132(Text40,{size:"xs",style:{marginTop:2},children:lastCommunication?formatDateTime3(lastCommunication.sent):""})]})]})})};import{jsx as jsx133,jsxs as jsxs89}from"react/jsx-runtime";var ChatList=props=>{let{threads,selectedCommunication,getThreadUri}=props;return jsx133(Stack37,{gap:0,children:threads.map(thread=>{let topicCommunication=thread[0],lastCommunication=thread[1],_isSelected=selectedCommunication?.id===topicCommunication.id;return jsxs89(Fragment47,{children:[jsx133(ChatListItem,{topic:topicCommunication,lastCommunication,isSelected:_isSelected,getThreadUri}),jsx133(Divider10,{})]},topicCommunication.id)})})};var ThreadInbox_default={container:"ThreadInbox_container",rightBorder:"ThreadInbox_rightBorder"};import{Fragment as Fragment48,jsx as jsx134,jsxs as jsxs90}from"react/jsx-runtime";function ThreadInbox(props){let{query,threadId,subject,showPatientSummary=!1,sections,onNew,getThreadUri,uploadEnabled,onViewInDocuments,onChange,inProgressUri,completedUri,allowPatientSelection=!1}=props,navigate=useMedplumNavigate5(),[modalOpened,{open:openModal,close:closeModal}]=useDisclosure10(!1),currentSearch=useMemo34(()=>parseSearchRequest(`Communication?${query}`),[query]),searchParams=useMemo34(()=>new URLSearchParams(query),[query]),itemsPerPage=Number.parseInt(searchParams.get("_count")||"20",10),currentOffset=Number.parseInt(searchParams.get("_offset")||"0",10),currentPage=Math.floor(currentOffset/itemsPerPage)+1,status=searchParams.get("status")||"in-progress",selectedParticipants=useMemo34(()=>(currentSearch.filters?.filter(f=>f.code==="recipient")??[]).flatMap(f=>f.value.split(",").filter(Boolean).map(ref=>({reference:ref}))),[currentSearch]),{loading,error,threadMessages,selectedThread,total,handleThreadStatusChange,addThreadMessage,refreshThreadMessages}=useThreadInbox({query,threadId}),handleParticipantsChange=useCallback24(participants=>{let otherFilters=currentSearch.filters?.filter(f=>f.code!=="recipient")??[],participantRefs=participants.map(p=>p.reference).filter(Boolean),newFilters=participantRefs.length>0?[...otherFilters,{code:"recipient",operator:Operator.EQUALS,value:participantRefs.join(",")}]:otherFilters;onChange({...currentSearch,filters:newFilters,offset:0})},[currentSearch,onChange]),skeletonTitleWidths=[80,72,68,64],skeletonSubtitleWidths=[85,78,70,60];useEffect26(()=>{error&&showNotification9({title:"Error",message:normalizeErrorString11(error),color:"red"})},[error]);let handleTopicStatusChangeWithErrorHandling=async newStatus=>{handleThreadStatusChange(newStatus);try{await refreshThreadMessages()}catch(error2){showNotification9({title:"Error",message:normalizeErrorString11(error2),color:"red"})}},handleNewTopicCompletion=message=>{addThreadMessage(message),onNew(message)};return jsxs90(Fragment48,{children:[jsx134("div",{className:ThreadInbox_default.container,children:jsxs90(Flex20,{direction:"row",h:"100%",w:"100%",children:[jsx134(Flex20,{direction:"column",w:380,h:"100%",className:ThreadInbox_default.rightBorder,children:jsxs90(Paper4,{h:"100%",style:{display:"flex",flexDirection:"column"},children:[jsxs90(ScrollArea3,{style:{flex:1},scrollbarSize:10,type:"hover",scrollHideDelay:250,children:[jsxs90(Flex20,{h:64,align:"center",justify:"space-between",p:"md",children:[jsx134(Tabs,{value:status,onChange:value=>{navigate(value==="in-progress"?inProgressUri:completedUri)},variant:"unstyled",className:"pill-tabs",children:jsxs90(Tabs.List,{children:[jsx134(Tabs.Tab,{value:"in-progress",children:"In Progress"}),jsx134(Tabs.Tab,{value:"completed",children:"Completed"})]})}),jsxs90(Group52,{gap:"xs",children:[jsx134(ParticipantFilter,{selectedParticipants,onFilterChange:handleParticipantsChange}),jsx134(Tooltip7,{label:"New Message",position:"bottom",openDelay:500,children:jsx134(ActionIcon12,{radius:"xl",variant:"filled",color:"blue",size:32,onClick:openModal,children:jsx134(IconPlus,{size:16})})})]})]}),jsx134(Divider11,{}),loading?jsx134(Stack38,{gap:"md",p:"md",children:Array.from({length:10}).map((_,index)=>{let titleWidth=skeletonTitleWidths[index%skeletonTitleWidths.length],subtitleWidth=skeletonSubtitleWidths[index%skeletonSubtitleWidths.length];return jsxs90(Flex20,{gap:"sm",align:"flex-start",children:[jsx134(Skeleton2,{height:40,width:40,radius:"50%"}),jsx134(Box22,{style:{flex:1},children:jsxs90(Flex20,{direction:"column",gap:"xs",children:[jsx134(Skeleton2,{height:16,width:`${titleWidth}%`}),jsx134(Skeleton2,{height:14,width:`${subtitleWidth}%`})]})})]},index)})}):threadMessages.length>0&&jsx134(ChatList,{threads:threadMessages,selectedCommunication:selectedThread,getThreadUri}),threadMessages.length===0&&!loading&&jsx134(EmptyMessagesState,{})]}),!loading&&total!==void 0&&total>itemsPerPage&&jsx134(Box22,{p:"md",children:jsx134(Center4,{children:jsx134(Pagination,{value:currentPage,total:Math.ceil(total/itemsPerPage),onChange:page=>{let offset=(page-1)*itemsPerPage;onChange({...currentSearch,offset})},size:"sm",siblings:1,boundaries:1})})})]})}),selectedThread?jsxs90(Fragment48,{children:[jsx134(Flex20,{direction:"column",style:{flex:1},h:"100%",className:ThreadInbox_default.rightBorder,children:jsx134(Paper4,{h:"100%",children:jsxs90(Stack38,{h:"100%",gap:0,children:[jsxs90(Flex20,{h:64,align:"center",justify:"space-between",p:"md",children:[jsx134(Text41,{fw:800,truncate:!0,fz:"lg",children:selectedThread.topic?.text??"Messages"}),jsxs90(Menu5,{position:"bottom-end",shadow:"md",children:[jsx134(Menu5.Target,{children:jsx134(Button13,{variant:"light",color:getStatusColor4(selectedThread.status),rightSection:selectedThread.status==="completed"?void 0:jsx134(IconChevronDown,{size:16}),radius:"xl",size:"sm",children:selectedThread.status.split("-").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")})}),selectedThread.status!=="completed"&&jsx134(Menu5.Dropdown,{children:jsx134(Menu5.Item,{onClick:()=>handleTopicStatusChangeWithErrorHandling("completed"),children:"Completed"})})]})]}),jsx134(Divider11,{}),jsx134(Flex20,{direction:"column",style:{flex:1},h:"100%",children:jsx134(ThreadChat,{title:"Messages",thread:selectedThread,excludeHeader:!0,uploadEnabled,onViewInDocuments},`${getReferenceString10(selectedThread)}`)})]})})}),selectedThread.subject&&showPatientSummary&&jsx134(Flex20,{direction:"column",w:300,h:"100%",children:jsx134(ScrollArea3,{p:0,h:"100%",scrollbarSize:10,type:"hover",scrollHideDelay:250,children:jsx134(PatientSummary,{patient:selectedThread.subject,sections},selectedThread.id)})})]}):jsx134(Flex20,{direction:"column",style:{flex:1},h:"100%",children:jsx134(NoMessages,{})})]})}),jsx134(NewTopicDialog,{subject,opened:modalOpened,onClose:closeModal,onSubmit:handleNewTopicCompletion,allowPatientSelection})]})}function NoMessages(){return jsx134(Center4,{h:"100%",w:"100%",children:jsxs90(Stack38,{align:"center",gap:"md",children:[jsx134(ThemeIcon,{size:64,variant:"light",color:"gray",children:jsx134(IconMessageCircle,{size:32})}),jsx134(Stack38,{align:"center",gap:"xs",children:jsx134(Text41,{size:"sm",c:"dimmed",ta:"center",children:"Select a message from the list to view details"})})]})})}function getStatusColor4(status){return status==="completed"?"green":status==="stopped"?"red":"blue"}function EmptyMessagesState(){return jsx134(Flex20,{direction:"column",h:"100%",justify:"center",align:"center",children:jsxs90(Stack38,{align:"center",gap:"md",pt:"xl",children:[jsx134(IconMessageCircle,{size:64,color:"var(--mantine-color-gray-4)"}),jsx134(Text41,{size:"lg",c:"dimmed",fw:500,children:"No messages found"})]})})}import{ActionIcon as ActionIcon14,Button as Button15,Center as Center5,Group as Group54,Loader as Loader6,ScrollArea as ScrollArea4,TextInput as TextInput26}from"@mantine/core";import{showNotification as showNotification10,updateNotification}from"@mantine/notifications";import{createReference as createReference14,normalizeErrorString as normalizeErrorString12}from"@medplum/core";import{useMedplum as useMedplum44,useResource as useResource11}from"@medplum/react-hooks";import{useCallback as useCallback25,useEffect as useEffect29,useLayoutEffect as useLayoutEffect4,useRef as useRef14,useState as useState80}from"react";import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize5,createPatch,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum42}from"@medplum/react-hooks";import{useEffect as useEffect27,useMemo as useMemo35,useState as useState78}from"react";import{Button as Button14,Table}from"@mantine/core";import{useState as useState77}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment49,jsx as jsx135,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]=useState77(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx135(Fragment49,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx135(Fragment49,{children:jsxs91(Table.Tr,{children:[jsx135(Table.Td,{children:name}),jsx135(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx135(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx135(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx135(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs91(Table.Tr,{children:[jsx135(Table.Td,{children:name}),jsx135(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx135(Button14,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx136,jsxs as jsxs92}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum42(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState78(!1);useEffect27(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo35(()=>{if(!schemaLoaded)return null;let typedOriginal=[toTypedValue(original)],typedRevised=[toTypedValue(revised)],result=[],patch=mergePatchOperations(createPatch(original,revised));for(let op of patch){let path=op.path,fhirPath=jsonPathToFhirPath(path),property=tryGetElementDefinition(original.resourceType,fhirPath),originalValue=op.op==="add"?void 0:evalFhirPathTyped(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:evalFhirPathTyped(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${capitalize5(op.op)} ${fhirPath}`,path:property?.path??original.resourceType+"."+fhirPath,property,originalValue:touchUpValue(property,originalValue),revisedValue:touchUpValue(property,revisedValue)})}return result},[schemaLoaded,original,revised]);return diffTable?jsxs92(Table2,{className:ResourceDiffTable_default.root,children:[jsx136(Table2.Thead,{children:jsxs92(Table2.Tr,{children:[jsx136(Table2.Th,{}),jsx136(Table2.Th,{children:"Before"}),jsx136(Table2.Th,{children:"After"})]})}),jsx136(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx136(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 useResource10}from"@medplum/react-hooks";import{useEffect as useEffect28,useMemo as useMemo36,useState as useState79}from"react";import{jsx as jsx137}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum43(),accessPolicy=medplum.getAccessPolicy(),value=useResource10(props.value),[schemaLoaded,setSchemaLoaded]=useState79(!1);useEffect28(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{tryGetProfile4(profileUrl)?setSchemaLoaded(!0):console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)});else{let schemaName=value.resourceType;medplum.requestSchema(schemaName).then(()=>{setSchemaLoaded(!0)}).catch(console.error)}},[medplum,profileUrl,value]);let accessPolicyResource=useMemo36(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx137(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon13,Group as Group53,Menu as Menu6,Text as Text42}from"@mantine/core";import{formatDateTime as formatDateTime4,getReferenceString as getReferenceString11}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx138,jsxs as jsxs93}from"react/jsx-runtime";function Timeline(props){return jsx138(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(Group53,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx138(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs93("div",{style:{flex:1},children:[jsxs93(Text42,{size:"sm",children:[jsx138(ResourceName,{c:"inherit",fw:500,value:author,link:!0}),onBehalfOf&&jsxs93(Text42,{component:"span",size:"xs",c:"dimmed",children:[" on behalf of ",jsx138(ResourceName,{c:"inherit",value:onBehalfOf,link:!0})]})]}),jsxs93(Text42,{size:"xs",children:[jsx138(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime4(dateTime)}),jsx138(Text42,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx138(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs93(Menu6,{position:"bottom-end",shadow:"md",width:200,children:[jsx138(Menu6.Target,{children:jsx138(ActionIcon13,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString11(props.resource)}`,children:jsx138(IconDots,{})})}),popupMenuItems]})]}),jsx138(ErrorBoundary,{children:jsx138("div",{className:clsx_default(Timeline_default.item,{[Timeline_default.itemPadding]:padding}),children:props.children})})]})}var ResourceTimeline_default={pinnedComment:"ResourceTimeline_pinnedComment"};import{jsx as jsx139,jsxs as jsxs94}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum44(),sender=medplum.getProfile(),inputRef=useRef14(null),resource=useResource11(props.value),[history,setHistory]=useState80(),[items,setItems]=useState80([]),[countToShow,setCountToShow]=useState80(10),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef14(items);useLayoutEffect4(()=>{itemsRef.current=items});let sortAndSetItems=useCallback25(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback25(batchResponse=>{let newItems=[];for(let settledResult of batchResponse){if(settledResult.status!=="fulfilled")continue;let bundle=settledResult.value;if(bundle.type==="history"&&setHistory(bundle),bundle.entry)for(let entry of bundle.entry)newItems.push(entry.resource)}sortAndSetItems(newItems)},[sortAndSetItems]),addResource=useCallback25(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback25(()=>{let resourceType,id;"resourceType"in props.value?(resourceType=props.value.resourceType,id=props.value.id):[resourceType,id]=props.value.reference?.split("/"),loadTimelineResources(medplum,resourceType,id).then(handleBatchResponse).catch(console.error)},[medplum,props.value,loadTimelineResources,handleBatchResponse]);useEffect29(()=>loadTimeline(),[loadTimeline]);function createComment(contentString){!resource||!props.createCommunication||medplum.createResource(props.createCommunication(resource,sender,contentString)).then(result=>addResource(result)).catch(console.error)}function createMedia(attachment){!resource||!props.createMedia||medplum.createResource(props.createMedia(resource,sender,attachment)).then(result=>addResource(result)).then(()=>updateNotification({id:"upload-notification",color:"teal",title:"Upload complete",message:"",icon:jsx139(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString12(reason),icon:jsx139(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification10({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:normalizeErrorString12(outcome),icon:jsx139(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return jsx139(Center5,{style:{width:"100%",height:"100%"},children:jsx139(Loader6,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return jsxs94(Timeline,{children:[props.createCommunication&&jsx139(Panel,{children:jsx139(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs94(Group54,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx139(ResourceAvatar,{value:sender}),jsx139(TextInput26,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx139(ActionIcon14,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx139(IconMessage,{size:16})}),jsx139(AttachmentButton,{securityContext:createReference14(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx139(ActionIcon14,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx139(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 jsx139(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx139(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx139(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx139(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx139(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx139(TimelineItem,{resource:item,padding:!0,children:jsx139(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&jsx139(Group54,{justify:"center",pb:"lg",children:jsx139(Button15,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx139(TimelineItem,{resource,padding:!0,...rest,children:jsx139(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs94(TimelineItem,{resource,padding:!0,...rest,children:[jsx139("h3",{children:"Created"}),jsx139(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 jsx139(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx139("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 jsx139(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx139(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx139(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx139(ScrollArea4,{children:jsx139("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx139(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx139(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 jsx140}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx140(ResourceTimeline,{value:resource,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`;return Promise.allSettled([medplum.readHistory(resourceType,id),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count:100})])},...rest})}import{createReference as createReference15}from"@medplum/core";import{jsx as jsx141}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx141(ResourceTimeline,{value:encounter,loadTimelineResources:async(medplum,_resourceType,id)=>Promise.allSettled([medplum.readHistory("Encounter",id),medplum.search("Communication","encounter=Encounter/"+id),medplum.search("Media","encounter=Encounter/"+id)]),createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",encounter:createReference15(resource),subject:resource.subject,sender:createReference15(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference15(resource),subject:resource.subject,operator:createReference15(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as 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 useEffect33,useState as useState85}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx142}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 jsx142(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon16,Button as Button19,Center as Center6,Group as Group57,Loader as Loader7,Menu as Menu8,Pagination as Pagination2,Table as Table3,Text as Text44,UnstyledButton as UnstyledButton7}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals as deepEquals2,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome10}from"@medplum/core";import{useMedplum as useMedplum45}from"@medplum/react-hooks";import{useCallback as useCallback26,useEffect as useEffect32,useLayoutEffect as useLayoutEffect6,useRef as useRef17,useState as useState84}from"react";import{Box as Box23,Button as Button16,Modal as Modal12,Text as Text43}from"@mantine/core";import{jsx as jsx143,jsxs as jsxs95}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs95(Modal12,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs95(Box23,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx143(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx143(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx143(Text43,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx143(Button16,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button17,Group as Group55,Modal as Modal13,MultiSelect as MultiSelect2,Stack as Stack39}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify3}from"@medplum/core";import{useEffect as useEffect30,useMemo as useMemo37,useRef as useRef15,useState as useState81}from"react";import{capitalize as capitalize6,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime5,Operator as Operator2}from"@medplum/core";import{Fragment as Fragment50,jsx as jsx144}from"react/jsx-runtime";var searchParamToOperators={string:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],fulltext:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],token:[Operator2.EQUALS,Operator2.NOT,Operator2.TEXT],reference:[Operator2.EQUALS,Operator2.NOT],numeric:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],quantity:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],date:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],datetime:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],uri:[Operator2.EQUALS,Operator2.NOT,Operator2.ABOVE,Operator2.BELOW]},operatorNames={eq:"equals",ne:"not equals",gt:"greater than",lt:"less than",ge:"greater than or equals",le:"less than or equals",sa:"starts after",eb:"ends before",ap:"approximately",sw:"starts with",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",present:"present",identifier:"identifier",iterate:"iterate"};function setFilters(definition,filters){return{...definition,filters,offset:0,name:void 0}}function clearFilters(definition){return setFilters(definition,[])}function clearFiltersOnField(definition,code){return setFilters(definition,(definition.filters??[]).filter(f=>f.code!==code))}function addFilter(definition,field,op,value,opt_clear){opt_clear&&(definition=clearFiltersOnField(definition,field));let nextFilters=[];return definition.filters&&nextFilters.push(...definition.filters),nextFilters.push({code:field,operator:op,value:value??""}),setFilters(definition,nextFilters)}function addField(definition,field){if(definition.fields?.includes(field))return definition;let newFields=[];return definition.fields&&newFields.push(...definition.fields),newFields.push(field),{...definition,fields:newFields,name:void 0}}function deleteFilter(definition,index){if(!definition.filters)return definition;let newFilters=[...definition.filters];return newFilters.splice(index,1),{...definition,filters:newFilters,name:void 0}}function addYesterdayFilter(definition,field){return addDayFilter(definition,field,-1)}function addTodayFilter(definition,field){return addDayFilter(definition,field,0)}function addTomorrowFilter(definition,field){return addDayFilter(definition,field,1)}function addDayFilter(definition,field,delta){let startTime=new Date;startTime.setDate(startTime.getDate()+delta),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setDate(endTime.getDate()+1),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addNext24HoursFilter(definition,field){let now=new Date,endTime=new Date(now.getTime()+1440*60*1e3);return addDateFilterBetween(definition,field,now,endTime)}function addLastMonthFilter(definition,field){return addMonthFilter(definition,field,-1)}function addThisMonthFilter(definition,field){return addMonthFilter(definition,field,0)}function addNextMonthFilter(definition,field){return addMonthFilter(definition,field,1)}function addMonthFilter(definition,field,delta){let startTime=new Date;startTime.setMonth(startTime.getMonth()+delta),startTime.setDate(1),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setMonth(endTime.getMonth()+1),endTime.setDate(1),endTime.setHours(0,0,0,0),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addYearToDateFilter(definition,field){let startTime=new Date;return startTime.setMonth(0),startTime.setDate(1),startTime.setHours(0,0,0,0),addDateFilterBetween(definition,field,startTime,new Date)}function addDateFilterBetween(definition,field,d1,d2){return definition=clearFiltersOnField(definition,field),definition=addDateFilterImpl(definition,field,Operator2.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator2.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator2.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.replaceAll(/([A-Z])/g," $1"),tmp=tmp.replaceAll(/[-_]/g," "),tmp=tmp.replaceAll(/\s+/g," "),tmp=tmp.trim(),tmp.toLowerCase()==="id"?"ID":tmp.split(/\s/).map(capitalize6).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?jsx144(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?jsx144(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:jsx144(Fragment50,{children:value.map((v,index)=>jsx144(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx145,jsxs as jsxs96}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef15(!1),[state,setState]=useState81({search:JSON.parse(stringify3(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState81(!1);useEffect30(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo37(()=>{if(!props.visible)return[];let resourceType=props.search.resourceType,typeSchema=getDataType2(resourceType),searchParams=getSearchParameters(resourceType);return sortStringArray(getFieldsList(typeSchema,searchParams)).map(field=>({value:field,label:buildFieldNameString(field)}))},[props.visible,props.search.resourceType]);function handleChange(newFields){setState({search:{...state.search,fields:newFields}})}return jsx145(Modal13,{title:"Fields",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>{props.onCancel()},size:"auto",withOverlay:!0,closeOnClickOutside:!1,overlayProps:{onMouseDownCapture:()=>{wasDropdownOpen.current=isDropdownOpen},onClick:()=>{wasDropdownOpen.current||props.onCancel(),wasDropdownOpen.current=!1},children:jsx145("div",{"data-testid":"overlay-child"})},children:jsxs96(Stack39,{children:[jsx145(MultiSelect2,{style:{width:550},placeholder:"Select fields to display",data:allFields,value:state.search.fields??[],onChange:handleChange,onDropdownOpen:()=>setIsDropdownOpen(!0),onDropdownClose:()=>setIsDropdownOpen(!1),maxDropdownHeight:"250px",clearButtonProps:{"aria-label":"Clear selection"},clearable:!0,searchable:!0}),jsx145(Group55,{justify:"flex-end",children:jsx145(Button17,{onClick:()=>props.onOk(state.search),children:"OK"})})]})})}function getFieldsList(typeSchema,searchParams){let result=[],keys=new Set,names=new Set;for(let key of Object.keys(typeSchema.elements))result.push(key),keys.add(key.toLowerCase()),names.add(buildFieldNameString(key));if(searchParams)for(let code of Object.keys(searchParams)){let name=buildFieldNameString(code);!keys.has(code)&&!names.has(name)&&(result.push(code),keys.add(code),names.add(name))}return result}import{ActionIcon as ActionIcon15,Group as Group56,Modal as Modal14,NativeSelect as NativeSelect11}from"@mantine/core";import{Operator as Operator3,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect31,useLayoutEffect as useLayoutEffect5,useRef as useRef16,useState as useState82}from"react";import{Checkbox as Checkbox7,TextInput as TextInput27}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx146}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 jsx146(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 jsx146(Checkbox7,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType.DATE:return jsx146(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 jsx146(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx146(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 jsx146(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx146(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 jsx147,jsxs as jsxs97}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState82(deepClone2(props.search)),searchRef=useRef16(search);useLayoutEffect5(()=>{searchRef.current=search}),useEffect31(()=>{setSearch(deepClone2(props.search))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}let resourceType=props.search.resourceType,searchParams=getSearchParameters2(resourceType)??{},filters=search.filters||[];return jsx147(Modal14,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs97(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs97("div",{children:[jsxs97("table",{children:[jsxs97("colgroup",{children:[jsx147("col",{style:{width:200}}),jsx147("col",{style:{width:200}}),jsx147("col",{style:{width:380}}),jsx147("col",{style:{width:40}})]}),jsx147("thead",{children:jsxs97("tr",{children:[jsx147("th",{children:"Field"}),jsx147("th",{children:"Operation"}),jsx147("th",{children:"Value"}),jsx147("th",{})]})}),jsx147("tbody",{children:filters.map((filter,index)=>jsx147(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`))})]}),jsx147(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx147(Group56,{justify:"flex-end",mt:"xl",children:jsx147(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value;function setFilterCode(newCode){props.onChange({code:newCode,operator:Operator3.EQUALS,value:""})}function setFilterOperator(newOperator){props.onChange({code:value.code,operator:newOperator,value:""})}function setFilterValue(newFilterValue){props.onChange({code:value.code,operator:value.operator,value:newFilterValue})}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return jsxs97("tr",{children:[jsx147("td",{children:jsx147(NativeSelect11,{"data-testid":`${props.id}-filter-field`,defaultValue:props.value.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...Object.keys(props.searchParams).map(param=>({value:param,label:buildFieldNameString(param)}))]})}),jsx147("td",{children:operators&&jsx147(NativeSelect11,{"data-testid":`${props.id}-filter-operation`,defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]},`${props.id}-filter-value-${props.value.code}`)}),jsx147("td",{children:searchParam&&value.operator&&jsx147(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}`)}),jsx147("td",{children:props.onDelete&&jsx147(ActionIcon15,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx147(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button18,Grid,Modal as Modal15}from"@mantine/core";import{useState as useState83}from"react";import{jsx as jsx148,jsxs as jsxs98}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState83(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx148(Modal15,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx148(Form,{onSubmit:onOk,children:jsxs98(Grid,{children:[jsx148(Grid.Col,{span:10,children:jsx148(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx148(Grid.Col,{span:2,children:jsx148(Button18,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime6,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator4,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment51,jsx as jsx149}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 jsx149(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx149(Fragment51,{children:formatDateTime6(filter.value)})}return jsx149(Fragment51,{children:filter.value})}import{Menu as Menu7}from"@mantine/core";import{Operator as Operator5}from"@medplum/core";import{Fragment as Fragment52,jsx as jsx150,jsxs as jsxs99}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?jsx150(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx150(Menu7.Dropdown,{children:props.searchParams.map(searchParam=>jsx150(Menu7.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx150(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx150(NumericFilterSubMenu,{...props});case"reference":return jsx150(ReferenceFilterSubMenu,{...props});case"string":return jsx150(TextFilterSubMenu,{...props});case"token":return jsx150(TokenFilterSubMenu,{...props});case"uri":return jsx150(UriFilterSubMenu,{...props});default:return jsxs99(Fragment52,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs99(Menu7.Dropdown,{children:[jsx150(Menu7.Item,{leftSection:jsx150(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx150(Menu7.Item,{leftSection:jsx150(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.ENDS_BEFORE),children:"Before..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.STARTS_AFTER),children:"After..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Between..."}),jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx150(Menu7.Item,{leftSection:jsx150(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx150(Menu7.Item,{leftSection:jsx150(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx150(Menu7.Item,{leftSection:jsx150(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx150(Menu7.Item,{leftSection:jsx150(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx150(Menu7.Item,{leftSection:jsx150(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx150(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs99(Menu7.Dropdown,{children:[jsx150(Menu7.Item,{leftSection:jsx150(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx150(Menu7.Item,{leftSection:jsx150(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN),children:"Greater than..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN),children:"Less than..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx150(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs99(Menu7.Dropdown,{children:[jsx150(Menu7.Item,{leftSection:jsx150(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx150(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs99(Menu7.Dropdown,{children:[jsx150(Menu7.Item,{leftSection:jsx150(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx150(Menu7.Item,{leftSection:jsx150(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.CONTAINS),children:"Contains..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Does not contain..."}),jsx150(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs99(Menu7.Dropdown,{children:[jsx150(Menu7.Item,{leftSection:jsx150(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.TEXT),children:"Text contains..."}),jsx150(CommonMenuItems,{...props})]})}function UriFilterSubMenu(props){let{searchParam}=props;return jsxs99(Menu7.Dropdown,{children:[jsx150(Menu7.Item,{leftSection:jsx150(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx150(Menu7.Item,{leftSection:jsx150(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx150(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs99(Fragment52,{children:[jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx150(Menu7.Item,{leftSection:jsx150(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx150(Menu7.Divider,{}),jsx150(Menu7.Item,{leftSection:jsx150(IconX,{size:14}),onClick:()=>props.onClear(searchParam),children:"Clear filters"})]})}function getPaginationControlProps(controlName){switch(controlName){case"next":return{"aria-label":"Next page"};case"previous":return{"aria-label":"Previous page"};case"first":return{"aria-label":"First page"};case"last":return{"aria-label":"Last page"};default:return{}}}var SearchControl_default={root:"SearchControl_root",table:"SearchControl_table",tr:"SearchControl_tr",th:"SearchControl_th",control:"SearchControl_control",icon:"SearchControl_icon"};import{getElementDefinition as getElementDefinition2,getSearchParameter,getSearchParameterDetails as getSearchParameterDetails4,getSearchParameters as getSearchParameters3}from"@medplum/core";function getFieldDefinitions(search){let resourceType=search.resourceType,fields=[];for(let name of search.fields||["id","_lastUpdated"])fields.push(getFieldDefinition(resourceType,name));return fields}function getFieldDefinition(resourceType,name){if(name==="_lastUpdated")return{name:"_lastUpdated",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_lastUpdated",name:"_lastUpdated",type:"date",expression:"Resource.meta.lastUpdated"}]};if(name==="meta.versionId")return{name:"meta.versionId",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_versionId",name:"_versionId",type:"token",expression:"Resource.meta.versionId"}]};let exactElementDefinition=getElementDefinition2(resourceType,name),exactSearchParam=getSearchParameter(resourceType,name.toLowerCase());if(exactElementDefinition&&exactSearchParam)return{name,elementDefinition:exactElementDefinition,searchParams:[exactSearchParam]};if(exactElementDefinition){let allSearchParams=getSearchParameters3(resourceType),searchParams;if(allSearchParams){let pathRegex=new RegExp(`${resourceType}\\.${name.replaceAll("[x]","")}([^\\w-]|$)`);searchParams=Object.values(allSearchParams).filter(p=>!!p.expression&&pathRegex.test(p?.expression)),searchParams.length===0&&(searchParams=void 0)}return{name,elementDefinition:exactElementDefinition,searchParams}}if(exactSearchParam){let details=getSearchParameterDetails4(resourceType,exactSearchParam);return{name,elementDefinition:details.elementDefinitions?.[0],searchParams:[exactSearchParam]}}return{name}}import{Fragment as Fragment53,jsx as jsx151,jsxs as jsxs100}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]=useState84(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState84(search);deepEquals2(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState84({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef17(state);useLayoutEffect6(()=>{stateRef.current=state});let total=memoizedSearch.total??"accurate",loadResults=useCallback26(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,formatSearchQuery({...memoizedSearch,total,fields:void 0}),options)).then(response=>{setState({...stateRef.current,searchResponse:response}),onLoad&&onLoad(new SearchLoadEvent(response))}).catch(reason=>{setState({...stateRef.current,searchResponse:void 0}),setOutcome(normalizeOperationOutcome10(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback26(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect32(()=>{loadResults()},[loadResults]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...stateRef.current.selected};checked?newSelected[id]=!0:delete newSelected[id],setState({...stateRef.current,selected:newSelected})}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},searchResponse=stateRef.current.searchResponse;checked&&searchResponse?.entry&&searchResponse.entry.forEach(entry=>{entry.resource?.id&&(newSelected[entry.resource.id]=!0)}),setState({...stateRef.current,selected:newSelected})}function isAllSelected(){if(!state.searchResponse?.entry||state.searchResponse.entry.length===0)return!1;for(let e of state.searchResponse.entry)if(e.resource?.id&&!state.selected[e.resource.id])return!1;return!0}function emitSearchChange(newSearch){props.onChange&&props.onChange(new SearchChangeEvent(newSearch))}function handleRowClick(e,resource){if(isCheckboxCell(e.target)||e.button===2)return;killEvent(e);let isAux=isAuxClick(e);!isAux&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),isAux&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e))}function isExportPassed(){return!!(props.onExport??props.onExportCsv??props.onExportTransactionBundle)}if(outcome)return jsx151(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx151(Center6,{style:{width:"100%",height:"100%"},children:jsx151(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 jsxs100("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs100(Group57,{justify:"space-between",mb:"xl",children:[jsxs100(Group57,{gap:2,children:[jsx151(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx151(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx151(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx151(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx151(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx151(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx151(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx151(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx151(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx151(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx151(Button19,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx151(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs100(Group57,{gap:2,children:[lastResult&&jsxs100(Text44,{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()}`]}),jsx151(ActionIcon16,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx151(IconRefresh,{size:iconSize})})]})]}),jsxs100(Table3,{className:SearchControl_default.table,children:[jsxs100(Table3.Thead,{children:[jsxs100(Table3.Tr,{children:[checkboxColumn&&jsx151(Table3.Th,{children:jsx151("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx151(Table3.Th,{children:jsxs100(Menu8,{shadow:"md",width:240,position:"bottom-end",children:[jsx151(Menu8.Target,{children:jsx151(UnstyledButton7,{className:SearchControl_default.control,p:2,children:jsxs100(Group57,{justify:"space-between",wrap:"nowrap",children:[jsx151(Text44,{fw:500,children:buildFieldNameString(field.name)}),jsx151(Center6,{className:SearchControl_default.icon,children:jsx151(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx151(SearchPopupMenu,{search:memoizedSearch,searchParams:field.searchParams,onPrompt:(searchParam,filter)=>{setState({...stateRef.current,filterDialogVisible:!0,filterDialogSearchParam:searchParam,filterDialogFilter:filter,dialogOpenTime:Date.now()})},onChange:result=>{emitSearchChange(result)}})]})},field.name))]}),!props.hideFilters&&jsxs100(Table3.Tr,{children:[checkboxColumn&&jsx151(Table3.Th,{}),fields.map(field=>jsx151(Table3.Th,{children:field.searchParams&&jsx151(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),jsx151(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs100(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx151(Table3.Td,{children:jsx151("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=>jsx151(Table3.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&jsx151(Container,{children:jsx151(Center6,{style:{height:150},children:jsx151(Text44,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx151(Center6,{m:"md",p:"md",children:jsx151(Pagination2,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),jsx151(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}`),jsx151(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}`),jsx151(SearchExportDialog,{visible:state.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx151(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?jsx151("span",{children:"no filters"}):jsx151(Fragment53,{children:filters.map(filter=>jsxs100("div",{children:[getOpString(filter.operator),"\xA0",jsx151(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 jsx152,jsxs as jsxs101}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum46(),[schemaLoaded,setSchemaLoaded]=useState85(!1),[outcome,setOutcome]=useState85(),{query,fields}=props,[response,setResponse]=useState85(),[selected,setSelected]=useState85({});useEffect33(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome11(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selected};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=response?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=response?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selected[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if(useEffect33(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx152(Loader8,{});let checkboxColumn=props.checkboxesEnabled;return jsxs101("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs101(Table4,{children:[jsx152(Table4.Thead,{children:jsxs101(Table4.Tr,{children:[checkboxColumn&&jsx152(Table4.Th,{children:jsx152("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx152(Table4.Th,{children:field.name},field.name))]})}),jsx152(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs101(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx152(Table4.Td,{children:jsx152("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=>jsx152(Table4.Td,{children:jsx152(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx152("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx152("div",{"data-testid":"search-error",children:jsx152("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx152(Button20,{onClick:()=>props.onBulk(Object.keys(selected)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo(FhirPathTable);import{ScrollArea as ScrollArea5}from"@mantine/core";var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};import{jsx as jsx153}from"react/jsx-runtime";function InfoBar(props){return jsx153(ScrollArea5,{children:jsx153("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx153("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx153("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx153("div",{className:InfoBar_default.value,children:props.children})};import{Anchor as Anchor12,Tabs as Tabs2}from"@mantine/core";import{isString as isString2,locationUtils as locationUtils5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate6}from"@medplum/react-hooks";import{useState as useState86}from"react";var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};import{jsx as jsx154,jsxs as jsxs102}from"react/jsx-runtime";function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=useMedplumNavigate6(),[currentTab,setCurrentTab]=useState86(()=>{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 jsxs102(Tabs2,{value:currentTab,onChange:onTabChange,...rest,children:[jsx154(Tabs2.List,{className:LinkTabs_default.list,children:tabs.map(t=>jsx154(Tabs2.Tab,{value:t.value,children:jsx154(Anchor12,{className:LinkTabs_default.link,href:`${baseUrl}/${t.value}`,onClick:onLinkClick,children:t.label})},t.value))}),children]})}function normalizeTabDefinitions(tabs){return tabs.map(t=>isString2(t)?{label:t,value:t.toLowerCase()}:t)}function onLinkClick(e){isAuxClick(e)||e.preventDefault()}import{Center as Center7,Divider as Divider13,Flex as Flex22,Group as Group58,Pagination as Pagination3,ScrollArea as ScrollArea6,Stack as Stack41,Tabs as Tabs3,Text as Text45}from"@mantine/core";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 Divider12,Flex as Flex21,Skeleton as Skeleton3,Stack as Stack40}from"@mantine/core";import{jsx as jsx155,jsxs as jsxs103}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 jsx155(Stack40,{gap:"md",p:"md",children:SKELETON_WIDTHS.map((widths,index)=>jsxs103(Stack40,{children:[jsxs103(Flex21,{direction:"column",gap:"xs",align:"flex-start",children:[jsx155(Skeleton3,{height:16,width:widths[0]}),jsx155(Skeleton3,{height:14,width:widths[1]}),jsx155(Skeleton3,{height:14,width:widths[2]})]}),jsx155(Divider12,{})]},index))})}import{Fragment as Fragment54,jsx as jsx156,jsxs as jsxs104}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,onTabChange,headerActions,selected,renderDetail,emptyDetail,refresh,page,pageCount,onPageChange}=props,handleTabChange=value=>{value&&onTabChange?.(value)},headerLeft=jsx156("span",{});return tabs?headerLeft=jsx156(Tabs3,{value:activeTab??null,onChange:handleTabChange,variant:"unstyled",className:ListWithDetailPane_default.pillTabs,children:jsx156(Tabs3.List,{children:tabs.map(tab=>jsx156(Tabs3.Tab,{value:tab.value,children:jsx156(MedplumLink,{className:ListWithDetailPane_default.tabLink,to:tab.uri,children:tab.label})},tab.value))})}):headerText!==void 0&&(headerLeft=jsx156(Text45,{className:ListWithDetailPane_default.headerText,children:headerText})),jsxs104(Flex22,{direction:"row",h:"100%",w:"100%",className:ListWithDetailPane_default.container,children:[jsxs104(Flex22,{direction:"column",w:listWidth,h:"100%",className:ListWithDetailPane_default.shell,children:[(tabs||headerActions||headerText)&&jsxs104(Fragment54,{children:[jsxs104(Flex22,{h:HEADER_HEIGHT2,align:"center",justify:"space-between",p:"md",children:[headerLeft,headerActions&&jsx156(Group58,{gap:"xs",children:headerActions})]}),jsx156(Divider13,{})]}),jsxs104(ScrollArea6,{flex:1,scrollbarSize:10,type:"hover",scrollHideDelay:250,children:[loading&&(skeleton??jsx156(ListWithDetailPaneSkeleton,{})),!loading&&items.length===0&&(emptyList??jsx156(DefaultEmptyList,{})),!loading&&items.length>0&&jsx156("div",{className:ListWithDetailPane_default.list,children:items.map((item,index)=>{let isSelected=item.id!==void 0&&item.id===selectedKey;return jsx156("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&&jsx156("div",{className:ListWithDetailPane_default.footer,children:jsx156(Pagination3,{value:page,total:pageCount,onChange:onPageChange,size:"sm",siblings:1,boundaries:1})})]}),selected===void 0?jsx156(Flex22,{direction:"column",style:{flex:1},h:"100%",children:emptyDetail??jsx156(DefaultEmptyDetail,{})}):renderDetail(selected,{refresh})]})}function DefaultEmptyList(){return jsx156(Flex22,{direction:"column",h:"100%",justify:"center",align:"center",pt:"xl",children:jsx156(Text45,{c:"dimmed",fw:500,children:"No items found"})})}function DefaultEmptyDetail(){return jsx156(Center7,{h:"100%",w:"100%",children:jsx156(Stack41,{align:"center",gap:"xs",children:jsx156(Text45,{size:"sm",c:"dimmed",ta:"center",children:"Select an item from the list to view details"})})})}import{Box as Box25,SimpleGrid as SimpleGrid2}from"@mantine/core";import{useResource as useResource12,useSearchOne}from"@medplum/react-hooks";import{Box as Box24,Flex as Flex23,Group as Group59,Paper as Paper5,RingProgress,Text as Text46,Title as Title13}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept6}from"@medplum/core";import{Fragment as Fragment55,jsx as jsx157,jsxs as jsxs105}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx157(Paper5,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs105(Group59,{children:[group.measureScore&&jsx157(MeasureScore,{group}),!group.measureScore&&jsx157(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs105(Fragment55,{children:[jsx157(Text46,{fz:"md",fw:500,mb:8,children:measure.title}),jsx157(Text46,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept6(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept6(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs105(Box24,{children:[jsx157(Title13,{order:3,children:"Not Applicable"}),jsx157(Text46,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs105(Box24,{children:[jsx157(Title13,{order:3,children:"Insufficient Data"}),jsx157(Text46,{children:`Numerator: ${numeratorCount}`}),jsx157(Text46,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx157(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx157(Flex23,{justify:"center",children:jsxs105(Text46,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx157(Fragment55,{children:unit==="%"?jsx157(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx157(Flex23,{justify:"center",children:jsx157(Text46,{fw:700,fz:18,children:jsx157(QuantityDisplay,{value:group.measureScore})})})}):jsx157(Flex23,{h:120,align:"center",children:jsx157(Title13,{order:3,children:jsx157(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 jsx158,jsxs as jsxs106}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource12(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs106(Box25,{children:[measure&&jsx158(MeasureTitle,{measure}),jsx158(SimpleGrid2,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx158(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon17,Indicator as Indicator2,Tooltip as Tooltip8}from"@mantine/core";import{useNotificationCount as useNotificationCount2}from"@medplum/react-hooks";import{jsx as jsx159}from"react/jsx-runtime";function NotificationIcon(props){let{resourceType,countCriteria,subscriptionCriteria}=props,unreadCount=useNotificationCount2({resourceType,countCriteria,subscriptionCriteria}),result=props.iconComponent;return props.onClick&&(result=jsx159(ActionIcon17,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=jsx159(Tooltip8,{label:props.tooltip,children:result})),unreadCount>0&&(result=jsx159(Indicator2,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}import{ActionIcon as ActionIcon18,Alert as Alert5,Badge as Badge3,Box as Box26,Button as Button21,Checkbox as Checkbox8,Divider as Divider14,Group as Group60,Modal as Modal16,Stack as Stack42,Table as Table5,Text as Text47,Title as Title14}from"@mantine/core";import{notifications}from"@mantine/notifications";import{extractAccountReferences,normalizeErrorString as normalizeErrorString13}from"@medplum/core";import{useMedplum as useMedplum47}from"@medplum/react-hooks";import{useCallback as useCallback27,useMemo as useMemo38,useState as useState87}from"react";import{Fragment as Fragment56,jsx as jsx160,jsxs as jsxs107}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]=useState87(originalAccounts),[confirmModalOpen,setConfirmModalOpen]=useState87(!1),[propagate,setPropagate]=useState87(!0),[saving,setSaving]=useState87(!1),changes=useMemo38(()=>{let result=[];for(let account of pendingAccounts)originalAccounts.some(o=>o.reference===account.reference)||result.push({reference:account,type:"addition"});for(let account of originalAccounts)pendingAccounts.some(p=>p.reference===account.reference)||result.push({reference:account,type:"removal"});return result},[originalAccounts,pendingAccounts]),hasChanges=changes.length>0,handleAddAccount=useCallback27(value=>{value?.reference&&(pendingAccounts.some(a=>a.reference===value.reference)||setPendingAccounts(prev=>[...prev,value]))},[pendingAccounts]),handleRemoveAccount=useCallback27(referenceString=>{setPendingAccounts(prev=>prev.filter(a=>a.reference!==referenceString))},[]),handleSave=useCallback27(async()=>{let patientId=patient.id;if(!patientId){notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:"Cannot update accounts: Patient resource has no ID.",icon:jsx160(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:jsx160(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0}),props.onSaved?.()}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString13(err),icon:jsx160(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}finally{setSaving(!1)}},[medplum,patient,pendingAccounts,propagate,props]);return isAdmin?jsxs107(Fragment56,{children:[jsxs107(Stack42,{children:[jsx160(Title14,{order:3,children:"Current Accounts"}),pendingAccounts.length===0?jsx160(Text47,{c:"dimmed",children:"No accounts assigned to this patient."}):jsxs107(Table5,{children:[jsx160(Table5.Thead,{children:jsxs107(Table5.Tr,{children:[jsx160(Table5.Th,{children:"Type"}),jsx160(Table5.Th,{children:"Account"}),jsx160(Table5.Th,{})]})}),jsx160(Table5.Tbody,{children:pendingAccounts.map(account=>jsxs107(Table5.Tr,{children:[jsx160(Table5.Td,{children:jsx160(AccountTypeBadge,{reference:account})}),jsx160(Table5.Td,{children:jsx160(ResourceBadge,{value:account,link:!0})}),jsx160(Table5.Td,{children:jsx160(ActionIcon18,{variant:"subtle",color:"red","aria-label":`Remove ${account.reference}`,onClick:()=>handleRemoveAccount(account.reference),children:jsx160(IconX,{size:16})})})]},account.reference))})]}),jsx160(Divider14,{}),jsx160(Title14,{order:4,children:"Add Account"}),jsx160(ReferenceInput,{name:"newAccount",placeholder:"Search for Organization, HealthcareService, or CareTeam...",targetTypes:ACCOUNT_TARGET_TYPES,onChange:value=>{value&&handleAddAccount(value)}}),hasChanges&&jsxs107(Fragment56,{children:[jsx160(Divider14,{}),jsx160(Title14,{order:4,children:"Pending Changes"}),jsx160(Stack42,{gap:"xs",children:changes.map(change=>jsxs107(Group60,{gap:"xs",children:[change.type==="addition"?jsx160(Badge3,{color:"green",variant:"light",leftSection:jsx160(IconPlus,{size:12}),children:"Add"}):jsx160(Badge3,{color:"red",variant:"light",leftSection:jsx160(IconMinus,{size:12}),children:"Remove"}),jsx160(ResourceBadge,{value:change.reference,link:!0})]},`${change.type}-${change.reference.reference}`))})]}),jsx160(Box26,{children:jsx160(Button21,{disabled:!hasChanges||saving,onClick:()=>setConfirmModalOpen(!0),children:"Save Changes"})})]}),jsx160(Modal16,{opened:confirmModalOpen,onClose:()=>setConfirmModalOpen(!1),title:"Confirm Account Changes",size:"md",keepMounted:!0,children:jsxs107(Stack42,{children:[jsxs107(Text47,{children:["The following changes will be applied to Patient"," ",jsxs107("strong",{children:[patient.name?.[0]?.given?.join(" ")," ",patient.name?.[0]?.family]}),":"]}),changes.filter(c=>c.type==="addition").length>0&&jsxs107(Box26,{children:[jsx160(Text47,{fw:600,c:"green",children:"Adding:"}),jsx160(Stack42,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="addition").map(c=>jsxs107(Group60,{gap:"xs",children:[jsx160(IconPlus,{size:14,color:"green"}),jsx160(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),changes.filter(c=>c.type==="removal").length>0&&jsxs107(Box26,{children:[jsx160(Text47,{fw:600,c:"red",children:"Removing:"}),jsx160(Stack42,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="removal").map(c=>jsxs107(Group60,{gap:"xs",children:[jsx160(IconMinus,{size:14,color:"red"}),jsx160(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),jsx160(Checkbox8,{label:"Propagate changes to all resources in this patient's compartment",checked:propagate,onChange:event=>setPropagate(event.currentTarget.checked)}),jsxs107(Group60,{justify:"right",mt:"md",children:[jsx160(Button21,{variant:"default",onClick:()=>setConfirmModalOpen(!1),children:"Cancel"}),jsx160(Button21,{onClick:handleSave,loading:saving,children:"Confirm"})]})]})})]}):jsx160(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 jsx160(Badge3,{variant:"light",color:{Organization:"blue",HealthcareService:"teal",CareTeam:"violet"}[type]??"gray",size:"sm",children:type})}import{Checkbox as Checkbox9,Group as Group61,SegmentedControl as SegmentedControl2,Stack as Stack43}from"@mantine/core";import{notifications as notifications2}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString14,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum48}from"@medplum/react-hooks";import{useCallback as useCallback28,useState as useState88}from"react";import{jsx as jsx161,jsxs as jsxs108}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]=useState88("everything"),[inlineAttachments,setInlineAttachments]=useState88(!1),handleSubmit=useCallback28(async data2=>{let patientId=resolveId2(patient),{operation,type,contentType,extension}=formats[format],url=medplum.fhirUrl("Patient",patientId,operation),params={};format==="everything"&&inlineAttachments&&url.searchParams.set("_inlineAttachments","true"),type&&(params.type=type),data2.author&&(params.author={reference:data2.author}),data2.authoredOn&&(params.authoredOn=convertLocalToIso(data2.authoredOn)),data2.startDate&&(params.start=data2.startDate),data2.endDate&&(params.end=data2.endDate),notifications2.show({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,loading:!0,message:"Exporting...",autoClose:!1,withCloseButton:!1});try{let response=await medplum.post(url,params,void 0,{cache:"no-cache",headers:{Accept:contentType}}),fileName=`Patient-export-${patientId}-${new Date().toISOString().replaceAll(":","-")}.${extension}`;saveData(response,fileName,contentType),notifications2.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"green",message:"Done",icon:jsx161(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications2.update({id:NOTIFICATION_ID2,title:NOTIFICATION_TITLE2,color:"red",message:normalizeErrorString14(err),icon:jsx161(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient,format,inlineAttachments]);return jsx161(Form,{onSubmit:handleSubmit,children:jsxs108(Stack43,{children:[jsx161(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx161(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})}),jsx161(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx161(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx161(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx161(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx161(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:jsx161(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx161(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:jsx161(DateTimeInput,{name:"endDate",placeholder:"End date"})}),format==="everything"&&jsx161(FormSection,{title:"Inline Attachments",description:"Embed DocumentReference file attachments as base64-encoded data instead of storage URLs.",children:jsx161(Stack43,{gap:"xs",children:jsx161(Checkbox9,{label:"Inline attachments",checked:inlineAttachments,onChange:e=>setInlineAttachments(e.currentTarget.checked)})})}),jsx161(Group61,{justify:"right",children:jsx161(SubmitButton,{children:"Request Export"})})]})})}function saveData(data2,fileName,contentType){let content=typeof data2=="string"?data2:JSON.stringify(data2,null,2),blob=new Blob([content],{type:contentType}),url=window.URL.createObjectURL(blob),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=url,a.download=fileName,a.click(),window.URL.revokeObjectURL(url)}import{calculateAgeString as calculateAgeString2}from"@medplum/core";import{useResource as useResource13}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment57,jsx as jsx162,jsxs as jsxs109}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource13(props.patient);return patient?jsxs109(InfoBar,{children:[jsx162(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs109(InfoBar.Entry,{children:[jsx162(InfoBar.Key,{children:"Name"}),jsx162(InfoBar.Value,{children:jsx162(MedplumLink,{to:patient,fw:500,children:patient.name?jsx162(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs109(Fragment57,{children:[jsxs109(InfoBar.Entry,{children:[jsx162(InfoBar.Key,{children:"DoB"}),jsx162(InfoBar.Value,{children:patient.birthDate})]}),jsxs109(InfoBar.Entry,{children:[jsx162(InfoBar.Key,{children:"Age"}),jsx162(InfoBar.Value,{children:calculateAgeString2(patient.birthDate)})]})]}),patient.gender&&jsxs109(InfoBar.Entry,{children:[jsx162(InfoBar.Key,{children:"Gender"}),jsx162(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs109(InfoBar.Entry,{children:[jsx162(InfoBar.Key,{children:"State"}),jsx162(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs109(InfoBar.Entry,{children:[jsx162(InfoBar.Key,{children:identifier?.system}),jsx162(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Box as Box27,Button as Button22,Checkbox as Checkbox10,Flex as Flex24,Group as Group62,Loader as Loader9,Radio as Radio5,Stack as Stack44,Text as Text48,TextInput as TextInput28}from"@mantine/core";import{showNotification as showNotification11}from"@mantine/notifications";import{formatAddress as formatAddress4,normalizeErrorString as normalizeErrorString15}from"@medplum/core";import{useCallback as useCallback29,useMemo as useMemo39,useState as useState89}from"react";var PharmacyDialog_default={pharmacyItem:"PharmacyDialog_pharmacyItem",pharmacyItemSelected:"PharmacyDialog_pharmacyItemSelected"};import{jsx as jsx163,jsxs as jsxs110}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 jsx163("form",{onSubmit:e=>{e.preventDefault();let formData=new FormData(e.currentTarget);onSearch(formData)},children:jsxs110(Stack44,{gap:"md",children:[jsx163(TextInput28,{name:"name",label:"Pharmacy Name",placeholder:placeholders.name}),jsxs110(Group62,{grow:!0,children:[jsx163(TextInput28,{name:"city",label:"City",placeholder:placeholders.city}),jsx163(TextInput28,{name:"state",label:"State",placeholder:placeholders.state})]}),jsxs110(Group62,{grow:!0,children:[jsx163(TextInput28,{name:"zip",label:"Zip Code",placeholder:placeholders.zip}),jsx163(TextInput28,{name:"phoneOrFax",label:"Phone or Fax",placeholder:placeholders.phoneOrFax})]}),jsx163(TextInput28,{name:"address",label:"Address",placeholder:placeholders.address}),jsx163(TextInput28,{name:"ncpdpID",label:"NCPDP ID",placeholder:placeholders.ncpdpID}),renderBeforeSearchButton,jsx163(Button22,{type:"submit",loading:searching,children:"Search"})]})})}function PharmacyItem({pharmacy,pharmacyKey,isSelected,onSelect}){return jsx163(Box27,{p:"sm",className:isSelected?PharmacyDialog_default.pharmacyItemSelected:PharmacyDialog_default.pharmacyItem,onClick:onSelect,children:jsx163(Radio5,{value:pharmacyKey,label:jsxs110(Box27,{children:[jsx163(Text48,{fw:500,size:"sm",children:pharmacy.name}),pharmacy.address?.[0]&&jsx163(Text48,{size:"xs",c:"dimmed",children:formatAddress4(pharmacy.address[0])}),pharmacy.telecom?.find(t=>t.system==="phone")&&jsxs110(Text48,{size:"xs",c:"dimmed",children:["Phone: ",pharmacy.telecom.find(t=>t.system==="phone")?.value]}),pharmacy.telecom?.find(t=>t.system==="fax")&&jsxs110(Text48,{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 jsxs110(Box27,{mt:"xl",children:[jsxs110(Text48,{fw:600,mb:"md",children:["Search Results (",searchResults.length,")"]}),jsx163(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:jsx163(Stack44,{gap:"sm",children:searchResults.map((pharmacy,index)=>{let pharmacyKey=getPharmacyKey(pharmacy,index),isSelected=selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy))===pharmacyKey:!1;return jsx163(PharmacyItem,{pharmacy,pharmacyKey,isSelected,onSelect:()=>onSelectPharmacy(pharmacy)},pharmacyKey)})})}),jsxs110(Flex24,{mt:"lg",gap:"md",align:"center",justify:"space-between",children:[jsx163(Checkbox10,{label:"Set as primary pharmacy",checked:setAsPrimary,onChange:e=>onSetAsPrimary(e.currentTarget.checked)}),jsxs110(Group62,{children:[jsx163(Button22,{variant:"subtle",onClick:onClose,children:"Cancel"}),jsx163(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]=useState89([]),[searching,setSearching]=useState89(!1),[selectedPharmacy,setSelectedPharmacy]=useState89(),[setAsPrimary,setSetAsPrimary]=useState89(!1),[adding,setAdding]=useState89(!1),handleSearch=useCallback29(async formData=>{let searchParams={name:formData.get("name")||void 0,city:formData.get("city")||void 0,state:formData.get("state")||void 0,zip:formData.get("zip")||void 0,address:formData.get("address")||void 0,phoneOrFax:formData.get("phoneOrFax")||void 0,ncpdpID:formData.get("ncpdpID")||void 0},cleanParams=Object.fromEntries(Object.entries(searchParams).filter(([_,v])=>typeof v=="string"&&v.trim()!=="")),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){showNotification11({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&&showNotification11({color:"blue",title:"No Results",message:"No pharmacies found matching your search criteria"})}catch(error){showNotification11({color:"red",title:"Search Error",message:normalizeErrorString15(error)})}finally{setSearching(!1)}},[getExtraSearchParams,onSearch]),handleAddFavorite=useCallback29(async()=>{if(!(!selectedPharmacy||!patient.id)){setAdding(!0);try{let response=await onAddToFavorites({patientId:patient.id,pharmacy:selectedPharmacy,setAsPrimary});response.success?(showNotification11({color:"green",title:"Success",message:response.message}),onSubmit(response.organization||selectedPharmacy)):showNotification11({color:"red",title:"Error",message:response.message})}catch(error){showNotification11({color:"red",title:"Error",message:normalizeErrorString15(error)})}finally{setAdding(!1)}}},[selectedPharmacy,patient.id,setAsPrimary,onAddToFavorites,onSubmit]);return jsxs110(Box27,{children:[jsx163(SearchForm,{onSearch:formData=>handleSearch(formData).catch(console.error),searching,renderBeforeSearchButton,placeholders}),searching&&jsx163(Flex24,{justify:"center",mt:"xl",children:jsx163(Loader9,{})}),searchResults.length>0&&!searching&&jsx163(SearchResults,{searchResults,selectedPharmacy,onSelectPharmacy:setSelectedPharmacy,setAsPrimary,onSetAsPrimary:setSetAsPrimary,onAddFavorite:handleAddFavorite,onClose,adding})]})}import{Box as Box28,Flex as Flex25,Group as Group63,Text as Text49}from"@mantine/core";import{getDisplayString as coreGetDisplayString}from"@medplum/core";import{jsx as jsx164,jsxs as jsxs111}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=>jsx164(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),jsx164(CollapsibleSection,{title:options.title,onAdd:options.onAdd,children:resources.length>0?jsx164(Flex25,{direction:"column",gap:8,children:resources.map(resource=>{let displayString=options.getDisplayString?options.getDisplayString(resource):coreGetDisplayString(resource),status=options.getStatus?.(resource),secondaryText=options.getSecondaryText?.(resource);return jsx164(SummaryItem,{onClick:()=>context.onClickResource?.(resource),children:jsxs111(Box28,{children:[jsx164(Text49,{fw:500,className:SummaryItem_default.itemText,children:displayString}),(status||secondaryText)&&jsxs111(Group63,{mt:2,gap:4,children:[status&&jsx164(StatusBadge,{color:status.color,variant:"light",status:status.label}),secondaryText&&jsx164(Text49,{size:"xs",fw:500,c:"dimmed",children:secondaryText})]})]})},resource.id)})}):jsx164(Text49,{children:"(none)"})})}import{createReference as createReference16}from"@medplum/core";import{useCallback as useCallback30}from"react";import{jsx as jsx165}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback30((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),medplum.search("ClinicalImpression",{subject:ref,_count}),medplum.search("Communication",{subject:ref,_count}),medplum.search("Device",{patient:ref,_count}),medplum.search("DeviceRequest",{patient:ref,_count}),medplum.search("DiagnosticReport",{subject:ref,_count}),medplum.search("Media",{subject:ref,_count}),medplum.search("ServiceRequest",{subject:ref,_count}),medplum.search("Task",{subject:ref,_count})])},[]);return jsx165(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference16(resource),sender:createReference16(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference16(resource),operator:createReference16(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor13,Box as Box29,Button as Button23,CloseButton as CloseButton3,Flex as Flex26,Group as Group64,Loader as Loader10,NativeSelect as NativeSelect12,Paper as Paper6,Stack as Stack45,Text as Text50,TextInput as TextInput29}from"@mantine/core";import{getReferenceString as getReferenceString12}from"@medplum/core";import{useMedplum as useMedplum49,useResource as useResource14}from"@medplum/react-hooks";import{useEffect as useEffect34,useState as useState90}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx166,jsxs as jsxs112}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum49(),defaultValue2=useResource14(props.value),[schemaLoaded,setSchemaLoaded]=useState90(!1),[selectedKey,setSelectedKey]=useState90(),[hoverKey,setHoverKey]=useState90(),[value,setValue]=useState90();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}if(useEffect34(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect34(()=>(setValue(ensurePlanDefinitionKeys(defaultValue2??{resourceType:"PlanDefinition",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]),!schemaLoaded||!value)return null;function changeProperty(property,newValue){setValue(prevValue=>({...prevValue,[property]:newValue}))}return jsx166("div",{children:jsxs112(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx166(TextInput29,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx166(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx166(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 jsxs112(Stack45,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx166(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx166("div",{children:jsx166(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 jsx166("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx166(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState90(),medplum=useMedplum49(),[loading,setLoading]=useState90(!1),[resource,setResource]=useState90(),editing=props.selectedKey===props.action.id,hovering=props.hoverKey===props.action.id;function changeProperty(property,value){props.onChange({...action,[property]:value})}let className=clsx_default(PlanDefinitionBuilder_default.section,{[PlanDefinitionBuilder_default.hovering]:hovering&&!editing});return useEffect34(()=>{(async()=>{if(!action.definitionCanonical)return;setLoading(!0);let resource2=await medplum.readCanonical(["Questionnaire","ActivityDefinition"],action.definitionCanonical);setActionType(getInitialActionType(resource2)),setResource(resource2),setLoading(!1)})().catch(console.error)},[action.definitionCanonical,medplum]),loading?jsx166(Loader10,{}):jsxs112(Paper6,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs112(Flex26,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx166(TextInput29,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx166(CloseButton3,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs112(Stack45,{gap:"xl",p:"md",children:[jsx166(Box29,{children:jsx166(TextInput29,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx166(Box29,{children:jsx166(NativeSelect12,{label:"Type of Action",value:actionType,onChange:e=>{let value=e.currentTarget.value==="standard"?void 0:e.currentTarget.value;setActionType(value),props.onChange({...props.action,definitionCanonical:value==="standard"?void 0:props.action.definitionCanonical})},data:[{value:"standard",label:"Standard task"},{value:"questionnaire",label:"Task with Questionnaire"},{value:"activitydefinition",label:"Task with Activity Definition"}]})}),actionType==="questionnaire"&&jsxs112(Stack45,{gap:0,children:[jsxs112(Group64,{gap:0,mb:"xs",children:[jsx166(Text50,{fw:600,children:"Select questionnaire"}),jsx166(Text50,{c:"red",children:"*"})]}),jsxs112(Text50,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx166(Anchor13,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx166(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&jsxs112(Stack45,{gap:0,children:[jsxs112(Group64,{gap:0,mb:"xs",children:[jsx166(Text50,{fw:600,children:"Select activity definition"}),jsx166(Text50,{c:"red",children:"*"})]}),jsxs112(Text50,{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"," ",jsx166(Anchor13,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx166(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return jsx166(ResourceInput,{name:id,placeholder:props.placeholder,resourceType:props.resourceType,defaultValue:resource,onChange:newValue=>{newValue?props.onChange({...props.action,definitionCanonical:"url"in newValue?newValue.url:void 0,definitionUri:"url"in newValue?void 0:getReferenceString12(newValue)}):props.onChange({...props.action,definitionCanonical:void 0})}})}function getInitialActionType(resource){return resource===void 0?"standard":resource.resourceType.toLowerCase()}var nextId=1;function generateId(existing){if(existing){if(existing.startsWith("id-")){let existingNum=Number.parseInt(existing.substring(3),10);Number.isNaN(existingNum)||(nextId=Math.max(nextId,existingNum+1))}return existing}return"id-"+nextId++}function ensurePlanDefinitionKeys(planDefinition){return{...planDefinition,action:ensurePlanDefinitionActionKeys(planDefinition.action)}}function ensurePlanDefinitionActionKeys(actions){if(actions)return actions.map(action=>({...action,id:generateId(action.id),action:ensurePlanDefinitionActionKeys(action.action)}))}import{Alert as Alert6,Loader as Loader11,Stack as Stack46,Text as Text51}from"@mantine/core";import{normalizeErrorString as normalizeErrorString16}from"@medplum/core";import{useEffect as useEffect35,useRef as useRef18,useState as useState91}from"react";import{jsx as jsx167,jsxs as jsxs113}from"react/jsx-runtime";var SCAN_INTERVAL_MS=150,jsQrPromise;function QrCodeScanner({onScan,onError,scanOnce=!0}){let videoRef=useRef18(null),canvasRef=useRef18(null),onScanRef=useRef18(onScan),onErrorRef=useRef18(onError),[loading,setLoading]=useState91(!0),[error,setError]=useState91();return useEffect35(()=>{onScanRef.current=onScan},[onScan]),useEffect35(()=>{onErrorRef.current=onError},[onError]),useEffect35(()=>{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(normalizeErrorString16(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]),jsxs113(Stack46,{gap:"sm",children:[error&&jsx167(Alert6,{color:"red",children:error}),jsx167("video",{ref:videoRef,width:640,height:480,muted:!0,style:{aspectRatio:"4 / 3",display:error?"none":"block",width:"100%",height:"auto",maxHeight:"70vh",background:"black"}}),jsx167("canvas",{ref:canvasRef,hidden:!0}),loading&&!error&&jsxs113(Text51,{c:"dimmed",size:"sm",children:[jsx167(Loader11,{size:"xs",mr:"xs"}),"Loading camera..."]})]})}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. ${normalizeErrorString16(err)}`)})),jsQrPromise}import{Anchor as Anchor14,Box as Box30,Group as Group65,NativeSelect as NativeSelect13,Space,Textarea as Textarea5,TextInput as TextInput30,Title as Title15}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{getQuestionnaireItemReferenceTargetTypes as getQuestionnaireItemReferenceTargetTypes2,isChoiceQuestion,QUESTIONNAIRE_ITEM_CONTROL_URL as QUESTIONNAIRE_ITEM_CONTROL_URL2,QuestionnaireItemType as QuestionnaireItemType4,setQuestionnaireItemReferenceTargetTypes,useMedplum as useMedplum50,useResource as useResource15}from"@medplum/react-hooks";import{useEffect as useEffect36,useLayoutEffect as useLayoutEffect7,useRef as useRef19,useState as useState92}from"react";var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};import{Fragment as Fragment58,jsx as jsx168,jsxs as jsxs114}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum50(),defaultValue2=useResource15(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState92(!1),[value,setValue]=useState92(),[selectedKey,setSelectedKey]=useState92(),[hoverKey,setHoverKey]=useState92();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect36(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect36(()=>(setValue(ensureQuestionnaireKeys(defaultValue2??{resourceType:"Questionnaire",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]);let handleChange=(questionnaire2,disableSubmit)=>{setValue(questionnaire2),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire2)};return!schemaLoaded||!value?null:jsx168("div",{children:jsxs114(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx168(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx168(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource4=isResourceType(props.item),isContainer=isResource4||item.type===QuestionnaireItemType4.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef19(props.item);useLayoutEffect7(()=>{itemRef.current=props.item});function onClick(e){killEvent(e),props.setSelectedKey(props.item.id)}function onHover(e){killEvent(e),props.setHoverKey(props.item.id)}function changeItem(changedItem){let curr=itemRef.current;props.onChange({...curr,item:curr.item?.map(i=>i.id===changedItem.id?changedItem:i)})}function addItem(addedItem,disableSubmit){props.onChange({...props.item,item:[...props.item.item??[],addedItem]},disableSubmit)}function removeItem(removedItem){props.onChange({...props.item,item:props.item.item?.filter(i=>i!==removedItem)})}function changeProperty(property,value){props.onChange({...itemRef.current,[property]:value})}function updateItem(updatedItem){props.onChange({...props.item,...updatedItem})}function toggleRepeatable(item2){props.onChange({...props.item,item:props.item.item?.map(i=>i===item2?{...i,repeats:!i.repeats}:i)})}function moveItem(itemIndex,delta){let updatedItems=reorderItems(props.item.item,itemIndex,delta);props.onChange({...props.item,item:updatedItems})}let className=clsx_default(QuestionnaireBuilder_default.section,{[QuestionnaireBuilder_default.editing]:editing,[QuestionnaireBuilder_default.hovering]:hovering&&!editing});return jsxs114("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx168("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs114(Fragment58,{children:[isResource4&&jsx168(TextInput30,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource4&&jsx168(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx168(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx168(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs114(Fragment58,{children:[resource.title&&jsx168(Title15,{children:resource.title}),item.text&&jsx168("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx168(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx168("div",{children:jsx168(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&&jsx168("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs114(Fragment58,{children:[jsx168(TextInput30,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx168(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"}]})]}):jsx168("div",{children:linkId})}),!isResource4&&jsx168(Box30,{className:QuestionnaireBuilder_default.movementActions,children:jsxs114(Box30,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx168(Anchor14,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx168(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx168(Anchor14,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx168(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs114("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs114(Fragment58,{children:[jsx168(Anchor14,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx168(Anchor14,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource4&&jsx168(Anchor14,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource4&&jsxs114(Fragment58,{children:[jsx168(Anchor14,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx168(Anchor14,{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 jsxs114("div",{children:[props.item.answerValueSet!==void 0?jsx168(TextInput30,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx168(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs114(Box30,{display:"flex",children:[jsx168(Anchor14,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),jsx168(Space,{w:"lg"}),jsx168(Anchor14,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx168("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs114("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx168("div",{children:jsx168(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)}),jsx168("div",{children:jsx168(Anchor14,{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 jsxs114(Fragment58,{children:[targetTypes.map((targetType,index)=>jsxs114(Group65,{children:[jsx168(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx168(Anchor14,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx168(Anchor14,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId2=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId2(){return"id-"+nextId2++}function ensureQuestionnaireKeys(questionnaire2){return{...questionnaire2,id:questionnaire2.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire2.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId2=Math.max(nextId2,Number.parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,Number.parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId2(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId2()}))}function createPage(){return{id:generateId2(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:QUESTIONNAIRE_ITEM_CONTROL_URL2,valueCodeableConcept:{coding:[{system:"http://hl7.org/fhir/questionnaire-item-control",code:"page"}]}}]}}function reorderItems(items,itemIndex,delta){let currentItems=items??[],newIndex=itemIndex+delta;if(newIndex<0||newIndex>=currentItems.length)return currentItems;let updatedItems=[...currentItems];return[updatedItems[itemIndex],updatedItems[newIndex]]=[updatedItems[newIndex],updatedItems[itemIndex]],updatedItems}import{ActionIcon as ActionIcon19,Box as Box31,Button as Button24,Collapse as Collapse2,Divider as Divider15,Flex as Flex27,Loader as Loader12,Stack as Stack47,Text as Text52}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback4}from"@mantine/hooks";import{showNotification as showNotification12}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString17}from"@medplum/core";import{useMedplum as useMedplum51,useWhisper}from"@medplum/react-hooks";import{useCallback as useCallback31,useEffect as useEffect37,useRef as useRef20,useState as useState93}from"react";var AIRealTimeQuestionnaireForm_default={banner:"AIRealTimeQuestionnaireForm_banner",headerRow:"AIRealTimeQuestionnaireForm_headerRow",statusRow:"AIRealTimeQuestionnaireForm_statusRow",iconWrapper:"AIRealTimeQuestionnaireForm_iconWrapper",recordingPulse:"AIRealTimeQuestionnaireForm_recordingPulse",statusLabel:"AIRealTimeQuestionnaireForm_statusLabel",statusLabelPrimary:"AIRealTimeQuestionnaireForm_statusLabelPrimary",statusLabelFinishing:"AIRealTimeQuestionnaireForm_statusLabelFinishing",dictationButton:"AIRealTimeQuestionnaireForm_dictationButton",dictationButtonLoading:"AIRealTimeQuestionnaireForm_dictationButtonLoading",instructions:"AIRealTimeQuestionnaireForm_instructions",panelGrid:"AIRealTimeQuestionnaireForm_panelGrid",panelColumn:"AIRealTimeQuestionnaireForm_panelColumn",transcriptWrapper:"AIRealTimeQuestionnaireForm_transcriptWrapper",transcriptArea:"AIRealTimeQuestionnaireForm_transcriptArea",transcriptText:"AIRealTimeQuestionnaireForm_transcriptText"};import{Fragment as Fragment59,jsx as jsx169,jsxs as jsxs115}from"react/jsx-runtime";var SILENCE_DEBOUNCE_MS=3e3,DEFAULT_IDLE_LABEL="Start Dictation to complete this form with your voice",TRANSCRIPT_PLACEHOLDER="Start speaking to see your transcribed words...",VOICE_TRANSCRIPT_EXTENSION_URL="https://medplum.com/ai-voice-transcript",botIdentifier={system:"https://www.medplum.com/bots",value:"ai-realtime-questionnaire"};function getStoredTranscript(response){return response?.extension?.find(e=>e.url===VOICE_TRANSCRIPT_EXTENSION_URL)?.valueString??""}var DEFAULT_INSTRUCTIONS=jsxs115(Stack47,{gap:"xs",children:[jsx169(Text52,{children:"To fill out the form, just speak naturally and the dictation tool will map your spoken answers to the form fields."}),jsx169(Text52,{children:"Pause briefly between thoughts to start processing."})]});function AIRealTimeQuestionnaireForm(props){let{aiModel,onTranscript,voiceInstructions,...questionnaireFormProps}=props,medplum=useMedplum51(),[questionnaireResponse,setQuestionnaireResponse]=useState93(props.questionnaireResponse),[isProcessing,setIsProcessing]=useState93(!1),[transcript,setTranscript]=useState93(""),[displayTranscript,setDisplayTranscript]=useState93(()=>getStoredTranscript(props.questionnaireResponse)),[expanded,setExpanded]=useState93(!1),[isStopping,setIsStopping]=useState93(!1),[responseVersion,setResponseVersion]=useState93(0),questionnaireRef=useRef20(null),inputRef=useRef20(""),inFlightRef=useRef20(!1),responseRef=useRef20(questionnaireResponse),flushTranscriptRef=useRef20(async()=>{}),transcriptViewportRef=useRef20(null),fullTranscriptRef=useRef20(getStoredTranscript(questionnaireResponse));useEffect37(()=>{responseRef.current=questionnaireResponse},[questionnaireResponse]);let[botAvailability,setBotAvailability]=useState93("loading");useEffect37(()=>{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=jsxs115(Fragment59,{children:["Voice dictation unavailable: bot '",botIdentifier.value??"","' is not deployed",jsx169("br",{}),"Please contact support"]})):idleLabel=jsxs115(Fragment59,{children:["Voice dictation is not enabled for this project",jsx169("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=useRef20(status);useEffect37(()=>{statusRef.current=status},[status]);let processTranscript=useCallback31(async transcript2=>{if(!(!questionnaireRef.current||!transcript2.trim())){setIsProcessing(!0);try{let existingResponse=responseRef.current,parameter=[{name:"questionnaire",valueString:JSON.stringify(questionnaireRef.current)},{name:"transcript",valueString:transcript2}];existingResponse?.item&&existingResponse.item.length>0&¶meter.push({name:"questionnaireResponse",valueString:JSON.stringify(existingResponse)}),aiModel&¶meter.push({name:"model",valueString:aiModel});let responseParam=(await medplum.executeBot(botIdentifier,{resourceType:"Parameters",parameter})).parameter?.find(p=>p.name==="questionnaireResponse");if(responseParam?.valueString)try{let aiQuestionnaireResponse=JSON.parse(responseParam.valueString),preservedExtensions=(aiQuestionnaireResponse.extension??[]).filter(e=>e.url!==VOICE_TRANSCRIPT_EXTENSION_URL);aiQuestionnaireResponse.extension=[...preservedExtensions,{url:VOICE_TRANSCRIPT_EXTENSION_URL,valueString:fullTranscriptRef.current}],responseRef.current=aiQuestionnaireResponse,setQuestionnaireResponse(aiQuestionnaireResponse),setResponseVersion(v=>v+1)}catch(parseError){console.error("Failed to parse bot response as QuestionnaireResponse:",parseError),showNotification12({color:"red",message:`Failed to parse bot response as QuestionnaireResponse: ${normalizeErrorString17(parseError)}`})}}catch(error){console.error("Error processing transcript with AI:",error)}finally{setIsProcessing(!1)}}},[medplum,aiModel]);useEffect37(()=>{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=>showNotification12({color:"red",message:`Error flushing transcript: ${normalizeErrorString17(err)}`}))},SILENCE_DEBOUNCE_MS);useEffect37(()=>{status==="speech_stopped"&&debouncedFlush()},[status,debouncedFlush]),useEffect37(()=>{let viewport=transcriptViewportRef.current;viewport&&viewport.scrollTo({top:viewport.scrollHeight,behavior:"smooth"})},[transcript,displayTranscript]);let isConnecting=status==="requesting_microphone"||status==="connecting"||status==="connected",isRecording=status==="listening"||status==="speech_started"||status==="speech_stopped",handleStartDictation=useCallback31(()=>{setExpanded(!0),start().catch(err=>console.error("Error starting voice input:",err))},[start]),handleStopDictation=useCallback31(()=>{setIsStopping(!0),stop(),debouncedFlush.cancel(),flushTranscriptRef.current().catch(err=>showNotification12({color:"red",message:`Error flushing transcript: ${normalizeErrorString17(err)}`}))},[stop,debouncedFlush]),handleToggleExpanded=useCallback31(()=>{setExpanded(prev=>!prev)},[]),handleClearTranscript=useCallback31(()=>{inputRef.current="",fullTranscriptRef.current="",setTranscript(""),setDisplayTranscript(""),onTranscript?.("","");let existing=responseRef.current;if(existing?.extension?.some(e=>e.url===VOICE_TRANSCRIPT_EXTENSION_URL)){let next={...existing,extension:existing.extension.filter(e=>e.url!==VOICE_TRANSCRIPT_EXTENSION_URL)};responseRef.current=next,setQuestionnaireResponse(next)}},[onTranscript]);useEffect37(()=>{isStopping&&!isConnecting&&!isRecording&&setIsStopping(!1)},[isStopping,isProcessing,isConnecting,isRecording]),useEffect37(()=>{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=jsx169(IconMicrophone,{size:20});isFinishing?(statusState="finishing",statusIcon=jsx169(Loader12,{size:16,color:"blue"})):activeStatusLabel&&(statusState="recording",statusIcon=jsx169(IconCircleFilled,{size:16}));let afterHeader=jsxs115(Box31,{className:AIRealTimeQuestionnaireForm_default.banner,children:[jsxs115(Flex27,{align:"center",justify:"space-between",gap:"sm",p:"md",className:AIRealTimeQuestionnaireForm_default.headerRow,children:[jsxs115("div",{className:AIRealTimeQuestionnaireForm_default.statusRow,"data-state":statusState,children:[jsx169("span",{className:AIRealTimeQuestionnaireForm_default.iconWrapper,"aria-hidden":!0,children:statusIcon}),jsx169("span",{className:AIRealTimeQuestionnaireForm_default.statusLabel,"aria-live":"polite",children:activeStatusLabel?jsx169("span",{className:isFinishing?AIRealTimeQuestionnaireForm_default.statusLabelFinishing:AIRealTimeQuestionnaireForm_default.statusLabelPrimary,children:activeStatusLabel}):idleLabel})]}),jsxs115(Flex27,{align:"center",gap:"xs",children:[jsx169(Button24,{className:clsx_default(AIRealTimeQuestionnaireForm_default.dictationButton,showButtonLoader&&AIRealTimeQuestionnaireForm_default.dictationButtonLoading),variant:showStopButton?"light":"filled",color:showStopButton?"red":"blue",size:"sm",leftSection:showButtonLoader?jsx169(Loader12,{size:14,color:"dimmed"}):void 0,disabled:showButtonLoader||!isVoiceEnabled&&!showStopButton,onClick:showStopButton?handleStopDictation:handleStartDictation,children:dictationLabel}),jsx169(ActionIcon19,{variant:"subtle",color:"gray",size:"lg",radius:"xl","aria-label":expanded?"Collapse transcript":"Expand transcript","aria-expanded":expanded,onClick:handleToggleExpanded,children:expanded?jsx169(IconChevronUp,{size:18}):jsx169(IconChevronDown,{size:18})})]})]}),jsxs115(Collapse2,{in:expanded,children:[jsx169(Box31,{px:"md",children:jsx169(Divider15,{color:"var(--mantine-color-gray-2)"})}),jsx169(Box31,{p:"md",children:jsxs115("div",{className:AIRealTimeQuestionnaireForm_default.panelGrid,children:[jsxs115("div",{className:AIRealTimeQuestionnaireForm_default.panelColumn,children:[jsx169(Text52,{size:"sm",fw:700,children:"How to Use"}),jsx169("div",{className:AIRealTimeQuestionnaireForm_default.instructions,children:voiceInstructions??DEFAULT_INSTRUCTIONS})]}),jsxs115("div",{className:AIRealTimeQuestionnaireForm_default.panelColumn,children:[jsxs115(Flex27,{align:"center",justify:"space-between",gap:"xs",children:[jsx169(Text52,{size:"sm",fw:700,children:"Transcript"}),jsx169(Button24,{variant:"subtle",color:"red",size:"compact-xs",leftSection:jsx169(IconTrash,{size:14}),disabled:!displayTranscript&&!transcript,onClick:handleClearTranscript,children:"Clear"})]}),jsx169("div",{className:AIRealTimeQuestionnaireForm_default.transcriptWrapper,children:jsx169("div",{ref:transcriptViewportRef,className:AIRealTimeQuestionnaireForm_default.transcriptArea,children:jsx169(Text52,{component:"pre",className:AIRealTimeQuestionnaireForm_default.transcriptText,children:(displayTranscript&&transcript?`${displayTranscript} ${transcript}`:displayTranscript||transcript)||TRANSCRIPT_PLACEHOLDER})})})]})]})})]})]});return jsx169(QuestionnaireForm,{...questionnaireFormProps,questionnaireResponse,afterHeader,onChange:response=>{setQuestionnaireResponse(response),props.onChange?.(response)}},responseVersion)}import{Stack as Stack49}from"@mantine/core";import{useResource as useResource16}from"@medplum/react-hooks";import{Stack as Stack48,Text as Text53}from"@mantine/core";import{formatDate as formatDate4}from"@medplum/core";import{useMemo as useMemo40}from"react";import{Fragment as Fragment60,jsx as jsx170,jsxs as jsxs116}from"react/jsx-runtime";function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=useMemo40(()=>answer&&answer.length>0?jsx170(Fragment60,{children:answer.map((ans,index)=>jsx170(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?jsx170(Fragment60,{children:nestedAnswers.map((nestedAnswer,index)=>jsx170(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):jsx170(Text53,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return jsxs116(Stack48,{gap:0,pb:"xs",children:[jsx170(Text53,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return jsx170(Text53,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return jsx170(Text53,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return jsx170(Text53,{children:value});case"valueQuantity":return jsx170(QuantityDisplay,{value});case"valueString":return jsx170(Text53,{children:value});case"valueCoding":return jsx170(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return jsx170(RangeDisplay,{value});case"valueDateTime":return jsx170(Text53,{children:formatDate4(value)});case"valueBoolean":return jsx170(Text53,{children:value?"True":"False"});case"valueReference":return jsx170(Text53,{children:value.display??value.reference});default:return jsx170(Text53,{children:value.toString()})}}import{jsx as jsx171}from"react/jsx-runtime";function QuestionnaireResponseDisplay(props){let questionnaireResponse=useResource16(props.questionnaireResponse);return jsx171(Stack49,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>jsx171(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}import{ActionIcon as ActionIcon20,Divider as Divider16,Group as Group66,NativeSelect as NativeSelect14,Stack as Stack50,Text as Text54,TextInput as TextInput31}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect38,useState as useState94}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx172,jsxs as jsxs117}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]=useState94([]),[groupId,setGroupId]=useState94(1),[intervalId,setIntervalId]=useState94(1);return useEffect38(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs117(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx172(Stack50,{children:intervalGroups.map(intervalGroup=>jsx172(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx172(ActionIcon20,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx172(IconCirclePlus,{})}),jsx172(Group66,{justify:"flex-end",children:jsx172(SubmitButton,{children:"Save"})})]});function submitDefinition(){let qualifiedInterval=intervalGroups.flatMap(group=>group.intervals).filter(interval=>!isEmptyInterval(interval));props.onSubmit({...defaultDefinition,qualifiedInterval})}function addGroup(addedGroup){setIntervalGroups(currentGroups=>[...currentGroups,addedGroup])}function removeGroup(removedGroup){setIntervalGroups(currentGroups=>currentGroups.filter(group=>group.id!==removedGroup.id))}function changeInterval(groupId2,changedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2),index=currentGroup?.intervals.findIndex(interval=>interval.id===changedInterval.id);return index!==void 0&¤tGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g=>g.id===groupId2);if(currentGroupIndex!==-1){let currentGroup={...groups[currentGroupIndex]};addedInterval={...addedInterval,...currentGroup.filters},currentGroup.intervals=[...currentGroup.intervals,addedInterval],groups[currentGroupIndex]=currentGroup}return groups})}function removeInterval(groupId2,removedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx172(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs117(Stack50,{gap:"lg",children:[jsx172(Group66,{justify:"flex-end",children:jsx172(ActionIcon20,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx172(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx172(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx172(Divider16,{}),intervalGroup.intervals.map(interval=>jsxs117(Stack50,{gap:"xs",children:[jsxs117(Group66,{children:[jsx172(TextInput31,{"data-testid":`condition-${interval.id}`,defaultValue:interval.condition,label:"Condition: ",size:"sm",onChange:e=>{killEvent(e),props.onChange(intervalGroup.id,{...interval,condition:e.currentTarget.value.trim()})}},`condition-${interval.id}`),jsx172(ActionIcon20,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx172(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx172(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx172(ActionIcon20,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx172(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 jsxs117(Stack50,{style:{maxWidth:"50%"},children:[jsx172(Group66,{children:jsx172(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})}}})}),jsxs117(Group66,{gap:"xs",children:[jsx172(Text54,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx172("div",{id:`div-age-${intervalGroup.id}`,children:jsx172(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}`)})]}),jsx172(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"}]}})}}}),jsx172(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 Button25,Grid as Grid2,Text as Text55}from"@mantine/core";import{formatDateTime as formatDateTime7,getReferenceString as getReferenceString13}from"@medplum/core";import{useMedplum as useMedplum52,useResource as useResource17}from"@medplum/react-hooks";import{Fragment as Fragment61,useEffect as useEffect39,useState as useState95}from"react";import{jsx as jsx173,jsxs as jsxs118}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum52(),requestGroup=useResource17(props.value),[startedLoading,setStartedLoading]=useState95(!1),[responseBundle,setResponseBundle]=useState95();if(useEffect39(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx173(Grid2,{children:requestGroup.action?.map((action,index)=>{let task=action.resource&&findBundleEntry(action.resource),taskInput=task?.input?.[0]?.valueReference,taskOutput=task?.output?.[0]?.valueReference;return jsxs118(Fragment61,{children:[jsx173(Grid2.Col,{span:1,p:"md",children:task?.status==="completed"?jsx173(IconCheckbox,{}):jsx173(IconSquare,{color:"gray"})}),jsxs118(Grid2.Col,{span:9,p:"xs",children:[jsx173(Text55,{fw:500,children:action.title}),action.description&&jsx173("div",{children:action.description}),jsxs118("div",{children:["Last edited by\xA0",jsx173(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime7(task?.meta?.lastUpdated)]}),jsxs118("div",{children:["Status: ",jsx173(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs118(Grid2.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx173(Button25,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx173(Button25,{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 useMedplum53}from"@medplum/react-hooks";import{useEffect as useEffect40,useState as useState96}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 Fragment62,jsx as jsx174,jsxs as jsxs119}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum53(),[value,setValue]=useState96(props.history);if(useEffect40(()=>{!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 jsx174("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx174("div",{className:ResourceBlame_default.container,children:jsx174("table",{className:ResourceBlame_default.root,children:jsx174("tbody",{children:table.map((row,index)=>jsxs119("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs119(Fragment62,{children:[jsxs119("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:[jsx174(ResourceName,{value:row.meta.author,link:!0,fz:"xs"}),row.meta.onBehalfOf&&jsxs119("div",{className:ResourceBlame_default.onBehalfOf,children:["on behalf of ",jsx174(ResourceName,{value:row.meta.onBehalfOf,link:!0,fz:"xs",c:"dimmed"})]})]}),jsx174("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx174(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),fz:"xs",children:getTimeString(row.meta.lastUpdated)})})]}),jsx174("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx174("td",{className:ResourceBlame_default.line,children:jsx174("pre",{className:ResourceBlame_default.pre,children:row.value})})]},"row-"+index))})})})}import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT3}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate7,useResourceBoard}from"@medplum/react-hooks";import{jsx as jsx175}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,navigate=useMedplumNavigate7(),{items,total,loading,selected,search:memoizedSearch,refresh}=useResourceBoard({search,selectedId,loadItems,resolveSelected,reloadKey,onSelectFirst,onLoad,onError}),count=memoizedSearch.count??DEFAULT_SEARCH_COUNT3,offset=memoizedSearch.offset??0,currentPage=Math.floor(offset/count)+1,pageCount=total!==void 0?Math.ceil(total/count):0,selectedKey=selected?.id??selectedId;return jsx175(ListWithDetailPane,{items,loading,selectedKey,renderItem,emptyList,skeleton,listWidth,...tabs?{tabs,activeTab,onTabChange:value=>{let tab=tabs?.find(t=>t.value===value);tab&&navigate(tab.uri)}}:{headerText},headerActions,selected,renderDetail,emptyDetail,refresh,page:currentPage,pageCount,onPageChange:onChange?page=>{onChange?.({...memoizedSearch,offset:(page-1)*count})}:void 0})}import{stringify as stringify5}from"@medplum/core";var ResourceDiff_default={removed:"ResourceDiff_removed",added:"ResourceDiff_added"};import{Fragment as Fragment63,jsx as jsx176,jsxs as jsxs120}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 jsx176("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx176(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs120(Fragment63,{children:["...",jsx176("br",{}),props.delta.original.lines.length>0&&jsx176("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
|
|
110
|
-
`)}),props.delta.revised.lines.length>0&&
|
|
111
|
-
`)}),"...",jsx176("br",{})]})}import{ActionIcon as ActionIcon21,Alert as Alert7,Button as Button26,Group as Group67,Menu as Menu9,Stack as Stack51,TextInput as TextInput32,useMantineTheme}from"@mantine/core";import{AccessPolicyInteraction as AccessPolicyInteraction2,applyDefaultValuesToResource,canWriteResourceType,isPopulated as isPopulated11,satisfiedAccessPolicy as satisfiedAccessPolicy2,tryGetProfile as tryGetProfile5}from"@medplum/core";import{useMedplum as useMedplum54,useResource as useResource18}from"@medplum/react-hooks";import{useEffect as useEffect41,useMemo as useMemo41,useState as useState97}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx177,jsxs as jsxs121}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum54(),defaultValue2=useResource18(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState97(!1),[value,setValue]=useState97(),accessPolicy=medplum.getAccessPolicy(),theme=useMantineTheme();useEffect41(()=>{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=useMemo41(()=>defaultValue2&&satisfiedAccessPolicy2(defaultValue2,AccessPolicyInteraction2.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=useMemo41(()=>medplum.isSuperAdmin()||!accessPolicy||!isPopulated11(value?.resourceType)?!0:canWriteResourceType(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?jsx177("div",{children:"Loading..."}):canWrite?jsxs121("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs121(Stack51,{mb:"xl",children:[jsx177(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx177(TextInput32,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx177(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx177(TextInput32,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx177(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:resourceType,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl,accessPolicyResource}),jsxs121(Group67,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx177(Button26,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs121(Menu9,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx177(Menu9.Target,{children:jsx177(ActionIcon21,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx177(IconChevronDown,{size:14,stroke:1.5})})}),jsxs121(Menu9.Dropdown,{children:[props.onPatch&&jsx177(Menu9.Item,{leftSection:jsx177(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx177(Menu9.Item,{color:"red",leftSection:jsx177(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs121(Alert7,{color:"red",title:"Permission denied",icon:jsx177(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 normalizeErrorString18}from"@medplum/core";import{useMedplum as useMedplum55}from"@medplum/react-hooks";import{useEffect as useEffect42,useState as useState98}from"react";import{jsx as jsx178,jsxs as jsxs122}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum55(),[value,setValue]=useState98(props.history);return useEffect42(()=>{!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?jsxs122(Table6,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx178(Table6.Thead,{children:jsxs122(Table6.Tr,{children:[jsx178(Table6.Th,{children:"Author"}),jsx178(Table6.Th,{children:"On Behalf Of"}),jsx178(Table6.Th,{children:"Date"}),jsx178(Table6.Th,{children:"Version"})]})}),jsx178(Table6.Tbody,{children:value.entry?.map((entry,index)=>jsx178(HistoryRow,{entry},"entry-"+index))})]}):jsx178("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs122(Table6.Tr,{children:[jsx178(Table6.Td,{children:jsx178(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx178(Table6.Td,{children:resource.meta?.onBehalfOf&&jsx178(ResourceBadge,{value:resource.meta.onBehalfOf,link:!0})}),jsx178(Table6.Td,{children:formatDateTime8(resource.meta?.lastUpdated)}),jsx178(Table6.Td,{children:jsx178(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx178(Table6.Tr,{children:jsx178(Table6.Td,{colSpan:4,children:normalizeErrorString18(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button27,Loader as Loader13,Stack as Stack52,Text as Text56}from"@mantine/core";import{showNotification as showNotification13}from"@mantine/notifications";import{arrayify as arrayify2,getReferenceString as getReferenceString14,isDefined,isReference as isReference4,isResource as isResource3,normalizeErrorString as normalizeErrorString19}from"@medplum/core";import{useMedplum as useMedplum56}from"@medplum/react-hooks";import{useCallback as useCallback32,useEffect as useEffect43,useMemo as useMemo42,useState as useState99}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx179,jsxs as jsxs123}from"react/jsx-runtime";function BaseScheduler(props){let[month,setMonth]=useState99(getStartMonth),[date,setDate]=useState99(),[options,setOptions]=useState99(),[selectedOption,setSelectedOption]=useState99(),{fetchOptions,onSelectOption}=props;useEffect43(()=>{let active=!0;async function doSearch(){let start=getStart2(month),end=getEnd2(month),options2=await fetchOptions({start,end});active&&setOptions(options2)}return doSearch().catch(console.error),()=>{active=!1}},[fetchOptions,month]);let handleSelectOption=useCallback32(option=>{setSelectedOption(option),onSelectOption?.(...option)},[onSelectOption]),filteredOptions=useMemo42(()=>{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?jsxs123("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs123("div",{className:Scheduler_default.info,children:[props.actor&&jsx179(ResourceAvatar,{value:props.actor,size:"xl"}),props.actor&&jsx179(Text56,{size:"xl",fw:500,children:jsx179(ResourceName,{value:props.actor})}),jsx179("p",{children:"1 hour"}),date&&jsx179("p",{children:date.toLocaleDateString()}),selectedOption&&jsx179("p",{children:formatTime(selectedOption[1])})]}),jsxs123("div",{className:Scheduler_default.selection,children:[!date&&jsxs123("div",{children:[jsx179("h3",{children:"Select date"}),jsx179(CalendarDateInput,{availableDates:options.map(opt=>opt[1]),onChangeMonth:setMonth,onClick:setDate})]}),date&&!selectedOption&&jsxs123("div",{children:[jsx179("h3",{children:"Select time"}),jsx179(Stack52,{children:filteredOptions.map(option=>jsx179("div",{children:jsx179(Button27,{variant:"outline",style:{width:150},onClick:()=>handleSelectOption(option),children:formatTime(option[1])})},option[1].toISOString()))})]}),props.children]})]}):jsx179("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:jsx179(Loader13,{})})}function onlyPractitioner(schedule){let refs=schedule.actor.filter(ref=>isReference4(ref,"Practitioner"));if(refs.length===1)return refs[0]}function Scheduler(props){let medplum=useMedplum56(),{fetchSlots,schedule}=props,[actor,setActor]=useState99(),fetchOptions=useCallback32(async period=>{if(fetchSlots)return(await fetchSlots(period)).map(slot=>[slot,new Date(slot.start)]);let scheduleRefs=arrayify2(schedule??[]).map(getReferenceString14).filter(isDefined),slotSearchParams=new URLSearchParams([["_count","720"],["schedule",scheduleRefs.join(",")],["start","gt"+period.start],["start","lt"+period.end]]);return(await medplum.searchResources("Slot",slotSearchParams)).map(slot=>[slot,new Date(slot.start)])},[medplum,fetchSlots,schedule]);return useEffect43(()=>{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=>{showNotification13({color:"red",title:"Error",message:normalizeErrorString19(error)})})},[medplum,props.schedule]),jsx179(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 useEffect44}from"react";var dist_exports={};__export(dist_exports,{HydratedRouter:()=>HydratedRouter,RouterProvider:()=>RouterProvider});__reExport(dist_exports,react_router_star);import{HydratedRouter,RouterProvider}from"react-router/dom";import*as react_router_star from"react-router";function ScrollToTop(){let{pathname}=(0,dist_exports.useLocation)();return useEffect44(()=>{window.scrollTo(0,0)},[pathname]),null}import{createReference as createReference17}from"@medplum/core";import{jsx as jsx180}from"react/jsx-runtime";function ServiceRequestTimeline(props){let{serviceRequest,...rest}=props;return jsx180(ResourceTimeline,{value:serviceRequest,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("ServiceRequest",id),medplum.search("Communication",{"based-on":ref,_count}),medplum.search("DiagnosticReport",{"based-on":ref,_count}),medplum.search("Media",{"based-on":ref,_count}),medplum.search("DocumentReference",{related:ref,_count}),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count})])},createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",basedOn:[createReference17(resource)],subject:resource.subject,sender:createReference17(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference17(resource)],subject:resource.subject,operator:createReference17(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor15}from"@mantine/core";import{showNotification as showNotification14}from"@mantine/notifications";import{ensureTrailingSlash,normalizeErrorString as normalizeErrorString20}from"@medplum/core";import{useMedplum as useMedplum57,useResource as useResource19}from"@medplum/react-hooks";import{jsx as jsx181}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum57(),{client,patient,encounter,children,...rest}=props,patientResource=useResource19(patient),encounterResource=useResource19(encounter);function launchApp(){let patientRef=patient,encounterRef=encounter;if(client.launchIdentifierSystems?.length){let patientIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Patient");if(patientRef&&patientResource&&patientIdentifierConfig?.system){let identifier=patientResource.identifier?.find(i=>i.system===patientIdentifierConfig.system);identifier&&(patientRef={...patient,identifier})}let encounterIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Encounter");if(encounterRef&&encounterResource&&encounterIdentifierConfig?.system){let identifier=encounterResource.identifier?.find(i=>i.system===encounterIdentifierConfig.system);identifier&&(encounterRef={...encounter,identifier})}}medplum.createResource({resourceType:"SmartAppLaunch",patient:patientRef,encounter:encounterRef,fhirContext:props.fhirContext}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",ensureTrailingSlash(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),window.open(url.toString(),"_blank")}).catch(err=>showNotification14({color:"red",message:normalizeErrorString20(err),autoClose:!1}))}return jsx181(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,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,InfoBar,InsuranceSection,LabsSection,LinkTabs,ListWithDetailPane,Loading,Logo,MeasureReportDisplay,MedicationsSection,MedplumLink,MemoizedFhirPathTable,MfaEnrollForm,MfaForm,MfaVerificationForm,MoneyDisplay,MoneyInput,MultiResourceInput,Navbar,NewTopicDialog,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,Panel,ParticipantFilter,PatientAccountsForm,PatientExportForm,PatientHeader,PatientSummary,PatientTimeline,Pharmacies,PharmaciesSection,PharmacyDialog,PlanDefinitionBuilder,ProblemListSection,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,ValueSetAutocomplete,VitalsSection,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNext24HoursFilter,addNextMonthFilter,addPreferredPharmacyToPatient,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,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,isOrganizationArray,isSortDescending,isSupportedProfileStructureDefinition,killEvent,parseForm,removePreferredPharmacyFromPatient,renderValue,sendCommand,setFilters,setOffset,setPage,setPropertyValue,setSort,sortByDateAndPriority,summaryResourceListSection,toggleSort,valueSetElementToCoding};
|
|
109
|
+
}`.replaceAll(/\s+/g," ");return(await medplum.graphql(query)).data.StructureDefinitionList[0]}function shouldFetchResourceType(targetType){return targetType.type==="profile"&&!targetType?.error&&isEmpty4(targetType.resourceType)}import{Group as Group25,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 Group24,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(Group24,{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(Group24,{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(Group25,{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(Group25,{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 Group26,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(Group26,{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(Group26,{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(Group26,{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(Group26,{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(Group26,{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(Group27,{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 Group28}from"@mantine/core";import{useMemo as useMemo23,useState as useState54}from"react";var CalendarDateInput_default={table:"CalendarDateInput_table"};function getMonthString(date){return date.toLocaleString("default",{month:"long"})+" "+date.getFullYear()}function getStartMonth(){let result=new Date;return result.setDate(1),result.setHours(0,0,0,0),result}import{jsx as jsx96,jsxs as jsxs56}from"react/jsx-runtime";function CalendarDateInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState54(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth);return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=useMemo23(()=>buildGrid(month,props.availableDates),[month,props.availableDates]);return jsxs56("div",{children:[jsxs56(Group28,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx96("p",{style:{flex:1},children:getMonthString(month)}),jsxs56(Group28,{justify:"flex-end",gap:"xs",children:[jsx96(Button9,{variant:"outline","aria-label":"Previous month",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",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,availableDates){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d),available:isDayAvailable(d,availableDates)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,availableDates){for(let availableDate of availableDates)if(availableDate.getFullYear()===day.getFullYear()&&availableDate.getMonth()===day.getMonth()&&availableDate.getDate()===day.getDate())return!0;return!1}import{useMemo as useMemo24}from"react";import{jsx as 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 Group29,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&¶ms.set("subject",subjectRefStr),query.trim()&¶ms.set("description:contains",query.trim()),params.set("_sort","-date"),params.set("_count","5");let results=await medplum.searchResources("DocumentReference",params);setDocs([...results])}catch(err){console.error(err)}finally{setLoading(!1)}},300);useEffect15(()=>{fetchDocs(search)},[fetchDocs,search]);let getDocName=doc=>doc.description??doc.content?.[0]?.attachment?.title??"Untitled";return 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(Group29,{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(Group29,{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(Group29,{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(Group29,{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(Group29,{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(Group29,{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(Group29,{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{Box as Box13,Button as Button10,Modal as Modal3,Stack as Stack22}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";var EditThreadDialog_default={body:"EditThreadDialog_body",title:"EditThreadDialog_title",header:"EditThreadDialog_header"};import{Divider as Divider6,Stack as Stack21,Text as Text23,TextInput as TextInput21}from"@mantine/core";import{createReference as createReference4}from"@medplum/core";import{Fragment as Fragment33,jsx as jsx102,jsxs as jsxs60}from"react/jsx-runtime";var ThreadMessageForm=props=>{let{defaultPractitioners,onPractitionersChange,topic,onTopicChange,defaultPatient,onPatientChange}=props,allowPatientSelection=props.allowPatientSelection??!1;return jsxs60(Fragment33,{children:[jsxs60(Stack21,{gap:0,children:[jsx102(Text23,{fw:500,children:"Patient"}),allowPatientSelection&&jsx102(Text23,{c:"dimmed",children:"Select a patient"}),jsx102(ResourceInput,{resourceType:"Patient",name:"patient",required:!!onPatientChange,defaultValue:defaultPatient,disabled:!allowPatientSelection&&!!defaultPatient,onChange:value=>{onPatientChange?.(value?createReference4(value):void 0)}})]}),jsxs60(Stack21,{gap:0,children:[jsx102(Text23,{fw:500,children:"Practitioner"}),jsx102(Text23,{c:"dimmed",children:"Select one or more practitioners"}),jsx102(MultiResourceInput,{resourceType:"Practitioner",name:"practitioners",defaultValue:defaultPractitioners,onChange:resources=>onPractitionersChange(resources.map(practitioner=>createReference4(practitioner)))})]}),jsxs60(Stack21,{gap:0,children:[jsx102(Text23,{fw:500,children:"Topic (optional)"}),jsx102(Text23,{c:"dimmed",children:"Enter a topic for the message"}),jsx102(TextInput21,{placeholder:"Enter your topic",value:topic,onChange:e=>onTopicChange(e.target.value)})]}),jsx102(Divider6,{pt:"xs"})]})};import{jsx as jsx103,jsxs as jsxs61}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 jsx103(Modal3,{opened,onClose,title:"New Message",size:"md",classNames:EditThreadDialog_default,children:jsxs61(Stack22,{gap:0,children:[jsx103(Stack22,{gap:"lg",p:"lg",children:jsx103(ThreadMessageForm,{defaultPractitioners:initialPractitioners,onPractitionersChange:setPractitioners,topic,onTopicChange:setTopic,defaultPatient:patient,onPatientChange:setPatient,allowPatientSelection})}),jsx103(Box13,{px:"lg",pb:"lg",children:jsx103(Button10,{w:"100%",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"})})]})})};import{ActionIcon as ActionIcon10,Checkbox as Checkbox5,CloseButton as CloseButton2,Group as Group30,Indicator,Popover as Popover2,Stack as Stack23,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 jsx104,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:[jsx104(Popover2.Target,{children:jsx104(Tooltip5,{label:"Message Participants",position:"bottom",openDelay:500,disabled:opened,children:jsx104(Indicator,{disabled:!hasActiveFilter,color:"blue",size:8,offset:4,children:jsx104(ActionIcon10,{variant:"transparent",onClick:opened?close:open,radius:"xl",size:32,className:"outline-icon-button","data-opened":opened||void 0,children:jsx104(IconUsers,{size:16})})})})}),jsx104(Popover2.Dropdown,{p:"md",children:jsxs62(Stack23,{gap:"md",children:[jsx104(Text24,{size:"xs",c:"dimmed",fw:500,children:"Message Participants"}),jsx104(TextInput22,{placeholder:"Search for a Patient or Practitioner...",value:searchQuery,autoFocus:!0,onChange:e=>setSearchQuery(e.target.value),rightSection:searchQuery?jsx104(CloseButton2,{size:"sm",onClick:()=>setSearchQuery("")}):null}),jsxs62(Stack23,{gap:"xs",mah:250,style:{overflowY:"auto"},children:[currentUserParticipant&&jsx104(ParticipantItem,{participant:currentUserParticipant,isSelected:isSelected(currentUserParticipant),isCurrentUser:!0,onToggle:()=>toggleParticipant(currentUserParticipant)}),displayParticipants.map(participant=>jsx104(ParticipantItem,{participant,isSelected:isSelected(participant),isCurrentUser:!1,onToggle:()=>toggleParticipant(participant),onRemove:isSelected(participant)?()=>removeParticipant(participant):void 0},participant.reference)),isSearching&&jsx104(Text24,{size:"sm",c:"dimmed",ta:"center",children:"Searching..."}),searchQuery.trim()&&!isSearching&&searchResults.length===0&&jsx104(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(Group30,{justify:"space-between",wrap:"nowrap",className:ParticipantFilter_default.participantItem,children:[jsxs62(Group30,{gap:"sm",wrap:"nowrap",style:{flex:1,minWidth:0},children:[jsx104(Checkbox5,{checked:isSelected,onChange:onToggle}),jsx104(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&&jsx104(CloseButton2,{size:"sm",onClick:onRemove})]}):null}import{ActionIcon as ActionIcon14,Box as Box27,Center as Center5,Flex as Flex23,Skeleton as Skeleton3,Stack as Stack39,Text as Text42,ThemeIcon,Tooltip as Tooltip9}from"@mantine/core";import{useDisclosure as useDisclosure10}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 useCallback23,useEffect as useEffect24,useMemo as useMemo34}from"react";import{Box as Box14,Center as Center4,Divider as Divider8,Flex as Flex13,Group as Group31,Pagination,ScrollArea as ScrollArea3,Stack as Stack25,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 Divider7,Flex as Flex12,Skeleton as Skeleton2,Stack as Stack24}from"@mantine/core";import{jsx as jsx105,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 jsx105(Stack24,{gap:"md",p:"md",children:SKELETON_WIDTHS.map((widths,index)=>jsxs63(Stack24,{children:[jsxs63(Flex12,{direction:"column",gap:"xs",align:"flex-start",children:[jsx105(Skeleton2,{height:16,width:widths[0]}),jsx105(Skeleton2,{height:14,width:widths[1]}),jsx105(Skeleton2,{height:14,width:widths[2]})]}),jsx105(Divider7,{})]},index))})}import{Fragment as Fragment34,jsx as jsx106,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=jsx106("span",{});return tabs?headerLeft=jsx106(Tabs,{value:activeTab??null,variant:"unstyled",className:ListWithDetailPane_default.pillTabs,children:jsx106(Tabs.List,{children:tabs.map(tab=>jsx106(Tabs.Tab,{value:tab.value,renderRoot:({onClick:_onClick,className,children,...rootProps})=>jsx106(MedplumLink,{to:tab.uri,className:clsx_default(ListWithDetailPane_default.tabLink,className),...rootProps,children}),children:tab.label},tab.value))})}):headerText!==void 0&&(headerLeft=jsx106(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&&jsx106(Group31,{gap:"xs",children:headerActions})]}),jsx106(Divider8,{})]}),jsxs64(ScrollArea3,{flex:1,scrollbarSize:10,type:"hover",scrollHideDelay:250,children:[loading&&(skeleton??jsx106(ListWithDetailPaneSkeleton,{})),!loading&&items.length===0&&(emptyList??jsx106(DefaultEmptyList,{})),!loading&&items.length>0&&jsx106("div",{className:ListWithDetailPane_default.list,children:items.map((item,index)=>{let isSelected=item.id!==void 0&&item.id===selectedKey;return jsx106("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&&jsx106("div",{className:ListWithDetailPane_default.footer,children:jsx106(Pagination,{value:page,total:pageCount,onChange:onPageChange,size:"sm",siblings:1,boundaries:1})})]}),selected===void 0?jsx106(Box14,{flex:1,h:"100%",children:emptyDetail??jsx106(DefaultEmptyDetail,{})}):renderDetail(selected,{refresh})]})}function DefaultEmptyList(){return jsx106(Flex13,{direction:"column",h:"100%",justify:"center",align:"center",pt:"xl",children:jsx106(Text25,{c:"dimmed",fw:500,children:"No items found"})})}function DefaultEmptyDetail(){return jsx106(Center4,{h:"100%",w:"100%",children:jsx106(Stack25,{align:"center",gap:"xs",children:jsx106(Text25,{size:"sm",c:"dimmed",ta:"center",children:"Select an item from the list to view details"})})})}import{Box as Box15,Button as Button11,Modal as Modal4,Stack as Stack26}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 jsx107,jsxs as jsxs65}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)),jsx107(Modal4,{opened,onClose,title:"Message Settings",size:"md",classNames:EditThreadDialog_default,children:thread&&jsxs65(Stack26,{gap:0,children:[jsx107(Stack26,{gap:"lg",p:"lg",children:jsx107(ThreadMessageForm,{defaultPractitioners:initialPractitioners,onPractitionersChange:setPractitioners,topic,onTopicChange:setTopic,defaultPatient:patientRef})}),jsx107(Box15,{px:"lg",pb:"lg",children:jsx107(Button11,{w:"100%",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"})})]})})};import{ActionIcon as ActionIcon13,Box as Box26,Button as Button12,Divider as Divider11,Flex as Flex22,Group as Group49,Menu as Menu5,Paper as Paper3,ScrollArea as ScrollArea4,Stack as Stack37,Text as Text40,Tooltip as Tooltip8}from"@mantine/core";import{getReferenceString as getReferenceString9}from"@medplum/core";import{Divider as Divider10,Flex as Flex21,Group as Group48,Stack as Stack36,Text as Text39,Tooltip as Tooltip7}from"@mantine/core";import{formatHumanName as formatHumanName9,resolveId}from"@medplum/core";import{useMedplum as useMedplum39,usePatientSummaryData,useResource as useResource9}from"@medplum/react-hooks";import{useEffect as useEffect23,useMemo as useMemo33,useState as useState76}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 Stack35}from"@mantine/core";import{calculateAgeString,formatAddress as formatAddress4}from"@medplum/core";import{Box as Box18,Flex as Flex14,Group as Group34,Modal as Modal5,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 jsx108}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 jsx108(Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}import{Group as Group32,Stack as Stack27,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 jsx109,jsxs as jsxs66}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 jsx109(Form,{onSubmit:handleSubmit,children:jsxs66(Stack27,{children:[jsx109(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}),jsx109(TextInput23,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx109(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}),jsx109(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx109(Group32,{justify:"flex-end",gap:4,mt:"md",children:jsx109(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon11,Box as Box16,Collapse,Group as Group33,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 jsx110,jsxs as jsxs67}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState63(!1);return jsxs67(Box16,{className:CollapsibleSection_default.root,children:[jsxs67(Group33,{justify:"space-between",className:CollapsibleSection_default.header,children:[jsxs67(Group33,{gap:8,children:[jsx110(ActionIcon11,{variant:"subtle",onClick:()=>setCollapsed(c=>!c),"aria-label":collapsed?`Show ${title.toLowerCase()}`:`Hide ${title.toLowerCase()}`,className:CollapsibleSection_default.chevron,"data-collapsed":collapsed||void 0,size:"md",children:jsx110(IconChevronDown,{size:20})}),jsx110(Text26,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx110(ActionIcon11,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx110(IconPlus,{size:18})})]}),jsx110(Collapse,{in:!collapsed,children:jsx110(Box16,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}import{ActionIcon as ActionIcon12,Box as Box17}from"@mantine/core";var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};import{jsx as jsx111,jsxs as jsxs68}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs68(Box17,{className:SummaryItem_default.item,onClick,children:[children,jsx111("div",{className:SummaryItem_default.gradient}),jsx111("div",{className:SummaryItem_default.container,children:jsx111(ActionIcon12,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx111(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment35,jsx as jsx112,jsxs as jsxs69}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 jsxs69(Fragment35,{children:[jsx112(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx112(Box18,{children:jsx112(Flex14,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx112(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs69(Box18,{children:[jsx112(Text27,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString5(allergy)}),jsx112(Group34,{mt:2,gap:4,children:status&&jsx112(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx112(Text27,{children:"(none)"})}),jsx112(Modal5,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx112(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 Box19,Flex as Flex15,Group as Group35,Text as Text28}from"@mantine/core";import{formatDate}from"@medplum/core";import{useResource as useResource5}from"@medplum/react-hooks";import{jsx as jsx113,jsxs as jsxs70}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 jsx113(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs70(Box19,{children:[jsx113(Text28,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx113(Text28,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs70(Group35,{mt:2,gap:4,children:[jsx113(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs70(Text28,{size:"xs",fw:500,color:"gray.6",children:["Ends ",formatDate(coverageResource?.period?.end)]})]})]})})}function Insurance(props){let{coverages,onClickResource}=props,activeCoverages=coverages.filter(coverage=>coverage.status==="active"&&!coverage.type?.coding?.some(coding=>coding.code==="SELFPAY"));return jsx113(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx113(Flex15,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx113(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx113(Text28,{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 Flex16,Group as Group38,Modal as Modal6,Text as Text31}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{formatDate as formatDate2,getDisplayString as getDisplayString8}from"@medplum/core";import{useState as useState67}from"react";import{Divider as Divider9,Group as Group37,List,Stack as Stack29,Text as Text30,Title as Title10}from"@mantine/core";import{formatAddress as formatAddress2,formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime2,formatHumanName as formatHumanName8,formatObservationValue,getDisplayString as getDisplayString7,isReference as isReference4}from"@medplum/core";import{useMedplum as useMedplum32,useResource as useResource7}from"@medplum/react-hooks";import{useEffect as useEffect21,useState as useState66}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 jsx114}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx114(Stack28,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx114(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 Group36}from"@mantine/core";import{Text as Text29}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 useState65}from"react";import{jsx as jsx115}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState65(),resource=useResource6(value,setOutcome),text;if(outcome&&!isOk2(outcome))text=`[${normalizeErrorString12(outcome)}]`;else if(resource)text=getDisplayString6(resource);else return null;return link?jsx115(MedplumLink,{to:value,...rest,children:text}):jsx115(Text29,{component:"span",...rest,children:text})}import{jsx as jsx116,jsxs as jsxs71}from"react/jsx-runtime";function ResourceBadge(props){return jsxs71(Group36,{gap:"xs",children:[jsx116(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx116(ResourceName,{value:props.value,link:props.link})]})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment36,jsx as jsx117,jsxs as jsxs72}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum32(),diagnosticReport=useResource7(props.value),[specimens,setSpecimens]=useState66();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 jsxs72(Stack29,{children:[jsx117(Title10,{children:"Diagnostic Report"}),jsx117(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx117(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx117(NoteDisplay,{value:specimenNotes}),diagnosticReport.conclusion&&jsxs72(Stack29,{mt:"md",children:[jsx117(Text30,{fw:500,size:"sm",c:"dimmed",children:"Conclusion"}),jsx117(Text30,{children:diagnosticReport.conclusion})]}),jsx117(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 jsxs72(Group37,{mt:"md",gap:"xl",align:"stretch",wrap:"nowrap",children:[hasLeftColumn&&jsxs72(Stack29,{gap:"md",style:{flex:1},children:[showSubject&&jsx117(HeaderField,{label:"Subject",children:jsx117(ResourceBadge,{value:value.subject,link:!0})}),requester&&jsx117(HeaderField,{label:"Ordering",children:jsx117(ResourceBadge,{value:requester,link:!0})}),value.resultsInterpreter?.map(interpreter=>jsx117(HeaderField,{label:"Interpreter",children:jsx117(ResourceBadge,{value:interpreter,link:!0})},interpreter.reference))]}),hasLeftColumn&&hasRightColumn&&jsx117(Divider9,{orientation:"vertical"}),hasRightColumn&&jsxs72(Stack29,{gap:"md",style:{flex:1},children:[value.performer?.map(performer=>jsx117(HeaderField,{label:"Performer",children:jsx117(PerformerDisplay,{value:performer})},performer.reference)),value.issued&&jsx117(HeaderField,{label:"Issued",children:jsx117(Text30,{children:formatDateTime2(value.issued)})}),value.status&&jsx117(HeaderField,{label:"Status",children:jsx117(StatusBadge,{status:value.status})})]})]})}function HeaderField({label,children}){return jsxs72(Group37,{gap:"md",align:"flex-start",wrap:"nowrap",children:[jsx117(Text30,{c:"dimmed",w:110,style:{flexShrink:0},children:label}),jsx117("div",{children})]})}function PerformerDisplay({value}){let performer=useResource7(value),address=performer?.resourceType==="Organization"?performer.address?.[0]:void 0;return jsxs72(Fragment36,{children:[jsx117(ResourceBadge,{value,link:!0}),address&&jsx117(Text30,{size:"sm",c:"dimmed",mt:4,ml:34,children:jsx117(AddressDisplay,{value:address})})]})}function SpecimenInfo(specimens){return jsxs72(Stack29,{gap:"xs",children:[jsx117(Title10,{order:2,size:"h6",children:"Specimens"}),jsx117(List,{type:"ordered",children:specimens?.map(specimen=>jsx117(List.Item,{ml:"sm",children:jsxs72(Group37,{gap:20,children:[jsxs72(Group37,{gap:5,children:[jsx117(Text30,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs72(Group37,{gap:5,children:[jsx117(Text30,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs72("table",{className:DiagnosticReportDisplay_default.table,children:[jsx117("thead",{children:jsxs72("tr",{children:[jsx117("th",{children:"Test"}),jsx117("th",{children:"Value"}),jsx117("th",{children:"Reference Range"}),jsx117("th",{children:"Interpretation"}),jsx117("th",{children:"Category"}),jsx117("th",{children:"Performer"}),jsx117("th",{children:"Status"})]})}),jsx117("tbody",{children:jsx117(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx117(Fragment36,{children:props.value?.map(observation=>jsx117(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);return jsxs72(Fragment36,{children:[jsxs72("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx117("td",{rowSpan:displayNotes?2:1,children:jsx117(MedplumLink,{to:observation,children:jsx117(CodeableConceptDisplay,{value:observation.code})})}),jsx117("td",{children:jsx117(ObservationValueDisplay,{value:observation})}),jsx117("td",{children:jsx117(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx117("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx117(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx117("td",{children:observation.category&&observation.category.length>0&&jsx117(Fragment36,{children:observation.category.map(concept=>jsx117("div",{children:jsx117(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx117("td",{children:observation.performer?.map(performer=>jsx117(ObservationPerformerDisplay,{value:performer},performer.reference))}),jsx117("td",{children:observation.status&&jsx117(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx117(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx117("tr",{children:jsx117("td",{colSpan:6,children:jsx117(NoteDisplay,{value:observation.note})})})]})}function ObservationPerformerDisplay(props){let performer=useResource7(props.value);return performer?jsx117(MedplumLink,{to:props.value,children:getDisplayString7(performer)}):jsx117(ReferenceDisplay,{value:props.value})}function ObservationValueDisplay(props){let obs=props.value;return jsx117(Fragment36,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx117(Fragment36,{children:range.text}):jsx117(RangeDisplay,{value:range}):null}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=useMedplum32(),[labs,setLabs]=useState66();return useEffect21(()=>{getPerformingLabs(medplum,value).then(setLabs).catch(console.error)},[medplum,value]),!labs||labs.length===0?null:jsxs72(Stack29,{gap:"xs",mt:"md",children:[jsx117(Divider9,{}),jsx117(Text30,{fw:500,size:"sm",c:"dimmed",children:"Performing Labs"}),labs.map(lab=>jsxs72(Group37,{justify:"space-between",align:"flex-start",wrap:"nowrap",children:[jsxs72("div",{children:[jsx117(Text30,{children:lab.name}),lab.address?.[0]&&jsx117(Text30,{size:"sm",c:"dimmed",children:jsx117(AddressDisplay,{value:lab.address[0]})})]}),jsx117(LabContactDisplay,{value:lab.contact?.[0]})]},`lab-${lab.id}-${lab.name}`))]})}function LabContactDisplay({value}){return value?jsxs72("div",{style:{textAlign:"right"},children:[value.name&&jsx117(Text30,{children:value.name.text??formatHumanName8(value.name)}),value.telecom?.[0]&&jsx117(Text30,{size:"sm",c:"dimmed",children:jsx117(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 Fragment37,jsx as jsx118,jsxs as jsxs73}from"react/jsx-runtime";function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=useState67(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=useDisclosure3(!1),diagnosticReportsRequests=new Set,filteredDiagnosticReports=diagnosticReports.filter(report=>{let flag=isLaboratoryReport(report);return flag&&report.basedOn&&report.basedOn.forEach(basedOn=>{if(basedOn.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn.reference.split("/");diagnosticReportsRequests.add(id)}}),flag}),completedRequisitionNumbers=new Set,filteredServiceRequests=serviceRequests.filter(request=>{if(request.id&&diagnosticReportsRequests.has(request.id)||request.basedOn&&request.basedOn.find(basedOn2=>{if(basedOn2.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn2.reference.split("/");return diagnosticReportsRequests.has(id)}return!1}))return!1;let shouldFilter=shouldFilterRequest(request,completedRequisitionNumbers);return!shouldFilter&&request.requisition?.value&&completedRequisitionNumbers.add(request.requisition?.value),!shouldFilter}),handleDiagnosticReportClick=report=>{setSelectedReport(report),openReportDialog()};return jsxs73(Fragment37,{children:[jsx118(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:jsxs73(Flex16,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>jsx118(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:jsxs73(Box20,{children:[jsx118(Text31,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(serviceRequest)}),jsxs73(Group38,{mt:2,gap:4,children:[serviceRequest.status&&jsx118(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),jsx118(Text31,{size:"xs",fw:500,c:"dimmed",children:formatDate2(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>jsx118(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:jsxs73(Box20,{children:[jsx118(Text31,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(report)}),jsxs73(Group38,{mt:2,gap:4,children:[report.status&&jsx118(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),jsx118(Text31,{size:"xs",fw:500,c:"dimmed",children:formatDate2(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&jsx118(Text31,{children:"(none)"})]})}),jsx118(Modal6,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&jsx118(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 Flex17,Group as Group40,Modal as Modal7,Text as Text32}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{formatCodeableConcept as formatCodeableConcept4,getDisplayString as getDisplayString9}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback16,useState as useState69}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 Group39,Radio,Stack as Stack30}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG3,addProfileToResource as addProfileToResource2,createReference as createReference8}from"@medplum/core";import{useMedplumProfile as useMedplumProfile9}from"@medplum/react-hooks";import{useCallback as useCallback15,useState as useState68}from"react";import{jsx as jsx119,jsxs as jsxs74}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile9(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState68(medication?.medicationCodeableConcept),handleSubmit=useCallback15(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&&createReference8(encounter)),requester:medication?.requester??createReference8(me),medicationCodeableConcept:code,subject:createReference8(patient)},HTTP_HL7_ORG3+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx119(Form,{onSubmit:handleSubmit,children:jsxs74(Stack30,{children:[jsx119(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}),jsx119(Radio.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx119(Radio,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx119(Group39,{justify:"flex-end",gap:4,children:jsx119(SubmitButton,{children:"Save"})})]})}):jsx119(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment38,jsx as jsx120,jsxs as jsxs75}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum33(),[medicationRequests,setMedicationRequests]=useState69(props.medicationRequests),[editMedication,setEditMedication]=useState69(),[opened,{open,close}]=useDisclosure4(!1),medications=[...medicationRequests,...props.medicationStatements??[]].sort(compareByLastUpdatedDescending),handleSubmit=useCallback16(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m=>m.id===updatedMedication.id?updatedMedication:m))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs75(Fragment38,{children:[jsx120(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medications.length>0?jsx120(Flex17,{direction:"column",gap:8,children:medications.map(medication=>jsx120(SummaryItem,{onClick:()=>{medication.resourceType==="MedicationRequest"?(setEditMedication(medication),open()):props.onClickResource?.(medication)},children:jsxs75(Box21,{children:[jsx120(Text32,{fw:500,className:SummaryItem_default.itemText,children:getMedicationDisplayString(medication)}),jsx120(Group40,{mt:2,gap:4,children:medication.status&&jsx120(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},`${medication.resourceType}/${medication.id}`))}):jsx120(Text32,{children:"(none)"})}),jsx120(Modal7,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx120(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?formatCodeableConcept4(medication.medicationCodeableConcept):getDisplayString9(medication)}import{Box as Box22,Group as Group41,Text as Text33,Tooltip as Tooltip6}from"@mantine/core";import{jsx as jsx121,jsxs as jsxs76}from"react/jsx-runtime";var PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return jsx121(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx121(Box22,{className:PatientSummary_default.patientSummaryListItem,children:jsx121(Tooltip6,{label,position:"top-start",openDelay:650,children:jsxs76(Group41,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,jsx121(Text33,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};import{capitalize as capitalize3,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG4}from"@medplum/core";function getGenderIdentity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-ethnicity`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getGeneralPractitioner(patient){return patient.generalPractitioner?.[0]?.display}function formatPatientGenderDisplay(patient){let capitalizedGender=patient.gender?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 ")}var getPreferredLanguage=patient=>{if(!patient.communication?.length)return;let preferred=patient.communication?.find(comm=>comm.preferred===!0);return preferred?.language?.coding?.[0]?.display?preferred.language.coding[0].display:patient.communication[0]?.language?.coding?.[0]?.display};import{Box as Box23,Flex as Flex18,Group as Group42,Loader as Loader5,Modal as Modal8,Text as Text34}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{formatAddress as formatAddress3,getReferenceString as getReferenceString8,OperationOutcomeError}from"@medplum/core";import{useMedplum as useMedplum34,useResource as useResource8}from"@medplum/react-hooks";import{useCallback as useCallback17,useEffect as useEffect22,useMemo as useMemo31,useState as useState70}from"react";import{PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,addPreferredPharmacyToPatient,createPreferredPharmacyExtension,getPreferredPharmaciesFromPatient,isAddPharmacyResponse,isOrganizationArray,removePreferredPharmacyFromPatient}from"@medplum/core";import{Fragment as Fragment39,jsx as jsx122,jsxs as jsxs77}from"react/jsx-runtime";function Pharmacies(props){let{patient:patientProp,onClickResource,pharmacyDialogComponent}=props,PharmacyDialogComponent=pharmacyDialogComponent,medplum=useMedplum34(),[opened,{open,close}]=useDisclosure5(!1),[resolvedPharmacies,setResolvedPharmacies]=useState70([]),[loadState,setLoadState]=useState70("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=useCallback17(async _pharmacy=>{patient?.id&&medplum.invalidateUrl(getReferenceString8(patient)),close()},[medplum,patient,close]);return patient?jsxs77(Fragment39,{children:[jsx122(CollapsibleSection,{title:"Pharmacies",onAdd:pharmacyDialogComponent?open:void 0,children:loadState==="loading"?jsx122(Loader5,{size:"sm"}):loadState==="error"?jsx122(Text34,{c:"red",size:"sm",children:"Failed to load pharmacies"}):resolvedPharmacies.length===0?jsx122(Text34,{children:"(none)"}):jsx122(Box23,{children:jsx122(Flex18,{direction:"column",gap:8,children:resolvedPharmacies.map((pharmacy,index)=>jsx122(SummaryItem,{onClick:()=>onClickResource?.(pharmacy),children:jsxs77(Box23,{children:[jsx122(Text34,{fw:500,className:SummaryItem_default.itemText,children:pharmacy.name}),jsxs77(Group42,{mt:2,gap:4,children:[pharmacy.isPrimary&&jsx122(StatusBadge,{color:"blue",variant:"light",status:"primary"}),pharmacy.address?.[0]&&jsx122(Text34,{size:"xs",c:"dimmed",children:formatAddress3(pharmacy.address[0])})]})]})},pharmacy.id||index))})})}),PharmacyDialogComponent?jsx122(Modal8,{opened,onClose:close,title:"Add Pharmacy",size:"lg",children:jsx122(PharmacyDialogComponent,{patient,onSubmit:handleSubmit,onClose:close})}):null]}):jsx122(Fragment39,{})}function isNotFoundError(error){return error instanceof OperationOutcomeError?error.outcome.issue?.some(issue=>issue.code==="not-found")??!1:!1}import{Badge as Badge2,Box as Box24,Flex as Flex19,Group as Group44,Modal as Modal9,Text as Text35,UnstyledButton as UnstyledButton4}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{formatDate as formatDate3,getDisplayString as getDisplayString10}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{useCallback as useCallback19,useMemo as useMemo32,useState as useState72}from"react";import{Group as Group43,Stack as Stack31}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference9}from"@medplum/core";import{useCallback as useCallback18,useState as useState71}from"react";import{jsx as jsx123,jsxs as jsxs78}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState71(condition?.code),[clinicalStatus,setClinicalStatus]=useState71(condition?.clinicalStatus),handleSubmit=useCallback18(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:createReference9(patient),encounter:encounter&&createReference9(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 jsx123(Form,{onSubmit:handleSubmit,children:jsxs78(Stack31,{children:[jsx123(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}),jsx123(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}),jsx123(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx123(Group43,{justify:"flex-end",gap:4,mt:"md",children:jsx123(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment40,jsx as jsx124,jsxs as jsxs79}from"react/jsx-runtime";function getCodeKey(condition){let coding=condition.code?.coding?.[0];return coding?.system&&coding?.code?`${coding.system}|${coding.code}`:coding?.code?coding.code:condition.code?.text??condition.id}function ProblemList(props){let medplum=useMedplum35(),{patient,encounter}=props,[problems,setProblems]=useState72(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=useState72(),[opened,{open,close}]=useDisclosure6(!1),[expandedGroups,setExpandedGroups]=useState72(()=>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=useCallback19(key=>{setExpandedGroups(prev=>{let next=new Set(prev);return next.has(key)?next.delete(key):next.add(key),next})},[]),handleSubmit=useCallback19(async condition=>{if(condition.id){let updatedCondition=await medplum.updateResource(condition);setProblems(problems.map(p=>p.id===updatedCondition.id?updatedCondition:p))}else{let newCondition=await medplum.createResource(condition);setProblems([newCondition,...problems])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs79(Fragment40,{children:[jsx124(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx124(Flex19,{direction:"column",gap:8,children:groupedProblems.map(([key,group],groupIndex)=>{let isExpanded=expandedGroups.has(key),displayProblems=isExpanded?group:[group[0]],groupContentId=`problem-group-content-${groupIndex}`;return jsxs79(Box24,{children:[jsx124(Flex19,{direction:"column",gap:4,id:groupContentId,children:displayProblems.map(problem=>jsx124(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs79(Box24,{children:[jsxs79(Group44,{gap:6,wrap:"nowrap",children:[jsx124(Text35,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString10(problem)}),!isExpanded&&group.length>1&&jsxs79(Badge2,{size:"xs",color:"gray",variant:"light",style:{flexShrink:0},children:["+",group.length-1]})]}),jsxs79(Group44,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx124(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx124(Text35,{size:"xs",fw:500,c:"dimmed",children:formatDate3(problem.onsetDateTime)})]})]})},problem.id))}),group.length>1&&jsx124(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)})}):jsx124(Text35,{children:"(none)"})}),jsx124(Modal9,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx124(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 Flex20,Group as Group45,Modal as Modal10,Radio as Radio2,Stack as Stack32,Text as Text36,UnstyledButton as UnstyledButton5}from"@mantine/core";import{useDisclosure as useDisclosure7}from"@mantine/hooks";import{createReference as createReference10,HTTP_HL7_ORG as HTTP_HL7_ORG6,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum36}from"@medplum/react-hooks";import{useCallback as useCallback20,useState as useState73}from"react";import{Fragment as Fragment41,jsx as jsx125,jsxs as jsxs80}from"react/jsx-runtime";var NULLFLAVOR=HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/v3-NullFlavor",CodesToText={38628009:"Homosexual",20430005:"Heterosexual",42035005:"Bisexual",OTH:"Other",UNK:"Unknown",ASKU:"Asked but no answer"},CodesToSystem={38628009:SNOMED,20430005:SNOMED,42035005:SNOMED,OTH:NULLFLAVOR,UNK:NULLFLAVOR,ASKU:NULLFLAVOR};function SexualOrientation(props){let{patient,encounter}=props,medplum=useMedplum36(),[sexualOrientation,setSexualOrientation]=useState73(props.sexualOrientation),[opened,{open,close}]=useDisclosure7(!1),[hoverIndex,setHoverIndex]=useState73(null),handleSubmit=useCallback20(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:createReference10(patient),encounter:encounter?createReference10(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:CodesToSystem[code],code:formData.sexualOrientation}],text:CodesToText[code]}}).then(newSexualOrientation=>{setSexualOrientation(newSexualOrientation),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs80(Fragment41,{children:[jsx125(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx125(Flex20,{direction:"column",gap:8,children:jsx125(Box25,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx125(UnstyledButton5,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx125(Box25,{pr:hoverIndex===0?24:0,children:jsx125(Text36,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx125(Text36,{children:"(none)"})}),jsx125(Modal10,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx125(Form,{onSubmit:handleSubmit,children:jsxs80(Stack32,{children:[jsx125(Radio2.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx125(Radio2,{value:code,label:text,my:"xs"},code))}),jsx125(Group45,{justify:"flex-end",gap:4,mt:"md",children:jsx125(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group46,Modal as Modal11,Radio as Radio3,Stack as Stack33,Text as Text37,UnstyledButton as UnstyledButton6}from"@mantine/core";import{useDisclosure as useDisclosure8}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG7,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference11,formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{useMedplum as useMedplum37}from"@medplum/react-hooks";import{useCallback as useCallback21,useState as useState74}from"react";import{Fragment as Fragment42,jsx as jsx126,jsxs as jsxs81}from"react/jsx-runtime";var smokingStatusOptions={266919005:"Never smoked tobacco",266927001:"Tobacco smoking consumption unknown","428041000124106":"Occasional tobacco smoker","428061000124105":"Light tobacco smoker","428071000124103":"Heavy tobacco smoker",449868002:"Smokes tobacco daily",77176002:"Smoker",8517006:"Ex-smoker"};function SmokingStatus(props){let medplum=useMedplum37(),[smokingStatus,setSmokingStatus]=useState74(props.smokingStatus),[opened,{open,close}]=useDisclosure8(!1),handleSubmit=useCallback21(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:createReference11(props.patient),encounter:props.encounter?createReference11(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED2,version:SNOMED2+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return jsxs81(Fragment42,{children:[jsx126(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx126(UnstyledButton6,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx126(Text37,{children:formatCodeableConcept5(smokingStatus.valueCodeableConcept)})}):jsx126(Text37,{children:"(none)"})}),jsx126(Modal11,{opened,onClose:close,title:"Set Smoking Status",children:jsx126(Form,{onSubmit:handleSubmit,children:jsxs81(Stack33,{children:[jsx126(Radio3.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx126(Radio3,{value:code,label:text,my:"xs"},code))}),jsx126(Group46,{justify:"flex-end",gap:4,mt:"md",children:jsx126(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group47,Modal as Modal12,SimpleGrid,Stack as Stack34,Text as Text38,Textarea as Textarea3,TextInput as TextInput24}from"@mantine/core";import{useDisclosure as useDisclosure9}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum38}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState75}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference12}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:createReference12(patient),encounter:encounter?createReference12(encounter):void 0,effectiveDateTime:new Date().toISOString(),category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"vital-signs",display:"Vital Signs"}]}],code:createLoincCode(code,title)}}function createLoincCode(code,display){return{coding:[{code,display,system:LOINC3}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!Number.isNaN(value)&&Number.isFinite(value)}import{Fragment as Fragment43,jsx as jsx127,jsxs as jsxs82}from"react/jsx-runtime";var BP="85354-9",SYSTOLIC="8480-6",DIASTOLIC="8462-4",LOINC_CODES=[{name:"systolic",short:"BP Sys",code:BP,component:SYSTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"diastolic",short:"BP Dias",code:BP,component:DIASTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"heartRate",short:"HR",code:"8867-4",title:"Heart Rate",unit:"/min"},{name:"bodyTemperature",short:"Temp",code:"8310-5",title:"Body Temperature",unit:"Cel"},{name:"respiratoryRate",short:"RR",code:"9279-1",title:"Respiratory Rate",unit:"/min"},{name:"height",short:"Ht",code:"8302-2",title:"Height",unit:"cm"},{name:"weight",short:"Wt",code:"29463-7",title:"Weight",unit:"kg"},{name:"bmi",short:"BMI",code:"39156-5",title:"BMI",unit:"kg/m2"},{name:"oxygen",short:"O2",code:"2708-6",title:"Oxygen",unit:"%"},{name:"headCircumference",short:"HC",code:"9843-4",title:"Head Circumference",unit:"cm"}];function Vitals(props){let medplum=useMedplum38(),{patient,encounter}=props,[vitals,setVitals]=useState75(props.vitals),[opened,{open,close}]=useDisclosure9(!1),handleSubmit=useCallback22(formData=>{let newObservations=[];newObservations.push(createCompoundObservation(patient,encounter,BP,"Blood pressure",[{code:createLoincCode(SYSTOLIC,"Systolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.systolic),"mm[Hg]")},{code:createLoincCode(DIASTOLIC,"Diastolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.diastolic),"mm[Hg]")}]));for(let meta of LOINC_CODES)meta.component||newObservations.push(createObservation(patient,encounter,meta.code,meta.title,createQuantity(Number.parseFloat(formData[meta.name]),meta.unit)));Promise.all(newObservations.filter(Boolean).map(obs=>medplum.createResource(obs))).then(newVitals=>setVitals([...newVitals,...vitals])).catch(console.error),close()},[medplum,patient,encounter,vitals,close]);return jsxs82(Fragment43,{children:[jsx127(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx127(Stack34,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs82(Group47,{align:"center",children:[jsx127(Text38,{c:"dimmed",children:meta.short}),obs&&jsx127(Text38,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx127(Modal12,{opened,onClose:close,title:"Add Vitals",children:jsxs82(Form,{onSubmit:handleSubmit,children:[jsx127(SimpleGrid,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx127(TextInput24,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx127(Textarea3,{name:"notes",label:"Notes"}),jsx127(Group47,{justify:"flex-end",gap:4,mt:"md",children:jsx127(SubmitButton,{children:"Save"})})]})})]})}import{jsx as jsx128,jsxs as jsxs83}from"react/jsx-runtime";var DemographicsSection={key:"demographics",title:"Demographics",component:({patient,onClickResource})=>{let languageDisplay=getPreferredLanguage(patient);return jsxs83(Stack35,{gap:"xs",py:8,children:[jsx128(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${calculateAgeString(patient.birthDate)})`:void 0,icon:jsx128(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),jsx128(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:jsx128(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),jsx128(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:jsx128(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),jsx128(PatientInfoItem,{patient,value:patient.address?.[0]?formatAddress4(patient.address[0]):void 0,icon:jsx128(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),jsx128(PatientInfoItem,{patient,value:languageDisplay,icon:jsx128(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),jsx128(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:jsx128(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})=>jsx128(Insurance,{coverages:results.coverages||[],onClickResource})},AllergiesSection={key:"allergies",title:"Allergies",searches:[{key:"allergies",resourceType:"AllergyIntolerance",patientParam:"patient"}],component:({results,patient,onClickResource})=>jsx128(Allergies,{patient,allergies:results.allergies||[],onClickResource})},ProblemListSection={key:"problemList",title:"Problems",searches:[{key:"conditions",resourceType:"Condition",patientParam:"patient"}],component:({results,patient,onClickResource})=>jsx128(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})=>jsx128(Medications,{patient,medicationRequests:results.medicationRequests||[],medicationStatements:results.medicationStatements||[],onClickResource})};function createLabsSection(onRequestLabs){return{key:"labs",title:"Labs",searches:[{key:"serviceRequests",resourceType:"ServiceRequest",patientParam:"subject"},{key:"diagnosticReports",resourceType:"DiagnosticReport",patientParam:"subject"}],component:({results,patient,onClickResource})=>jsx128(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 jsx128(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 jsx128(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 jsx128(Vitals,{patient,vitals:observations,onClickResource})}};function createPharmaciesSection(pharmacyDialogComponent){return{key:"pharmacies",title:"Pharmacies",component:({patient,onClickResource})=>jsx128(Pharmacies,{patient,onClickResource,pharmacyDialogComponent})}}var PharmaciesSection=createPharmaciesSection();function getDefaultSections(onRequestLabs){return[DemographicsSection,InsuranceSection,AllergiesSection,ProblemListSection,MedicationsSection,createLabsSection(onRequestLabs),SexualOrientationSection,SmokingStatusSection,VitalsSection,PharmaciesSection]}import{Fragment as Fragment44,jsx as jsx129,jsxs as jsxs84}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum39(),{patient:propsPatient,onClickResource,onRequestLabs}=props,patient=useResource9(propsPatient),[createdDate,setCreatedDate]=useState76(),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?jsxs84(Flex21,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs84(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs84(Group48,{align:"center",gap:"sm",p:16,children:[jsx129(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs84(Stack36,{gap:0,style:{flex:1,minWidth:0},children:[jsx129(Tooltip7,{label:formatHumanName9(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx129(Text39,{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 jsxs84(Text39,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx129(Divider10,{})]}),jsxs84(Stack36,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:[error&&jsxs84(Text39,{c:"red",fz:"sm",children:["Error loading patient summary: ",error.message]}),!loading&§ions.length>0&&jsx129(Fragment44,{children:sections.map((section,index)=>{let SectionComponent=section.component;return jsxs84("div",{children:[jsx129(SectionComponent,{patient,onClickResource,results:sectionData[index]??{}}),jsx129(Divider10,{})]},section.key)})})]})]}):null}var ThreadDetail_default={rightBorder:"ThreadDetail_rightBorder"};import{Fragment as Fragment45,jsx as jsx130,jsxs as jsxs85}from"react/jsx-runtime";function ThreadDetail(props){let{thread,showPatientSummary=!1,sections,uploadEnabled,onViewInDocuments,onStatusChange,onOpenSettings,onMessageSent}=props;return jsxs85(Fragment45,{children:[jsx130(Flex22,{direction:"column",style:{flex:1},h:"100%",className:ThreadDetail_default.rightBorder,children:jsx130(Paper3,{h:"100%",children:jsxs85(Stack37,{h:"100%",gap:0,children:[jsxs85(Flex22,{h:64,align:"center",justify:"space-between",p:"md",children:[jsx130(Text40,{fw:800,truncate:!0,fz:"lg",children:thread.topic?.text??"Messages"}),jsxs85(Group49,{gap:"xs",children:[onOpenSettings&&jsx130(Tooltip8,{label:"Message Settings",position:"bottom",openDelay:500,children:jsx130(ActionIcon13,{"aria-label":"Message settings",variant:"transparent",radius:"xl",size:32,className:"outline-icon-button",onClick:onOpenSettings,children:jsx130(IconInfoCircle,{size:16})})}),jsxs85(Menu5,{position:"bottom-end",shadow:"md",children:[jsx130(Menu5.Target,{children:jsx130(Button12,{variant:"light",color:getStatusColor4(thread.status),rightSection:thread.status==="completed"?void 0:jsx130(IconChevronDown,{size:16}),radius:"xl",size:"sm",children:thread.status.split("-").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")})}),thread.status!=="completed"&&jsx130(Menu5.Dropdown,{children:jsx130(Menu5.Item,{onClick:()=>onStatusChange("completed"),children:"Completed"})})]})]})]}),jsx130(Divider11,{}),jsx130(Box26,{flex:1,h:"100%",children:jsx130(ThreadChat,{title:"Messages",thread,excludeHeader:!0,uploadEnabled,onViewInDocuments,onMessageSent},`${getReferenceString9(thread)}`)})]})})}),thread.subject&&showPatientSummary&&jsx130(Box26,{w:300,h:"100%",children:jsx130(ScrollArea4,{p:0,h:"100%",scrollbarSize:10,type:"hover",scrollHideDelay:250,children:jsx130(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 Group50,Stack as Stack38,Text as Text41}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 jsx131,jsxs as jsxs86}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 jsx131(MedplumLink,{to:getThreadUri(topic),underline:"never",display:"block",c:"inherit",children:jsxs86(Group50,{p:"xs",align:"center",wrap:"nowrap",children:[jsx131(ResourceAvatar,{value:topic.subject,radius:"xl",size:36}),jsxs86(Stack38,{gap:0,children:[jsx131(Text41,{size:"sm",fw:700,truncate:"end",children:patientName}),jsx131(Text41,{size:"sm",fw:400,lineClamp:2,className:ThreadListItem_default.content,children:topicName}),jsx131(Text41,{size:"xs",style:{marginTop:2},children:lastCommunication?formatDateTime3(lastCommunication.sent):""})]})]})})};import{Fragment as Fragment46,jsx as jsx132,jsxs as jsxs87}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}]=useDisclosure10(!1),modalOpened=props.newTopicOpened??internalModalOpened,openModal=onNewTopicOpen??openInternalModal,closeModal=onNewTopicClose??closeInternalModal,[editModalOpened,{open:openEditModal,close:closeEditModal}]=useDisclosure10(!1),currentSearch=useMemo34(()=>parseSearchRequest(`Communication?${query}`),[query]),searchParams=useMemo34(()=>new URLSearchParams(query),[query]),itemsPerPage=Number.parseInt(searchParams.get("_count")||"20",10),currentOffset=Number.parseInt(searchParams.get("_offset")||"0",10),currentPage=Math.floor(currentOffset/itemsPerPage)+1,status=searchParams.get("status")||"in-progress",selectedParticipants=useMemo34(()=>(currentSearch.filters?.filter(f=>f.code==="recipient")??[]).flatMap(f=>f.value.split(",").filter(Boolean).map(ref=>({reference:ref}))),[currentSearch]),{loading,error,threadMessages,selectedThread,total,handleThreadStatusChange,addThreadMessage,refreshThreadMessages}=useThreadInbox({query,threadId}),handleParticipantsChange=useCallback23(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=useCallback23(thread=>!!thread.id&&lastMessageByThreadId.has(thread.id)&&!lastMessageByThreadId.get(thread.id),[lastMessageByThreadId]),handleMessageSent=useCallback23(()=>{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=jsxs87(Fragment46,{children:[jsx132(ParticipantFilter,{selectedParticipants,onFilterChange:handleParticipantsChange}),jsx132(Tooltip9,{label:"New Message",position:"bottom",openDelay:500,children:jsx132(ActionIcon14,{radius:"xl",variant:"filled",color:"blue",size:32,onClick:openModal,children:jsx132(IconPlus,{size:16})})})]});return jsxs87(Fragment46,{children:[jsx132("div",{className:ThreadInbox_default.container,children:jsx132(ListWithDetailPane,{items,loading,selectedKey:selectedThread?.id??threadId,selected:selectedThread,onSelectFirst:modalOpened?void 0:onSelectFirst,listWidth:380,tabs,activeTab:status,headerActions,skeleton:jsx132(ThreadListSkeleton,{}),emptyList:jsx132(EmptyMessagesState,{}),emptyDetail:jsx132(NoMessages,{}),refresh:refreshThreadMessages,page:currentPage,pageCount,onPageChange:page=>onChange({...currentSearch,offset:(page-1)*itemsPerPage}),renderItem:item=>jsx132(ThreadListItem,{topic:item,lastCommunication:item.id?lastMessageByThreadId.get(item.id):void 0,getThreadUri}),renderDetail:thread=>jsx132(ThreadDetail,{thread,showPatientSummary,sections,uploadEnabled,onViewInDocuments,onStatusChange:handleTopicStatusChangeWithErrorHandling,onOpenSettings:isDraft(thread)?void 0:openEditModal,onMessageSent:handleMessageSent})})}),modalOpened&&jsx132(NewTopicDialog,{subject,opened:modalOpened,onClose:closeModal,onSubmit:handleNewTopicCompletion,allowPatientSelection}),selectedThread&&editModalOpened&&jsx132(EditThreadDialog,{thread:selectedThread,opened:editModalOpened,onClose:closeEditModal,onSaved:()=>{refreshThreadMessages().catch(err=>showNotification10({color:"red",message:normalizeErrorString13(err)}))}})]})}function NoMessages(){return jsx132(Center5,{h:"100%",w:"100%",children:jsxs87(Stack39,{align:"center",gap:"md",children:[jsx132(ThemeIcon,{size:64,variant:"light",color:"gray",children:jsx132(IconMessageCircle,{size:32})}),jsx132(Stack39,{align:"center",gap:"xs",children:jsx132(Text42,{size:"sm",c:"dimmed",ta:"center",children:"Select a message from the list to view details"})})]})})}function EmptyMessagesState(){return jsx132(Flex23,{direction:"column",h:"100%",justify:"center",align:"center",children:jsxs87(Stack39,{align:"center",gap:"md",pt:"xl",children:[jsx132(IconMessageCircle,{size:64,color:"var(--mantine-color-gray-4)"}),jsx132(Text42,{size:"lg",c:"dimmed",fw:500,children:"No messages found"})]})})}function ThreadListSkeleton(){let titleWidths=[80,72,68,64],subtitleWidths=[85,78,70,60];return jsx132(Stack39,{gap:"md",p:"md",children:Array.from({length:10}).map((_,index)=>{let titleWidth=titleWidths[index%titleWidths.length],subtitleWidth=subtitleWidths[index%subtitleWidths.length];return jsxs87(Flex23,{gap:"sm",align:"flex-start",children:[jsx132(Skeleton3,{height:40,width:40,radius:"50%"}),jsx132(Box27,{style:{flex:1},children:jsxs87(Flex23,{direction:"column",gap:"xs",children:[jsx132(Skeleton3,{height:16,width:`${titleWidth}%`}),jsx132(Skeleton3,{height:14,width:`${subtitleWidth}%`})]})})]},index)})})}import{ActionIcon as ActionIcon16,Button as Button14,Center as Center6,Group as Group52,Loader as Loader6,ScrollArea as ScrollArea5,TextInput as TextInput25}from"@mantine/core";import{showNotification as showNotification11,updateNotification}from"@mantine/notifications";import{createReference as createReference13,normalizeErrorString as normalizeErrorString14}from"@medplum/core";import{useMedplum as useMedplum42,useResource as useResource12}from"@medplum/react-hooks";import{useCallback as useCallback24,useEffect as useEffect27,useLayoutEffect as useLayoutEffect2,useRef as useRef13,useState as useState80}from"react";import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize4,createPatch,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum40}from"@medplum/react-hooks";import{useEffect as useEffect25,useMemo as useMemo35,useState as useState78}from"react";import{Button as Button13,Table}from"@mantine/core";import{useState as useState77}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment47,jsx as jsx133,jsxs as jsxs88}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState77(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx133(Fragment47,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx133(Fragment47,{children:jsxs88(Table.Tr,{children:[jsx133(Table.Td,{children:name}),jsx133(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx133(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx133(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx133(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs88(Table.Tr,{children:[jsx133(Table.Td,{children:name}),jsx133(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx133(Button13,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx134,jsxs as jsxs89}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum40(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState78(!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?jsxs89(Table2,{className:ResourceDiffTable_default.root,children:[jsx134(Table2.Thead,{children:jsxs89(Table2.Tr,{children:[jsx134(Table2.Th,{}),jsx134(Table2.Th,{children:"Before"}),jsx134(Table2.Th,{children:"After"})]})}),jsx134(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx134(ResourceDiffRow,{...rest},key)})})]}):null}function mergePatchOperations(patch){let result=[];for(let patchOperation of patch){let{op,path}=patchOperation;if(path.startsWith("/meta/author")||path.startsWith("/meta/compartment")||path.startsWith("/meta/lastUpdated")||path.startsWith("/meta/versionId"))continue;let count=patch.filter(el=>el.op===op&&el.path===path).length,resultOperation={op,path};count>1&&(op==="add"||op==="remove")&&/\/[0-9-]+$/.test(path)&&(resultOperation.op="replace",resultOperation.path=path.replace(/\/[^/]+$/,"")),result.some(el=>el.op===resultOperation.op&&el.path===resultOperation.path)||result.push(resultOperation)}return result}function jsonPathToFhirPath(path){let parts=path.split("/").filter(Boolean),result="";for(let i=0;i<parts.length;i++){let part=parts[i];part==="-"?result+=".last()":/^\d+$/.test(part)?result+=`[${part}]`:(i>0&&(result+="."),result+=part)}return result.endsWith(".url")&&(result=result.replace(/\.url$/,"")),result}function tryGetElementDefinition(resourceType,fhirPath){try{return getSearchParameterDetails(resourceType,{resourceType:"SearchParameter",base:[resourceType],code:resourceType+"."+fhirPath,expression:resourceType+"."+fhirPath})?.elementDefinitions?.[0]}catch(err){console.warn("Failed to get element definition",{resourceType,fhirPath,err});return}}function touchUpValue(property,input){return input&&{type:Array.isArray(input)?input[0].type:input.type,value:fixArray(input,!!property?.isArray)}}function fixArray(input,isArray){let inputValue=arrayify(input).flatMap(v=>v.value);return isArray?inputValue:inputValue[0]}import{AccessPolicyInteraction,satisfiedAccessPolicy,tryGetProfile as tryGetProfile4}from"@medplum/core";import{useMedplum as useMedplum41,useResource as useResource11}from"@medplum/react-hooks";import{useEffect as useEffect26,useMemo as useMemo36,useState as useState79}from"react";import{jsx as jsx135}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum41(),accessPolicy=medplum.getAccessPolicy(),value=useResource11(props.value),[schemaLoaded,setSchemaLoaded]=useState79(!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:jsx135(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 Group51,Menu as Menu6,Text as Text43}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 jsx136,jsxs as jsxs90}from"react/jsx-runtime";function Timeline(props){return jsx136(Container,{children:props.children})}function TimelineItem(props){let{resource,profile,padding,popupMenuItems,...others}=props,author=profile??resource.meta?.author,onBehalfOf=resource.meta?.onBehalfOf,dateTime=props.dateTime??resource.meta?.lastUpdated;return jsxs90(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs90(Group51,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx136(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs90("div",{style:{flex:1},children:[jsxs90(Text43,{size:"sm",children:[jsx136(ResourceName,{c:"inherit",fw:500,value:author,link:!0}),onBehalfOf&&jsxs90(Text43,{component:"span",size:"xs",c:"dimmed",children:[" on behalf of ",jsx136(ResourceName,{c:"inherit",value:onBehalfOf,link:!0})]})]}),jsxs90(Text43,{size:"xs",children:[jsx136(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime4(dateTime)}),jsx136(Text43,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx136(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs90(Menu6,{position:"bottom-end",shadow:"md",width:200,children:[jsx136(Menu6.Target,{children:jsx136(ActionIcon15,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString10(props.resource)}`,children:jsx136(IconDots,{})})}),popupMenuItems]})]}),jsx136(ErrorBoundary,{children:jsx136("div",{className:clsx_default(Timeline_default.item,{[Timeline_default.itemPadding]:padding}),children:props.children})})]})}var ResourceTimeline_default={pinnedComment:"ResourceTimeline_pinnedComment"};import{jsx as jsx137,jsxs as jsxs91}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum42(),sender=medplum.getProfile(),inputRef=useRef13(null),resource=useResource12(props.value),[history,setHistory]=useState80(),[items,setItems]=useState80([]),[countToShow,setCountToShow]=useState80(10),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef13(items);useLayoutEffect2(()=>{itemsRef.current=items});let sortAndSetItems=useCallback24(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback24(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=useCallback24(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback24(()=>{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:jsx137(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString14(reason),icon:jsx137(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:jsx137(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return jsx137(Center6,{style:{width:"100%",height:"100%"},children:jsx137(Loader6,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return jsxs91(Timeline,{children:[props.createCommunication&&jsx137(Panel,{children:jsx137(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs91(Group52,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx137(ResourceAvatar,{value:sender}),jsx137(TextInput25,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx137(ActionIcon16,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx137(IconMessage,{size:16})}),jsx137(AttachmentButton,{securityContext:createReference13(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx137(ActionIcon16,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx137(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 jsx137(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx137(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx137(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx137(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx137(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx137(TimelineItem,{resource:item,padding:!0,children:jsx137(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&jsx137(Group52,{justify:"center",pb:"lg",children:jsx137(Button14,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx137(TimelineItem,{resource,padding:!0,...rest,children:jsx137(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs91(TimelineItem,{resource,padding:!0,...rest,children:[jsx137("h3",{children:"Created"}),jsx137(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 jsx137(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx137("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 jsx137(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx137(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx137(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx137(ScrollArea5,{children:jsx137("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx137(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx137(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 jsx138}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx138(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 createReference14}from"@medplum/core";import{jsx as jsx139}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx139(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:createReference14(resource),subject:resource.subject,sender:createReference14(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference14(resource),subject:resource.subject,operator:createReference14(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button19,Loader as Loader8,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome11}from"@medplum/core";import{useMedplum as useMedplum44}from"@medplum/react-hooks";import{memo,useEffect as useEffect31,useState as useState85}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx140}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 jsx140(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon18,Button as Button18,Center as Center7,Group as Group55,Loader as Loader7,Menu as Menu8,Pagination as Pagination2,Table as Table3,Text as Text45,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 useMedplum43}from"@medplum/react-hooks";import{useCallback as useCallback25,useEffect as useEffect30,useLayoutEffect as useLayoutEffect4,useRef as useRef16,useState as useState84}from"react";import{Box as Box28,Button as Button15,Modal as Modal13,Text as Text44}from"@mantine/core";import{jsx as jsx141,jsxs as jsxs92}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs92(Modal13,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs92(Box28,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx141(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx141(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx141(Text44,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx141(Button15,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button16,Group as Group53,Modal as Modal14,MultiSelect,Stack as Stack40}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 useState81}from"react";import{capitalize as capitalize5,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime5,Operator as Operator2}from"@medplum/core";import{Fragment as Fragment48,jsx as jsx142}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"?jsx142(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?jsx142(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:jsx142(Fragment48,{children:value.map((v,index)=>jsx142(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx143,jsxs as jsxs93}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef14(!1),[state,setState]=useState81({search:JSON.parse(stringify2(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState81(!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 jsx143(Modal14,{title:"Fields",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>{props.onCancel()},size:"auto",withOverlay:!0,closeOnClickOutside:!1,overlayProps:{onMouseDownCapture:()=>{wasDropdownOpen.current=isDropdownOpen},onClick:()=>{wasDropdownOpen.current||props.onCancel(),wasDropdownOpen.current=!1},children:jsx143("div",{"data-testid":"overlay-child"})},children:jsxs93(Stack40,{children:[jsx143(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}),jsx143(Group53,{justify:"flex-end",children:jsx143(Button16,{onClick:()=>props.onOk(state.search),children:"OK"})})]})})}function getFieldsList(typeSchema,searchParams){let result=[],keys=new Set,names=new Set;for(let key of Object.keys(typeSchema.elements))result.push(key),keys.add(key.toLowerCase()),names.add(buildFieldNameString(key));if(searchParams)for(let code of Object.keys(searchParams)){let name=buildFieldNameString(code);!keys.has(code)&&!names.has(name)&&(result.push(code),keys.add(code),names.add(name))}return result}import{ActionIcon as ActionIcon17,Group as Group54,Modal as Modal15,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 useState82}from"react";import{Checkbox as Checkbox6,TextInput as TextInput26}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx144}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 jsx144(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 jsx144(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 jsx144(TextInput26,{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 jsx144(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx144(TextInput26,{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 jsx144(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx144(TextInput26,{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 jsx145,jsxs as jsxs94}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState82(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 jsx145(Modal15,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs94(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs94("div",{children:[jsxs94("table",{children:[jsxs94("colgroup",{children:[jsx145("col",{style:{width:200}}),jsx145("col",{style:{width:200}}),jsx145("col",{style:{width:380}}),jsx145("col",{style:{width:40}})]}),jsx145("thead",{children:jsxs94("tr",{children:[jsx145("th",{children:"Field"}),jsx145("th",{children:"Operation"}),jsx145("th",{children:"Value"}),jsx145("th",{})]})}),jsx145("tbody",{children:filters.map((filter,index)=>jsx145(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`))})]}),jsx145(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx145(Group54,{justify:"flex-end",mt:"xl",children:jsx145(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value;function setFilterCode(newCode){props.onChange({code:newCode,operator:Operator3.EQUALS,value:""})}function setFilterOperator(newOperator){props.onChange({code:value.code,operator:newOperator,value:""})}function setFilterValue(newFilterValue){props.onChange({code:value.code,operator:value.operator,value:newFilterValue})}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam),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 jsxs94("tr",{children:[jsx145("td",{children:jsx145(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}]:[]]})}),jsx145("td",{children:operators&&jsx145(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}`)}),jsx145("td",{children:searchParam&&value.operator&&jsx145(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}`)}),jsx145("td",{children:props.onDelete&&jsx145(ActionIcon17,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx145(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button17,Grid,Modal as Modal16}from"@mantine/core";import{useState as useState83}from"react";import{jsx as jsx146,jsxs as jsxs95}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState83(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx146(Modal16,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx146(Form,{onSubmit:onOk,children:jsxs95(Grid,{children:[jsx146(Grid.Col,{span:10,children:jsx146(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx146(Grid.Col,{span:2,children:jsx146(Button17,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime6,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator4,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment49,jsx as jsx147}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 jsx147(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx147(Fragment49,{children:formatDateTime6(filter.value)})}return jsx147(Fragment49,{children:filter.value})}import{Menu as Menu7}from"@mantine/core";import{Operator as Operator5}from"@medplum/core";import{Fragment as Fragment50,jsx as jsx148,jsxs as jsxs96}from"react/jsx-runtime";function SearchPopupMenu(props){if(!props.searchParams)return null;function onSort(searchParam,desc){onChange(setSort(props.search,searchParam.code,desc))}function onClear(searchParam){onChange(clearFiltersOnField(props.search,searchParam.code))}function onPrompt(searchParam,operator){props.onPrompt(searchParam,{code:searchParam.code,operator,value:""})}function onChange(definition){props.onChange(definition)}return props.searchParams.length===1?jsx148(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx148(Menu7.Dropdown,{children:props.searchParams.map(searchParam=>jsx148(Menu7.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx148(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx148(NumericFilterSubMenu,{...props});case"reference":return jsx148(ReferenceFilterSubMenu,{...props});case"string":return jsx148(TextFilterSubMenu,{...props});case"token":return jsx148(TokenFilterSubMenu,{...props});case"uri":return jsx148(UriFilterSubMenu,{...props});default:return jsxs96(Fragment50,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs96(Menu7.Dropdown,{children:[jsx148(Menu7.Item,{leftSection:jsx148(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx148(Menu7.Item,{leftSection:jsx148(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.ENDS_BEFORE),children:"Before..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.STARTS_AFTER),children:"After..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Between..."}),jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx148(Menu7.Item,{leftSection:jsx148(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx148(Menu7.Item,{leftSection:jsx148(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx148(Menu7.Item,{leftSection:jsx148(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx148(Menu7.Item,{leftSection:jsx148(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx148(Menu7.Item,{leftSection:jsx148(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx148(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx148(Menu7.Item,{leftSection:jsx148(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx148(Menu7.Item,{leftSection:jsx148(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN),children:"Greater than..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN),children:"Less than..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx148(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx148(Menu7.Item,{leftSection:jsx148(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx148(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx148(Menu7.Item,{leftSection:jsx148(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx148(Menu7.Item,{leftSection:jsx148(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.CONTAINS),children:"Contains..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Does not contain..."}),jsx148(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx148(Menu7.Item,{leftSection:jsx148(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.TEXT),children:"Text contains..."}),jsx148(CommonMenuItems,{...props})]})}function UriFilterSubMenu(props){let{searchParam}=props;return jsxs96(Menu7.Dropdown,{children:[jsx148(Menu7.Item,{leftSection:jsx148(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx148(Menu7.Item,{leftSection:jsx148(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx148(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs96(Fragment50,{children:[jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx148(Menu7.Item,{leftSection:jsx148(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx148(Menu7.Divider,{}),jsx148(Menu7.Item,{leftSection:jsx148(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 Fragment51,jsx as jsx149,jsxs as jsxs97}from"react/jsx-runtime";var SearchChangeEvent=class extends Event{constructor(definition){super("change");__publicField(this,"definition");this.definition=definition}},SearchLoadEvent=class extends Event{constructor(response){super("load");__publicField(this,"response");this.response=response}},SearchClickEvent=class extends Event{constructor(resource,browserEvent){super("click");__publicField(this,"resource");__publicField(this,"browserEvent");this.resource=resource,this.browserEvent=browserEvent}};function SearchControl(props){let medplum=useMedplum43(),[outcome,setOutcome]=useState84(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState84(search);deepEquals(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState84({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef16(state);useLayoutEffect4(()=>{stateRef.current=state});let total=memoizedSearch.total??"accurate",loadResults=useCallback25(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=useCallback25(()=>{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 jsx149(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx149(Center7,{style:{width:"100%",height:"100%"},children:jsx149(Loader7,{})});let checkboxColumn=props.checkboxesEnabled,fields=getFieldDefinitions(memoizedSearch),resourceType=memoizedSearch.resourceType,lastResult=state.searchResponse,resources=lastResult?.entry?.map(e=>e.resource),buttonVariant="subtle",buttonColor="gray",iconSize=16,isMobile=window.innerWidth<768;return jsxs97("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs97(Group55,{justify:"space-between",mb:"xl",children:[jsxs97(Group55,{gap:2,children:[jsx149(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx149(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx149(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx149(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx149(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx149(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx149(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx149(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx149(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx149(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx149(Button18,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx149(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs97(Group55,{gap:2,children:[lastResult&&jsxs97(Text45,{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()}`]}),jsx149(ActionIcon18,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx149(IconRefresh,{size:iconSize})})]})]}),jsxs97(Table3,{className:SearchControl_default.table,children:[jsxs97(Table3.Thead,{children:[jsxs97(Table3.Tr,{children:[checkboxColumn&&jsx149(Table3.Th,{children:jsx149("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx149(Table3.Th,{children:jsxs97(Menu8,{shadow:"md",width:240,position:"bottom-end",children:[jsx149(Menu8.Target,{children:jsx149(UnstyledButton7,{className:SearchControl_default.control,p:2,children:jsxs97(Group55,{justify:"space-between",wrap:"nowrap",children:[jsx149(Text45,{fw:500,children:buildFieldNameString(field.name)}),jsx149(Center7,{className:SearchControl_default.icon,children:jsx149(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx149(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=>jsx149(Table3.Th,{children:jsx149(Text45,{fw:500,p:2,children:col.name})},col.name))]}),!props.hideFilters&&jsxs97(Table3.Tr,{children:[checkboxColumn&&jsx149(Table3.Th,{}),fields.map(field=>jsx149(Table3.Th,{children:field.searchParams&&jsx149(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name)),props.additionalColumns?.map(col=>jsx149(Table3.Th,{},col.name))]})]}),jsx149(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs97(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx149(Table3.Td,{children:jsx149("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=>jsx149(Table3.Td,{children:renderValue(resource,field)},field.name)),props.additionalColumns?.map(col=>jsx149(Table3.Td,{children:col.renderCell(resource)},col.name))]},resource.id))})]}),!resources?.length&&jsx149(Container,{children:jsx149(Center7,{style:{height:150},children:jsx149(Text45,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx149(Center7,{m:"md",p:"md",children:jsx149(Pagination2,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),jsx149(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}`),jsx149(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}`),jsx149(SearchExportDialog,{visible:state.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx149(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?jsx149("span",{children:"no filters"}):jsx149(Fragment51,{children:filters.map(filter=>jsxs97("div",{children:[getOpString(filter.operator),"\xA0",jsx149(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 jsx150,jsxs as jsxs98}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum44(),[schemaLoaded,setSchemaLoaded]=useState85(!1),[outcome,setOutcome]=useState85(),{query,fields}=props,[response,setResponse]=useState85(),[selected,setSelected]=useState85({});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 jsx150(Loader8,{});let checkboxColumn=props.checkboxesEnabled;return jsxs98("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs98(Table4,{children:[jsx150(Table4.Thead,{children:jsxs98(Table4.Tr,{children:[checkboxColumn&&jsx150(Table4.Th,{children:jsx150("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx150(Table4.Th,{children:field.name},field.name))]})}),jsx150(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs98(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx150(Table4.Td,{children:jsx150("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=>jsx150(Table4.Td,{children:jsx150(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx150("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx150("div",{"data-testid":"search-error",children:jsx150("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx150(Button19,{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 jsx151}from"react/jsx-runtime";function InfoBar(props){return jsx151(ScrollArea6,{children:jsx151("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx151("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx151("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx151("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 useState86}from"react";var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};import{jsx as jsx152,jsxs as jsxs99}from"react/jsx-runtime";function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=useMedplumNavigate5(),[currentTab,setCurrentTab]=useState86(()=>{let segment=locationUtils5.getPathname().split("/").pop();if(segment){let segmentLower=segment.toLowerCase(),matched=tabs.find(t=>t.value.split(/[?#]/)[0].toLowerCase()===segmentLower);if(matched)return matched.value}return tabs[0].value});function onTabChange(newTabName){newTabName=newTabName||tabs[0].value,setCurrentTab(newTabName),navigate(`${baseUrl}/${newTabName}`)}return jsxs99(Tabs2,{value:currentTab,onChange:onTabChange,...rest,children:[jsx152(Tabs2.List,{className:LinkTabs_default.list,children:tabs.map(t=>jsx152(Tabs2.Tab,{value:t.value,children:jsx152(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 Box30,SimpleGrid as SimpleGrid2}from"@mantine/core";import{useResource as useResource13,useSearchOne}from"@medplum/react-hooks";import{Box as Box29,Flex as Flex24,Group as Group56,Paper as Paper4,RingProgress,Text as Text46,Title as Title11}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept6}from"@medplum/core";import{Fragment as Fragment52,jsx as jsx153,jsxs as jsxs100}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx153(Paper4,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs100(Group56,{children:[group.measureScore&&jsx153(MeasureScore,{group}),!group.measureScore&&jsx153(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs100(Fragment52,{children:[jsx153(Text46,{fz:"md",fw:500,mb:8,children:measure.title}),jsx153(Text46,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept6(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept6(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs100(Box29,{children:[jsx153(Title11,{order:3,children:"Not Applicable"}),jsx153(Text46,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs100(Box29,{children:[jsx153(Title11,{order:3,children:"Insufficient Data"}),jsx153(Text46,{children:`Numerator: ${numeratorCount}`}),jsx153(Text46,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx153(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx153(Flex24,{justify:"center",children:jsxs100(Text46,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx153(Fragment52,{children:unit==="%"?jsx153(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx153(Flex24,{justify:"center",children:jsx153(Text46,{fw:700,fz:18,children:jsx153(QuantityDisplay,{value:group.measureScore})})})}):jsx153(Flex24,{h:120,align:"center",children:jsx153(Title11,{order:3,children:jsx153(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 jsx154,jsxs as jsxs101}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource13(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs101(Box30,{children:[measure&&jsx154(MeasureTitle,{measure}),jsx154(SimpleGrid2,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx154(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 jsx155}from"react/jsx-runtime";function NotificationIcon(props){let{resourceType,countCriteria,subscriptionCriteria}=props,unreadCount=useNotificationCount2({resourceType,countCriteria,subscriptionCriteria}),result=props.iconComponent;return props.onClick&&(result=jsx155(ActionIcon19,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=jsx155(Tooltip10,{label:props.tooltip,children:result})),unreadCount>0&&(result=jsx155(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 Box31,Button as Button20,Checkbox as Checkbox7,Divider as Divider12,Group as Group57,Modal as Modal17,Stack as Stack41,Table as Table5,Text as Text47,Title as Title12}from"@mantine/core";import{notifications}from"@mantine/notifications";import{extractAccountReferences,normalizeErrorString as normalizeErrorString15}from"@medplum/core";import{useMedplum as useMedplum45}from"@medplum/react-hooks";import{useCallback as useCallback26,useMemo as useMemo38,useState as useState87}from"react";import{Fragment as Fragment53,jsx as jsx156,jsxs as jsxs102}from"react/jsx-runtime";var NOTIFICATION_ID="patient-accounts",NOTIFICATION_TITLE="Patient Accounts",ACCOUNT_TARGET_TYPES=["Organization","HealthcareService","CareTeam"];function PatientAccountsForm(props){let{patient}=props,medplum=useMedplum45(),isAdmin=medplum.isProjectAdmin()||medplum.isSuperAdmin(),originalAccounts=useMemo38(()=>extractAccountReferences(patient.meta)??[],[patient.meta]),[pendingAccounts,setPendingAccounts]=useState87(originalAccounts),[confirmModalOpen,setConfirmModalOpen]=useState87(!1),[propagate,setPropagate]=useState87(!0),[saving,setSaving]=useState87(!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=useCallback26(value=>{value?.reference&&(pendingAccounts.some(a=>a.reference===value.reference)||setPendingAccounts(prev=>[...prev,value]))},[pendingAccounts]),handleRemoveAccount=useCallback26(referenceString=>{setPendingAccounts(prev=>prev.filter(a=>a.reference!==referenceString))},[]),handleSave=useCallback26(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:jsx156(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:jsx156(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:jsx156(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}finally{setSaving(!1)}},[medplum,patient,pendingAccounts,propagate,props]);return isAdmin?jsxs102(Fragment53,{children:[jsxs102(Stack41,{children:[jsx156(Title12,{order:3,children:"Current Accounts"}),pendingAccounts.length===0?jsx156(Text47,{c:"dimmed",children:"No accounts assigned to this patient."}):jsxs102(Table5,{children:[jsx156(Table5.Thead,{children:jsxs102(Table5.Tr,{children:[jsx156(Table5.Th,{children:"Type"}),jsx156(Table5.Th,{children:"Account"}),jsx156(Table5.Th,{})]})}),jsx156(Table5.Tbody,{children:pendingAccounts.map(account=>jsxs102(Table5.Tr,{children:[jsx156(Table5.Td,{children:jsx156(AccountTypeBadge,{reference:account})}),jsx156(Table5.Td,{children:jsx156(ResourceBadge,{value:account,link:!0})}),jsx156(Table5.Td,{children:jsx156(ActionIcon20,{variant:"subtle",color:"red","aria-label":`Remove ${account.reference}`,onClick:()=>handleRemoveAccount(account.reference),children:jsx156(IconX,{size:16})})})]},account.reference))})]}),jsx156(Divider12,{}),jsx156(Title12,{order:4,children:"Add Account"}),jsx156(ReferenceInput,{name:"newAccount",placeholder:"Search for Organization, HealthcareService, or CareTeam...",targetTypes:ACCOUNT_TARGET_TYPES,onChange:value=>{value&&handleAddAccount(value)}}),hasChanges&&jsxs102(Fragment53,{children:[jsx156(Divider12,{}),jsx156(Title12,{order:4,children:"Pending Changes"}),jsx156(Stack41,{gap:"xs",children:changes.map(change=>jsxs102(Group57,{gap:"xs",children:[change.type==="addition"?jsx156(Badge3,{color:"green",variant:"light",leftSection:jsx156(IconPlus,{size:12}),children:"Add"}):jsx156(Badge3,{color:"red",variant:"light",leftSection:jsx156(IconMinus,{size:12}),children:"Remove"}),jsx156(ResourceBadge,{value:change.reference,link:!0})]},`${change.type}-${change.reference.reference}`))})]}),jsx156(Box31,{children:jsx156(Button20,{disabled:!hasChanges||saving,onClick:()=>setConfirmModalOpen(!0),children:"Save Changes"})})]}),jsx156(Modal17,{opened:confirmModalOpen,onClose:()=>setConfirmModalOpen(!1),title:"Confirm Account Changes",size:"md",keepMounted:!0,children:jsxs102(Stack41,{children:[jsxs102(Text47,{children:["The following changes will be applied to Patient"," ",jsxs102("strong",{children:[patient.name?.[0]?.given?.join(" ")," ",patient.name?.[0]?.family]}),":"]}),changes.filter(c=>c.type==="addition").length>0&&jsxs102(Box31,{children:[jsx156(Text47,{fw:600,c:"green",children:"Adding:"}),jsx156(Stack41,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="addition").map(c=>jsxs102(Group57,{gap:"xs",children:[jsx156(IconPlus,{size:14,color:"green"}),jsx156(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),changes.filter(c=>c.type==="removal").length>0&&jsxs102(Box31,{children:[jsx156(Text47,{fw:600,c:"red",children:"Removing:"}),jsx156(Stack41,{gap:"xs",mt:"xs",children:changes.filter(c=>c.type==="removal").map(c=>jsxs102(Group57,{gap:"xs",children:[jsx156(IconMinus,{size:14,color:"red"}),jsx156(ResourceBadge,{value:c.reference})]},c.reference.reference))})]}),jsx156(Checkbox7,{label:"Propagate changes to all resources in this patient's compartment",checked:propagate,onChange:event=>setPropagate(event.currentTarget.checked)}),jsxs102(Group57,{justify:"right",mt:"md",children:[jsx156(Button20,{variant:"default",onClick:()=>setConfirmModalOpen(!1),children:"Cancel"}),jsx156(Button20,{onClick:handleSave,loading:saving,children:"Confirm"})]})]})})]}):jsx156(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 jsx156(Badge3,{variant:"light",color:{Organization:"blue",HealthcareService:"teal",CareTeam:"violet"}[type]??"gray",size:"sm",children:type})}import{Checkbox as Checkbox8,Group as Group58,SegmentedControl as SegmentedControl2,Stack as Stack42}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 useMedplum46}from"@medplum/react-hooks";import{useCallback as useCallback27,useState as useState88}from"react";import{jsx as jsx157,jsxs as jsxs103}from"react/jsx-runtime";var NOTIFICATION_ID2="patient-export",NOTIFICATION_TITLE2="Patient Export",formats={everything:{operation:"$everything",extension:"json",contentType:ContentType3.FHIR_JSON},summary:{operation:"$summary",extension:"json",contentType:ContentType3.FHIR_JSON},ccda:{operation:"$ccda-export",extension:"xml",contentType:ContentType3.CDA_XML},ccdaReferral:{operation:"$ccda-export",type:"referral",extension:"xml",contentType:ContentType3.CDA_XML}};function PatientExportForm(props){let medplum=useMedplum46(),{patient}=props,[format,setFormat]=useState88("everything"),[inlineAttachments,setInlineAttachments]=useState88(!1),handleSubmit=useCallback27(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:jsx157(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:jsx157(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient,format,inlineAttachments]);return jsx157(Form,{onSubmit:handleSubmit,children:jsxs103(Stack42,{children:[jsx157(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx157(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})}),jsx157(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx157(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx157(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx157(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx157(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:jsx157(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx157(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:jsx157(DateTimeInput,{name:"endDate",placeholder:"End date"})}),format==="everything"&&jsx157(FormSection,{title:"Inline Attachments",description:"Embed DocumentReference file attachments as base64-encoded data instead of storage URLs.",children:jsx157(Stack42,{gap:"xs",children:jsx157(Checkbox8,{label:"Inline attachments",checked:inlineAttachments,onChange:e=>setInlineAttachments(e.currentTarget.checked)})})}),jsx157(Group58,{justify:"right",children:jsx157(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 Fragment54,jsx as jsx158,jsxs as jsxs104}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource14(props.patient);return patient?jsxs104(InfoBar,{children:[jsx158(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs104(InfoBar.Entry,{children:[jsx158(InfoBar.Key,{children:"Name"}),jsx158(InfoBar.Value,{children:jsx158(MedplumLink,{to:patient,fw:500,children:patient.name?jsx158(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs104(Fragment54,{children:[jsxs104(InfoBar.Entry,{children:[jsx158(InfoBar.Key,{children:"DoB"}),jsx158(InfoBar.Value,{children:patient.birthDate})]}),jsxs104(InfoBar.Entry,{children:[jsx158(InfoBar.Key,{children:"Age"}),jsx158(InfoBar.Value,{children:calculateAgeString2(patient.birthDate)})]})]}),patient.gender&&jsxs104(InfoBar.Entry,{children:[jsx158(InfoBar.Key,{children:"Gender"}),jsx158(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs104(InfoBar.Entry,{children:[jsx158(InfoBar.Key,{children:"State"}),jsx158(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs104(InfoBar.Entry,{children:[jsx158(InfoBar.Key,{children:identifier?.system}),jsx158(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Box as Box32,Button as Button21,Checkbox as Checkbox9,Flex as Flex25,Group as Group59,Loader as Loader9,Radio as Radio4,Stack as Stack43,Text as Text48,TextInput as TextInput27}from"@mantine/core";import{showNotification as showNotification12}from"@mantine/notifications";import{formatAddress as formatAddress5,normalizeErrorString as normalizeErrorString17}from"@medplum/core";import{useCallback as useCallback28,useMemo as useMemo39,useState as useState89}from"react";var PharmacyDialog_default={pharmacyItem:"PharmacyDialog_pharmacyItem",pharmacyItemSelected:"PharmacyDialog_pharmacyItemSelected"};import{jsx as jsx159,jsxs as jsxs105}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 jsx159("form",{onSubmit:e=>{e.preventDefault();let formData=new FormData(e.currentTarget);onSearch(formData)},children:jsxs105(Stack43,{gap:"md",children:[jsx159(TextInput27,{name:"name",label:"Pharmacy Name",placeholder:placeholders.name}),jsxs105(Group59,{grow:!0,children:[jsx159(TextInput27,{name:"city",label:"City",placeholder:placeholders.city}),jsx159(TextInput27,{name:"state",label:"State",placeholder:placeholders.state})]}),jsxs105(Group59,{grow:!0,children:[jsx159(TextInput27,{name:"zip",label:"Zip Code",placeholder:placeholders.zip}),jsx159(TextInput27,{name:"phoneOrFax",label:"Phone or Fax",placeholder:placeholders.phoneOrFax})]}),jsx159(TextInput27,{name:"address",label:"Address",placeholder:placeholders.address}),jsx159(TextInput27,{name:"ncpdpID",label:"NCPDP ID",placeholder:placeholders.ncpdpID}),renderBeforeSearchButton,jsx159(Button21,{type:"submit",loading:searching,children:"Search"})]})})}function PharmacyItem({pharmacy,pharmacyKey,isSelected,onSelect}){return jsx159(Box32,{p:"sm",className:isSelected?PharmacyDialog_default.pharmacyItemSelected:PharmacyDialog_default.pharmacyItem,onClick:onSelect,children:jsx159(Radio4,{value:pharmacyKey,label:jsxs105(Box32,{children:[jsx159(Text48,{fw:500,size:"sm",children:pharmacy.name}),pharmacy.address?.[0]&&jsx159(Text48,{size:"xs",c:"dimmed",children:formatAddress5(pharmacy.address[0])}),pharmacy.telecom?.find(t=>t.system==="phone")&&jsxs105(Text48,{size:"xs",c:"dimmed",children:["Phone: ",pharmacy.telecom.find(t=>t.system==="phone")?.value]}),pharmacy.telecom?.find(t=>t.system==="fax")&&jsxs105(Text48,{size:"xs",c:"dimmed",children:["Fax: ",pharmacy.telecom.find(t=>t.system==="fax")?.value]})]})})},pharmacyKey)}function SearchResults({searchResults,selectedPharmacy,onSelectPharmacy,setAsPrimary,onSetAsPrimary,onAddFavorite,onClose,adding}){return jsxs105(Box32,{mt:"xl",children:[jsxs105(Text48,{fw:600,mb:"md",children:["Search Results (",searchResults.length,")"]}),jsx159(Radio4.Group,{value:selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy)):"",onChange:value=>{let selected=searchResults.find((p,i)=>getPharmacyKey(p,i)===value);selected&&onSelectPharmacy(selected)},children:jsx159(Stack43,{gap:"sm",children:searchResults.map((pharmacy,index)=>{let pharmacyKey=getPharmacyKey(pharmacy,index),isSelected=selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy))===pharmacyKey:!1;return jsx159(PharmacyItem,{pharmacy,pharmacyKey,isSelected,onSelect:()=>onSelectPharmacy(pharmacy)},pharmacyKey)})})}),jsxs105(Flex25,{mt:"lg",gap:"md",align:"center",justify:"space-between",children:[jsx159(Checkbox9,{label:"Set as primary pharmacy",checked:setAsPrimary,onChange:e=>onSetAsPrimary(e.currentTarget.checked)}),jsxs105(Group59,{children:[jsx159(Button21,{variant:"subtle",onClick:onClose,children:"Cancel"}),jsx159(Button21,{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]=useState89([]),[searching,setSearching]=useState89(!1),[selectedPharmacy,setSelectedPharmacy]=useState89(),[setAsPrimary,setSetAsPrimary]=useState89(!1),[adding,setAdding]=useState89(!1),handleSearch=useCallback28(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=useCallback28(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 jsxs105(Box32,{children:[jsx159(SearchForm,{onSearch:formData=>handleSearch(formData).catch(console.error),searching,renderBeforeSearchButton,placeholders}),searching&&jsx159(Flex25,{justify:"center",mt:"xl",children:jsx159(Loader9,{})}),searchResults.length>0&&!searching&&jsx159(SearchResults,{searchResults,selectedPharmacy,onSelectPharmacy:setSelectedPharmacy,setAsPrimary,onSetAsPrimary:setSetAsPrimary,onAddFavorite:handleAddFavorite,onClose,adding})]})}import{Box as Box33,Flex as Flex26,Group as Group60,Text as Text49}from"@mantine/core";import{getDisplayString as coreGetDisplayString}from"@medplum/core";import{jsx as jsx160,jsxs as jsxs106}from"react/jsx-runtime";function summaryResourceListSection(options){return{key:options.key,title:options.title,searches:[{key:options.key,resourceType:options.search.resourceType,patientParam:options.search.patientParam,query:options.search.query}],component:context=>jsx160(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),jsx160(CollapsibleSection,{title:options.title,onAdd:options.onAdd,children:resources.length>0?jsx160(Flex26,{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 jsx160(SummaryItem,{onClick:()=>context.onClickResource?.(resource),children:jsxs106(Box33,{children:[jsx160(Text49,{fw:500,className:SummaryItem_default.itemText,children:displayString}),(status||secondaryText)&&jsxs106(Group60,{mt:2,gap:4,children:[status&&jsx160(StatusBadge,{color:status.color,variant:"light",status:status.label}),secondaryText&&jsx160(Text49,{size:"xs",fw:500,c:"dimmed",children:secondaryText})]})]})},resource.id)})}):jsx160(Text49,{children:"(none)"})})}import{createReference as createReference15}from"@medplum/core";import{useCallback as useCallback29}from"react";import{jsx as jsx161}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback29((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 jsx161(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference15(resource),sender:createReference15(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference15(resource),operator:createReference15(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor11,Box as Box34,Button as Button22,CloseButton as CloseButton3,Flex as Flex27,Group as Group61,Loader as Loader10,NativeSelect as NativeSelect11,Paper as Paper5,Stack as Stack44,Text as Text50,TextInput as TextInput28}from"@mantine/core";import{getReferenceString as getReferenceString11}from"@medplum/core";import{useMedplum as useMedplum47,useResource as useResource15}from"@medplum/react-hooks";import{useEffect as useEffect32,useState as useState90}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx162,jsxs as jsxs107}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum47(),defaultValue2=useResource15(props.value),[schemaLoaded,setSchemaLoaded]=useState90(!1),[selectedKey,setSelectedKey]=useState90(),[hoverKey,setHoverKey]=useState90(),[value,setValue]=useState90();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 jsx162("div",{children:jsxs107(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx162(TextInput28,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx162(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx162(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){function changeAction(changedAction){props.onChange(props.actions.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...props.actions,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(props.actions.filter(i=>i!==removedAction))}return jsxs107(Stack44,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx162(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx162("div",{children:jsx162(Button22,{variant:"outline",onClick:e=>{killEvent(e),addAction({id:generateId()})},children:"Add action"})})]})}function ActionBuilder(props){let{action}=props;function onClick(e){e.stopPropagation(),props.setSelectedKey(props.action.id)}function onHover(e){killEvent(e),props.setHoverKey(props.action.id)}return jsx162("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx162(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState90(),medplum=useMedplum47(),[loading,setLoading]=useState90(!1),[resource,setResource]=useState90(),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?jsx162(Loader10,{}):jsxs107(Paper5,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs107(Flex27,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx162(TextInput28,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx162(CloseButton3,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs107(Stack44,{gap:"xl",p:"md",children:[jsx162(Box34,{children:jsx162(TextInput28,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx162(Box34,{children:jsx162(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"&&jsxs107(Stack44,{gap:0,children:[jsxs107(Group61,{gap:0,mb:"xs",children:[jsx162(Text50,{fw:600,children:"Select questionnaire"}),jsx162(Text50,{c:"red",children:"*"})]}),jsxs107(Text50,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx162(Anchor11,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx162(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&jsxs107(Stack44,{gap:0,children:[jsxs107(Group61,{gap:0,mb:"xs",children:[jsx162(Text50,{fw:600,children:"Select activity definition"}),jsx162(Text50,{c:"red",children:"*"})]}),jsxs107(Text50,{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"," ",jsx162(Anchor11,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx162(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return jsx162(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,Loader as Loader11,Stack as Stack45,Text as Text51}from"@mantine/core";import{normalizeErrorString as normalizeErrorString18}from"@medplum/core";import{useEffect as useEffect33,useRef as useRef17,useState as useState91}from"react";import{jsx as jsx163,jsxs as jsxs108}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]=useState91(!0),[error,setError]=useState91();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]),jsxs108(Stack45,{gap:"sm",children:[error&&jsx163(Alert6,{color:"red",children:error}),jsx163("video",{ref:videoRef,width:640,height:480,muted:!0,style:{aspectRatio:"4 / 3",display:error?"none":"block",width:"100%",height:"auto",maxHeight:"70vh",background:"black"}}),jsx163("canvas",{ref:canvasRef,hidden:!0}),loading&&!error&&jsxs108(Text51,{c:"dimmed",size:"sm",children:[jsx163(Loader11,{size:"xs",mr:"xs"}),"Loading camera..."]})]})}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 Group63,NativeSelect as NativeSelect13,Space,Textarea as Textarea5,TextInput as TextInput30,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 useMedplum49,useResource as useResource16}from"@medplum/react-hooks";import{useEffect as useEffect35,useLayoutEffect as useLayoutEffect5,useRef as useRef18,useState as useState93}from"react";import{Checkbox as Checkbox10,Group as Group62,MultiSelect as MultiSelect2,NativeSelect as NativeSelect12,Radio as Radio5,Text as Text52,Textarea as Textarea4,TextInput as TextInput29}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 useMedplum48}from"@medplum/react-hooks";import{useEffect as useEffect34,useState as useState92}from"react";import{Fragment as Fragment55,jsx as jsx164,jsxs as jsxs109}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=jsx164("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx164(CheckboxFormSection,{title:props.item.text,htmlFor:inputId,children:jsx164(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=jsx164(TextInput29,{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=jsx164(TextInput29,{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=jsx164(TextInput29,{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=jsx164(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case QuestionnaireItemType.time:formComponent=jsx164(TextInput29,{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=jsx164(TextInput29,{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=jsx164(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=jsx164(Group62,{py:4,children:jsx164(AttachmentInput,{path:"",name:inputId,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case QuestionnaireItemType.reference:formComponent=jsx164(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=jsx164(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=jsx164(QuestionnaireCheckboxInput,{...sharedProps}):widget==="drop-down"?formComponent=jsx164(QuestionnaireDropdownInput,{...sharedProps}):formComponent=jsx164(QuestionnaireRadioButtonInput,{...sharedProps})}break;default:return null}return jsxs109(Fragment55,{children:[formComponent,validationError?.valueString&&jsx164(Text52,{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 jsx164(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||multiselect;if(item.answerValueSet)return jsx164(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 jsx164(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 jsx164(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=useMedplum48(),[valueSetOptions,setValueSetOptions]=useState92([]),[isLoading,setIsLoading]=useState92(!1),[isAvailable,setIsAvailable]=useState92(()=>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 jsx164(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 jsx164(Text52,{children:"Loading options..."});if(options.length===0)return isValueSetAvailable===!1?jsx164(SuggestionsUnavailableDisplay,{valueSetUrl:item.answerValueSet}):jsx164(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs109(Fragment55,{children:[jsx164(Radio5.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])=>jsx164(Radio5,{id:optionName,value:optionName,py:4,required,label:jsx164(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)&&jsxs109(Text52,{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 jsx164(Text52,{children:"Loading options..."});if(options.length===0)return isValueSetAvailable===!1?jsx164(SuggestionsUnavailableDisplay,{valueSetUrl:item.answerValueSet}):jsx164(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 jsxs109(Group62,{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 jsx164(Checkbox10,{id:optionName,label:jsx164(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)&&jsxs109(Text52,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx164(TextInput29,{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 Fragment56,jsx as jsx165,jsxs as jsxs110}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum49(),defaultValue2=useResource16(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState93(!1),[value,setValue]=useState93(),[selectedKey,setSelectedKey]=useState93(),[hoverKey,setHoverKey]=useState93();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:jsx165("div",{children:jsxs110(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx165(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx165(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 jsxs110("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx165("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs110(Fragment56,{children:[isResource4&&jsx165(TextInput30,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource4&&jsx165(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx165(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx165(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs110(Fragment56,{children:[resource.title&&jsx165(Title13,{children:resource.title}),item.text&&jsx165("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx165(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx165("div",{children:jsx165(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&&jsx165("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs110(Fragment56,{children:[jsx165(TextInput30,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx165(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"}]})]}):jsx165("div",{children:linkId})}),!isResource4&&jsx165(Box35,{className:QuestionnaireBuilder_default.movementActions,children:jsxs110(Box35,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx165(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx165(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx165(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx165(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs110("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs110(Fragment56,{children:[jsx165(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx165(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource4&&jsx165(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource4&&jsxs110(Fragment56,{children:[jsx165(Anchor12,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx165(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 jsxs110("div",{children:[props.item.answerValueSet!==void 0?jsx165(TextInput30,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx165(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs110(Box35,{display:"flex",children:[jsx165(Anchor12,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),jsx165(Space,{w:"lg"}),jsx165(Anchor12,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx165("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs110("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx165("div",{children:jsx165(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)}),jsx165("div",{children:jsx165(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 jsxs110(Fragment56,{children:[targetTypes.map((targetType,index)=>jsxs110(Group63,{children:[jsx165(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx165(Anchor12,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx165(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 Button25,Collapse as Collapse2,Divider as Divider15,Flex as Flex28,Loader as Loader12,Stack as Stack49,Text as Text54}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 useMedplum52,useWhisper}from"@medplum/react-hooks";import{useCallback as useCallback31,useEffect as useEffect38,useRef as useRef21,useState as useState95}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 Divider14,Group as Group65,Stack as Stack48,Text as Text53,Title as Title15}from"@mantine/core";import{createReference as createReference17,getExtension as getExtension3,getReferenceString as getReferenceString12}from"@medplum/core";import{QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,useMedplum as useMedplum51,useQuestionnaireForm}from"@medplum/react-hooks";import{useCallback as useCallback30,useEffect as useEffect37,useLayoutEffect as useLayoutEffect7,useMemo as useMemo40,useRef as useRef20,useState as useState94}from"react";import{Button as Button23,Paper as Paper6}from"@mantine/core";import{createReference as createReference16,HTTP_HL7_ORG as HTTP_HL7_ORG9}from"@medplum/core";import{useMedplum as useMedplum50}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 jsx166,jsxs as jsxs111}from"react/jsx-runtime";function SignatureInput(props){let medplum=useMedplum50(),{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??createReference16(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]),jsxs111(Paper6,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[jsx166("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),jsx166(Button23,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:jsx166(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}import{Divider as Divider13,Stack as Stack47}from"@mantine/core";import{isQuestionEnabled,QuestionnaireItemType as QuestionnaireItemType4}from"@medplum/react-hooks";import{Fragment as Fragment58}from"react";import{Title as Title14}from"@mantine/core";import{jsx as jsx167,jsxs as jsxs112}from"react/jsx-runtime";function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return jsxs112("div",{children:[props.item.text&&jsx167(Title14,{order:4,mb:"md",children:props.item.text}),jsx167(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 Fragment57,jsx as jsx168,jsxs as jsxs113}from"react/jsx-runtime";function QuestionnaireFormRepeatableGroup(props){return jsxs113(Fragment57,{children:[props.responseItems.map(response=>jsx168(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),jsx168(Anchor13,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}import{Anchor as Anchor14,Stack as Stack46}from"@mantine/core";import{QuestionnaireItemType as QuestionnaireItemType3}from"@medplum/react-hooks";import{jsx as jsx169,jsxs as jsxs114}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 jsxs114(FormSection,{title:props.item.text,withAsterisk:props.item.required,children:[jsx169(Stack46,{gap:"xs",children:answers?.map((_,index)=>jsx169(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&jsx169(Anchor14,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}import{jsx as jsx170,jsxs as jsxs115}from"react/jsx-runtime";function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props,isTopLevel=context.length===0,hasRenderedSection=!1;return jsx170(Stack47,{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 jsx170("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===QuestionnaireItemType4.group&&item.repeats?jsxs115(Fragment58,{children:[showSectionDivider&&jsx170(Divider13,{color:"var(--mantine-color-gray-2)"}),jsx170(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems})]},`repeating-group-${item.id}-${index}`):item.type===QuestionnaireItemType4.group?jsxs115(Fragment58,{children:[showSectionDivider&&jsx170(Divider13,{color:"var(--mantine-color-gray-2)"}),jsx170(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]})]},`group-${item.id}-${index}`):item.type===QuestionnaireItemType4.boolean?jsx170(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?jsx170(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):jsx170(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:jsx170(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}import{Button as Button24,Group as Group64,Stepper}from"@mantine/core";import{Fragment as Fragment59,jsx as jsx171,jsxs as jsxs116}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 jsxs116(Fragment59,{children:[jsx171(Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>jsx171(Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&jsxs116(Group64,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx171(Button24,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&jsx171(Button24,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&jsx171(SubmitButton,{children:submitButtonText??"Submit"})]})]})}import{Fragment as Fragment60,jsx as jsx172,jsxs as jsxs117}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum51(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=useState94(!1),propsRef=useRef20(props),pendingChangeRef=useRef20(void 0);useLayoutEffect7(()=>{propsRef.current=props});let onFormChange=useCallback30(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=useCallback30(()=>{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=createReference17(profile))}onSubmit({...response,questionnaire:questionnaire.url??getReferenceString12(questionnaire),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:jsxs117(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&jsx172(Title15,{order:1,fz:"1.625rem",fw:700,lh:1.3,mb:"xl",children:formState.questionnaire.title}),props.afterHeader&&jsxs117(Stack48,{gap:"xl",mb:"xl",children:[props.afterHeader,jsx172(Divider14,{color:"var(--mantine-color-gray-2)"})]}),formState.pagination?jsx172(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:jsx172(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):jsxs117(Fragment60,{children:[jsx172(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&jsxs117(Stack48,{mt:"md",gap:0,children:[jsx172(Text53,{size:"sm",fw:500,children:"Signature"}),jsx172(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&jsx172(Text53,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&jsx172(Group65,{justify:"flex-end",mt:"xl",gap:"xs",children:jsx172(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}import{Fragment as Fragment61,jsx as jsx173,jsxs as jsxs118}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=jsxs118(Stack49,{gap:"xs",children:[jsx173(Text54,{children:"To fill out the form, just speak naturally and the dictation tool will map your spoken answers to the form fields."}),jsx173(Text54,{children:"Pause briefly between thoughts to start processing."})]});function AIRealTimeQuestionnaireForm(props){let{aiModel,onTranscript,voiceInstructions,silenceDebounceMs,...questionnaireFormProps}=props,medplum=useMedplum52(),[questionnaireResponse,setQuestionnaireResponse]=useState95(props.questionnaireResponse),[isProcessing,setIsProcessing]=useState95(!1),[transcript,setTranscript]=useState95(""),[displayTranscript,setDisplayTranscript]=useState95(()=>getStoredTranscript(props.questionnaireResponse)),[expanded,setExpanded]=useState95(!1),[isStopping,setIsStopping]=useState95(!1),[responseVersion,setResponseVersion]=useState95(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]=useState95("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=jsxs118(Fragment61,{children:["Voice dictation unavailable: bot '",botIdentifier.value??"","' is not deployed",jsx173("br",{}),"Please contact support"]})):idleLabel=jsxs118(Fragment61,{children:["Voice dictation is not enabled for this project",jsx173("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=useCallback31(async transcript2=>{if(!(!questionnaireRef.current||!transcript2.trim())){setIsProcessing(!0);try{let existingResponse=responseRef.current,parameter=[{name:"questionnaire",valueString:JSON.stringify(questionnaireRef.current)},{name:"transcript",valueString:transcript2}];existingResponse?.item&&existingResponse.item.length>0&¶meter.push({name:"questionnaireResponse",valueString:JSON.stringify(existingResponse)}),aiModel&¶meter.push({name:"model",valueString:aiModel});let responseParam=(await medplum.executeBot(botIdentifier,{resourceType:"Parameters",parameter})).parameter?.find(p=>p.name==="questionnaireResponse");if(responseParam?.valueString)try{let aiQuestionnaireResponse=JSON.parse(responseParam.valueString),preservedExtensions=(aiQuestionnaireResponse.extension??[]).filter(e=>e.url!==VOICE_TRANSCRIPT_EXTENSION_URL);aiQuestionnaireResponse.extension=[...preservedExtensions,{url:VOICE_TRANSCRIPT_EXTENSION_URL,valueString:fullTranscriptRef.current}],responseRef.current=aiQuestionnaireResponse,setQuestionnaireResponse(aiQuestionnaireResponse),setResponseVersion(v=>v+1)}catch(parseError){console.error("Failed to parse bot response as QuestionnaireResponse:",parseError),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=useCallback31(()=>{setExpanded(!0),start().catch(err=>console.error("Error starting voice input:",err))},[start]),handleStopDictation=useCallback31(()=>{setIsStopping(!0),stop(),debouncedFlush.cancel(),flushTranscriptRef.current().catch(err=>showNotification13({color:"red",message:`Error flushing transcript: ${normalizeErrorString19(err)}`}))},[stop,debouncedFlush]),handleToggleExpanded=useCallback31(()=>{setExpanded(prev=>!prev)},[]),handleClearTranscript=useCallback31(()=>{inputRef.current="",fullTranscriptRef.current="",setTranscript(""),setDisplayTranscript(""),onTranscript?.("","");let existing=responseRef.current;if(existing?.extension?.some(e=>e.url===VOICE_TRANSCRIPT_EXTENSION_URL)){let next={...existing,extension:existing.extension.filter(e=>e.url!==VOICE_TRANSCRIPT_EXTENSION_URL)};responseRef.current=next,setQuestionnaireResponse(next)}},[onTranscript]);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=jsx173(IconMicrophone,{size:20});isFinishing?(statusState="finishing",statusIcon=jsx173(Loader12,{size:16,color:"blue"})):activeStatusLabel&&(statusState="recording",statusIcon=jsx173(IconCircleFilled,{size:16}));let afterHeader=jsxs118(Box36,{className:AIRealTimeQuestionnaireForm_default.banner,children:[jsxs118(Flex28,{align:"center",justify:"space-between",gap:"sm",p:"md",className:AIRealTimeQuestionnaireForm_default.headerRow,children:[jsxs118("div",{className:AIRealTimeQuestionnaireForm_default.statusRow,"data-state":statusState,children:[jsx173("span",{className:AIRealTimeQuestionnaireForm_default.iconWrapper,"aria-hidden":!0,children:statusIcon}),jsx173("span",{className:AIRealTimeQuestionnaireForm_default.statusLabel,"aria-live":"polite",children:activeStatusLabel?jsx173("span",{className:isFinishing?AIRealTimeQuestionnaireForm_default.statusLabelFinishing:AIRealTimeQuestionnaireForm_default.statusLabelPrimary,children:activeStatusLabel}):idleLabel})]}),jsxs118(Flex28,{align:"center",gap:"xs",children:[jsx173(Button25,{className:clsx_default(AIRealTimeQuestionnaireForm_default.dictationButton,showButtonLoader&&AIRealTimeQuestionnaireForm_default.dictationButtonLoading),variant:showStopButton?"light":"filled",color:showStopButton?"red":"blue",size:"sm",leftSection:showButtonLoader?jsx173(Loader12,{size:14,color:"dimmed"}):void 0,disabled:showButtonLoader||!isVoiceEnabled&&!showStopButton,onClick:showStopButton?handleStopDictation:handleStartDictation,children:dictationLabel}),jsx173(ActionIcon21,{variant:"subtle",color:"gray",size:"lg",radius:"xl","aria-label":expanded?"Collapse transcript":"Expand transcript","aria-expanded":expanded,onClick:handleToggleExpanded,children:expanded?jsx173(IconChevronUp,{size:18}):jsx173(IconChevronDown,{size:18})})]})]}),jsxs118(Collapse2,{in:expanded,children:[jsx173(Box36,{px:"md",children:jsx173(Divider15,{color:"var(--mantine-color-gray-2)"})}),jsx173(Box36,{p:"md",children:jsxs118("div",{className:AIRealTimeQuestionnaireForm_default.panelGrid,children:[jsxs118("div",{className:AIRealTimeQuestionnaireForm_default.panelColumn,children:[jsx173(Text54,{size:"sm",fw:700,children:"How to Use"}),jsx173("div",{className:AIRealTimeQuestionnaireForm_default.instructions,children:voiceInstructions??DEFAULT_INSTRUCTIONS})]}),jsxs118("div",{className:AIRealTimeQuestionnaireForm_default.panelColumn,children:[jsxs118(Flex28,{align:"center",justify:"space-between",gap:"xs",children:[jsx173(Text54,{size:"sm",fw:700,children:"Transcript"}),jsx173(Button25,{variant:"subtle",color:"red",size:"compact-xs",leftSection:jsx173(IconTrash,{size:14}),disabled:!displayTranscript&&!transcript,onClick:handleClearTranscript,children:"Clear"})]}),jsx173("div",{className:AIRealTimeQuestionnaireForm_default.transcriptWrapper,children:jsx173("div",{ref:transcriptViewportRef,className:AIRealTimeQuestionnaireForm_default.transcriptArea,children:jsx173(Text54,{component:"pre",className:AIRealTimeQuestionnaireForm_default.transcriptText,children:(displayTranscript&&transcript?`${displayTranscript} ${transcript}`:displayTranscript||transcript)||TRANSCRIPT_PLACEHOLDER})})})]})]})})]})]});return jsx173(QuestionnaireForm,{...questionnaireFormProps,questionnaireResponse,afterHeader,onChange:response=>{setQuestionnaireResponse(response),props.onChange?.(response)}},responseVersion)}import{Stack as Stack51}from"@mantine/core";import{useResource as useResource17}from"@medplum/react-hooks";import{Stack as Stack50,Text as Text55}from"@mantine/core";import{formatDate as formatDate4}from"@medplum/core";import{useMemo as useMemo41}from"react";import{Fragment as Fragment62,jsx as jsx174,jsxs as jsxs119}from"react/jsx-runtime";function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=useMemo41(()=>answer&&answer.length>0?jsx174(Fragment62,{children:answer.map((ans,index)=>jsx174(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?jsx174(Fragment62,{children:nestedAnswers.map((nestedAnswer,index)=>jsx174(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):jsx174(Text55,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return jsxs119(Stack50,{gap:0,pb:"xs",children:[jsx174(Text55,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return jsx174(Text55,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return jsx174(Text55,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return jsx174(Text55,{children:value});case"valueQuantity":return jsx174(QuantityDisplay,{value});case"valueString":return jsx174(Text55,{children:value});case"valueCoding":return jsx174(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return jsx174(RangeDisplay,{value});case"valueDateTime":return jsx174(Text55,{children:formatDate4(value)});case"valueBoolean":return jsx174(Text55,{children:value?"True":"False"});case"valueReference":return jsx174(Text55,{children:value.display??value.reference});default:return jsx174(Text55,{children:value.toString()})}}import{jsx as jsx175}from"react/jsx-runtime";function QuestionnaireResponseDisplay(props){let questionnaireResponse=useResource17(props.questionnaireResponse);return jsx175(Stack51,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>jsx175(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}import{ActionIcon as ActionIcon22,Divider as Divider16,Group as Group66,NativeSelect as NativeSelect14,Stack as Stack52,Text as Text56,TextInput as TextInput31}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect39,useState as useState96}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx176,jsxs as jsxs120}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]=useState96([]),[groupId,setGroupId]=useState96(1),[intervalId,setIntervalId]=useState96(1);return useEffect39(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs120(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx176(Stack52,{children:intervalGroups.map(intervalGroup=>jsx176(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx176(ActionIcon22,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx176(IconCirclePlus,{})}),jsx176(Group66,{justify:"flex-end",children:jsx176(SubmitButton,{children:"Save"})})]});function submitDefinition(){let qualifiedInterval=intervalGroups.flatMap(group=>group.intervals).filter(interval=>!isEmptyInterval(interval));props.onSubmit({...defaultDefinition,qualifiedInterval})}function addGroup(addedGroup){setIntervalGroups(currentGroups=>[...currentGroups,addedGroup])}function removeGroup(removedGroup){setIntervalGroups(currentGroups=>currentGroups.filter(group=>group.id!==removedGroup.id))}function changeInterval(groupId2,changedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2),index=currentGroup?.intervals.findIndex(interval=>interval.id===changedInterval.id);return index!==void 0&¤tGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g=>g.id===groupId2);if(currentGroupIndex!==-1){let currentGroup={...groups[currentGroupIndex]};addedInterval={...addedInterval,...currentGroup.filters},currentGroup.intervals=[...currentGroup.intervals,addedInterval],groups[currentGroupIndex]=currentGroup}return groups})}function removeInterval(groupId2,removedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx176(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs120(Stack52,{gap:"lg",children:[jsx176(Group66,{justify:"flex-end",children:jsx176(ActionIcon22,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx176(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx176(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx176(Divider16,{}),intervalGroup.intervals.map(interval=>jsxs120(Stack52,{gap:"xs",children:[jsxs120(Group66,{children:[jsx176(TextInput31,{"data-testid":`condition-${interval.id}`,defaultValue:interval.condition,label:"Condition: ",size:"sm",onChange:e=>{killEvent(e),props.onChange(intervalGroup.id,{...interval,condition:e.currentTarget.value.trim()})}},`condition-${interval.id}`),jsx176(ActionIcon22,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx176(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx176(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx176(ActionIcon22,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx176(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 jsxs120(Stack52,{style:{maxWidth:"50%"},children:[jsx176(Group66,{children:jsx176(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})}}})}),jsxs120(Group66,{gap:"xs",children:[jsx176(Text56,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx176("div",{id:`div-age-${intervalGroup.id}`,children:jsx176(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}`)})]}),jsx176(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"}]}})}}}),jsx176(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 Button26,Grid as Grid2,Text as Text57}from"@mantine/core";import{formatDateTime as formatDateTime7,getReferenceString as getReferenceString13}from"@medplum/core";import{useMedplum as useMedplum53,useResource as useResource18}from"@medplum/react-hooks";import{Fragment as Fragment63,useEffect as useEffect40,useState as useState97}from"react";import{jsx as jsx177,jsxs as jsxs121}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum53(),requestGroup=useResource18(props.value),[startedLoading,setStartedLoading]=useState97(!1),[responseBundle,setResponseBundle]=useState97();if(useEffect40(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx177(Grid2,{children:requestGroup.action?.map((action,index)=>{let task=action.resource&&findBundleEntry(action.resource),taskInput=task?.input?.[0]?.valueReference,taskOutput=task?.output?.[0]?.valueReference;return jsxs121(Fragment63,{children:[jsx177(Grid2.Col,{span:1,p:"md",children:task?.status==="completed"?jsx177(IconCheckbox,{}):jsx177(IconSquare,{color:"gray"})}),jsxs121(Grid2.Col,{span:9,p:"xs",children:[jsx177(Text57,{fw:500,children:action.title}),action.description&&jsx177("div",{children:action.description}),jsxs121("div",{children:["Last edited by\xA0",jsx177(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime7(task?.meta?.lastUpdated)]}),jsxs121("div",{children:["Status: ",jsx177(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs121(Grid2.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx177(Button26,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx177(Button26,{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 useMedplum54}from"@medplum/react-hooks";import{useEffect as useEffect41,useState as useState98}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 Fragment64,jsx as jsx178,jsxs as jsxs122}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum54(),[value,setValue]=useState98(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 jsx178("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx178("div",{className:ResourceBlame_default.container,children:jsx178("table",{className:ResourceBlame_default.root,children:jsx178("tbody",{children:table.map((row,index)=>jsxs122("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs122(Fragment64,{children:[jsxs122("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:[jsx178(ResourceName,{value:row.meta.author,link:!0,fz:"xs"}),row.meta.onBehalfOf&&jsxs122("div",{className:ResourceBlame_default.onBehalfOf,children:["on behalf of ",jsx178(ResourceName,{value:row.meta.onBehalfOf,link:!0,fz:"xs",c:"dimmed"})]})]}),jsx178("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx178(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),fz:"xs",children:getTimeString(row.meta.lastUpdated)})})]}),jsx178("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx178("td",{className:ResourceBlame_default.line,children:jsx178("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 jsx179}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 jsx179(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 Fragment65,jsx as jsx180,jsxs as jsxs123}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 jsx180("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx180(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs123(Fragment65,{children:["...",jsx180("br",{}),props.delta.original.lines.length>0&&jsx180("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
|
|
110
|
+
`)}),props.delta.revised.lines.length>0&&jsx180("div",{className:ResourceDiff_default.added,children:props.delta.revised.lines.join(`
|
|
111
|
+
`)}),"...",jsx180("br",{})]})}import{ActionIcon as ActionIcon23,Alert as Alert7,Button as Button27,Group as Group67,Menu as Menu9,Stack as Stack53,TextInput as TextInput32,useMantineTheme}from"@mantine/core";import{AccessPolicyInteraction as AccessPolicyInteraction2,applyDefaultValuesToResource,canWriteResourceType,isPopulated as isPopulated11,satisfiedAccessPolicy as satisfiedAccessPolicy2,tryGetProfile as tryGetProfile5}from"@medplum/core";import{useMedplum as useMedplum55,useResource as useResource19}from"@medplum/react-hooks";import{useEffect as useEffect42,useMemo as useMemo42,useState as useState99}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx181,jsxs as jsxs124}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum55(),defaultValue2=useResource19(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState99(!1),[value,setValue]=useState99(),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?jsx181("div",{children:"Loading..."}):canWrite?jsxs124("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs124(Stack53,{mb:"xl",children:[jsx181(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx181(TextInput32,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx181(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx181(TextInput32,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx181(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:resourceType,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl,accessPolicyResource}),jsxs124(Group67,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx181(Button27,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs124(Menu9,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx181(Menu9.Target,{children:jsx181(ActionIcon23,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx181(IconChevronDown,{size:14,stroke:1.5})})}),jsxs124(Menu9.Dropdown,{children:[props.onPatch&&jsx181(Menu9.Item,{leftSection:jsx181(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx181(Menu9.Item,{color:"red",leftSection:jsx181(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs124(Alert7,{color:"red",title:"Permission denied",icon:jsx181(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 useMedplum56}from"@medplum/react-hooks";import{useEffect as useEffect43,useState as useState100}from"react";import{jsx as jsx182,jsxs as jsxs125}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum56(),[value,setValue]=useState100(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?jsxs125(Table6,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx182(Table6.Thead,{children:jsxs125(Table6.Tr,{children:[jsx182(Table6.Th,{children:"Author"}),jsx182(Table6.Th,{children:"On Behalf Of"}),jsx182(Table6.Th,{children:"Date"}),jsx182(Table6.Th,{children:"Version"})]})}),jsx182(Table6.Tbody,{children:value.entry?.map((entry,index)=>jsx182(HistoryRow,{entry},"entry-"+index))})]}):jsx182("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs125(Table6.Tr,{children:[jsx182(Table6.Td,{children:jsx182(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx182(Table6.Td,{children:resource.meta?.onBehalfOf&&jsx182(ResourceBadge,{value:resource.meta.onBehalfOf,link:!0})}),jsx182(Table6.Td,{children:formatDateTime8(resource.meta?.lastUpdated)}),jsx182(Table6.Td,{children:jsx182(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx182(Table6.Tr,{children:jsx182(Table6.Td,{colSpan:4,children:normalizeErrorString20(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button28,Loader as Loader13,Stack as Stack54,Text as Text58}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 useMedplum57}from"@medplum/react-hooks";import{useCallback as useCallback32,useEffect as useEffect44,useMemo as useMemo43,useState as useState101}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx183,jsxs as jsxs126}from"react/jsx-runtime";function BaseScheduler(props){let[month,setMonth]=useState101(getStartMonth),[date,setDate]=useState101(),[options,setOptions]=useState101(),[selectedOption,setSelectedOption]=useState101(),{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=useCallback32(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?jsxs126("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs126("div",{className:Scheduler_default.info,children:[props.actor&&jsx183(ResourceAvatar,{value:props.actor,size:"xl"}),props.actor&&jsx183(Text58,{size:"xl",fw:500,children:jsx183(ResourceName,{value:props.actor})}),jsx183("p",{children:"1 hour"}),date&&jsx183("p",{children:date.toLocaleDateString()}),selectedOption&&jsx183("p",{children:formatTime(selectedOption[1])})]}),jsxs126("div",{className:Scheduler_default.selection,children:[!date&&jsxs126("div",{children:[jsx183("h3",{children:"Select date"}),jsx183(CalendarDateInput,{availableDates:options.map(opt=>opt[1]),onChangeMonth:setMonth,onClick:setDate})]}),date&&!selectedOption&&jsxs126("div",{children:[jsx183("h3",{children:"Select time"}),jsx183(Stack54,{children:filteredOptions.map(option=>jsx183("div",{children:jsx183(Button28,{variant:"outline",style:{width:150},onClick:()=>handleSelectOption(option),children:formatTime(option[1])})},option[1].toISOString()))})]}),props.children]})]}):jsx183("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:jsx183(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=useMedplum57(),{fetchSlots,schedule}=props,[actor,setActor]=useState101(),fetchOptions=useCallback32(async period=>{if(fetchSlots)return(await fetchSlots(period)).map(slot=>[slot,new Date(slot.start)]);let scheduleRefs=arrayify2(schedule??[]).map(getReferenceString14).filter(isDefined),slotSearchParams=new URLSearchParams([["_count","720"],["schedule",scheduleRefs.join(",")],["start","gt"+period.start],["start","lt"+period.end]]);return(await medplum.searchResources("Slot",slotSearchParams)).map(slot=>[slot,new Date(slot.start)])},[medplum,fetchSlots,schedule]);return 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]),jsx183(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";var dist_exports={};__export(dist_exports,{HydratedRouter:()=>HydratedRouter,RouterProvider:()=>RouterProvider});__reExport(dist_exports,react_router_star);import{HydratedRouter,RouterProvider}from"react-router/dom";import*as react_router_star from"react-router";function ScrollToTop(){let{pathname}=(0,dist_exports.useLocation)();return useEffect45(()=>{window.scrollTo(0,0)},[pathname]),null}import{createReference as createReference18}from"@medplum/core";import{jsx as jsx184}from"react/jsx-runtime";function ServiceRequestTimeline(props){let{serviceRequest,...rest}=props;return jsx184(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:[createReference18(resource)],subject:resource.subject,sender:createReference18(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference18(resource)],subject:resource.subject,operator:createReference18(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 useMedplum58,useResource as useResource20}from"@medplum/react-hooks";import{jsx as jsx185}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum58(),{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 jsx185(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,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,InfoBar,InsuranceSection,LabsSection,LinkTabs,ListWithDetailPane,Loading,Logo,MeasureReportDisplay,MedicationsSection,MedplumLink,MemoizedFhirPathTable,MfaEnrollForm,MfaForm,MfaVerificationForm,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};
|
|
112
112
|
/*! Bundled license information:
|
|
113
113
|
|
|
114
114
|
@tabler/icons-react/dist/esm/defaultAttributes.mjs:
|
|
@@ -154,6 +154,7 @@ var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDe
|
|
|
154
154
|
@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs:
|
|
155
155
|
@tabler/icons-react/dist/esm/icons/IconFileText.mjs:
|
|
156
156
|
@tabler/icons-react/dist/esm/icons/IconFilter.mjs:
|
|
157
|
+
@tabler/icons-react/dist/esm/icons/IconInfoCircle.mjs:
|
|
157
158
|
@tabler/icons-react/dist/esm/icons/IconLanguage.mjs:
|
|
158
159
|
@tabler/icons-react/dist/esm/icons/IconLayoutSidebar.mjs:
|
|
159
160
|
@tabler/icons-react/dist/esm/icons/IconLogout.mjs:
|
|
@@ -186,7 +187,7 @@ var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDe
|
|
|
186
187
|
@tabler/icons-react/dist/esm/icons/IconCircleFilled.mjs:
|
|
187
188
|
@tabler/icons-react/dist/esm/tabler-icons-react.mjs:
|
|
188
189
|
(**
|
|
189
|
-
* @license @tabler/icons-react v3.
|
|
190
|
+
* @license @tabler/icons-react v3.46.0 - MIT
|
|
190
191
|
*
|
|
191
192
|
* This source code is licensed under the MIT license.
|
|
192
193
|
* See the LICENSE file in the root directory of this source tree.
|
|
@@ -194,13 +195,13 @@ var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDe
|
|
|
194
195
|
|
|
195
196
|
signature_pad/dist/signature_pad.js:
|
|
196
197
|
(*!
|
|
197
|
-
* Signature Pad v5.1.
|
|
198
|
-
* (c)
|
|
198
|
+
* Signature Pad v5.1.4 | https://github.com/szimek/signature_pad
|
|
199
|
+
* (c) 2026 Szymon Nowak | Released under the MIT license
|
|
199
200
|
*)
|
|
200
201
|
|
|
201
202
|
react-router-dom/dist/index.mjs:
|
|
202
203
|
(**
|
|
203
|
-
* react-router-dom v7.18.
|
|
204
|
+
* react-router-dom v7.18.2
|
|
204
205
|
*
|
|
205
206
|
* Copyright (c) Remix Software Inc.
|
|
206
207
|
*
|