@medplum/react 3.0.13 → 3.1.1

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.
@@ -1,4 +1,4 @@
1
- var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __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};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));var require_pointer=__commonJS({"../../node_modules/rfc6902/pointer.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.Pointer=void 0;function unescape(token){return token.replace(/~1/g,"/").replace(/~0/g,"~")}function escape(token){return token.replace(/~/g,"~0").replace(/\//g,"~1")}var Pointer=function(){function Pointer2(tokens){tokens===void 0&&(tokens=[""]),this.tokens=tokens}return Pointer2.fromJSON=function(path){var tokens=path.split("/").map(unescape);if(tokens[0]!=="")throw new Error("Invalid JSON Pointer: ".concat(path));return new Pointer2(tokens)},Pointer2.prototype.toString=function(){return this.tokens.map(escape).join("/")},Pointer2.prototype.evaluate=function(object){for(var parent=null,key="",value=object,i=1,l=this.tokens.length;i<l;i++)parent=value,key=this.tokens[i],!(key=="__proto__"||key=="constructor"||key=="prototype")&&(value=(parent||{})[key]);return{parent,key,value}},Pointer2.prototype.get=function(object){return this.evaluate(object).value},Pointer2.prototype.set=function(object,value){var endpoint=this.evaluate(object);endpoint.parent&&(endpoint.parent[endpoint.key]=value)},Pointer2.prototype.push=function(token){this.tokens.push(token)},Pointer2.prototype.add=function(token){var tokens=this.tokens.concat(String(token));return new Pointer2(tokens)},Pointer2}();exports.Pointer=Pointer}});var require_util=__commonJS({"../../node_modules/rfc6902/util.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.clone=exports.objectType=exports.hasOwnProperty=void 0;exports.hasOwnProperty=Object.prototype.hasOwnProperty;function objectType(object){return object===void 0?"undefined":object===null?"null":Array.isArray(object)?"array":typeof object}exports.objectType=objectType;function isNonPrimitive(value){return value!=null&&typeof value=="object"}function clone(source){if(!isNonPrimitive(source))return source;if(source.constructor==Array){for(var length_1=source.length,arrayTarget=new Array(length_1),i=0;i<length_1;i++)arrayTarget[i]=clone(source[i]);return arrayTarget}if(source.constructor==Date){var dateTarget=new Date(+source);return dateTarget}var objectTarget={};for(var key in source)exports.hasOwnProperty.call(source,key)&&(objectTarget[key]=clone(source[key]));return objectTarget}exports.clone=clone}});var require_diff=__commonJS({"../../node_modules/rfc6902/diff.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.diffAny=exports.diffObjects=exports.diffArrays=exports.intersection=exports.subtract=exports.isDestructive=void 0;var util_1=require_util();function isDestructive(_a){var op=_a.op;return op==="remove"||op==="replace"||op==="copy"||op==="move"}exports.isDestructive=isDestructive;function subtract(minuend,subtrahend){var obj={};for(var add_key in minuend)util_1.hasOwnProperty.call(minuend,add_key)&&minuend[add_key]!==void 0&&(obj[add_key]=1);for(var del_key in subtrahend)util_1.hasOwnProperty.call(subtrahend,del_key)&&subtrahend[del_key]!==void 0&&delete obj[del_key];return Object.keys(obj)}exports.subtract=subtract;function intersection(objects){for(var length=objects.length,counter={},i=0;i<length;i++){var object=objects[i];for(var key in object)util_1.hasOwnProperty.call(object,key)&&object[key]!==void 0&&(counter[key]=(counter[key]||0)+1)}for(var key in counter)counter[key]<length&&delete counter[key];return Object.keys(counter)}exports.intersection=intersection;function isArrayAdd(array_operation){return array_operation.op==="add"}function isArrayRemove(array_operation){return array_operation.op==="remove"}function appendArrayOperation(base,operation){return{operations:base.operations.concat(operation),cost:base.cost+1}}function diffArrays(input,output,ptr,diff2){diff2===void 0&&(diff2=diffAny);var memo3={"0,0":{operations:[],cost:0}};function dist(i,j){var memo_key="".concat(i,",").concat(j),memoized=memo3[memo_key];if(memoized===void 0){if(i>0&&j>0&&!diff2(input[i-1],output[j-1],ptr.add(String(i-1))).length)memoized=dist(i-1,j-1);else{var alternatives=[];if(i>0){var remove_base=dist(i-1,j),remove_operation={op:"remove",index:i-1};alternatives.push(appendArrayOperation(remove_base,remove_operation))}if(j>0){var add_base=dist(i,j-1),add_operation={op:"add",index:i-1,value:output[j-1]};alternatives.push(appendArrayOperation(add_base,add_operation))}if(i>0&&j>0){var replace_base=dist(i-1,j-1),replace_operation={op:"replace",index:i-1,original:input[i-1],value:output[j-1]};alternatives.push(appendArrayOperation(replace_base,replace_operation))}var best=alternatives.sort(function(a2,b2){return a2.cost-b2.cost})[0];memoized=best}memo3[memo_key]=memoized}return memoized}var input_length=isNaN(input.length)||input.length<=0?0:input.length,output_length=isNaN(output.length)||output.length<=0?0:output.length,array_operations=dist(input_length,output_length).operations,padded_operations=array_operations.reduce(function(_a,array_operation){var operations=_a[0],padding=_a[1];if(isArrayAdd(array_operation)){var padded_index=array_operation.index+1+padding,index_token=padded_index<input_length+padding?String(padded_index):"-",operation={op:array_operation.op,path:ptr.add(index_token).toString(),value:array_operation.value};return[operations.concat(operation),padding+1]}else if(isArrayRemove(array_operation)){var operation={op:array_operation.op,path:ptr.add(String(array_operation.index+padding)).toString()};return[operations.concat(operation),padding-1]}else{var replace_ptr=ptr.add(String(array_operation.index+padding)),replace_operations=diff2(array_operation.original,array_operation.value,replace_ptr);return[operations.concat.apply(operations,replace_operations),padding]}},[[],0])[0];return padded_operations}exports.diffArrays=diffArrays;function diffObjects(input,output,ptr,diff2){diff2===void 0&&(diff2=diffAny);var operations=[];return subtract(input,output).forEach(function(key){operations.push({op:"remove",path:ptr.add(key).toString()})}),subtract(output,input).forEach(function(key){operations.push({op:"add",path:ptr.add(key).toString(),value:output[key]})}),intersection([input,output]).forEach(function(key){operations.push.apply(operations,diff2(input[key],output[key],ptr.add(key)))}),operations}exports.diffObjects=diffObjects;function diffAny(input,output,ptr,diff2){if(diff2===void 0&&(diff2=diffAny),input===output)return[];var input_type=(0,util_1.objectType)(input),output_type=(0,util_1.objectType)(output);return input_type=="array"&&output_type=="array"?diffArrays(input,output,ptr,diff2):input_type=="object"&&output_type=="object"?diffObjects(input,output,ptr,diff2):[{op:"replace",path:ptr.toString(),value:output}]}exports.diffAny=diffAny}});var require_patch=__commonJS({"../../node_modules/rfc6902/patch.js"(exports){"use strict";var __extends=exports&&exports.__extends||function(){var extendStatics=function(d,b2){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d2,b3){d2.__proto__=b3}||function(d2,b3){for(var p in b3)Object.prototype.hasOwnProperty.call(b3,p)&&(d2[p]=b3[p])},extendStatics(d,b2)};return function(d,b2){if(typeof b2!="function"&&b2!==null)throw new TypeError("Class extends value "+String(b2)+" is not a constructor or null");extendStatics(d,b2);function __(){this.constructor=d}d.prototype=b2===null?Object.create(b2):(__.prototype=b2.prototype,new __)}}();Object.defineProperty(exports,"__esModule",{value:!0});exports.apply=exports.InvalidOperationError=exports.test=exports.copy=exports.move=exports.replace=exports.remove=exports.add=exports.TestError=exports.MissingError=void 0;var pointer_1=require_pointer(),util_1=require_util(),diff_1=require_diff(),MissingError=function(_super){__extends(MissingError2,_super);function MissingError2(path){var _this=_super.call(this,"Value required at path: ".concat(path))||this;return _this.path=path,_this.name="MissingError",_this}return MissingError2}(Error);exports.MissingError=MissingError;var TestError=function(_super){__extends(TestError2,_super);function TestError2(actual,expected){var _this=_super.call(this,"Test failed: ".concat(actual," != ").concat(expected))||this;return _this.actual=actual,_this.expected=expected,_this.name="TestError",_this}return TestError2}(Error);exports.TestError=TestError;function _add(object,key,value){if(Array.isArray(object))if(key=="-")object.push(value);else{var index=parseInt(key,10);object.splice(index,0,value)}else object[key]=value}function _remove(object,key){if(Array.isArray(object)){var index=parseInt(key,10);object.splice(index,1)}else delete object[key]}function add(object,operation){var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);return endpoint.parent===void 0?new MissingError(operation.path):(_add(endpoint.parent,endpoint.key,(0,util_1.clone)(operation.value)),null)}exports.add=add;function remove(object,operation){var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);return endpoint.value===void 0?new MissingError(operation.path):(_remove(endpoint.parent,endpoint.key),null)}exports.remove=remove;function replace(object,operation){var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);if(endpoint.parent===null)return new MissingError(operation.path);if(Array.isArray(endpoint.parent)){if(parseInt(endpoint.key,10)>=endpoint.parent.length)return new MissingError(operation.path)}else if(endpoint.value===void 0)return new MissingError(operation.path);return endpoint.parent[endpoint.key]=(0,util_1.clone)(operation.value),null}exports.replace=replace;function move(object,operation){var from_endpoint=pointer_1.Pointer.fromJSON(operation.from).evaluate(object);if(from_endpoint.value===void 0)return new MissingError(operation.from);var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);return endpoint.parent===void 0?new MissingError(operation.path):(_remove(from_endpoint.parent,from_endpoint.key),_add(endpoint.parent,endpoint.key,from_endpoint.value),null)}exports.move=move;function copy(object,operation){var from_endpoint=pointer_1.Pointer.fromJSON(operation.from).evaluate(object);if(from_endpoint.value===void 0)return new MissingError(operation.from);var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);return endpoint.parent===void 0?new MissingError(operation.path):(_add(endpoint.parent,endpoint.key,(0,util_1.clone)(from_endpoint.value)),null)}exports.copy=copy;function test(object,operation){var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);return(0,diff_1.diffAny)(endpoint.value,operation.value,new pointer_1.Pointer).length?new TestError(endpoint.value,operation.value):null}exports.test=test;var InvalidOperationError=function(_super){__extends(InvalidOperationError2,_super);function InvalidOperationError2(operation){var _this=_super.call(this,"Invalid operation: ".concat(operation.op))||this;return _this.operation=operation,_this.name="InvalidOperationError",_this}return InvalidOperationError2}(Error);exports.InvalidOperationError=InvalidOperationError;function apply(object,operation){switch(operation.op){case"add":return add(object,operation);case"remove":return remove(object,operation);case"replace":return replace(object,operation);case"move":return move(object,operation);case"copy":return copy(object,operation);case"test":return test(object,operation)}return new InvalidOperationError(operation)}exports.apply=apply}});var require_rfc6902=__commonJS({"../../node_modules/rfc6902/index.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.createTests=exports.createPatch=exports.applyPatch=exports.Pointer=void 0;var pointer_1=require_pointer();Object.defineProperty(exports,"Pointer",{enumerable:!0,get:function(){return pointer_1.Pointer}});var patch_1=require_patch(),diff_1=require_diff();function applyPatch(object,patch){return patch.map(function(operation){return(0,patch_1.apply)(object,operation)})}exports.applyPatch=applyPatch;function wrapVoidableDiff(diff2){function wrappedDiff(input,output,ptr){var custom_patch=diff2(input,output,ptr);return Array.isArray(custom_patch)?custom_patch:(0,diff_1.diffAny)(input,output,ptr,wrappedDiff)}return wrappedDiff}function createPatch2(input,output,diff2){var ptr=new pointer_1.Pointer;return(diff2?wrapVoidableDiff(diff2):diff_1.diffAny)(input,output,ptr)}exports.createPatch=createPatch2;function createTest(input,path){var endpoint=pointer_1.Pointer.fromJSON(path).evaluate(input);if(endpoint!==void 0)return{op:"test",path,value:endpoint.value}}function createTests(input,patch){var tests=new Array;return patch.filter(diff_1.isDestructive).forEach(function(operation){var pathTest=createTest(input,operation.path);if(pathTest&&tests.push(pathTest),"from"in operation){var fromTest=createTest(input,operation.from);fromTest&&tests.push(fromTest)}}),tests}exports.createTests=createTests}});import{useEffect as M,useMemo as K,useState as b}from"react";import{createContext as O,useContext as P}from"react";import{jsx as L}from"react/jsx-runtime";import{useMemo as N}from"react";import{useEffect as w,useRef as B}from"react";import{deepEquals as k,isReference as v,isResource as F,normalizeOperationOutcome as z}from"@medplum/core";import{useCallback as Q,useEffect as E,useState as U}from"react";import{allOk as A,normalizeOperationOutcome as _}from"@medplum/core";import{useEffect as D,useState as f}from"react";import{useCallback as J,useEffect as y,useRef as m,useState as X}from"react";var R=O(void 0);function x(){return P(R)}function a(){return x().medplum}function V(){return x().navigate}function W(){return x().profile}function ee(e){let t=e.medplum,n=e.navigate??I,[o,u]=b({profile:t.getProfile(),loading:!t.isInitialized});M(()=>{t&&(t.isInitialized||(u(r2=>({...r2,loading:!0})),t.getInitPromise().then(()=>u(r2=>({...r2,loading:!1}))).catch(console.error)))},[t,t.isInitialized]),M(()=>{function r2(){u({...o,profile:t.getProfile()})}return t.addEventListener("change",r2),()=>t.removeEventListener("change",r2)},[t,o]);let i=K(()=>({...o,medplum:t,navigate:n}),[o,t,n]);return L(R.Provider,{value:i,children:e.children})}function I(e){window.location.assign(e)}var C=new Map,oe=e=>N(()=>{if(!e)return;let t=e.split("?")[0];if(!t)return e;let n;try{n=new URLSearchParams(new URL(e).search)}catch{return e}if(!n.has("Key-Pair-Id")||!n.has("Signature"))return e;let o=n.get("Expires");if(!o||o.length>13)return e;let u=C.get(t);if(u){let r2=new URLSearchParams(new URL(u).search).get("Expires");if(r2&&parseInt(r2,10)*1e3-5e3>Date.now())return u}return C.set(t,e),e},[e]);function se(e){let t=B();return w(()=>{t.current=e}),t.current}function pe(e,t){let n=a(),[o,u]=U(S(n,e)),i=Q(r2=>{k(r2,o)||u(r2)},[o,u]);return E(()=>{i(S(n,e))},[n,e,i]),E(()=>{let r2=!0;return v(e)&&n.readReference(e).then(s=>{r2&&i(s)}).catch(s=>{r2&&(i(void 0),t&&t(z(s)))}),()=>r2=!1},[n,o,e,i,t]),o}function S(e,t){if(t){if(F(t))return t;if(v(t))return e.getCachedReference(t)}}function Me(e,t){return g("search",e,t)}function Ce(e,t){return g("searchOne",e,t)}function Ee(e,t){return g("searchResources",e,t)}function g(e,t,n){let o=a(),[u,i]=f(),[r2,s]=f(!1),[d,c]=f(),[p,h]=f();return D(()=>{let T=o.fhirSearchUrl(t,n).toString();T!==u&&(i(T),o[e](t,n).then(l=>{s(!1),c(l),h(A)}).catch(l=>{s(!1),c(void 0),h(_(l))}))},[o,e,t,n,u]),[d,r2,p]}var G=3e3;function Oe(e,t){let n=a(),[o,u]=X(),i=m(!1),r2=m(),s=m(),d=m();d.current=t,y(()=>(r2.current&&(clearTimeout(r2.current),r2.current=void 0),s.current!==e&&u(n.subscribeToCriteria(e)),s.current=e,()=>{r2.current=setTimeout(()=>{u(void 0),n.unsubscribeFromCriteria(e)},G)}),[n,e]);let c=J(p=>{d.current?.(p.payload)},[]);y(()=>o?(i.current||(o.addEventListener("message",c),i.current=!0),()=>{i.current=!1,o.removeEventListener("message",c)}):()=>{},[o,c])}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)}):null}import{Group,NativeSelect,TextInput}from"@mantine/core";import{useRef,useState}from"react";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}}function AddressInput(props){let[value,setValue]=useState(props.defaultValue||{}),valueRef=useRef();valueRef.current=value;function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}function setUse(use){setValueWrapper({...valueRef.current,use})}function setType(type){setValueWrapper({...valueRef.current,type})}function setLine1(line1){setValueWrapper(setLine(valueRef.current||{},0,line1))}function setLine2(line2){setValueWrapper(setLine(valueRef.current||{},1,line2))}function setCity(city){setValueWrapper({...valueRef.current,city})}function setState(state){setValueWrapper({...valueRef.current,state})}function setPostalCode(postalCode){setValueWrapper({...valueRef.current,postalCode})}return jsxs(Group,{gap:"xs",wrap:"nowrap",grow:!0,children:[jsx2(NativeSelect,{"data-testid":"address-use",defaultValue:value.use,onChange:e=>setUse(e.currentTarget.value),data:["","home","work","temp","old","billing"]}),jsx2(NativeSelect,{"data-testid":"address-type",defaultValue:value.type,onChange:e=>setType(e.currentTarget.value),data:["","postal","physical","both"]}),jsx2(TextInput,{placeholder:"Line 1",defaultValue:getLine(value,0),onChange:e=>setLine1(e.currentTarget.value)}),jsx2(TextInput,{placeholder:"Line 2",defaultValue:getLine(value,1),onChange:e=>setLine2(e.currentTarget.value)}),jsx2(TextInput,{placeholder:"City",defaultValue:value.city,onChange:e=>setCity(e.currentTarget.value)}),jsx2(TextInput,{placeholder:"State",defaultValue:value.state,onChange:e=>setState(e.currentTarget.value)}),jsx2(TextInput,{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{useState as useState2}from"react";import{jsx as jsx3}from"react/jsx-runtime";function AnnotationInput(props){let author=W(),[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,{name:props.name,placeholder:"Annotation text",defaultValue:value.text,onChange:e=>setText(e.currentTarget.value)})}import{AppShell as MantineAppShell3}from"@mantine/core";import{showNotification as showNotification3}from"@mantine/notifications";import{Suspense,useEffect as useEffect2,useState as useState8}from"react";import{Alert}from"@mantine/core";import{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,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},[...iconNode.map(([tag,attrs])=>createElement(tag,attrs)),...Array.isArray(children)?children:[children]]));return Component2.displayName=`${iconNamePascal}`,Component2};var IconAdjustmentsHorizontal=createReactComponent("outline","adjustments-horizontal","IconAdjustmentsHorizontal",[["path",{d:"M14 6m-2 0a2 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:"M8 12m-2 0a2 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:"M17 18m-2 0a2 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"}]]);var IconAlertCircle=createReactComponent("outline","alert-circle","IconAlertCircle",[["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"}]]);var IconArrowDown=createReactComponent("outline","arrow-down","IconArrowDown",[["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"}]]);var IconArrowRight=createReactComponent("outline","arrow-right","IconArrowRight",[["path",{d:"M5 12l14 0",key:"svg-0"}],["path",{d:"M13 18l6 -6",key:"svg-1"}],["path",{d:"M13 6l6 6",key:"svg-2"}]]);var IconArrowUp=createReactComponent("outline","arrow-up","IconArrowUp",[["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"}]]);var IconBleachOff=createReactComponent("outline","bleach-off","IconBleachOff",[["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"}]]);var IconBleach=createReactComponent("outline","bleach","IconBleach",[["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"}]]);var IconBoxMultiple=createReactComponent("outline","box-multiple","IconBoxMultiple",[["path",{d:"M7 3m0 2a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2z",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"}]]);var IconBracketsContain=createReactComponent("outline","brackets-contain","IconBracketsContain",[["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"}]]);var IconBucketOff=createReactComponent("outline","bucket-off","IconBucketOff",[["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"}]]);var IconBucket=createReactComponent("outline","bucket","IconBucket",[["path",{d:"M12 7m-8 0a8 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"}]]);var IconCalendar=createReactComponent("outline","calendar","IconCalendar",[["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-12z",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"}]]);var IconCheck=createReactComponent("outline","check","IconCheck",[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]]);var IconCheckbox=createReactComponent("outline","checkbox","IconCheckbox",[["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"}]]);var IconChevronDown=createReactComponent("outline","chevron-down","IconChevronDown",[["path",{d:"M6 9l6 6l6 -6",key:"svg-0"}]]);var IconCircleMinus=createReactComponent("outline","circle-minus","IconCircleMinus",[["path",{d:"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M9 12l6 0",key:"svg-1"}]]);var IconCirclePlus=createReactComponent("outline","circle-plus","IconCirclePlus",[["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"}]]);var IconCloudUpload=createReactComponent("outline","cloud-upload","IconCloudUpload",[["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"}]]);var IconColumns=createReactComponent("outline","columns","IconColumns",[["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"}]]);var IconCopy=createReactComponent("outline","copy","IconCopy",[["path",{d:"M7 7m0 2.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.667z",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"}]]);var IconCurrencyDollar=createReactComponent("outline","currency-dollar","IconCurrencyDollar",[["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"}]]);var IconDots=createReactComponent("outline","dots","IconDots",[["path",{d:"M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}]]);var IconEdit=createReactComponent("outline","edit","IconEdit",[["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.415z",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]]);var IconEqualNot=createReactComponent("outline","equal-not","IconEqualNot",[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}],["path",{d:"M5 19l14 -14",key:"svg-2"}]]);var IconEqual=createReactComponent("outline","equal","IconEqual",[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}]]);var IconFileAlert=createReactComponent("outline","file-alert","IconFileAlert",[["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 2z",key:"svg-1"}],["path",{d:"M12 17l.01 0",key:"svg-2"}],["path",{d:"M12 11l0 3",key:"svg-3"}]]);var IconFilePlus=createReactComponent("outline","file-plus","IconFilePlus",[["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 2z",key:"svg-1"}],["path",{d:"M12 11l0 6",key:"svg-2"}],["path",{d:"M9 14l6 0",key:"svg-3"}]]);var IconFilter=createReactComponent("outline","filter","IconFilter",[["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.227z",key:"svg-0"}]]);var IconGenderFemale=createReactComponent("outline","gender-female","IconGenderFemale",[["path",{d:"M12 9m-5 0a5 5 0 1 0 10 0a5 5 0 1 0 -10 0",key:"svg-0"}],["path",{d:"M12 14v7",key:"svg-1"}],["path",{d:"M9 18h6",key:"svg-2"}]]);var IconListDetails=createReactComponent("outline","list-details","IconListDetails",[["path",{d:"M13 5h8",key:"svg-0"}],["path",{d:"M13 9h5",key:"svg-1"}],["path",{d:"M13 15h8",key:"svg-2"}],["path",{d:"M13 19h5",key:"svg-3"}],["path",{d:"M3 4m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z",key:"svg-4"}],["path",{d:"M3 14m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z",key:"svg-5"}]]);var IconLogout=createReactComponent("outline","logout","IconLogout",[["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"}]]);var IconMathGreater=createReactComponent("outline","math-greater","IconMathGreater",[["path",{d:"M5 18l14 -6l-14 -6",key:"svg-0"}]]);var IconMathLower=createReactComponent("outline","math-lower","IconMathLower",[["path",{d:"M19 18l-14 -6l14 -6",key:"svg-0"}]]);var IconMessage=createReactComponent("outline","message","IconMessage",[["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 -3h12z",key:"svg-2"}]]);var IconPin=createReactComponent("outline","pin","IconPin",[["path",{d:"M15 4.5l-4 4l-4 1.5l-1.5 1.5l7 7l1.5 -1.5l1.5 -4l4 -4",key:"svg-0"}],["path",{d:"M9 15l-4.5 4.5",key:"svg-1"}],["path",{d:"M14.5 4l5.5 5.5",key:"svg-2"}]]);var IconPinnedOff=createReactComponent("outline","pinned-off","IconPinnedOff",[["path",{d:"M3 3l18 18",key:"svg-0"}],["path",{d:"M15 4.5l-3.249 3.249m-2.57 1.433l-2.181 .818l-1.5 1.5l7 7l1.5 -1.5l.82 -2.186m1.43 -2.563l3.25 -3.251",key:"svg-1"}],["path",{d:"M9 15l-4.5 4.5",key:"svg-2"}],["path",{d:"M14.5 4l5.5 5.5",key:"svg-3"}]]);var IconPlus=createReactComponent("outline","plus","IconPlus",[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]]);var IconRefresh=createReactComponent("outline","refresh","IconRefresh",[["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"}]]);var IconSearch=createReactComponent("outline","search","IconSearch",[["path",{d:"M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]]);var IconSettings=createReactComponent("outline","settings","IconSettings",[["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.065z",key:"svg-0"}],["path",{d:"M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-1"}]]);var IconSortAscending=createReactComponent("outline","sort-ascending","IconSortAscending",[["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"}]]);var IconSortDescending=createReactComponent("outline","sort-descending","IconSortDescending",[["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"}]]);var IconSquare=createReactComponent("outline","square","IconSquare",[["path",{d:"M3 3m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z",key:"svg-0"}]]);var IconStethoscope=createReactComponent("outline","stethoscope","IconStethoscope",[["path",{d:"M6 4h-1a2 2 0 0 0 -2 2v3.5h0a5.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:"M20 10m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-4"}]]);var IconSwitchHorizontal=createReactComponent("outline","switch-horizontal","IconSwitchHorizontal",[["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"}]]);var IconTableExport=createReactComponent("outline","table-export","IconTableExport",[["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"}]]);var IconTrash=createReactComponent("outline","trash","IconTrash",[["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"}]]);var IconUserSquare=createReactComponent("outline","user-square","IconUserSquare",[["path",{d:"M9 10a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-0"}],["path",{d:"M6 21v-1a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v1",key:"svg-1"}],["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-14z",key:"svg-2"}]]);var IconX=createReactComponent("outline","x","IconX",[["path",{d:"M18 6l-12 12",key:"svg-0"}],["path",{d:"M6 6l12 12",key:"svg-1"}]]);import{Component}from"react";import{jsx as jsx4}from"react/jsx-runtime";var ErrorBoundary=class extends Component{constructor(props){super(props),this.state={lastLocation:window.location.toString()}}static getDerivedStateFromError(error){return{error,lastLocation:window.location.toString()}}componentDidUpdate(_prevProps,_prevState){window.location.toString()!==this.state.lastLocation&&this.setState({lastLocation:window.location.toString(),error:void 0})}shouldComponentUpdate(nextProps,nextState){return!!(this.props.children!==nextProps.children||nextState.error&&!this.state.error||this.state.lastLocation!==window.location.toString())}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,{})})}var AppShell_default={main:"AppShell_main"};import{Group as Group5,AppShell as MantineAppShell,Menu as Menu2,Text as Text3,UnstyledButton}from"@mantine/core";import{formatHumanName as formatHumanName3}from"@medplum/core";function r(e){var t,f2,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]&&(f2=r(e[t]))&&(n&&(n+=" "),n+=f2)}else for(f2 in e)e[f2]&&(n&&(n+=" "),n+=f2);return n}function clsx(){for(var e,t,f2=0,n="",o=arguments.length;f2<o;f2++)(e=arguments[f2])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}var clsx_default=clsx;import{useState as useState4}from"react";import{Avatar}from"@mantine/core";import{getDisplayString,getImageSrc}from"@medplum/core";import{Anchor}from"@mantine/core";import{isReference,isResource}from"@medplum/core";function killEvent(e){e.preventDefault(),e.stopPropagation()}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"}import{jsx as jsx6}from"react/jsx-runtime";function MedplumLink(props){let navigate=V(),{to,suffix,label,onClick,children,...rest}=props,href=getHref(to);return suffix&&(href+="/"+suffix),jsx6(Anchor,{href,"aria-label":label,onClick:e=>{killEvent(e),onClick?onClick(e):to&&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[words.length-1][0]:words.length===1?words[0][0]:""}import{jsx as jsx7}from"react/jsx-runtime";function ResourceAvatar(props){let resource=pe(props.value),text=resource?getDisplayString(resource):props.alt??"",initials=getInitials(text),uncachedImageUrl=(resource&&getImageSrc(resource))??props.src,imageUrl=oe(uncachedImageUrl??void 0),radius=props.radius??"xl",avatarProps={...props};return delete avatarProps.value,delete avatarProps.link,props.link?jsx7(MedplumLink,{to:resource,children:jsx7(Avatar,{src:imageUrl,alt:text,radius,...avatarProps,children:initials})}):jsx7(Avatar,{src:imageUrl,alt:text,radius,...avatarProps,children:initials})}var Header_default={logoButton:"Header_logoButton",user:"Header_user",userName:"Header_userName",userActive:"Header_userActive"};import{Avatar as Avatar2,Group as Group2,Menu,SegmentedControl,Stack,Text,useMantineColorScheme}from"@mantine/core";import{getReferenceString}from"@medplum/core";import{formatHumanName}from"@medplum/core";import{Fragment as Fragment2,jsx as jsx8}from"react/jsx-runtime";function HumanNameDisplay(props){let name=props.value;return name?jsx8(Fragment2,{children:formatHumanName(name,props.options)}):null}import{Fragment as Fragment3,jsx as jsx9,jsxs as jsxs2}from"react/jsx-runtime";function HeaderDropdown(props){let context=x(),{medplum,profile,navigate}=context,logins=medplum.getLogins(),{colorScheme,setColorScheme}=useMantineColorScheme();return jsxs2(Fragment3,{children:[jsxs2(Stack,{align:"center",p:"xl",children:[jsx9(ResourceAvatar,{size:"xl",radius:100,value:context.profile}),jsx9(HumanNameDisplay,{value:context.profile?.name?.[0]}),jsx9(Text,{c:"dimmed",size:"xs",children:medplum.getActiveLogin()?.project.display})]}),logins.length>1&&jsx9(Menu.Divider,{}),logins.map(login=>login.profile.reference!==getReferenceString(context.profile)&&jsx9(Menu.Item,{onClick:()=>{medplum.setActiveLogin(login).then(()=>window.location.reload()).catch(console.log)},children:jsxs2(Group2,{children:[jsx9(Avatar2,{radius:"xl"}),jsxs2("div",{style:{flex:1},children:[jsx9(Text,{size:"sm",fw:500,children:login.profile.display}),jsx9(Text,{c:"dimmed",size:"xs",children:login.project.display})]})]})},login.profile.reference)),jsx9(Menu.Divider,{}),jsx9(Group2,{justify:"center",children:jsx9(SegmentedControl,{size:"xs",value:colorScheme,onChange:newValue=>setColorScheme(newValue),data:[{label:"Light",value:"light"},{label:"Dark",value:"dark"},{label:"Auto",value:"auto"}]})}),jsx9(Menu.Divider,{}),jsx9(Menu.Item,{leftSection:jsx9(IconSwitchHorizontal,{size:14,stroke:1.5}),onClick:()=>navigate("/signin"),children:"Add another account"}),jsx9(Menu.Item,{leftSection:jsx9(IconSettings,{size:14,stroke:1.5}),onClick:()=>navigate(`/${getReferenceString(profile)}`),children:"Account settings"}),jsx9(Menu.Item,{leftSection:jsx9(IconLogout,{size:14,stroke:1.5}),onClick:async()=>{await medplum.signOut(),navigate("/signin")},children:"Sign out"}),jsx9(Text,{size:"xs",c:"dimmed",ta:"center",children:props.version})]})}import{formatHumanName as formatHumanName2,getDisplayString as getDisplayString2,getReferenceString as getReferenceString2,isUUID}from"@medplum/core";import{forwardRef as forwardRef2,useCallback as useCallback2}from"react";import{Combobox,Group as Group3,Loader as Loader2,Pill,PillsInput,useCombobox}from"@mantine/core";import{showNotification}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString2}from"@medplum/core";import{useCallback,useEffect,useRef as useRef2,useState as useState3}from"react";import{jsx as jsx10,jsxs as jsxs3}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,onChange,onCreate,creatable,clearable,required,placeholder,leftSection,maxValues,...rest}=props,defaultItems=toDefaultItems(defaultValue2),[search,setSearch]=useState3(""),[timer,setTimer]=useState3(),[abortController,setAbortController]=useState3(),[autoSubmit,setAutoSubmit]=useState3(),[selected,setSelected]=useState3(defaultItems.map(toOption4)),[options,setOptions]=useState3([]),ItemComponent4=itemComponent??DefaultItemComponent,searchRef=useRef2();searchRef.current=search;let lastLoadOptionsRef=useRef2(),lastValueRef=useRef2(),timerRef=useRef2();timerRef.current=timer;let abortControllerRef=useRef2();abortControllerRef.current=abortController;let autoSubmitRef=useRef2();autoSubmitRef.current=autoSubmit;let optionsRef=useRef2();optionsRef.current=options;let handleTimer=useCallback(()=>{if(setTimer(void 0),searchRef.current===lastValueRef.current&&loadOptions===lastLoadOptionsRef.current)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)),setAbortController(void 0),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)})})},[combobox,loadOptions,onChange,toOption4]),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 result=[],newSelected=[...selected],option=options?.find(option2=>option2.value===newValue),item=option?.resource;if(!item&&creatable!==!1&&onCreate&&(item=onCreate(newValue),option=toOption4(item)),item&&result.push(item),option&&newSelected.push(option),maxValues!==void 0)for(;newSelected.length>maxValues;)newSelected.shift();onChange(result),setSelected(newSelected)},[creatable,options,selected,maxValues,onChange,onCreate,toOption4]),handleValueSelect=val=>{setSearch(""),setOptions([]),combobox.closeDropdown(),lastValueRef.current=void 0,addSelected(val==="$create"?search:val)},handleValueRemove=useCallback(item=>{let newSelected=selected.filter(v2=>v2.value!==item.value);onChange(newSelected.map(v2=>v2.resource)),setSelected(newSelected)},[selected,onChange]),handleKeyDown=useCallback(e=>{e.key==="Enter"?!timer&&!abortController?(killEvent(e),options&&options.length>0&&(setOptions(options.slice(0,1)),addSelected(options[0].value))):setAutoSubmit(!0):e.key==="Backspace"&&search.length===0&&(killEvent(e),handleValueRemove(selected[selected.length-1]))},[search,selected,options,timer,abortController,addSelected,handleValueRemove]);useEffect(()=>()=>{abortControllerRef.current&&abortControllerRef.current.abort()},[]);let clearButton=clearable&&selected.length>0&&jsx10(Combobox.ClearButton,{title:"Clear all",size:16,onClear:()=>{setSearch(""),setSelected([]),onChange([]),combobox.closeDropdown()}});return jsxs3(Combobox,{store:combobox,onOptionSubmit:handleValueSelect,withinPortal:!0,shadow:"xl",...rest,children:[jsx10(Combobox.DropdownTarget,{children:jsx10(PillsInput,{label,description,error,className:props.className,leftSection,rightSection:abortController?jsx10(Loader2,{size:16}):clearButton,required,children:jsxs3(Pill.Group,{children:[selected.map(item=>jsx10(Pill,{withRemoveButton:!0,onRemove:()=>handleValueRemove(item),children:item.label},item.value)),(maxValues===void 0||maxValues===0||selected.length<maxValues)&&jsx10(Combobox.EventsTarget,{children:jsx10(PillsInput.Field,{role:"searchbox",name,value:search,placeholder,onFocus:handleSearchChange,onBlur:()=>combobox.closeDropdown(),onKeyDown:handleKeyDown,onChange:handleSearchChange})})]})})}),jsx10(Combobox.Dropdown,{children:jsxs3(Combobox.Options,{children:[options.map(item=>jsx10(Combobox.Option,{value:item.value,active:selected.includes(item),children:jsx10(ItemComponent4,{...item})},item.value)),creatable&&search.trim().length>0&&jsxs3(Combobox.Option,{value:"$create",children:["+ Create ",search]}),!creatable&&search.trim().length>0&&options.length===0&&jsx10(Combobox.Empty,{children:"Nothing found"})]})})]})}function toDefaultItems(defaultValue2){return defaultValue2?Array.isArray(defaultValue2)?defaultValue2:[defaultValue2]:[]}function DefaultItemComponent(props){return jsx10(Group3,{gap:"sm",children:jsx10("span",{children:props.label})})}var HeaderSearchInput_default={searchInput:"HeaderSearchInput_searchInput"};import{Group as Group4,Text as Text2}from"@mantine/core";import{jsx as jsx11,jsxs as jsxs4}from"react/jsx-runtime";function toOption(resource){return{value:resource.id,label:getDisplayString2(resource),resource}}function HeaderSearchInput(props){let navigate=V(),medplum=a(),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 jsx11(AsyncAutocomplete,{size:"sm",radius:"md",className:HeaderSearchInput_default.searchInput,leftSection:jsx11(IconSearch,{size:16}),placeholder:"Search",itemComponent:ItemComponent,toOption,onChange:handleSelect,loadOptions:loadData,maxValues:0,clearable:!1},`${props.pathname}?${props.searchParams}`)}var ItemComponent=forwardRef2(({resource,...others},ref)=>{let helpText;return resource.resourceType==="Patient"?helpText=resource.birthDate:resource.resourceType==="ServiceRequest"&&(helpText=resource.subject?.display),jsx11("div",{ref,...others,children:jsxs4(Group4,{wrap:"nowrap",children:[jsx11(ResourceAvatar,{value:resource}),jsxs4("div",{children:[jsx11(Text2,{children:getDisplayString2(resource)}),jsx11(Text2,{size:"xs",c:"dimmed",children:helpText})]})]})})});function buildGraphQLQuery(input){let escaped=JSON.stringify(input);return isUUID(input)?`{
1
+ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __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};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));var require_pointer=__commonJS({"../../node_modules/rfc6902/pointer.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.Pointer=void 0;function unescape(token){return token.replace(/~1/g,"/").replace(/~0/g,"~")}function escape(token){return token.replace(/~/g,"~0").replace(/\//g,"~1")}var Pointer=function(){function Pointer2(tokens){tokens===void 0&&(tokens=[""]),this.tokens=tokens}return Pointer2.fromJSON=function(path){var tokens=path.split("/").map(unescape);if(tokens[0]!=="")throw new Error("Invalid JSON Pointer: ".concat(path));return new Pointer2(tokens)},Pointer2.prototype.toString=function(){return this.tokens.map(escape).join("/")},Pointer2.prototype.evaluate=function(object){for(var parent=null,key="",value=object,i=1,l=this.tokens.length;i<l;i++)parent=value,key=this.tokens[i],!(key=="__proto__"||key=="constructor"||key=="prototype")&&(value=(parent||{})[key]);return{parent,key,value}},Pointer2.prototype.get=function(object){return this.evaluate(object).value},Pointer2.prototype.set=function(object,value){var endpoint=this.evaluate(object);endpoint.parent&&(endpoint.parent[endpoint.key]=value)},Pointer2.prototype.push=function(token){this.tokens.push(token)},Pointer2.prototype.add=function(token){var tokens=this.tokens.concat(String(token));return new Pointer2(tokens)},Pointer2}();exports.Pointer=Pointer}});var require_util=__commonJS({"../../node_modules/rfc6902/util.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.clone=exports.objectType=exports.hasOwnProperty=void 0;exports.hasOwnProperty=Object.prototype.hasOwnProperty;function objectType(object){return object===void 0?"undefined":object===null?"null":Array.isArray(object)?"array":typeof object}exports.objectType=objectType;function isNonPrimitive(value){return value!=null&&typeof value=="object"}function clone(source){if(!isNonPrimitive(source))return source;if(source.constructor==Array){for(var length_1=source.length,arrayTarget=new Array(length_1),i=0;i<length_1;i++)arrayTarget[i]=clone(source[i]);return arrayTarget}if(source.constructor==Date){var dateTarget=new Date(+source);return dateTarget}var objectTarget={};for(var key in source)exports.hasOwnProperty.call(source,key)&&(objectTarget[key]=clone(source[key]));return objectTarget}exports.clone=clone}});var require_diff=__commonJS({"../../node_modules/rfc6902/diff.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.diffAny=exports.diffObjects=exports.diffArrays=exports.intersection=exports.subtract=exports.isDestructive=void 0;var util_1=require_util();function isDestructive(_a){var op=_a.op;return op==="remove"||op==="replace"||op==="copy"||op==="move"}exports.isDestructive=isDestructive;function subtract(minuend,subtrahend){var obj={};for(var add_key in minuend)util_1.hasOwnProperty.call(minuend,add_key)&&minuend[add_key]!==void 0&&(obj[add_key]=1);for(var del_key in subtrahend)util_1.hasOwnProperty.call(subtrahend,del_key)&&subtrahend[del_key]!==void 0&&delete obj[del_key];return Object.keys(obj)}exports.subtract=subtract;function intersection(objects){for(var length=objects.length,counter={},i=0;i<length;i++){var object=objects[i];for(var key in object)util_1.hasOwnProperty.call(object,key)&&object[key]!==void 0&&(counter[key]=(counter[key]||0)+1)}for(var key in counter)counter[key]<length&&delete counter[key];return Object.keys(counter)}exports.intersection=intersection;function isArrayAdd(array_operation){return array_operation.op==="add"}function isArrayRemove(array_operation){return array_operation.op==="remove"}function appendArrayOperation(base,operation){return{operations:base.operations.concat(operation),cost:base.cost+1}}function diffArrays(input,output,ptr,diff2){diff2===void 0&&(diff2=diffAny);var memo3={"0,0":{operations:[],cost:0}};function dist(i,j){var memo_key="".concat(i,",").concat(j),memoized=memo3[memo_key];if(memoized===void 0){if(i>0&&j>0&&!diff2(input[i-1],output[j-1],ptr.add(String(i-1))).length)memoized=dist(i-1,j-1);else{var alternatives=[];if(i>0){var remove_base=dist(i-1,j),remove_operation={op:"remove",index:i-1};alternatives.push(appendArrayOperation(remove_base,remove_operation))}if(j>0){var add_base=dist(i,j-1),add_operation={op:"add",index:i-1,value:output[j-1]};alternatives.push(appendArrayOperation(add_base,add_operation))}if(i>0&&j>0){var replace_base=dist(i-1,j-1),replace_operation={op:"replace",index:i-1,original:input[i-1],value:output[j-1]};alternatives.push(appendArrayOperation(replace_base,replace_operation))}var best=alternatives.sort(function(a2,b2){return a2.cost-b2.cost})[0];memoized=best}memo3[memo_key]=memoized}return memoized}var input_length=isNaN(input.length)||input.length<=0?0:input.length,output_length=isNaN(output.length)||output.length<=0?0:output.length,array_operations=dist(input_length,output_length).operations,padded_operations=array_operations.reduce(function(_a,array_operation){var operations=_a[0],padding=_a[1];if(isArrayAdd(array_operation)){var padded_index=array_operation.index+1+padding,index_token=padded_index<input_length+padding?String(padded_index):"-",operation={op:array_operation.op,path:ptr.add(index_token).toString(),value:array_operation.value};return[operations.concat(operation),padding+1]}else if(isArrayRemove(array_operation)){var operation={op:array_operation.op,path:ptr.add(String(array_operation.index+padding)).toString()};return[operations.concat(operation),padding-1]}else{var replace_ptr=ptr.add(String(array_operation.index+padding)),replace_operations=diff2(array_operation.original,array_operation.value,replace_ptr);return[operations.concat.apply(operations,replace_operations),padding]}},[[],0])[0];return padded_operations}exports.diffArrays=diffArrays;function diffObjects(input,output,ptr,diff2){diff2===void 0&&(diff2=diffAny);var operations=[];return subtract(input,output).forEach(function(key){operations.push({op:"remove",path:ptr.add(key).toString()})}),subtract(output,input).forEach(function(key){operations.push({op:"add",path:ptr.add(key).toString(),value:output[key]})}),intersection([input,output]).forEach(function(key){operations.push.apply(operations,diff2(input[key],output[key],ptr.add(key)))}),operations}exports.diffObjects=diffObjects;function diffAny(input,output,ptr,diff2){if(diff2===void 0&&(diff2=diffAny),input===output)return[];var input_type=(0,util_1.objectType)(input),output_type=(0,util_1.objectType)(output);return input_type=="array"&&output_type=="array"?diffArrays(input,output,ptr,diff2):input_type=="object"&&output_type=="object"?diffObjects(input,output,ptr,diff2):[{op:"replace",path:ptr.toString(),value:output}]}exports.diffAny=diffAny}});var require_patch=__commonJS({"../../node_modules/rfc6902/patch.js"(exports){"use strict";var __extends=exports&&exports.__extends||function(){var extendStatics=function(d,b2){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d2,b3){d2.__proto__=b3}||function(d2,b3){for(var p in b3)Object.prototype.hasOwnProperty.call(b3,p)&&(d2[p]=b3[p])},extendStatics(d,b2)};return function(d,b2){if(typeof b2!="function"&&b2!==null)throw new TypeError("Class extends value "+String(b2)+" is not a constructor or null");extendStatics(d,b2);function __(){this.constructor=d}d.prototype=b2===null?Object.create(b2):(__.prototype=b2.prototype,new __)}}();Object.defineProperty(exports,"__esModule",{value:!0});exports.apply=exports.InvalidOperationError=exports.test=exports.copy=exports.move=exports.replace=exports.remove=exports.add=exports.TestError=exports.MissingError=void 0;var pointer_1=require_pointer(),util_1=require_util(),diff_1=require_diff(),MissingError=function(_super){__extends(MissingError2,_super);function MissingError2(path){var _this=_super.call(this,"Value required at path: ".concat(path))||this;return _this.path=path,_this.name="MissingError",_this}return MissingError2}(Error);exports.MissingError=MissingError;var TestError=function(_super){__extends(TestError2,_super);function TestError2(actual,expected){var _this=_super.call(this,"Test failed: ".concat(actual," != ").concat(expected))||this;return _this.actual=actual,_this.expected=expected,_this.name="TestError",_this}return TestError2}(Error);exports.TestError=TestError;function _add(object,key,value){if(Array.isArray(object))if(key=="-")object.push(value);else{var index=parseInt(key,10);object.splice(index,0,value)}else object[key]=value}function _remove(object,key){if(Array.isArray(object)){var index=parseInt(key,10);object.splice(index,1)}else delete object[key]}function add(object,operation){var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);return endpoint.parent===void 0?new MissingError(operation.path):(_add(endpoint.parent,endpoint.key,(0,util_1.clone)(operation.value)),null)}exports.add=add;function remove(object,operation){var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);return endpoint.value===void 0?new MissingError(operation.path):(_remove(endpoint.parent,endpoint.key),null)}exports.remove=remove;function replace(object,operation){var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);if(endpoint.parent===null)return new MissingError(operation.path);if(Array.isArray(endpoint.parent)){if(parseInt(endpoint.key,10)>=endpoint.parent.length)return new MissingError(operation.path)}else if(endpoint.value===void 0)return new MissingError(operation.path);return endpoint.parent[endpoint.key]=(0,util_1.clone)(operation.value),null}exports.replace=replace;function move(object,operation){var from_endpoint=pointer_1.Pointer.fromJSON(operation.from).evaluate(object);if(from_endpoint.value===void 0)return new MissingError(operation.from);var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);return endpoint.parent===void 0?new MissingError(operation.path):(_remove(from_endpoint.parent,from_endpoint.key),_add(endpoint.parent,endpoint.key,from_endpoint.value),null)}exports.move=move;function copy(object,operation){var from_endpoint=pointer_1.Pointer.fromJSON(operation.from).evaluate(object);if(from_endpoint.value===void 0)return new MissingError(operation.from);var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);return endpoint.parent===void 0?new MissingError(operation.path):(_add(endpoint.parent,endpoint.key,(0,util_1.clone)(from_endpoint.value)),null)}exports.copy=copy;function test(object,operation){var endpoint=pointer_1.Pointer.fromJSON(operation.path).evaluate(object);return(0,diff_1.diffAny)(endpoint.value,operation.value,new pointer_1.Pointer).length?new TestError(endpoint.value,operation.value):null}exports.test=test;var InvalidOperationError=function(_super){__extends(InvalidOperationError2,_super);function InvalidOperationError2(operation){var _this=_super.call(this,"Invalid operation: ".concat(operation.op))||this;return _this.operation=operation,_this.name="InvalidOperationError",_this}return InvalidOperationError2}(Error);exports.InvalidOperationError=InvalidOperationError;function apply(object,operation){switch(operation.op){case"add":return add(object,operation);case"remove":return remove(object,operation);case"replace":return replace(object,operation);case"move":return move(object,operation);case"copy":return copy(object,operation);case"test":return test(object,operation)}return new InvalidOperationError(operation)}exports.apply=apply}});var require_rfc6902=__commonJS({"../../node_modules/rfc6902/index.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.createTests=exports.createPatch=exports.applyPatch=exports.Pointer=void 0;var pointer_1=require_pointer();Object.defineProperty(exports,"Pointer",{enumerable:!0,get:function(){return pointer_1.Pointer}});var patch_1=require_patch(),diff_1=require_diff();function applyPatch(object,patch){return patch.map(function(operation){return(0,patch_1.apply)(object,operation)})}exports.applyPatch=applyPatch;function wrapVoidableDiff(diff2){function wrappedDiff(input,output,ptr){var custom_patch=diff2(input,output,ptr);return Array.isArray(custom_patch)?custom_patch:(0,diff_1.diffAny)(input,output,ptr,wrappedDiff)}return wrappedDiff}function createPatch2(input,output,diff2){var ptr=new pointer_1.Pointer;return(diff2?wrapVoidableDiff(diff2):diff_1.diffAny)(input,output,ptr)}exports.createPatch=createPatch2;function createTest(input,path){var endpoint=pointer_1.Pointer.fromJSON(path).evaluate(input);if(endpoint!==void 0)return{op:"test",path,value:endpoint.value}}function createTests(input,patch){var tests=new Array;return patch.filter(diff_1.isDestructive).forEach(function(operation){var pathTest=createTest(input,operation.path);if(pathTest&&tests.push(pathTest),"from"in operation){var fromTest=createTest(input,operation.from);fromTest&&tests.push(fromTest)}}),tests}exports.createTests=createTests}});import{useEffect as M,useMemo as K,useState as b}from"react";import{createContext as O,useContext as P}from"react";import{jsx as L}from"react/jsx-runtime";import{useMemo as N}from"react";import{useEffect as w,useRef as B}from"react";import{deepEquals as k,isReference as v,isResource as F,normalizeOperationOutcome as z}from"@medplum/core";import{useCallback as Q,useEffect as E,useState as U}from"react";import{allOk as A,normalizeOperationOutcome as _}from"@medplum/core";import{useEffect as D,useState as f}from"react";import{useCallback as J,useEffect as y,useRef as m,useState as X}from"react";var R=O(void 0);function x(){return P(R)}function a(){return x().medplum}function V(){return x().navigate}function W(){return x().profile}function ee(e){let t=e.medplum,n=e.navigate??I,[o,u]=b({profile:t.getProfile(),loading:!t.isInitialized});M(()=>{t&&(t.isInitialized||(u(r2=>({...r2,loading:!0})),t.getInitPromise().then(()=>u(r2=>({...r2,loading:!1}))).catch(console.error)))},[t,t.isInitialized]),M(()=>{function r2(){u({...o,profile:t.getProfile()})}return t.addEventListener("change",r2),()=>t.removeEventListener("change",r2)},[t,o]);let i=K(()=>({...o,medplum:t,navigate:n}),[o,t,n]);return L(R.Provider,{value:i,children:e.children})}function I(e){window.location.assign(e)}var C=new Map,oe=e=>N(()=>{if(!e)return;let t=e.split("?")[0];if(!t)return e;let n;try{n=new URLSearchParams(new URL(e).search)}catch{return e}if(!n.has("Key-Pair-Id")||!n.has("Signature"))return e;let o=n.get("Expires");if(!o||o.length>13)return e;let u=C.get(t);if(u){let r2=new URLSearchParams(new URL(u).search).get("Expires");if(r2&&parseInt(r2,10)*1e3-5e3>Date.now())return u}return C.set(t,e),e},[e]);function se(e){let t=B();return w(()=>{t.current=e}),t.current}function pe(e,t){let n=a(),[o,u]=U(S(n,e)),i=Q(r2=>{k(r2,o)||u(r2)},[o,u]);return E(()=>{i(S(n,e))},[n,e,i]),E(()=>{let r2=!0;return v(e)&&n.readReference(e).then(s=>{r2&&i(s)}).catch(s=>{r2&&(i(void 0),t&&t(z(s)))}),()=>r2=!1},[n,o,e,i,t]),o}function S(e,t){if(t){if(F(t))return t;if(v(t))return e.getCachedReference(t)}}function Me(e,t){return g("search",e,t)}function Ce(e,t){return g("searchOne",e,t)}function Ee(e,t){return g("searchResources",e,t)}function g(e,t,n){let o=a(),[u,i]=f(),[r2,s]=f(!1),[d,c]=f(),[p,h]=f();return D(()=>{let T=o.fhirSearchUrl(t,n).toString();T!==u&&(i(T),o[e](t,n).then(l=>{s(!1),c(l),h(A)}).catch(l=>{s(!1),c(void 0),h(_(l))}))},[o,e,t,n,u]),[d,r2,p]}var G=3e3;function Oe(e,t){let n=a(),[o,u]=X(),i=m(!1),r2=m(),s=m(),d=m();d.current=t,y(()=>(r2.current&&(clearTimeout(r2.current),r2.current=void 0),s.current!==e&&u(n.subscribeToCriteria(e)),s.current=e,()=>{r2.current=setTimeout(()=>{u(void 0),n.unsubscribeFromCriteria(e)},G)}),[n,e]);let c=J(p=>{d.current?.(p.payload)},[]);y(()=>o?(i.current||(o.addEventListener("message",c),i.current=!0),()=>{i.current=!1,o.removeEventListener("message",c)}):()=>{},[o,c])}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)}):null}import{Group,NativeSelect,TextInput}from"@mantine/core";import{useRef,useState}from"react";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}}function AddressInput(props){let[value,setValue]=useState(props.defaultValue||{}),valueRef=useRef();valueRef.current=value;function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}function setUse(use){setValueWrapper({...valueRef.current,use})}function setType(type){setValueWrapper({...valueRef.current,type})}function setLine1(line1){setValueWrapper(setLine(valueRef.current||{},0,line1))}function setLine2(line2){setValueWrapper(setLine(valueRef.current||{},1,line2))}function setCity(city){setValueWrapper({...valueRef.current,city})}function setState(state){setValueWrapper({...valueRef.current,state})}function setPostalCode(postalCode){setValueWrapper({...valueRef.current,postalCode})}return jsxs(Group,{gap:"xs",wrap:"nowrap",grow:!0,children:[jsx2(NativeSelect,{"data-testid":"address-use",defaultValue:value.use,onChange:e=>setUse(e.currentTarget.value),data:["","home","work","temp","old","billing"]}),jsx2(NativeSelect,{"data-testid":"address-type",defaultValue:value.type,onChange:e=>setType(e.currentTarget.value),data:["","postal","physical","both"]}),jsx2(TextInput,{placeholder:"Line 1",defaultValue:getLine(value,0),onChange:e=>setLine1(e.currentTarget.value)}),jsx2(TextInput,{placeholder:"Line 2",defaultValue:getLine(value,1),onChange:e=>setLine2(e.currentTarget.value)}),jsx2(TextInput,{placeholder:"City",defaultValue:value.city,onChange:e=>setCity(e.currentTarget.value)}),jsx2(TextInput,{placeholder:"State",defaultValue:value.state,onChange:e=>setState(e.currentTarget.value)}),jsx2(TextInput,{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{useState as useState2}from"react";import{jsx as jsx3}from"react/jsx-runtime";function AnnotationInput(props){let author=W(),[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,{name:props.name,placeholder:"Annotation text",defaultValue:value.text,onChange:e=>setText(e.currentTarget.value)})}import{AppShell as MantineAppShell3}from"@mantine/core";import{showNotification as showNotification3}from"@mantine/notifications";import{Suspense,useEffect as useEffect2,useState as useState8}from"react";import{Alert}from"@mantine/core";import{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,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},[...iconNode.map(([tag,attrs])=>createElement(tag,attrs)),...Array.isArray(children)?children:[children]]));return Component2.displayName=`${iconNamePascal}`,Component2};var IconAdjustmentsHorizontal=createReactComponent("outline","adjustments-horizontal","IconAdjustmentsHorizontal",[["path",{d:"M14 6m-2 0a2 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:"M8 12m-2 0a2 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:"M17 18m-2 0a2 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"}]]);var IconAlertCircle=createReactComponent("outline","alert-circle","IconAlertCircle",[["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"}]]);var IconArrowDown=createReactComponent("outline","arrow-down","IconArrowDown",[["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"}]]);var IconArrowRight=createReactComponent("outline","arrow-right","IconArrowRight",[["path",{d:"M5 12l14 0",key:"svg-0"}],["path",{d:"M13 18l6 -6",key:"svg-1"}],["path",{d:"M13 6l6 6",key:"svg-2"}]]);var IconArrowUp=createReactComponent("outline","arrow-up","IconArrowUp",[["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"}]]);var IconBleachOff=createReactComponent("outline","bleach-off","IconBleachOff",[["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"}]]);var IconBleach=createReactComponent("outline","bleach","IconBleach",[["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"}]]);var IconBoxMultiple=createReactComponent("outline","box-multiple","IconBoxMultiple",[["path",{d:"M7 3m0 2a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2z",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"}]]);var IconBracketsContain=createReactComponent("outline","brackets-contain","IconBracketsContain",[["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"}]]);var IconBucketOff=createReactComponent("outline","bucket-off","IconBucketOff",[["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"}]]);var IconBucket=createReactComponent("outline","bucket","IconBucket",[["path",{d:"M12 7m-8 0a8 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"}]]);var IconCalendar=createReactComponent("outline","calendar","IconCalendar",[["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-12z",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"}]]);var IconCheck=createReactComponent("outline","check","IconCheck",[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]]);var IconCheckbox=createReactComponent("outline","checkbox","IconCheckbox",[["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"}]]);var IconChevronDown=createReactComponent("outline","chevron-down","IconChevronDown",[["path",{d:"M6 9l6 6l6 -6",key:"svg-0"}]]);var IconChevronUp=createReactComponent("outline","chevron-up","IconChevronUp",[["path",{d:"M6 15l6 -6l6 6",key:"svg-0"}]]);var IconCircleMinus=createReactComponent("outline","circle-minus","IconCircleMinus",[["path",{d:"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M9 12l6 0",key:"svg-1"}]]);var IconCirclePlus=createReactComponent("outline","circle-plus","IconCirclePlus",[["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"}]]);var IconCloudUpload=createReactComponent("outline","cloud-upload","IconCloudUpload",[["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"}]]);var IconColumns=createReactComponent("outline","columns","IconColumns",[["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"}]]);var IconCopy=createReactComponent("outline","copy","IconCopy",[["path",{d:"M7 7m0 2.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.667z",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"}]]);var IconCurrencyDollar=createReactComponent("outline","currency-dollar","IconCurrencyDollar",[["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"}]]);var IconDots=createReactComponent("outline","dots","IconDots",[["path",{d:"M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}]]);var IconEdit=createReactComponent("outline","edit","IconEdit",[["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.415z",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]]);var IconEqualNot=createReactComponent("outline","equal-not","IconEqualNot",[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}],["path",{d:"M5 19l14 -14",key:"svg-2"}]]);var IconEqual=createReactComponent("outline","equal","IconEqual",[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}]]);var IconFileAlert=createReactComponent("outline","file-alert","IconFileAlert",[["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 2z",key:"svg-1"}],["path",{d:"M12 17l.01 0",key:"svg-2"}],["path",{d:"M12 11l0 3",key:"svg-3"}]]);var IconFilePlus=createReactComponent("outline","file-plus","IconFilePlus",[["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 2z",key:"svg-1"}],["path",{d:"M12 11l0 6",key:"svg-2"}],["path",{d:"M9 14l6 0",key:"svg-3"}]]);var IconFilter=createReactComponent("outline","filter","IconFilter",[["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.227z",key:"svg-0"}]]);var IconGenderFemale=createReactComponent("outline","gender-female","IconGenderFemale",[["path",{d:"M12 9m-5 0a5 5 0 1 0 10 0a5 5 0 1 0 -10 0",key:"svg-0"}],["path",{d:"M12 14v7",key:"svg-1"}],["path",{d:"M9 18h6",key:"svg-2"}]]);var IconListDetails=createReactComponent("outline","list-details","IconListDetails",[["path",{d:"M13 5h8",key:"svg-0"}],["path",{d:"M13 9h5",key:"svg-1"}],["path",{d:"M13 15h8",key:"svg-2"}],["path",{d:"M13 19h5",key:"svg-3"}],["path",{d:"M3 4m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z",key:"svg-4"}],["path",{d:"M3 14m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z",key:"svg-5"}]]);var IconLogout=createReactComponent("outline","logout","IconLogout",[["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"}]]);var IconMathGreater=createReactComponent("outline","math-greater","IconMathGreater",[["path",{d:"M5 18l14 -6l-14 -6",key:"svg-0"}]]);var IconMathLower=createReactComponent("outline","math-lower","IconMathLower",[["path",{d:"M19 18l-14 -6l14 -6",key:"svg-0"}]]);var IconMessage=createReactComponent("outline","message","IconMessage",[["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 -3h12z",key:"svg-2"}]]);var IconPin=createReactComponent("outline","pin","IconPin",[["path",{d:"M15 4.5l-4 4l-4 1.5l-1.5 1.5l7 7l1.5 -1.5l1.5 -4l4 -4",key:"svg-0"}],["path",{d:"M9 15l-4.5 4.5",key:"svg-1"}],["path",{d:"M14.5 4l5.5 5.5",key:"svg-2"}]]);var IconPinnedOff=createReactComponent("outline","pinned-off","IconPinnedOff",[["path",{d:"M3 3l18 18",key:"svg-0"}],["path",{d:"M15 4.5l-3.249 3.249m-2.57 1.433l-2.181 .818l-1.5 1.5l7 7l1.5 -1.5l.82 -2.186m1.43 -2.563l3.25 -3.251",key:"svg-1"}],["path",{d:"M9 15l-4.5 4.5",key:"svg-2"}],["path",{d:"M14.5 4l5.5 5.5",key:"svg-3"}]]);var IconPlus=createReactComponent("outline","plus","IconPlus",[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]]);var IconRefresh=createReactComponent("outline","refresh","IconRefresh",[["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"}]]);var IconSearch=createReactComponent("outline","search","IconSearch",[["path",{d:"M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]]);var IconSettings=createReactComponent("outline","settings","IconSettings",[["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.065z",key:"svg-0"}],["path",{d:"M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-1"}]]);var IconSortAscending=createReactComponent("outline","sort-ascending","IconSortAscending",[["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"}]]);var IconSortDescending=createReactComponent("outline","sort-descending","IconSortDescending",[["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"}]]);var IconSquare=createReactComponent("outline","square","IconSquare",[["path",{d:"M3 3m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z",key:"svg-0"}]]);var IconStethoscope=createReactComponent("outline","stethoscope","IconStethoscope",[["path",{d:"M6 4h-1a2 2 0 0 0 -2 2v3.5h0a5.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:"M20 10m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-4"}]]);var IconSwitchHorizontal=createReactComponent("outline","switch-horizontal","IconSwitchHorizontal",[["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"}]]);var IconTableExport=createReactComponent("outline","table-export","IconTableExport",[["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"}]]);var IconTrash=createReactComponent("outline","trash","IconTrash",[["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"}]]);var IconUserSquare=createReactComponent("outline","user-square","IconUserSquare",[["path",{d:"M9 10a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-0"}],["path",{d:"M6 21v-1a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v1",key:"svg-1"}],["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-14z",key:"svg-2"}]]);var IconX=createReactComponent("outline","x","IconX",[["path",{d:"M18 6l-12 12",key:"svg-0"}],["path",{d:"M6 6l12 12",key:"svg-1"}]]);import{Component}from"react";import{jsx as jsx4}from"react/jsx-runtime";var ErrorBoundary=class extends Component{constructor(props){super(props),this.state={lastLocation:window.location.toString()}}static getDerivedStateFromError(error){return{error,lastLocation:window.location.toString()}}componentDidUpdate(_prevProps,_prevState){window.location.toString()!==this.state.lastLocation&&this.setState({lastLocation:window.location.toString(),error:void 0})}shouldComponentUpdate(nextProps,nextState){return!!(this.props.children!==nextProps.children||nextState.error&&!this.state.error||this.state.lastLocation!==window.location.toString())}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,{})})}var AppShell_default={main:"AppShell_main"};import{Group as Group5,AppShell as MantineAppShell,Menu as Menu2,Text as Text3,UnstyledButton}from"@mantine/core";import{formatHumanName as formatHumanName3}from"@medplum/core";function r(e){var t,f2,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]&&(f2=r(e[t]))&&(n&&(n+=" "),n+=f2)}else for(f2 in e)e[f2]&&(n&&(n+=" "),n+=f2);return n}function clsx(){for(var e,t,f2=0,n="",o=arguments.length;f2<o;f2++)(e=arguments[f2])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}var clsx_default=clsx;import{useState as useState4}from"react";import{Avatar}from"@mantine/core";import{getDisplayString,getImageSrc}from"@medplum/core";import{Anchor}from"@mantine/core";import{isReference,isResource}from"@medplum/core";function killEvent(e){e.preventDefault(),e.stopPropagation()}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"}import{jsx as jsx6}from"react/jsx-runtime";function MedplumLink(props){let navigate=V(),{to,suffix,label,onClick,children,...rest}=props,href=getHref(to);return suffix&&(href+="/"+suffix),jsx6(Anchor,{href,"aria-label":label,onClick:e=>{killEvent(e),onClick?onClick(e):to&&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[words.length-1][0]:words.length===1?words[0][0]:""}import{jsx as jsx7}from"react/jsx-runtime";function ResourceAvatar(props){let resource=pe(props.value),text=resource?getDisplayString(resource):props.alt??"",initials=getInitials(text),uncachedImageUrl=(resource&&getImageSrc(resource))??props.src,imageUrl=oe(uncachedImageUrl??void 0),radius=props.radius??"xl",avatarProps={...props,value:void 0,link:void 0};return props.link?jsx7(MedplumLink,{to:resource,children:jsx7(Avatar,{src:imageUrl,alt:text,radius,...avatarProps,children:initials})}):jsx7(Avatar,{src:imageUrl,alt:text,radius,...avatarProps,children:initials})}var Header_default={logoButton:"Header_logoButton",user:"Header_user",userName:"Header_userName",userActive:"Header_userActive"};import{Avatar as Avatar2,Group as Group2,Menu,SegmentedControl,Stack,Text,useMantineColorScheme}from"@mantine/core";import{getReferenceString}from"@medplum/core";import{formatHumanName}from"@medplum/core";import{Fragment as Fragment2,jsx as jsx8}from"react/jsx-runtime";function HumanNameDisplay(props){let name=props.value;return name?jsx8(Fragment2,{children:formatHumanName(name,props.options)}):null}import{Fragment as Fragment3,jsx as jsx9,jsxs as jsxs2}from"react/jsx-runtime";function HeaderDropdown(props){let context=x(),{medplum,profile,navigate}=context,logins=medplum.getLogins(),{colorScheme,setColorScheme}=useMantineColorScheme();return jsxs2(Fragment3,{children:[jsxs2(Stack,{align:"center",p:"xl",children:[jsx9(ResourceAvatar,{size:"xl",radius:100,value:context.profile}),jsx9(HumanNameDisplay,{value:context.profile?.name?.[0]}),jsx9(Text,{c:"dimmed",size:"xs",children:medplum.getActiveLogin()?.project.display})]}),logins.length>1&&jsx9(Menu.Divider,{}),logins.map(login=>login.profile.reference!==getReferenceString(context.profile)&&jsx9(Menu.Item,{onClick:()=>{medplum.setActiveLogin(login).then(()=>window.location.reload()).catch(console.log)},children:jsxs2(Group2,{children:[jsx9(Avatar2,{radius:"xl"}),jsxs2("div",{style:{flex:1},children:[jsx9(Text,{size:"sm",fw:500,children:login.profile.display}),jsx9(Text,{c:"dimmed",size:"xs",children:login.project.display})]})]})},login.profile.reference)),jsx9(Menu.Divider,{}),jsx9(Group2,{justify:"center",children:jsx9(SegmentedControl,{size:"xs",value:colorScheme,onChange:newValue=>setColorScheme(newValue),data:[{label:"Light",value:"light"},{label:"Dark",value:"dark"},{label:"Auto",value:"auto"}]})}),jsx9(Menu.Divider,{}),jsx9(Menu.Item,{leftSection:jsx9(IconSwitchHorizontal,{size:14,stroke:1.5}),onClick:()=>navigate("/signin"),children:"Add another account"}),jsx9(Menu.Item,{leftSection:jsx9(IconSettings,{size:14,stroke:1.5}),onClick:()=>navigate(`/${getReferenceString(profile)}`),children:"Account settings"}),jsx9(Menu.Item,{leftSection:jsx9(IconLogout,{size:14,stroke:1.5}),onClick:async()=>{await medplum.signOut(),navigate("/signin")},children:"Sign out"}),jsx9(Text,{size:"xs",c:"dimmed",ta:"center",children:props.version})]})}import{formatHumanName as formatHumanName2,getDisplayString as getDisplayString2,getReferenceString as getReferenceString2,isUUID}from"@medplum/core";import{forwardRef as forwardRef2,useCallback as useCallback2}from"react";import{Combobox,Group as Group3,Loader as Loader2,Pill,PillsInput,useCombobox}from"@mantine/core";import{showNotification}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString2}from"@medplum/core";import{useCallback,useEffect,useRef as useRef2,useState as useState3}from"react";import{jsx as jsx10,jsxs as jsxs3}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,onChange,onCreate,creatable,clearable,required,placeholder,leftSection,maxValues,...rest}=props,defaultItems=toDefaultItems(defaultValue2),[search,setSearch]=useState3(""),[timer,setTimer]=useState3(),[abortController,setAbortController]=useState3(),[autoSubmit,setAutoSubmit]=useState3(),[selected,setSelected]=useState3(defaultItems.map(toOption4)),[options,setOptions]=useState3([]),ItemComponent4=itemComponent??DefaultItemComponent,searchRef=useRef2();searchRef.current=search;let lastLoadOptionsRef=useRef2(),lastValueRef=useRef2(),timerRef=useRef2();timerRef.current=timer;let abortControllerRef=useRef2();abortControllerRef.current=abortController;let autoSubmitRef=useRef2();autoSubmitRef.current=autoSubmit;let optionsRef=useRef2();optionsRef.current=options;let handleTimer=useCallback(()=>{if(setTimer(void 0),searchRef.current===lastValueRef.current&&loadOptions===lastLoadOptionsRef.current)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)),setAbortController(void 0),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)})})},[combobox,loadOptions,onChange,toOption4]),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 result=[],newSelected=[...selected],option=options?.find(option2=>option2.value===newValue),item=option?.resource;if(!item&&creatable!==!1&&onCreate&&(item=onCreate(newValue),option=toOption4(item)),item&&result.push(item),option&&newSelected.push(option),maxValues!==void 0)for(;newSelected.length>maxValues;)newSelected.shift();onChange(result),setSelected(newSelected)},[creatable,options,selected,maxValues,onChange,onCreate,toOption4]),handleValueSelect=val=>{setSearch(""),setOptions([]),combobox.closeDropdown(),lastValueRef.current=void 0,addSelected(val==="$create"?search:val)},handleValueRemove=useCallback(item=>{let newSelected=selected.filter(v2=>v2.value!==item.value);onChange(newSelected.map(v2=>v2.resource)),setSelected(newSelected)},[selected,onChange]),handleKeyDown=useCallback(e=>{e.key==="Enter"?!timer&&!abortController?(killEvent(e),options&&options.length>0&&(setOptions(options.slice(0,1)),addSelected(options[0].value))):setAutoSubmit(!0):e.key==="Backspace"&&search.length===0&&(killEvent(e),handleValueRemove(selected[selected.length-1]))},[search,selected,options,timer,abortController,addSelected,handleValueRemove]);useEffect(()=>()=>{abortControllerRef.current&&abortControllerRef.current.abort()},[]);let clearButton=clearable&&selected.length>0&&jsx10(Combobox.ClearButton,{title:"Clear all",size:16,onClear:()=>{setSearch(""),setSelected([]),onChange([]),combobox.closeDropdown()}});return jsxs3(Combobox,{store:combobox,onOptionSubmit:handleValueSelect,withinPortal:!0,shadow:"xl",...rest,children:[jsx10(Combobox.DropdownTarget,{children:jsx10(PillsInput,{label,description,error,className:props.className,leftSection,rightSection:abortController?jsx10(Loader2,{size:16}):clearButton,required,children:jsxs3(Pill.Group,{children:[selected.map(item=>jsx10(Pill,{withRemoveButton:!0,onRemove:()=>handleValueRemove(item),children:item.label},item.value)),(maxValues===void 0||maxValues===0||selected.length<maxValues)&&jsx10(Combobox.EventsTarget,{children:jsx10(PillsInput.Field,{role:"searchbox",name,value:search,placeholder,onFocus:handleSearchChange,onBlur:()=>combobox.closeDropdown(),onKeyDown:handleKeyDown,onChange:handleSearchChange})})]})})}),jsx10(Combobox.Dropdown,{children:jsxs3(Combobox.Options,{children:[options.map(item=>jsx10(Combobox.Option,{value:item.value,active:selected.includes(item),children:jsx10(ItemComponent4,{...item})},item.value)),creatable&&search.trim().length>0&&jsxs3(Combobox.Option,{value:"$create",children:["+ Create ",search]}),!creatable&&search.trim().length>0&&options.length===0&&jsx10(Combobox.Empty,{children:"Nothing found"})]})})]})}function toDefaultItems(defaultValue2){return defaultValue2?Array.isArray(defaultValue2)?defaultValue2:[defaultValue2]:[]}function DefaultItemComponent(props){return jsx10(Group3,{gap:"sm",children:jsx10("span",{children:props.label})})}var HeaderSearchInput_default={searchInput:"HeaderSearchInput_searchInput"};import{Group as Group4,Text as Text2}from"@mantine/core";import{jsx as jsx11,jsxs as jsxs4}from"react/jsx-runtime";function toOption(resource){return{value:resource.id,label:getDisplayString2(resource),resource}}function HeaderSearchInput(props){let navigate=V(),medplum=a(),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 jsx11(AsyncAutocomplete,{size:"sm",radius:"md",className:HeaderSearchInput_default.searchInput,leftSection:jsx11(IconSearch,{size:16}),placeholder:"Search",itemComponent:ItemComponent,toOption,onChange:handleSelect,loadOptions:loadData,maxValues:0,clearable:!1},`${props.pathname}?${props.searchParams}`)}var ItemComponent=forwardRef2(({resource,...others},ref)=>{let helpText;return resource.resourceType==="Patient"?helpText=resource.birthDate:resource.resourceType==="ServiceRequest"&&(helpText=resource.subject?.display),jsx11("div",{ref,...others,children:jsxs4(Group4,{wrap:"nowrap",children:[jsx11(ResourceAvatar,{value:resource}),jsxs4("div",{children:[jsx11(Text2,{children:getDisplayString2(resource)}),jsx11(Text2,{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,16 +61,16 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
61
61
  display
62
62
  }
63
63
  }
64
- }`.replace(/\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((a2,b2)=>getResourceScore(b2,query)-getResourceScore(a2,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 jsx12,jsxs as jsxs5}from"react/jsx-runtime";function Header(props){let profile=W(),[userMenuOpened,setUserMenuOpened]=useState4(!1);return jsx12(MantineAppShell.Header,{p:8,style:{zIndex:101},children:jsxs5(Group5,{justify:"space-between",children:[jsxs5(Group5,{gap:"xs",children:[jsx12(UnstyledButton,{className:Header_default.logoButton,onClick:props.navbarToggle,children:props.logo}),!props.headerSearchDisabled&&jsx12(HeaderSearchInput,{pathname:props.pathname,searchParams:props.searchParams})]}),jsxs5(Group5,{gap:"lg",pr:"sm",children:[props.notifications,jsxs5(Menu2,{width:260,shadow:"xl",position:"bottom-end",transitionProps:{transition:"pop-top-right"},opened:userMenuOpened,onClose:()=>setUserMenuOpened(!1),children:[jsx12(Menu2.Target,{children:jsx12(UnstyledButton,{className:clsx_default(Header_default.user,{[Header_default.userActive]:userMenuOpened}),onClick:()=>setUserMenuOpened(o=>!o),children:jsxs5(Group5,{gap:7,children:[jsx12(ResourceAvatar,{value:profile,radius:"xl",size:24}),jsx12(Text3,{size:"sm",className:Header_default.userName,children:formatHumanName3(profile?.name?.[0])}),jsx12(IconChevronDown,{size:12,stroke:1.5})]})})}),jsx12(Menu2.Dropdown,{children:jsx12(HeaderDropdown,{version:props.version})})]})]})]})})}import{Button as Button2,AppShell as MantineAppShell2,ScrollArea,Space,Text as Text5}from"@mantine/core";import{Fragment as Fragment4,useState as useState7}from"react";import{Button,Group as Group6,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";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 jsx13}from"react/jsx-runtime";function Form(props){return jsx13("form",{style:props.style,"data-testid":props.testid,onSubmit:e=>{e.preventDefault();let formData=parseForm(e.target);props.onSubmit&&props.onSubmit(formData)},children:props.children})}import{jsx as jsx14,jsxs as jsxs6}from"react/jsx-runtime";function BookmarkDialog(props){let medplum=a(),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 jsx14(Modal,{title:"Add Bookmark",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:jsx14(Form,{onSubmit:submitHandler,children:jsxs6(Stack2,{children:[jsx14(SelectMenu,{config}),jsx14(TextInput3,{label:"Bookmark Name",type:"text",name:"bookmarkname",placeholder:"Bookmark Name",withAsterisk:!0}),jsx14(Group6,{justify:"flex-end",children:jsx14(Button,{mt:"sm",type:"submit",children:"OK"})})]})})})}function SelectMenu(props){function userConfigToMenu(config){return config?.menu?.map(menu=>menu.title)}let menus=userConfigToMenu(props.config);return jsx14(NativeSelect2,{name:"menuname",defaultValue:menus[0],label:"Select Menu Option",data:menus,withAsterisk:!0})}import{useCallback as useCallback4,useState as useState6}from"react";import{useState as useState5}from"react";import{Group as Group7,Text as Text4}from"@mantine/core";import{forwardRef as forwardRef3,useCallback as useCallback3}from"react";import{jsx as jsx15,jsxs as jsxs7}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=a(),{binding,creatable,clearable,expandParams,withHelpText,...rest}=props,loadValues=useCallback3(async(input,signal)=>{if(!binding)return[];let valueSetElements=(await medplum.valueSetExpand({...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 jsx15(AsyncAutocomplete,{...rest,creatable:creatable??!0,clearable:clearable??!0,toOption:toOption2,loadOptions:loadValues,onCreate:createValue,itemComponent:withHelpText?ItemComponent2:void 0})}var ItemComponent2=forwardRef3(({label,resource,...others},ref)=>jsx15("div",{ref,...others,children:jsx15(Group7,{wrap:"nowrap",children:jsxs7("div",{children:[jsx15(Text4,{children:label}),jsx15(Text4,{size:"xs",c:"dimmed",children:`${resource.system}#${resource.code}`})]})})}));import{jsx as jsx16}from"react/jsx-runtime";function CodeInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,...rest}=props,[value,setValue]=useState5(defaultValue2);function handleChange(newValues){let newValue=newValues[0],newCode=valueSetElementToCode(newValue);setValue(newCode),onChange&&onChange(newCode)}return jsx16(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 jsx17}from"react/jsx-runtime";function ResourceTypeInput(props){let[resourceType,setResourceType]=useState6(props.defaultValue),onChange=props.onChange,setResourceTypeWrapper=useCallback4(newResourceType=>{setResourceType(newResourceType),onChange&&onChange(newResourceType)},[onChange]);return jsx17(CodeInput,{"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={menuTitle:"Navbar_menuTitle",link:"Navbar_link",linkActive:"Navbar_linkActive"};import{Fragment as Fragment5,jsx as jsx18,jsxs as jsxs8}from"react/jsx-runtime";function Navbar(props){let navigate=V(),activeLink=getActiveLink(props.pathname,props.searchParams,props.menus),[bookmarkDialogVisible,setBookmarkDialogVisible]=useState7(!1);function onLinkClick(e,to){e.stopPropagation(),e.preventDefault(),navigate(to),window.innerWidth<768&&props.closeNavbar()}function navigateResourceType(resourceType){resourceType&&navigate(`/${resourceType}`)}return jsxs8(Fragment5,{children:[jsx18(MantineAppShell2.Navbar,{children:jsxs8(ScrollArea,{p:"xs",children:[!props.resourceTypeSearchDisabled&&jsx18(MantineAppShell2.Section,{mb:"sm",children:jsx18(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",maxValues:0,onChange:newValue=>navigateResourceType(newValue)},window.location.pathname)}),jsxs8(MantineAppShell2.Section,{grow:!0,children:[props.menus?.map(menu=>jsxs8(Fragment4,{children:[jsx18(Text5,{className:Navbar_default.menuTitle,children:menu.title}),menu.links?.map(link=>jsxs8(NavbarLink,{to:link.href,active:link.href===activeLink?.href,onClick:e=>onLinkClick(e,link.href),children:[jsx18(NavLinkIcon,{to:link.href,icon:link.icon}),jsx18("span",{children:link.label})]},link.href))]},`menu-${menu.title}`)),props.displayAddBookmark&&jsx18(Button2,{variant:"subtle",size:"xs",mt:"xl",leftSection:jsx18(IconPlus,{size:"0.75rem"}),onClick:()=>setBookmarkDialogVisible(!0),children:"Add Bookmark"})]})]})}),props.pathname&&props.searchParams&&jsx18(BookmarkDialog,{pathname:props.pathname,searchParams:props.searchParams,visible:bookmarkDialogVisible,onOk:()=>setBookmarkDialogVisible(!1),onCancel:()=>setBookmarkDialogVisible(!1)})]})}function NavbarLink(props){return jsx18(MedplumLink,{onClick:props.onClick,to:props.to,className:clsx_default(Navbar_default.link,{[Navbar_default.linkActive]:props.active}),children:props.children})}function NavLinkIcon(props){return props.icon?props.icon:jsx18(Space,{w:30})}function getActiveLink(currentPathname,currentSearchParams,menus){if(!currentPathname||!currentSearchParams||!menus)return;let bestLink,bestScore=0;for(let menu of menus)if(menu.links)for(let link of menu.links){let score=getLinkScore(currentPathname,currentSearchParams,link.href);score>bestScore&&(bestScore=score,bestLink=link)}return bestLink}function getLinkScore(currentPathname,currentSearchParams,linkHref){let linkUrl=new URL(linkHref,"https://example.com");if(currentPathname!==linkUrl.pathname)return 0;let ignoredParams=["_count","_offset"];for(let[key,value]of linkUrl.searchParams.entries())if(!ignoredParams.includes(key)&&currentSearchParams.get(key)!==value)return 0;let count=1;for(let[key,value]of currentSearchParams.entries())ignoredParams.includes(key)||linkUrl.searchParams.get(key)===value&&count++;return count}import{jsx as jsx19,jsxs as jsxs9}from"react/jsx-runtime";function AppShell(props){let[navbarOpen,setNavbarOpen]=useState8(localStorage.navbarOpen==="true"),medplum=a(),profile=W();useEffect2(()=>{function eventListener(){showNotification3({color:"red",message:"No connection to server",autoClose:!1})}return medplum.addEventListener("offline",eventListener),()=>medplum.removeEventListener("offline",eventListener)},[medplum]);function setNavbarOpenWrapper(open){localStorage.navbarOpen=open.toString(),setNavbarOpen(open)}function closeNavbar(){setNavbarOpenWrapper(!1)}function toggleNavbar(){setNavbarOpenWrapper(!navbarOpen)}return medplum.isLoading()?jsx19(Loading,{}):jsxs9(MantineAppShell3,{header:{height:60},navbar:{width:250,breakpoint:"sm",collapsed:{desktop:!profile||!navbarOpen,mobile:!profile||!navbarOpen}},padding:0,children:[profile&&jsx19(Header,{pathname:props.pathname,searchParams:props.searchParams,headerSearchDisabled:props.headerSearchDisabled,logo:props.logo,version:props.version,navbarToggle:toggleNavbar,notifications:props.notifications}),profile&&navbarOpen?jsx19(Navbar,{pathname:props.pathname,searchParams:props.searchParams,menus:props.menus,closeNavbar,displayAddBookmark:props.displayAddBookmark,resourceTypeSearchDisabled:props.resourceTypeSearchDisabled}):void 0,jsx19(MantineAppShell3.Main,{className:AppShell_default.main,children:jsx19(ErrorBoundary,{children:jsx19(Suspense,{fallback:jsx19(Loading,{}),children:props.children})})})]})}import{Anchor as Anchor2}from"@mantine/core";import{jsx as jsx20,jsxs as jsxs10}from"react/jsx-runtime";function AttachmentDisplay(props){let{contentType,url:uncachedUrl,title}=props.value??{},url=oe(uncachedUrl);return url?jsxs10("div",{"data-testid":"attachment-display",children:[contentType?.startsWith("image/")&&jsx20("img",{"data-testid":"attachment-image",style:{maxWidth:props.maxWidth},src:url,alt:title}),contentType?.startsWith("video/")&&jsx20("video",{"data-testid":"attachment-video",style:{maxWidth:props.maxWidth},controls:!0,children:jsx20("source",{type:contentType,src:url})}),contentType==="application/pdf"&&jsx20("div",{"data-testid":"attachment-pdf",style:{maxWidth:props.maxWidth,minHeight:400},children:jsx20("iframe",{width:"100%",height:"400",src:url+"#navpanes=0",allowFullScreen:!0,frameBorder:0,seamless:!0})}),jsx20("div",{"data-testid":"download-link",style:{padding:"2px 16px 16px 16px"},children:jsx20(Anchor2,{href:url,"data-testid":"attachment-details",target:"_blank",rel:"noopener noreferrer",download:getDownloadName(title),children:title||"Download"})})]}):null}function getDownloadName(title){return title?.includes(".")?title:void 0}var DescriptionList_default={root:"DescriptionList_root",compact:"DescriptionList_compact"};import{Fragment as Fragment6,jsx as jsx21,jsxs as jsxs11}from"react/jsx-runtime";function DescriptionList(props){let{children,compact}=props;return jsx21("dl",{className:clsx_default(DescriptionList_default.root,{[DescriptionList_default.compact]:compact}),children})}function DescriptionListEntry(props){return jsxs11(Fragment6,{children:[jsx21("dt",{children:props.term}),jsx21("dd",{children:props.children})]})}import{getPathDisplayName,isPopulated}from"@medplum/core";import{Fragment as Fragment7,jsx as jsx22}from"react/jsx-runtime";function AttachmentArrayDisplay(props){let attachmentElements=props.values?.map((v2,index)=>jsx22("div",{children:jsx22(AttachmentDisplay,{value:v2,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(!isPopulated(props.path))throw new Error("props.path is required when includeDescriptionListEntry is true");let key=props.path.split(".").pop();content=jsx22(DescriptionListEntry,{term:getPathDisplayName(key),children:attachmentElements})}else content=jsx22(Fragment7,{children:attachmentElements});return content}import{ActionIcon}from"@mantine/core";import{useRef as useRef4,useState as useState9}from"react";import{normalizeOperationOutcome}from"@medplum/core";import{useRef as useRef3}from"react";import{Fragment as Fragment8,jsx as jsx23,jsxs as jsxs12}from"react/jsx-runtime";function AttachmentButton(props){let medplum=a(),fileInputRef=useRef3(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 jsxs12(Fragment8,{children:[jsx23("input",{type:"file","data-testid":"upload-file-input",style:{display:"none"},ref:fileInputRef,onChange:e=>onFileChange(e)}),props.children({onClick})]})}import{jsx as jsx24,jsxs as jsxs13}from"react/jsx-runtime";function AttachmentArrayInput(props){let[values,setValues]=useState9(props.defaultValue??[]),valuesRef=useRef4();valuesRef.current=values;function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}return jsxs13("table",{style:{width:"100%"},children:[jsxs13("colgroup",{children:[jsx24("col",{width:"97%"}),jsx24("col",{width:"3%"})]}),jsxs13("tbody",{children:[values.map((v2,index)=>jsxs13("tr",{children:[jsx24("td",{children:jsx24(AttachmentDisplay,{value:v2,maxWidth:200})}),jsx24("td",{children:jsx24(ActionIcon,{title:"Remove",variant:"subtle",size:"sm",color:"gray",onClick:e=>{killEvent(e);let copy=values.slice();copy.splice(index,1),setValuesWrapper(copy)},children:jsx24(IconCircleMinus,{})})})]},`${index}-${values.length}`)),jsxs13("tr",{children:[jsx24("td",{}),jsx24("td",{children:jsx24(AttachmentButton,{onUpload:attachment=>{setValuesWrapper([...valuesRef.current,attachment])},children:props2=>jsx24(ActionIcon,{...props2,title:"Add",variant:"subtle",size:"sm",color:"green",children:jsx24(IconCloudUpload,{})})})})]})]})]})}import{Button as Button3}from"@mantine/core";import{useState as useState10}from"react";import{Fragment as Fragment9,jsx as jsx25,jsxs as jsxs14}from"react/jsx-runtime";function AttachmentInput(props){let[value,setValue]=useState10(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return value?jsxs14(Fragment9,{children:[jsx25(AttachmentDisplay,{value,maxWidth:200}),jsx25(Button3,{onClick:e=>{killEvent(e),setValueWrapper(void 0)},children:"Remove"})]}):jsx25(AttachmentButton,{securityContext:props.securityContext,onUpload:setValueWrapper,children:props2=>jsx25(Button3,{...props2,children:"Upload..."})})}import{buildElementsContext as buildElementsContext2,getPathDisplayName as getPathDisplayName3,isEmpty as isEmpty2,tryGetDataType}from"@medplum/core";var DEFAULT_IGNORED_PROPERTIES=["meta","implicitRules","contained","extension","modifierExtension"],DEFAULT_IGNORED_NON_NESTED_PROPERTIES=["language","text"];import{ActionIcon as ActionIcon2,Box,CopyButton,Tooltip}from"@mantine/core";import{PropertyType,formatDateTime,formatPeriod,formatTiming,isEmpty}from"@medplum/core";import{formatCodeableConcept}from"@medplum/core";import{Fragment as Fragment10,jsx as jsx26}from"react/jsx-runtime";function CodeableConceptDisplay(props){return jsx26(Fragment10,{children:formatCodeableConcept(props.value)})}import{formatCoding}from"@medplum/core";import{Fragment as Fragment11,jsx as jsx27}from"react/jsx-runtime";function CodingDisplay(props){return jsx27(Fragment11,{children:formatCoding(props.value)})}import{Fragment as Fragment12,jsx as jsx28}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("]")),jsx28(Fragment12,{children:builder.join("").trim()})}import{Fragment as Fragment13,jsx as jsx29,jsxs as jsxs15}from"react/jsx-runtime";function ContactDetailDisplay(props){let contactDetail=props.value;return contactDetail?jsxs15(Fragment13,{children:[contactDetail.name,contactDetail.name&&": ",contactDetail.telecom?.map(telecom=>jsx29(ContactPointDisplay,{value:telecom},`telecom-${contactDetail.name}-${telecom.value}`))]}):null}import{jsxs as jsxs16}from"react/jsx-runtime";function IdentifierDisplay(props){return jsxs16("div",{children:[props.value?.system,": ",props.value?.value]})}import{formatMoney}from"@medplum/core";import{Fragment as Fragment14,jsx as jsx30}from"react/jsx-runtime";function MoneyDisplay(props){return jsx30(Fragment14,{children:formatMoney(props.value)})}import{formatQuantity}from"@medplum/core";import{Fragment as Fragment15,jsx as jsx31}from"react/jsx-runtime";function QuantityDisplay(props){return jsx31(Fragment15,{children:formatQuantity(props.value)})}import{formatRange}from"@medplum/core";import{Fragment as Fragment16,jsx as jsx32}from"react/jsx-runtime";function RangeDisplay(props){return jsx32(Fragment16,{children:formatRange(props.value)})}import{Fragment as Fragment17,jsx as jsx33,jsxs as jsxs17}from"react/jsx-runtime";function RatioDisplay(props){let value=props.value;return value?jsxs17(Fragment17,{children:[jsx33(QuantityDisplay,{value:value.numerator}),"\xA0/\xA0",jsx33(QuantityDisplay,{value:value.denominator})]}):null}import{stringify}from"@medplum/core";import{Fragment as Fragment18,jsx as jsx34}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?jsx34(MedplumLink,{to:props.value,children:displayString}):jsx34(Fragment18,{children:displayString})}import{getPathDisplayName as getPathDisplayName2,isPopulated as isPopulated4}from"@medplum/core";import{useState as useState11,useContext as useContext2,useEffect as useEffect3,useMemo as useMemo2}from"react";import React from"react";var ElementsContext=React.createContext({path:"",profileUrl:void 0,elements:Object.create(null),elementsByPath:Object.create(null),debugMode:!1});ElementsContext.displayName="ElementsContext";import{getValueSliceName,isPopulated as isPopulated2,isSliceDefinitionWithTypes,tryGetProfile}from"@medplum/core";function assignValuesIntoSlices(values,slices,slicing,profileUrl){if(!isPopulated2(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;isPopulated2(slice.elements)||(profileUrl=slice.type[0]?.profile?.[0]),supportedSlices.push(slice),profileUrls.push(profileUrl),profileUrl?promises.push(medplum.requestProfileSchema(profileUrl)):promises.push(Promise.resolve([]))}Promise.all(promises).then(()=>{for(let i=0;i<supportedSlices.length;i++){let slice=supportedSlices[i],profileUrl=profileUrls[i];if(profileUrl){let typeSchema=tryGetProfile(profileUrl);slice.typeSchema=typeSchema}}resolve(supportedSlices)}).catch(reject)})}import{buildElementsContext,isPopulated as isPopulated3}from"@medplum/core";import{useContext,useMemo}from"react";import{jsx as jsx35}from"react/jsx-runtime";function maybeWrapWithContext(ContextProvider,contextValue,contents){return contextValue!==void 0?jsx35(ContextProvider,{value:contextValue,children:contents}):contents}import{Fragment as Fragment19,jsx as jsx36}from"react/jsx-runtime";function SliceDisplay(props){let{slice,property}=props,sliceElements=slice.typeSchema?.elements??slice.elements,parentContext=useContext(ElementsContext),contextValue=useMemo(()=>{if(isPopulated3(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,jsx36(Fragment19,{children:props.value.map((value,valueIndex)=>jsx36("div",{children:jsx36(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 Fragment20,jsx as jsx37,jsxs as jsxs18}from"react/jsx-runtime";function ResourceArrayDisplay(props){let{property,propertyType}=props,medplum=a(),values=useMemo2(()=>Array.isArray(props.values)?props.values:[],[props.values]),[loading,setLoading]=useState11(!0),[slices,setSlices]=useState11([]),[slicedValues,setSlicedValues]=useState11(()=>[values]),ctx=useContext2(ElementsContext);if(useEffect3(()=>{prepareSlices({medplum,property}).then(slices2=>{setSlices(slices2);let slicedValues2=assignValuesIntoSlices(values,slices2,property.slicing,ctx.profileUrl);setSlicedValues(slicedValues2),setLoading(!1)}).catch(reason=>{console.error(reason),setLoading(!1)})},[medplum,property,ctx.profileUrl,setSlicedValues,values]),loading)return jsx37("div",{children:"Loading..."});let nonSliceContent;if(property.type[0]?.code!=="Extension"){let nonSliceValues=slicedValues[slices.length],nonSliceElements=nonSliceValues.map((value,valueIndex)=>jsx37("div",{children:jsx37(ResourcePropertyDisplay,{path:props.path,arrayElement:!0,property,propertyType,value,ignoreMissingValues:props.ignoreMissingValues,link:props.link})},`${valueIndex}-${nonSliceValues.length}`));if(props.includeDescriptionListEntry){if(!isPopulated4(props.path))throw new Error("props.path is required when includeDescriptionListEntry is true");let key=props.path.split(".").pop();nonSliceContent=jsx37(DescriptionListEntry,{term:getPathDisplayName2(key),children:nonSliceElements})}else nonSliceContent=jsx37(Fragment20,{children:nonSliceElements})}return jsxs18(Fragment20,{children:[slices.map((slice,sliceIndex)=>{if(!props.path)throw Error(`Displaying a resource property with slices of type ${props.propertyType} requires path`);let sliceDisplay=jsx37(SliceDisplay,{path:props.path,slice,property,value:slicedValues[sliceIndex],ignoreMissingValues:props.ignoreMissingValues,link:props.link},slice.name);return props.includeDescriptionListEntry&&(sliceDisplay=jsx37(DescriptionListEntry,{term:getPathDisplayName2(slice.name),children:sliceDisplay},slice.name)),sliceDisplay}),nonSliceContent]})}import{getDataType,isPopulated as isPopulated5,isProfileLoaded,tryGetProfile as tryGetProfile2}from"@medplum/core";import{useContext as useContext3,useEffect as useEffect4,useMemo as useMemo3,useState as useState12}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 jsx38}from"react/jsx-runtime";function ExtensionDisplay(props){let{elementDefinitionType}=props,medplum=a(),ctx=useContext3(ElementsContext),[typeSchema,setTypeSchema]=useState12(getDataType("Extension")),profileUrl=useMemo3(()=>{if(isPopulated5(elementDefinitionType?.profile))return elementDefinitionType.profile[0]},[elementDefinitionType]),[loadingProfile,setLoadingProfile]=useState12(profileUrl!==void 0);if(useEffect4(()=>{profileUrl&&(setLoadingProfile(!0),medplum.requestProfileSchema(profileUrl).then(()=>{let profile=tryGetProfile2(profileUrl);setLoadingProfile(!1),profile&&setTypeSchema(profile)}).catch(reason=>{setLoadingProfile(!1),console.warn(reason)}))},[medplum,profileUrl]),profileUrl&&(loadingProfile||!isProfileLoaded(profileUrl)))return jsx38("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 jsx38(ResourcePropertyDisplay,{propertyType,value:propertyValue})}return jsx38(BackboneElementDisplay,{path:props.path,value:{type:typeSchema.name,value:props.value},compact:props.compact,ignoreMissingValues:props.ignoreMissingValues,link:props.link,profileUrl})}import{Fragment as Fragment21,jsx as jsx39,jsxs as jsxs19}from"react/jsx-runtime";function ResourcePropertyDisplay(props){let{property,propertyType,value}=props;if(property?.path?.endsWith(".id"))return jsxs19(Box,{component:"div",style:{display:"flex",gap:3,alignItems:"center"},children:[value,!isEmpty(value)&&jsx39(CopyButton,{value,timeout:2e3,children:({copied,copy})=>jsx39(Tooltip,{label:copied?"Copied":"Copy",withArrow:!0,position:"right",children:jsx39(ActionIcon2,{variant:"subtle",color:copied?"teal":"gray",onClick:copy,children:copied?jsx39(IconCheck,{size:"1rem"}):jsx39(IconCopy,{size:"1rem"})})})})]});let isArrayElement=!!props.arrayElement;if(property?.max&&property.max>1&&!isArrayElement)return propertyType===PropertyType.Attachment?jsx39(AttachmentArrayDisplay,{values:value,maxWidth:props.maxWidth,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,property,path:props.path}):jsx39(ResourceArrayDisplay,{path:props.path,property,propertyType,values:value,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,ignoreMissingValues:props.ignoreMissingValues,link:props.link});switch(propertyType){case PropertyType.boolean:return jsx39(Fragment21,{children:value===void 0?"":(!!value).toString()});case PropertyType.SystemString:case PropertyType.string:return jsx39("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:return jsx39(Fragment21,{children:value});case PropertyType.canonical:return jsx39(ReferenceDisplay,{value:{reference:value},link:props.link});case PropertyType.dateTime:case PropertyType.instant:return jsx39(Fragment21,{children:formatDateTime(value)});case PropertyType.markdown:return jsx39("pre",{children:value});case PropertyType.Address:return jsx39(AddressDisplay,{value});case PropertyType.Annotation:return jsx39(Fragment21,{children:value?.text});case PropertyType.Attachment:return jsx39(AttachmentDisplay,{value,maxWidth:props.maxWidth});case PropertyType.CodeableConcept:return jsx39(CodeableConceptDisplay,{value});case PropertyType.Coding:return jsx39(CodingDisplay,{value});case PropertyType.ContactDetail:return jsx39(ContactDetailDisplay,{value});case PropertyType.ContactPoint:return jsx39(ContactPointDisplay,{value});case PropertyType.HumanName:return jsx39(HumanNameDisplay,{value});case PropertyType.Identifier:return jsx39(IdentifierDisplay,{value});case PropertyType.Money:return jsx39(MoneyDisplay,{value});case PropertyType.Period:return jsx39(Fragment21,{children:formatPeriod(value)});case PropertyType.Quantity:case PropertyType.Duration:return jsx39(QuantityDisplay,{value});case PropertyType.Range:return jsx39(RangeDisplay,{value});case PropertyType.Ratio:return jsx39(RatioDisplay,{value});case PropertyType.Reference:return jsx39(ReferenceDisplay,{value,link:props.link});case PropertyType.Timing:return jsx39(Fragment21,{children:formatTiming(value)});case PropertyType.Dosage:case PropertyType.UsageContext:if(!props.path)throw Error(`Displaying property of type ${props.propertyType} requires path`);return jsx39(BackboneElementDisplay,{path:props.path,value:{type:propertyType,value},compact:!0,ignoreMissingValues:props.ignoreMissingValues});case PropertyType.Extension:if(!props.path)throw Error(`Displaying property of type ${props.propertyType} requires path`);return jsx39(ExtensionDisplay,{path:props.path,value,compact:!0,ignoreMissingValues:props.ignoreMissingValues,elementDefinitionType:props.elementDefinitionType});default:if(!property)throw Error(`Displaying property of type ${props.propertyType} requires element schema`);if(!props.path)throw Error(`Displaying property of type ${props.propertyType} requires path`);return jsx39(BackboneElementDisplay,{path:props.path,value:{type:property.type[0].code,value},compact:!0,ignoreMissingValues:props.ignoreMissingValues})}}import{useContext as useContext4,useMemo as useMemo4}from"react";import{jsx as jsx40,jsxs as jsxs20}from"react/jsx-runtime";var EXTENSION_KEYS=["extension","modifierExtension"],IGNORED_PROPERTIES=DEFAULT_IGNORED_PROPERTIES.filter(prop=>!EXTENSION_KEYS.includes(prop));function BackboneElementDisplay(props){let typedValue=props.value,{value,type:typeName}=typedValue,parentElementsContext=useContext4(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo4(()=>tryGetDataType(typeName,profileUrl),[profileUrl,typeName]),newElementsContext=useMemo4(()=>{if(typeSchema)return buildElementsContext2({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url})},[typeSchema,props.path,parentElementsContext]);if(isEmpty2(value))return null;if(!typeSchema)return jsxs20("div",{children:[typeName,"\xA0not implemented"]});if(typeof value=="object"&&"name"in value&&Object.keys(value).length===1&&typeof value.name=="string")return jsx40("div",{children:value.name});let elementsContext=newElementsContext??parentElementsContext;return maybeWrapWithContext(ElementsContext.Provider,newElementsContext,jsx40(DescriptionList,{compact:props.compact,children:Object.entries(elementsContext.elements).map(([key,property])=>{if(EXTENSION_KEYS.includes(key)&&isEmpty2(property.slicing?.slices))return null;if(IGNORED_PROPERTIES.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=jsx40(ResourcePropertyDisplay,{property,propertyType,path:props.path+"."+key,value:propertyValue,ignoreMissingValues:props.ignoreMissingValues,includeArrayDescriptionListEntry:isArrayProperty,link:props.link},key);return isArrayProperty?resourcePropertyDisplay:jsx40(DescriptionListEntry,{term:getPathDisplayName3(key),children:resourcePropertyDisplay},key)})}))}import{buildElementsContext as buildElementsContext4,tryGetDataType as tryGetDataType2}from"@medplum/core";import{useContext as useContext13,useMemo as useMemo12,useState as useState33}from"react";import{Stack as Stack6}from"@mantine/core";import{getPathDisplayName as getPathDisplayName5,isPopulated as isPopulated11}from"@medplum/core";import{useContext as useContext12,useMemo as useMemo11,useState as useState32}from"react";import{Group as Group8,Input}from"@mantine/core";import{useContext as useContext5}from"react";import{jsx as jsx41,jsxs as jsxs21}from"react/jsx-runtime";function CheckboxFormSection(props){let{debugMode}=useContext5(ElementsContext),label;return debugMode&&props.fhirPath?label=`${props.title} - ${props.fhirPath}`:label=props.title,jsxs21(Group8,{wrap:"nowrap","data-testid":props.testId,children:[jsx41("div",{children:props.children}),jsx41("div",{children:jsx41(Input.Wrapper,{id:props.htmlFor,label,description:props.description,withAsterisk:props.withAsterisk,children:null})})]})}import{Input as Input2}from"@mantine/core";import{useContext as useContext6}from"react";function getErrorsForInput(outcome,expression){return outcome?.issue?.filter(issue=>isExpressionMatch(issue.expression?.[0],expression))?.map(issue=>issue.details?.text)?.join(`
65
- `)}function getIssuesForExpression(outcome,expression){return outcome?.issue?.filter(issue=>isExpressionMatch(issue.expression?.[0],expression))}function isExpressionMatch(expr1,expr2){if(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 jsx42}from"react/jsx-runtime";function FormSection(props){let{debugMode}=useContext6(ElementsContext),label;return debugMode&&props.fhirPath?label=`${props.title} - ${props.fhirPath}`:label=props.title,jsx42(Input2.Wrapper,{id:props.htmlFor,label,description:props.description,withAsterisk:props.withAsterisk,error:getErrorsForInput(props.outcome,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 obj[propName]=value,obj}function isSupportedProfileStructureDefinition(profile){return!!profile&&!isEmpty3(profile.url)&&!isEmpty3(profile.name)}import{Checkbox,Group as Group22,NativeSelect as NativeSelect9,Textarea as Textarea2,TextInput as TextInput12}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 useContext11,useMemo as useMemo10,useState as useState31}from"react";import{useState as useState13}from"react";import{jsx as jsx43}from"react/jsx-runtime";function CodeableConceptInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,...rest}=props,[value,setValue]=useState13(defaultValue2);function handleChange(newValues){let newConcept=valueSetElementToCodeableConcept(newValues);setValue(newConcept),onChange&&onChange(newConcept)}return jsx43(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 useState14}from"react";import{jsx as jsx44}from"react/jsx-runtime";function CodingInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,...rest}=props,[value,setValue]=useState14(defaultValue2);function handleChange(newValues){let newValue=newValues[0],newConcept=newValue&&valueSetElementToCoding(newValue);setValue(newConcept),onChange&&onChange(newConcept)}return jsx44(ValueSetAutocomplete,{defaultValue:value&&codingToValueSetElement(value),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 Group10,TextInput as TextInput5}from"@mantine/core";import{useRef as useRef6,useState as useState16}from"react";import{Group as Group9,NativeSelect as NativeSelect3,TextInput as TextInput4}from"@mantine/core";import{useContext as useContext7,useMemo as useMemo5,useRef as useRef5,useState as useState15}from"react";import{jsx as jsx45,jsxs as jsxs22}from"react/jsx-runtime";function ContactPointInput(props){let{path,outcome}=props,{elementsByPath}=useContext7(ElementsContext),[contactPoint,setContactPoint]=useState15(props.defaultValue),ref=useRef5();ref.current=contactPoint;let[systemElement,useElement,valueElement]=useMemo5(()=>["system","use","value"].map(field=>elementsByPath[path+"."+field]),[elementsByPath,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={...ref.current,system};system||delete newValue.system,setContactPointWrapper(newValue)}function setUse(use){let newValue={...ref.current,use};use||delete newValue.use,setContactPointWrapper(newValue)}function setValue(value){let newValue={...ref.current,value};value||delete newValue.value,setContactPointWrapper(newValue)}return jsxs22(Group9,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx45(NativeSelect3,{"data-testid":"system",defaultValue:contactPoint?.system,required:(systemElement?.min??0)>0,onChange:e=>setSystem(e.currentTarget.value),data:["","email","phone","fax","pager","sms","other"],error:getErrorsForInput(outcome,path+".system")}),jsx45(NativeSelect3,{"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,path+".use")}),jsx45(TextInput4,{placeholder:"Value",defaultValue:contactPoint?.value,required:(valueElement?.min??0)>0,onChange:e=>setValue(e.currentTarget.value),error:getErrorsForInput(outcome,path+".value")})]})}import{jsx as jsx46,jsxs as jsxs23}from"react/jsx-runtime";function ContactDetailInput(props){let[contactPoint,setContactDetail]=useState16(props.defaultValue),ref=useRef6();ref.current=contactPoint;function setContactDetailWrapper(newValue){setContactDetail(newValue),props.onChange&&props.onChange(newValue)}function setName(name){let newValue={...ref.current,name};name||delete newValue.name,setContactDetailWrapper(newValue)}function setTelecom(telecom){let newValue={...ref.current,telecom:telecom&&[telecom]};telecom||delete newValue.telecom,setContactDetailWrapper(newValue)}return jsxs23(Group10,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx46(TextInput5,{"data-testid":props.name+"-name",name:props.name+"-name",placeholder:"Name",style:{width:180},defaultValue:contactPoint?.name,onChange:e=>setName(e.currentTarget.value)}),jsx46(ContactPointInput,{name:props.name+"-telecom",path:props.path+".telecom",defaultValue:contactPoint?.telecom?.[0],onChange:setTelecom,outcome:props.outcome})]})}import{TextInput as TextInput6}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 jsx47}from"react/jsx-runtime";function DateTimeInput(props){return jsx47(TextInput6,{id:props.name,name:props.name,label:props.label,"data-autofocus":props.autoFocus,"data-testid":props.name,placeholder:props.placeholder,required:props.required,type:getInputType(),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{tryGetProfile as tryGetProfile3,isProfileLoaded as isProfileLoaded2,isPopulated as isPopulated6}from"@medplum/core";import{useEffect as useEffect5,useMemo as useMemo6,useState as useState17}from"react";import{jsx as jsx48}from"react/jsx-runtime";function ExtensionInput(props){let{propertyType}=props,medplum=a(),[typeSchema,setTypeSchema]=useState17(),profileUrl=useMemo6(()=>{if(isPopulated6(propertyType.profile))return propertyType.profile[0]},[propertyType]),[loadingProfile,setLoadingProfile]=useState17(profileUrl!==void 0);return useEffect5(()=>{profileUrl&&(setLoadingProfile(!0),medplum.requestProfileSchema(profileUrl).then(()=>{let profile=tryGetProfile3(profileUrl);setLoadingProfile(!1),setTypeSchema(profile)}).catch(reason=>{setLoadingProfile(!1),console.warn(reason)}))},[medplum,profileUrl]),profileUrl&&(loadingProfile||!isProfileLoaded2(profileUrl))?jsx48("div",{children:"Loading..."}):jsx48(BackboneElementInput,{profileUrl,path:props.path,typeName:typeSchema?.name??"Extension",defaultValue:props.defaultValue,onChange:props.onChange})}import{Group as Group11,NativeSelect as NativeSelect4,TextInput as TextInput7}from"@mantine/core";import{useState as useState18}from"react";import{jsx as jsx49,jsxs as jsxs24}from"react/jsx-runtime";function HumanNameInput(props){let{outcome,path}=props,[value,setValue]=useState18(props.defaultValue);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})}return jsxs24(Group11,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx49(NativeSelect4,{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,path+".use")}),jsx49(TextInput7,{placeholder:"Prefix",name:props.name+"-prefix",defaultValue:value?.prefix?.join(" "),onChange:e=>setPrefix(e.currentTarget.value),error:getErrorsForInput(outcome,path+".prefix")}),jsx49(TextInput7,{placeholder:"Given",name:props.name+"-given",defaultValue:value?.given?.join(" "),onChange:e=>setGiven(e.currentTarget.value),error:getErrorsForInput(outcome,path+".given")}),jsx49(TextInput7,{name:props.name+"-family",placeholder:"Family",defaultValue:value?.family,onChange:e=>setFamily(e.currentTarget.value),error:getErrorsForInput(outcome,path+".family")}),jsx49(TextInput7,{placeholder:"Suffix",name:props.name+"-suffix",defaultValue:value?.suffix?.join(" "),onChange:e=>setSuffix(e.currentTarget.value),error:getErrorsForInput(outcome,path+".suffix")})]})}import{Group as Group12,TextInput as TextInput8}from"@mantine/core";import{useContext as useContext8,useMemo as useMemo7,useState as useState19}from"react";import{jsx as jsx50,jsxs as jsxs25}from"react/jsx-runtime";function IdentifierInput(props){let{path,outcome}=props,[value,setValue]=useState19(props.defaultValue),{elementsByPath}=useContext8(ElementsContext),[systemElement,valueElement]=useMemo7(()=>["system","value"].map(field=>elementsByPath[path+"."+field]),[elementsByPath,path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs25(Group12,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx50(TextInput8,{placeholder:"System",required:(systemElement?.min??0)>0,defaultValue:value?.system,onChange:e=>setValueWrapper({...value,system:e.currentTarget.value}),error:getErrorsForInput(outcome,path+".system")}),jsx50(TextInput8,{placeholder:"Value",required:(valueElement?.min??0)>0,defaultValue:value?.value,onChange:e=>setValueWrapper({...value,value:e.currentTarget.value}),error:getErrorsForInput(outcome,path+".value")})]})}import{NativeSelect as NativeSelect5,TextInput as TextInput9}from"@mantine/core";import{useCallback as useCallback5,useState as useState20}from"react";import{jsx as jsx51}from"react/jsx-runtime";var data=["USD","EUR","CAD","GBP","AUD"];function MoneyInput(props){let{onChange}=props,[value,setValue]=useState20(props.defaultValue),setValueWrapper=useCallback5(newValue=>{setValue(newValue),onChange&&onChange(newValue)},[onChange]),handleCurrencyChange=useCallback5(e=>{setValueWrapper({...value,currency:e.currentTarget.value})},[value,setValueWrapper]),handleValueChange=useCallback5(e=>{setValueWrapper({...value,value:e.currentTarget.valueAsNumber})},[value,setValueWrapper]),select=jsx51(NativeSelect5,{defaultValue:value?.currency,data,styles:{input:{fontWeight:500,borderTopLeftRadius:0,borderBottomLeftRadius:0,width:92}},onChange:handleCurrencyChange});return jsx51(TextInput9,{type:"number",name:props.name,label:props.label,placeholder:props.placeholder??"Value",defaultValue:value?.value?.toString()??"USD",leftSection:jsx51(IconCurrencyDollar,{size:14}),rightSection:select,rightSectionWidth:92,onChange:handleValueChange})}import{Group as Group13}from"@mantine/core";import{useState as useState21}from"react";import{jsx as jsx52,jsxs as jsxs26}from"react/jsx-runtime";function PeriodInput(props){let[value,setValue]=useState21(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs26(Group13,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx52(DateTimeInput,{name:props.name+".start",placeholder:"Start",defaultValue:value?.start,onChange:newValue=>setValueWrapper({...value,start:newValue})}),jsx52(DateTimeInput,{name:props.name+".end",placeholder:"End",defaultValue:value?.end,onChange:newValue=>setValueWrapper({...value,end:newValue})})]})}import{Group as Group14,NativeSelect as NativeSelect6,TextInput as TextInput10}from"@mantine/core";import{useState as useState22}from"react";import{jsx as jsx53,jsxs as jsxs27}from"react/jsx-runtime";function QuantityInput(props){let[value,setValue]=useState22(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs27(Group14,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx53(NativeSelect6,{style:{width:80},"data-testid":props.name+"-comparator",defaultValue:value?.comparator,data:["","<","<=",">=",">"],onChange:e=>setValueWrapper({...value,comparator:e.currentTarget.value})}),jsx53(TextInput10,{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)})}}),jsx53(TextInput10,{placeholder:"Unit","data-testid":props.name+"-unit",defaultValue:value?.unit,onChange:e=>setValueWrapper({...value,unit:e.currentTarget.value})})]})}function tryParseNumber(str){if(str)return parseFloat(str)}import{Group as Group15}from"@mantine/core";import{useState as useState23}from"react";import{jsx as jsx54,jsxs as jsxs28}from"react/jsx-runtime";function RangeInput(props){let[value,setValue]=useState23(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs28(Group15,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx54(QuantityInput,{name:props.name+"-low",defaultValue:value?.low,onChange:v2=>setValueWrapper({...value,low:v2})}),jsx54(QuantityInput,{name:props.name+"-high",defaultValue:value?.high,onChange:v2=>setValueWrapper({...value,high:v2})})]})}import{Group as Group16}from"@mantine/core";import{useState as useState24}from"react";import{jsx as jsx55,jsxs as jsxs29}from"react/jsx-runtime";function RatioInput(props){let[value,setValue]=useState24(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs29(Group16,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx55(QuantityInput,{name:props.name+"-numerator",defaultValue:value?.numerator,onChange:v2=>setValueWrapper({...value,numerator:v2})}),jsx55(QuantityInput,{name:props.name+"-denominator",defaultValue:value?.denominator,onChange:v2=>setValueWrapper({...value,denominator:v2})})]})}import{Group as Group18,NativeSelect as NativeSelect7}from"@mantine/core";import{LRUCache,ReadablePromise,createReference as createReference2,isEmpty as isEmpty4,isPopulated as isPopulated8,tryGetProfile as tryGetProfile4}from"@medplum/core";import{useCallback as useCallback7,useEffect as useEffect6,useMemo as useMemo8,useRef as useRef7,useState as useState26}from"react";import{Group as Group17,Text as Text6}from"@mantine/core";import{getDisplayString as getDisplayString3,getReferenceString as getReferenceString3,isPopulated as isPopulated7}from"@medplum/core";import{forwardRef as forwardRef4,useCallback as useCallback6,useState as useState25}from"react";import{jsx as jsx56,jsxs as jsxs30}from"react/jsx-runtime";var SEARCH_CODES={Device:"device-name",Observation:"code",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","RiskEvidenceSynthesis","SearchParameter","StructureDefinition","StructureMap","TerminologyCapabilities","TestScript","UserConfiguration","ValueSet"];function toOption3(resource){return{value:getReferenceString3(resource),label:getDisplayString3(resource),resource}}function ResourceInput(props){let medplum=a(),{resourceType,searchCriteria}=props,[outcome,setOutcome]=useState25(),defaultValue2=pe(props.defaultValue,setOutcome),onChange=props.onChange,loadValues=useCallback6(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=useCallback6(newResources=>{onChange&&onChange(newResources[0])},[onChange]);return isPopulated7(props.defaultValue)&&!outcome&&!defaultValue2?null:jsx56(AsyncAutocomplete,{name:props.name,required:props.required,itemComponent:ItemComponent3,defaultValue:defaultValue2,placeholder:props.placeholder,maxValues:1,toOption:toOption3,loadOptions:loadValues,onChange:handleChange,clearable:!0})}var ItemComponent3=forwardRef4(({label,resource,...others},ref)=>jsx56("div",{ref,...others,children:jsxs30(Group17,{wrap:"nowrap",children:[jsx56(ResourceAvatar,{value:resource}),jsxs30("div",{children:[jsx56(Text6,{children:label}),jsx56(Text6,{size:"xs",c:"dimmed",children:resource.birthDate})]})]})}));function getSearchParamForResourceType(resourceType){return SEARCH_CODES[resourceType]??(NAME_RESOURCE_TYPES.includes(resourceType)?"name":"_id")}import{jsx as jsx57,jsxs as jsxs31}from"react/jsx-runtime";function ReferenceInput(props){let{onChange}=props,medplum=a(),[value,setValue]=useState26(props.defaultValue),[targetTypes,setTargetTypes]=useState26(()=>createTargetTypes(props.targetTypes)),[targetType,setTargetType]=useState26(()=>getInitialTargetType(props.defaultValue,targetTypes)),promiseCache=useRef7(new LRUCache),searchCriteria=useMemo8(()=>targetType?.type==="profile"?{...props.searchCriteria,_profile:targetType.value}:props.searchCriteria,[props.searchCriteria,targetType]);useEffect6(()=>{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=useCallback7(item=>{let newValue=item?createReference2(item):void 0;setValue(newValue),onChange&&onChange(newValue)},[onChange]),typeSelectOptions=useMemo8(()=>targetTypes?targetTypes.map(tt=>({value:tt.value,label:tt.type==="profile"?tt.title??tt.name??tt.resourceType??tt.value:tt.value})):[],[targetTypes]);return jsxs31(Group18,{gap:"xs",grow:!0,wrap:"nowrap",children:[targetTypes&&targetTypes.length>1&&jsx57(NativeSelect7,{"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&&jsx57(ResourceTypeInput,{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"}),jsx57(ResourceInput,{resourceType:targetType?.resourceType,name:props.name+"-id",required:props.required,placeholder:props.placeholder,defaultValue:value,searchCriteria,onChange:setValueHelper})]})}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=tryGetProfile4(profileUrl);if(profile)return{type:profile.type,name:profile.name,title:profile.title};let query=`{
64
+ }`.replace(/\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((a2,b2)=>getResourceScore(b2,query)-getResourceScore(a2,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 jsx12,jsxs as jsxs5}from"react/jsx-runtime";function Header(props){let profile=W(),[userMenuOpened,setUserMenuOpened]=useState4(!1);return jsx12(MantineAppShell.Header,{p:8,style:{zIndex:101},children:jsxs5(Group5,{justify:"space-between",children:[jsxs5(Group5,{gap:"xs",children:[jsx12(UnstyledButton,{className:Header_default.logoButton,onClick:props.navbarToggle,children:props.logo}),!props.headerSearchDisabled&&jsx12(HeaderSearchInput,{pathname:props.pathname,searchParams:props.searchParams})]}),jsxs5(Group5,{gap:"lg",pr:"sm",children:[props.notifications,jsxs5(Menu2,{width:260,shadow:"xl",position:"bottom-end",transitionProps:{transition:"pop-top-right"},opened:userMenuOpened,onClose:()=>setUserMenuOpened(!1),children:[jsx12(Menu2.Target,{children:jsx12(UnstyledButton,{className:clsx_default(Header_default.user,{[Header_default.userActive]:userMenuOpened}),onClick:()=>setUserMenuOpened(o=>!o),children:jsxs5(Group5,{gap:7,children:[jsx12(ResourceAvatar,{value:profile,radius:"xl",size:24}),jsx12(Text3,{size:"sm",className:Header_default.userName,children:formatHumanName3(profile?.name?.[0])}),jsx12(IconChevronDown,{size:12,stroke:1.5})]})})}),jsx12(Menu2.Dropdown,{children:jsx12(HeaderDropdown,{version:props.version})})]})]})]})})}import{Button as Button2,AppShell as MantineAppShell2,ScrollArea,Space,Text as Text5}from"@mantine/core";import{Fragment as Fragment4,useState as useState7}from"react";import{Button,Group as Group6,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";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 jsx13}from"react/jsx-runtime";function Form(props){return jsx13("form",{style:props.style,"data-testid":props.testid,onSubmit:e=>{e.preventDefault();let formData=parseForm(e.target);props.onSubmit&&props.onSubmit(formData)},children:props.children})}import{jsx as jsx14,jsxs as jsxs6}from"react/jsx-runtime";function BookmarkDialog(props){let medplum=a(),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 jsx14(Modal,{title:"Add Bookmark",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:jsx14(Form,{onSubmit:submitHandler,children:jsxs6(Stack2,{children:[jsx14(SelectMenu,{config}),jsx14(TextInput3,{label:"Bookmark Name",type:"text",name:"bookmarkname",placeholder:"Bookmark Name",withAsterisk:!0}),jsx14(Group6,{justify:"flex-end",children:jsx14(Button,{mt:"sm",type:"submit",children:"OK"})})]})})})}function SelectMenu(props){function userConfigToMenu(config){return config?.menu?.map(menu=>menu.title)}let menus=userConfigToMenu(props.config);return jsx14(NativeSelect2,{name:"menuname",defaultValue:menus[0],label:"Select Menu Option",data:menus,withAsterisk:!0})}import{useCallback as useCallback4,useState as useState6}from"react";import{useState as useState5}from"react";import{Group as Group7,Text as Text4}from"@mantine/core";import{forwardRef as forwardRef3,useCallback as useCallback3}from"react";import{jsx as jsx15,jsxs as jsxs7}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=a(),{binding,creatable,clearable,expandParams,withHelpText,...rest}=props,loadValues=useCallback3(async(input,signal)=>{if(!binding)return[];let valueSetElements=(await medplum.valueSetExpand({...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 jsx15(AsyncAutocomplete,{...rest,creatable:creatable??!0,clearable:clearable??!0,toOption:toOption2,loadOptions:loadValues,onCreate:createValue,itemComponent:withHelpText?ItemComponent2:void 0})}var ItemComponent2=forwardRef3(({label,resource,...others},ref)=>jsx15("div",{ref,...others,children:jsx15(Group7,{wrap:"nowrap",children:jsxs7("div",{children:[jsx15(Text4,{children:label}),jsx15(Text4,{size:"xs",c:"dimmed",children:`${resource.system}#${resource.code}`})]})})}));import{jsx as jsx16}from"react/jsx-runtime";function CodeInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,...rest}=props,[value,setValue]=useState5(defaultValue2);function handleChange(newValues){let newValue=newValues[0],newCode=valueSetElementToCode(newValue);setValue(newCode),onChange&&onChange(newCode)}return jsx16(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 jsx17}from"react/jsx-runtime";function ResourceTypeInput(props){let[resourceType,setResourceType]=useState6(props.defaultValue),onChange=props.onChange,setResourceTypeWrapper=useCallback4(newResourceType=>{setResourceType(newResourceType),onChange&&onChange(newResourceType)},[onChange]);return jsx17(CodeInput,{"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={menuTitle:"Navbar_menuTitle",link:"Navbar_link",linkActive:"Navbar_linkActive"};import{Fragment as Fragment5,jsx as jsx18,jsxs as jsxs8}from"react/jsx-runtime";function Navbar(props){let navigate=V(),activeLink=getActiveLink(props.pathname,props.searchParams,props.menus),[bookmarkDialogVisible,setBookmarkDialogVisible]=useState7(!1);function onLinkClick(e,to){e.stopPropagation(),e.preventDefault(),navigate(to),window.innerWidth<768&&props.closeNavbar()}function navigateResourceType(resourceType){resourceType&&navigate(`/${resourceType}`)}return jsxs8(Fragment5,{children:[jsx18(MantineAppShell2.Navbar,{children:jsxs8(ScrollArea,{p:"xs",children:[!props.resourceTypeSearchDisabled&&jsx18(MantineAppShell2.Section,{mb:"sm",children:jsx18(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",maxValues:0,onChange:newValue=>navigateResourceType(newValue)},window.location.pathname)}),jsxs8(MantineAppShell2.Section,{grow:!0,children:[props.menus?.map(menu=>jsxs8(Fragment4,{children:[jsx18(Text5,{className:Navbar_default.menuTitle,children:menu.title}),menu.links?.map(link=>jsxs8(NavbarLink,{to:link.href,active:link.href===activeLink?.href,onClick:e=>onLinkClick(e,link.href),children:[jsx18(NavLinkIcon,{to:link.href,icon:link.icon}),jsx18("span",{children:link.label})]},link.href))]},`menu-${menu.title}`)),props.displayAddBookmark&&jsx18(Button2,{variant:"subtle",size:"xs",mt:"xl",leftSection:jsx18(IconPlus,{size:"0.75rem"}),onClick:()=>setBookmarkDialogVisible(!0),children:"Add Bookmark"})]})]})}),props.pathname&&props.searchParams&&jsx18(BookmarkDialog,{pathname:props.pathname,searchParams:props.searchParams,visible:bookmarkDialogVisible,onOk:()=>setBookmarkDialogVisible(!1),onCancel:()=>setBookmarkDialogVisible(!1)})]})}function NavbarLink(props){return jsx18(MedplumLink,{onClick:props.onClick,to:props.to,className:clsx_default(Navbar_default.link,{[Navbar_default.linkActive]:props.active}),children:props.children})}function NavLinkIcon(props){return props.icon?props.icon:jsx18(Space,{w:30})}function getActiveLink(currentPathname,currentSearchParams,menus){if(!currentPathname||!currentSearchParams||!menus)return;let bestLink,bestScore=0;for(let menu of menus)if(menu.links)for(let link of menu.links){let score=getLinkScore(currentPathname,currentSearchParams,link.href);score>bestScore&&(bestScore=score,bestLink=link)}return bestLink}function getLinkScore(currentPathname,currentSearchParams,linkHref){let linkUrl=new URL(linkHref,"https://example.com");if(currentPathname!==linkUrl.pathname)return 0;let ignoredParams=["_count","_offset"];for(let[key,value]of linkUrl.searchParams.entries())if(!ignoredParams.includes(key)&&currentSearchParams.get(key)!==value)return 0;let count=1;for(let[key,value]of currentSearchParams.entries())ignoredParams.includes(key)||linkUrl.searchParams.get(key)===value&&count++;return count}import{jsx as jsx19,jsxs as jsxs9}from"react/jsx-runtime";function AppShell(props){let[navbarOpen,setNavbarOpen]=useState8(localStorage.navbarOpen==="true"),medplum=a(),profile=W();useEffect2(()=>{function eventListener(){showNotification3({color:"red",message:"No connection to server",autoClose:!1})}return medplum.addEventListener("offline",eventListener),()=>medplum.removeEventListener("offline",eventListener)},[medplum]);function setNavbarOpenWrapper(open){localStorage.navbarOpen=open.toString(),setNavbarOpen(open)}function closeNavbar(){setNavbarOpenWrapper(!1)}function toggleNavbar(){setNavbarOpenWrapper(!navbarOpen)}return medplum.isLoading()?jsx19(Loading,{}):jsxs9(MantineAppShell3,{header:{height:60},navbar:{width:250,breakpoint:"sm",collapsed:{desktop:!profile||!navbarOpen,mobile:!profile||!navbarOpen}},padding:0,children:[profile&&jsx19(Header,{pathname:props.pathname,searchParams:props.searchParams,headerSearchDisabled:props.headerSearchDisabled,logo:props.logo,version:props.version,navbarToggle:toggleNavbar,notifications:props.notifications}),profile&&navbarOpen?jsx19(Navbar,{pathname:props.pathname,searchParams:props.searchParams,menus:props.menus,closeNavbar,displayAddBookmark:props.displayAddBookmark,resourceTypeSearchDisabled:props.resourceTypeSearchDisabled}):void 0,jsx19(MantineAppShell3.Main,{className:AppShell_default.main,children:jsx19(ErrorBoundary,{children:jsx19(Suspense,{fallback:jsx19(Loading,{}),children:props.children})})})]})}import{Anchor as Anchor2}from"@mantine/core";import{jsx as jsx20,jsxs as jsxs10}from"react/jsx-runtime";function AttachmentDisplay(props){let{contentType,url:uncachedUrl,title}=props.value??{},url=oe(uncachedUrl);return url?jsxs10("div",{"data-testid":"attachment-display",children:[contentType?.startsWith("image/")&&jsx20("img",{"data-testid":"attachment-image",style:{maxWidth:props.maxWidth},src:url,alt:title}),contentType?.startsWith("video/")&&jsx20("video",{"data-testid":"attachment-video",style:{maxWidth:props.maxWidth},controls:!0,children:jsx20("source",{type:contentType,src:url})}),contentType==="application/pdf"&&jsx20("div",{"data-testid":"attachment-pdf",style:{maxWidth:props.maxWidth,minHeight:400},children:jsx20("iframe",{width:"100%",height:"400",src:url+"#navpanes=0",allowFullScreen:!0,frameBorder:0,seamless:!0})}),jsx20("div",{"data-testid":"download-link",style:{padding:"2px 16px 16px 16px"},children:jsx20(Anchor2,{href:url,"data-testid":"attachment-details",target:"_blank",rel:"noopener noreferrer",download:getDownloadName(title),children:title||"Download"})})]}):null}function getDownloadName(title){return title?.includes(".")?title:void 0}var DescriptionList_default={root:"DescriptionList_root",compact:"DescriptionList_compact"};import{Fragment as Fragment6,jsx as jsx21,jsxs as jsxs11}from"react/jsx-runtime";function DescriptionList(props){let{children,compact}=props;return jsx21("dl",{className:clsx_default(DescriptionList_default.root,{[DescriptionList_default.compact]:compact}),children})}function DescriptionListEntry(props){return jsxs11(Fragment6,{children:[jsx21("dt",{children:props.term}),jsx21("dd",{children:props.children})]})}import{getPathDisplayName,isPopulated}from"@medplum/core";import{Fragment as Fragment7,jsx as jsx22}from"react/jsx-runtime";function AttachmentArrayDisplay(props){let attachmentElements=props.values?.map((v2,index)=>jsx22("div",{children:jsx22(AttachmentDisplay,{value:v2,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(!isPopulated(props.path))throw new Error("props.path is required when includeDescriptionListEntry is true");let key=props.path.split(".").pop();content=jsx22(DescriptionListEntry,{term:getPathDisplayName(key),children:attachmentElements})}else content=jsx22(Fragment7,{children:attachmentElements});return content}import{ActionIcon}from"@mantine/core";import{useRef as useRef4,useState as useState9}from"react";import{normalizeOperationOutcome}from"@medplum/core";import{useRef as useRef3}from"react";import{Fragment as Fragment8,jsx as jsx23,jsxs as jsxs12}from"react/jsx-runtime";function AttachmentButton(props){let medplum=a(),fileInputRef=useRef3(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 jsxs12(Fragment8,{children:[jsx23("input",{type:"file","data-testid":"upload-file-input",style:{display:"none"},ref:fileInputRef,onChange:e=>onFileChange(e)}),props.children({onClick})]})}import{jsx as jsx24,jsxs as jsxs13}from"react/jsx-runtime";function AttachmentArrayInput(props){let[values,setValues]=useState9(props.defaultValue??[]),valuesRef=useRef4();valuesRef.current=values;function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}return jsxs13("table",{style:{width:"100%"},children:[jsxs13("colgroup",{children:[jsx24("col",{width:"97%"}),jsx24("col",{width:"3%"})]}),jsxs13("tbody",{children:[values.map((v2,index)=>jsxs13("tr",{children:[jsx24("td",{children:jsx24(AttachmentDisplay,{value:v2,maxWidth:200})}),jsx24("td",{children:jsx24(ActionIcon,{title:"Remove",variant:"subtle",size:"sm",color:"gray",onClick:e=>{killEvent(e);let copy=values.slice();copy.splice(index,1),setValuesWrapper(copy)},children:jsx24(IconCircleMinus,{})})})]},`${index}-${values.length}`)),jsxs13("tr",{children:[jsx24("td",{}),jsx24("td",{children:jsx24(AttachmentButton,{onUpload:attachment=>{setValuesWrapper([...valuesRef.current,attachment])},children:props2=>jsx24(ActionIcon,{...props2,title:"Add",variant:"subtle",size:"sm",color:"green",children:jsx24(IconCloudUpload,{})})})})]})]})]})}import{Button as Button3}from"@mantine/core";import{useState as useState10}from"react";import{Fragment as Fragment9,jsx as jsx25,jsxs as jsxs14}from"react/jsx-runtime";function AttachmentInput(props){let[value,setValue]=useState10(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return value?jsxs14(Fragment9,{children:[jsx25(AttachmentDisplay,{value,maxWidth:200}),jsx25(Button3,{onClick:e=>{killEvent(e),setValueWrapper(void 0)},children:"Remove"})]}):jsx25(AttachmentButton,{securityContext:props.securityContext,onUpload:setValueWrapper,children:props2=>jsx25(Button3,{...props2,children:"Upload..."})})}import{buildElementsContext as buildElementsContext2,getPathDisplayName as getPathDisplayName3,isEmpty as isEmpty2,tryGetDataType}from"@medplum/core";var DEFAULT_IGNORED_PROPERTIES=["meta","implicitRules","contained","extension","modifierExtension"],DEFAULT_IGNORED_NON_NESTED_PROPERTIES=["language","text"];import{ActionIcon as ActionIcon2,Box,CopyButton,Tooltip}from"@mantine/core";import{PropertyType,formatDateTime,formatPeriod,formatTiming,isEmpty}from"@medplum/core";import{formatCodeableConcept}from"@medplum/core";import{Fragment as Fragment10,jsx as jsx26}from"react/jsx-runtime";function CodeableConceptDisplay(props){return jsx26(Fragment10,{children:formatCodeableConcept(props.value)})}import{formatCoding}from"@medplum/core";import{Fragment as Fragment11,jsx as jsx27}from"react/jsx-runtime";function CodingDisplay(props){return jsx27(Fragment11,{children:formatCoding(props.value)})}import{Fragment as Fragment12,jsx as jsx28}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("]")),jsx28(Fragment12,{children:builder.join("").trim()})}import{Fragment as Fragment13,jsx as jsx29,jsxs as jsxs15}from"react/jsx-runtime";function ContactDetailDisplay(props){let contactDetail=props.value;return contactDetail?jsxs15(Fragment13,{children:[contactDetail.name,contactDetail.name&&": ",contactDetail.telecom?.map(telecom=>jsx29(ContactPointDisplay,{value:telecom},`telecom-${contactDetail.name}-${telecom.value}`))]}):null}import{jsxs as jsxs16}from"react/jsx-runtime";function IdentifierDisplay(props){return jsxs16("div",{children:[props.value?.system,": ",props.value?.value]})}import{formatMoney}from"@medplum/core";import{Fragment as Fragment14,jsx as jsx30}from"react/jsx-runtime";function MoneyDisplay(props){return jsx30(Fragment14,{children:formatMoney(props.value)})}import{formatQuantity}from"@medplum/core";import{Fragment as Fragment15,jsx as jsx31}from"react/jsx-runtime";function QuantityDisplay(props){return jsx31(Fragment15,{children:formatQuantity(props.value)})}import{formatRange}from"@medplum/core";import{Fragment as Fragment16,jsx as jsx32}from"react/jsx-runtime";function RangeDisplay(props){return jsx32(Fragment16,{children:formatRange(props.value)})}import{Fragment as Fragment17,jsx as jsx33,jsxs as jsxs17}from"react/jsx-runtime";function RatioDisplay(props){let value=props.value;return value?jsxs17(Fragment17,{children:[jsx33(QuantityDisplay,{value:value.numerator}),"\xA0/\xA0",jsx33(QuantityDisplay,{value:value.denominator})]}):null}import{stringify}from"@medplum/core";import{Fragment as Fragment18,jsx as jsx34}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?jsx34(MedplumLink,{to:props.value,children:displayString}):jsx34(Fragment18,{children:displayString})}import{getPathDisplayName as getPathDisplayName2,isPopulated as isPopulated5}from"@medplum/core";import{useState as useState11,useContext as useContext2,useEffect as useEffect3,useMemo as useMemo2}from"react";import{isPopulated as isPopulated2}from"@medplum/core";import React from"react";var ElementsContext=React.createContext({path:"",profileUrl:void 0,elements:Object.create(null),elementsByPath:Object.create(null),debugMode:!1});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])=>!isPopulated2(element.type)||element.max===0||element.path.toLowerCase().endsWith("extension.url")&&element.fixed||EXTENSION_KEYS.includes(key)&&!isPopulated2(element.slicing?.slices)||IGNORED_PROPERTIES.includes(key)?!1:!(DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key)&&element.path.split(".").length===2||key.includes(".")))}import{getValueSliceName,isPopulated as isPopulated3,isSliceDefinitionWithTypes,tryGetProfile}from"@medplum/core";function assignValuesIntoSlices(values,slices,slicing,profileUrl){if(!isPopulated3(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;isPopulated3(slice.elements)||(profileUrl=slice.type[0]?.profile?.[0]),supportedSlices.push(slice),profileUrls.push(profileUrl),profileUrl?promises.push(medplum.requestProfileSchema(profileUrl)):promises.push(Promise.resolve([]))}Promise.all(promises).then(()=>{for(let i=0;i<supportedSlices.length;i++){let slice=supportedSlices[i],profileUrl=profileUrls[i];if(profileUrl){let typeSchema=tryGetProfile(profileUrl);slice.typeSchema=typeSchema}}resolve(supportedSlices)}).catch(reject)})}import{buildElementsContext,isPopulated as isPopulated4}from"@medplum/core";import{useContext,useMemo}from"react";import{jsx as jsx35}from"react/jsx-runtime";function maybeWrapWithContext(ContextProvider,contextValue,contents){return contextValue!==void 0?jsx35(ContextProvider,{value:contextValue,children:contents}):contents}import{Fragment as Fragment19,jsx as jsx36}from"react/jsx-runtime";function SliceDisplay(props){let{slice,property}=props,sliceElements=slice.typeSchema?.elements??slice.elements,parentContext=useContext(ElementsContext),contextValue=useMemo(()=>{if(isPopulated4(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,jsx36(Fragment19,{children:props.value.map((value,valueIndex)=>jsx36("div",{children:jsx36(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 Fragment20,jsx as jsx37,jsxs as jsxs18}from"react/jsx-runtime";function ResourceArrayDisplay(props){let{property,propertyType}=props,medplum=a(),values=useMemo2(()=>Array.isArray(props.values)?props.values:[],[props.values]),[loading,setLoading]=useState11(!0),[slices,setSlices]=useState11([]),[slicedValues,setSlicedValues]=useState11(()=>[values]),ctx=useContext2(ElementsContext);if(useEffect3(()=>{prepareSlices({medplum,property}).then(slices2=>{setSlices(slices2);let slicedValues2=assignValuesIntoSlices(values,slices2,property.slicing,ctx.profileUrl);setSlicedValues(slicedValues2),setLoading(!1)}).catch(reason=>{console.error(reason),setLoading(!1)})},[medplum,property,ctx.profileUrl,setSlicedValues,values]),loading)return jsx37("div",{children:"Loading..."});let nonSliceContent;if(property.type[0]?.code!=="Extension"){let nonSliceValues=slicedValues[slices.length],nonSliceElements=nonSliceValues.map((value,valueIndex)=>jsx37("div",{children:jsx37(ResourcePropertyDisplay,{path:props.path,arrayElement:!0,property,propertyType,value,ignoreMissingValues:props.ignoreMissingValues,link:props.link})},`${valueIndex}-${nonSliceValues.length}`));if(props.includeDescriptionListEntry){if(!isPopulated5(props.path))throw new Error("props.path is required when includeDescriptionListEntry is true");let key=props.path.split(".").pop();nonSliceContent=jsx37(DescriptionListEntry,{term:getPathDisplayName2(key),children:nonSliceElements})}else nonSliceContent=jsx37(Fragment20,{children:nonSliceElements})}return jsxs18(Fragment20,{children:[slices.map((slice,sliceIndex)=>{if(!props.path)throw Error(`Displaying a resource property with slices of type ${props.propertyType} requires path`);let sliceDisplay=jsx37(SliceDisplay,{path:props.path,slice,property,value:slicedValues[sliceIndex],ignoreMissingValues:props.ignoreMissingValues,link:props.link},slice.name);return props.includeDescriptionListEntry&&(sliceDisplay=jsx37(DescriptionListEntry,{term:getPathDisplayName2(slice.name),children:sliceDisplay},slice.name)),sliceDisplay}),nonSliceContent]})}import{getDataType,isPopulated as isPopulated6,isProfileLoaded,tryGetProfile as tryGetProfile2}from"@medplum/core";import{useContext as useContext3,useEffect as useEffect4,useMemo as useMemo3,useState as useState12}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 jsx38}from"react/jsx-runtime";function ExtensionDisplay(props){let{elementDefinitionType}=props,medplum=a(),ctx=useContext3(ElementsContext),[typeSchema,setTypeSchema]=useState12(getDataType("Extension")),profileUrl=useMemo3(()=>{if(isPopulated6(elementDefinitionType?.profile))return elementDefinitionType.profile[0]},[elementDefinitionType]),[loadingProfile,setLoadingProfile]=useState12(profileUrl!==void 0);if(useEffect4(()=>{profileUrl&&(setLoadingProfile(!0),medplum.requestProfileSchema(profileUrl).then(()=>{let profile=tryGetProfile2(profileUrl);setLoadingProfile(!1),profile&&setTypeSchema(profile)}).catch(reason=>{setLoadingProfile(!1),console.warn(reason)}))},[medplum,profileUrl]),profileUrl&&(loadingProfile||!isProfileLoaded(profileUrl)))return jsx38("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 jsx38(ResourcePropertyDisplay,{propertyType,value:propertyValue})}return jsx38(BackboneElementDisplay,{path:props.path,value:{type:typeSchema.name,value:props.value},compact:props.compact,ignoreMissingValues:props.ignoreMissingValues,link:props.link,profileUrl})}import{Fragment as Fragment21,jsx as jsx39,jsxs as jsxs19}from"react/jsx-runtime";function ResourcePropertyDisplay(props){let{property,propertyType,value}=props;if(property?.path?.endsWith(".id"))return jsxs19(Box,{component:"div",style:{display:"flex",gap:3,alignItems:"center"},children:[value,!isEmpty(value)&&jsx39(CopyButton,{value,timeout:2e3,children:({copied,copy})=>jsx39(Tooltip,{label:copied?"Copied":"Copy",withArrow:!0,position:"right",children:jsx39(ActionIcon2,{variant:"subtle",color:copied?"teal":"gray",onClick:copy,children:copied?jsx39(IconCheck,{size:"1rem"}):jsx39(IconCopy,{size:"1rem"})})})})]});let isArrayElement=!!props.arrayElement;if(property?.max&&property.max>1&&!isArrayElement)return propertyType===PropertyType.Attachment?jsx39(AttachmentArrayDisplay,{values:value,maxWidth:props.maxWidth,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,property,path:props.path}):jsx39(ResourceArrayDisplay,{path:props.path,property,propertyType,values:value,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,ignoreMissingValues:props.ignoreMissingValues,link:props.link});switch(propertyType){case PropertyType.boolean:return jsx39(Fragment21,{children:value===void 0?"":(!!value).toString()});case PropertyType.SystemString:case PropertyType.string:return jsx39("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:return jsx39(Fragment21,{children:value});case PropertyType.canonical:return jsx39(ReferenceDisplay,{value:{reference:value},link:props.link});case PropertyType.dateTime:case PropertyType.instant:return jsx39(Fragment21,{children:formatDateTime(value)});case PropertyType.markdown:return jsx39("pre",{children:value});case PropertyType.Address:return jsx39(AddressDisplay,{value});case PropertyType.Annotation:return jsx39(Fragment21,{children:value?.text});case PropertyType.Attachment:return jsx39(AttachmentDisplay,{value,maxWidth:props.maxWidth});case PropertyType.CodeableConcept:return jsx39(CodeableConceptDisplay,{value});case PropertyType.Coding:return jsx39(CodingDisplay,{value});case PropertyType.ContactDetail:return jsx39(ContactDetailDisplay,{value});case PropertyType.ContactPoint:return jsx39(ContactPointDisplay,{value});case PropertyType.HumanName:return jsx39(HumanNameDisplay,{value});case PropertyType.Identifier:return jsx39(IdentifierDisplay,{value});case PropertyType.Money:return jsx39(MoneyDisplay,{value});case PropertyType.Period:return jsx39(Fragment21,{children:formatPeriod(value)});case PropertyType.Quantity:case PropertyType.Duration:return jsx39(QuantityDisplay,{value});case PropertyType.Range:return jsx39(RangeDisplay,{value});case PropertyType.Ratio:return jsx39(RatioDisplay,{value});case PropertyType.Reference:return jsx39(ReferenceDisplay,{value,link:props.link});case PropertyType.Timing:return jsx39(Fragment21,{children:formatTiming(value)});case PropertyType.Dosage:case PropertyType.UsageContext:if(!props.path)throw Error(`Displaying property of type ${props.propertyType} requires path`);return jsx39(BackboneElementDisplay,{path:props.path,value:{type:propertyType,value},compact:!0,ignoreMissingValues:props.ignoreMissingValues});case PropertyType.Extension:if(!props.path)throw Error(`Displaying property of type ${props.propertyType} requires path`);return jsx39(ExtensionDisplay,{path:props.path,value,compact:!0,ignoreMissingValues:props.ignoreMissingValues,elementDefinitionType:props.elementDefinitionType});default:if(!property)throw Error(`Displaying property of type ${props.propertyType} requires element schema`);if(!props.path)throw Error(`Displaying property of type ${props.propertyType} requires path`);return jsx39(BackboneElementDisplay,{path:props.path,value:{type:property.type[0].code,value},compact:!0,ignoreMissingValues:props.ignoreMissingValues})}}import{useContext as useContext4,useMemo as useMemo4}from"react";import{jsx as jsx40,jsxs as jsxs20}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=useContext4(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo4(()=>tryGetDataType(typeName,profileUrl),[profileUrl,typeName]),newElementsContext=useMemo4(()=>{if(typeSchema)return buildElementsContext2({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url})},[typeSchema,props.path,parentElementsContext]);if(isEmpty2(value))return null;if(!typeSchema)return jsxs20("div",{children:[typeName,"\xA0not implemented"]});if(typeof value=="object"&&"name"in value&&Object.keys(value).length===1&&typeof value.name=="string")return jsx40("div",{children:value.name});let elementsContext=newElementsContext??parentElementsContext;return maybeWrapWithContext(ElementsContext.Provider,newElementsContext,jsx40(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=jsx40(ResourcePropertyDisplay,{property,propertyType,path:props.path+"."+key,value:propertyValue,ignoreMissingValues:props.ignoreMissingValues,includeArrayDescriptionListEntry:isArrayProperty,link:props.link},key);return isArrayProperty?resourcePropertyDisplay:jsx40(DescriptionListEntry,{term:getPathDisplayName3(key),children:resourcePropertyDisplay},key)})}))}import{buildElementsContext as buildElementsContext4,tryGetDataType as tryGetDataType2}from"@medplum/core";import{useContext as useContext13,useMemo as useMemo12,useState as useState33}from"react";import{Stack as Stack6}from"@mantine/core";import{getPathDisplayName as getPathDisplayName5}from"@medplum/core";import{useContext as useContext12,useMemo as useMemo11,useState as useState32}from"react";import{Group as Group8,Input}from"@mantine/core";import{useContext as useContext5}from"react";import{jsx as jsx41,jsxs as jsxs21}from"react/jsx-runtime";function CheckboxFormSection(props){let{debugMode}=useContext5(ElementsContext),label;return debugMode&&props.fhirPath?label=`${props.title} - ${props.fhirPath}`:label=props.title,jsxs21(Group8,{wrap:"nowrap","data-testid":props.testId,children:[jsx41("div",{children:props.children}),jsx41("div",{children:jsx41(Input.Wrapper,{id:props.htmlFor,label,description:props.description,withAsterisk:props.withAsterisk,children:null})})]})}import{Input as Input2}from"@mantine/core";import{useContext as useContext6}from"react";function getErrorsForInput(outcome,expression){return outcome?.issue?.filter(issue=>isExpressionMatch(issue.expression?.[0],expression))?.map(issue=>issue.details?.text)?.join(`
65
+ `)}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 jsx42}from"react/jsx-runtime";function FormSection(props){let{debugMode}=useContext6(ElementsContext),label;return debugMode&&props.fhirPath?label=`${props.title} - ${props.fhirPath}`:label=props.title,jsx42(Input2.Wrapper,{id:props.htmlFor,label,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 obj[propName]=value,obj}function isSupportedProfileStructureDefinition(profile){return!!profile&&!isEmpty3(profile.url)&&!isEmpty3(profile.name)}import{Checkbox,Group as Group22,NativeSelect as NativeSelect9,Textarea as Textarea2,TextInput as TextInput12}from"@mantine/core";import{applyDefaultValuesToElement,capitalize as capitalize2,getPathDifference,HTTP_HL7_ORG,isComplexTypeCode,isEmpty as isEmpty6,isPopulated as isPopulated11,PropertyType as PropertyType2}from"@medplum/core";import{useContext as useContext11,useMemo as useMemo10,useState as useState31}from"react";import{useState as useState13}from"react";import{jsx as jsx43}from"react/jsx-runtime";function CodeableConceptInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,outcome:_outcome,path:_path,valuePath:_valuePath,...rest}=props,[value,setValue]=useState13(defaultValue2);function handleChange(newValues){let newConcept=valueSetElementToCodeableConcept(newValues);setValue(newConcept),onChange&&onChange(newConcept)}return jsx43(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 useState14}from"react";import{jsx as jsx44}from"react/jsx-runtime";function CodingInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,...rest}=props,[value,setValue]=useState14(defaultValue2);function handleChange(newValues){let newValue=newValues[0],newConcept=newValue&&valueSetElementToCoding(newValue);setValue(newConcept),onChange&&onChange(newConcept)}return jsx44(ValueSetAutocomplete,{defaultValue:value&&codingToValueSetElement(value),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 Group10,TextInput as TextInput5}from"@mantine/core";import{useRef as useRef6,useState as useState16}from"react";import{Group as Group9,NativeSelect as NativeSelect3,TextInput as TextInput4}from"@mantine/core";import{useContext as useContext7,useMemo as useMemo5,useRef as useRef5,useState as useState15}from"react";import{jsx as jsx45,jsxs as jsxs22}from"react/jsx-runtime";function ContactPointInput(props){let{path,outcome}=props,{elementsByPath}=useContext7(ElementsContext),[contactPoint,setContactPoint]=useState15(props.defaultValue),ref=useRef5();ref.current=contactPoint;let[systemElement,useElement,valueElement]=useMemo5(()=>["system","use","value"].map(field=>elementsByPath[path+"."+field]),[elementsByPath,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={...ref.current,system};system||delete newValue.system,setContactPointWrapper(newValue)}function setUse(use){let newValue={...ref.current,use};use||delete newValue.use,setContactPointWrapper(newValue)}function setValue(value){let newValue={...ref.current,value};value||delete newValue.value,setContactPointWrapper(newValue)}let errorPath=props.valuePath??path;return jsxs22(Group9,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx45(NativeSelect3,{"data-testid":"system",defaultValue:contactPoint?.system,required:(systemElement?.min??0)>0,onChange:e=>setSystem(e.currentTarget.value),data:["","email","phone","fax","pager","sms","other"],error:getErrorsForInput(outcome,errorPath+".system")}),jsx45(NativeSelect3,{"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")}),jsx45(TextInput4,{placeholder:"Value",defaultValue:contactPoint?.value,required:(valueElement?.min??0)>0,onChange:e=>setValue(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".value")})]})}import{jsx as jsx46,jsxs as jsxs23}from"react/jsx-runtime";function ContactDetailInput(props){let[contactPoint,setContactDetail]=useState16(props.defaultValue),ref=useRef6();ref.current=contactPoint;function setContactDetailWrapper(newValue){setContactDetail(newValue),props.onChange&&props.onChange(newValue)}function setName(name){let newValue={...ref.current,name};name||delete newValue.name,setContactDetailWrapper(newValue)}function setTelecom(telecom){let newValue={...ref.current,telecom:telecom&&[telecom]};telecom||delete newValue.telecom,setContactDetailWrapper(newValue)}return jsxs23(Group10,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx46(TextInput5,{"data-testid":props.name+"-name",name:props.name+"-name",placeholder:"Name",style:{width:180},defaultValue:contactPoint?.name,onChange:e=>setName(e.currentTarget.value)}),jsx46(ContactPointInput,{name:props.name+"-telecom",path:props.path+".telecom",defaultValue:contactPoint?.telecom?.[0],onChange:setTelecom,outcome:props.outcome})]})}import{TextInput as TextInput6}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 jsx47}from"react/jsx-runtime";function DateTimeInput(props){return jsx47(TextInput6,{id:props.name,name:props.name,label:props.label,"data-autofocus":props.autoFocus,"data-testid":props.name,placeholder:props.placeholder,required:props.required,type:getInputType(),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{tryGetProfile as tryGetProfile3,isProfileLoaded as isProfileLoaded2,isPopulated as isPopulated7}from"@medplum/core";import{useEffect as useEffect5,useMemo as useMemo6,useState as useState17}from"react";import{jsx as jsx48}from"react/jsx-runtime";function ExtensionInput(props){let{propertyType}=props,medplum=a(),[typeSchema,setTypeSchema]=useState17(),profileUrl=useMemo6(()=>{if(isPopulated7(propertyType.profile))return propertyType.profile[0]},[propertyType]),[loadingProfile,setLoadingProfile]=useState17(profileUrl!==void 0);return useEffect5(()=>{profileUrl&&(setLoadingProfile(!0),medplum.requestProfileSchema(profileUrl).then(()=>{let profile=tryGetProfile3(profileUrl);setLoadingProfile(!1),setTypeSchema(profile)}).catch(reason=>{setLoadingProfile(!1),console.warn(reason)}))},[medplum,profileUrl]),profileUrl&&(loadingProfile||!isProfileLoaded2(profileUrl))?jsx48("div",{children:"Loading..."}):jsx48(BackboneElementInput,{profileUrl,path:props.path,typeName:typeSchema?.name??"Extension",defaultValue:props.defaultValue,onChange:props.onChange})}import{Group as Group11,NativeSelect as NativeSelect4,TextInput as TextInput7}from"@mantine/core";import{useState as useState18}from"react";import{jsx as jsx49,jsxs as jsxs24}from"react/jsx-runtime";function HumanNameInput(props){let{outcome,path}=props,[value,setValue]=useState18(props.defaultValue);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 jsxs24(Group11,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx49(NativeSelect4,{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")}),jsx49(TextInput7,{placeholder:"Prefix",name:props.name+"-prefix",defaultValue:value?.prefix?.join(" "),onChange:e=>setPrefix(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".prefix")}),jsx49(TextInput7,{placeholder:"Given",name:props.name+"-given",defaultValue:value?.given?.join(" "),onChange:e=>setGiven(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".given")}),jsx49(TextInput7,{name:props.name+"-family",placeholder:"Family",defaultValue:value?.family,onChange:e=>setFamily(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".family")}),jsx49(TextInput7,{placeholder:"Suffix",name:props.name+"-suffix",defaultValue:value?.suffix?.join(" "),onChange:e=>setSuffix(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".suffix")})]})}import{Group as Group12,TextInput as TextInput8}from"@mantine/core";import{useContext as useContext8,useMemo as useMemo7,useState as useState19}from"react";import{jsx as jsx50,jsxs as jsxs25}from"react/jsx-runtime";function IdentifierInput(props){let[value,setValue]=useState19(props.defaultValue),{elementsByPath}=useContext8(ElementsContext),[systemElement,valueElement]=useMemo7(()=>["system","value"].map(field=>elementsByPath[props.path+"."+field]),[elementsByPath,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let errorPath=props.valuePath??props.path;return jsxs25(Group12,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx50(TextInput8,{placeholder:"System",required:(systemElement?.min??0)>0,defaultValue:value?.system,onChange:e=>setValueWrapper({...value,system:e.currentTarget.value}),error:getErrorsForInput(props.outcome,errorPath+".system")}),jsx50(TextInput8,{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 TextInput9}from"@mantine/core";import{useCallback as useCallback5,useState as useState20}from"react";import{jsx as jsx51}from"react/jsx-runtime";var data=["USD","EUR","CAD","GBP","AUD"];function MoneyInput(props){let{onChange}=props,[value,setValue]=useState20(props.defaultValue),setValueWrapper=useCallback5(newValue=>{setValue(newValue),onChange&&onChange(newValue)},[onChange]),handleCurrencyChange=useCallback5(e=>{setValueWrapper({...value,currency:e.currentTarget.value})},[value,setValueWrapper]),handleValueChange=useCallback5(e=>{setValueWrapper({...value,value:e.currentTarget.valueAsNumber})},[value,setValueWrapper]),select=jsx51(NativeSelect5,{defaultValue:value?.currency,data,styles:{input:{fontWeight:500,borderTopLeftRadius:0,borderBottomLeftRadius:0,width:92}},onChange:handleCurrencyChange});return jsx51(TextInput9,{type:"number",name:props.name,label:props.label,placeholder:props.placeholder??"Value",defaultValue:value?.value?.toString()??"USD",leftSection:jsx51(IconCurrencyDollar,{size:14}),rightSection:select,rightSectionWidth:92,onChange:handleValueChange})}import{Group as Group13}from"@mantine/core";import{useState as useState21}from"react";import{jsx as jsx52,jsxs as jsxs26}from"react/jsx-runtime";function PeriodInput(props){let[value,setValue]=useState21(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs26(Group13,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx52(DateTimeInput,{name:props.name+".start",placeholder:"Start",defaultValue:value?.start,onChange:newValue=>setValueWrapper({...value,start:newValue})}),jsx52(DateTimeInput,{name:props.name+".end",placeholder:"End",defaultValue:value?.end,onChange:newValue=>setValueWrapper({...value,end:newValue})})]})}import{Group as Group14,NativeSelect as NativeSelect6,TextInput as TextInput10}from"@mantine/core";import{useState as useState22}from"react";import{jsx as jsx53,jsxs as jsxs27}from"react/jsx-runtime";function QuantityInput(props){let[value,setValue]=useState22(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs27(Group14,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx53(NativeSelect6,{style:{width:80},"data-testid":props.name+"-comparator",defaultValue:value?.comparator,data:["","<","<=",">=",">"],onChange:e=>setValueWrapper({...value,comparator:e.currentTarget.value})}),jsx53(TextInput10,{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)})}}),jsx53(TextInput10,{placeholder:"Unit","data-testid":props.name+"-unit",defaultValue:value?.unit,onChange:e=>setValueWrapper({...value,unit:e.currentTarget.value})})]})}function tryParseNumber(str){if(str)return parseFloat(str)}import{Group as Group15}from"@mantine/core";import{useState as useState23}from"react";import{jsx as jsx54,jsxs as jsxs28}from"react/jsx-runtime";function RangeInput(props){let[value,setValue]=useState23(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs28(Group15,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx54(QuantityInput,{name:props.name+"-low",defaultValue:value?.low,onChange:v2=>setValueWrapper({...value,low:v2})}),jsx54(QuantityInput,{name:props.name+"-high",defaultValue:value?.high,onChange:v2=>setValueWrapper({...value,high:v2})})]})}import{Group as Group16}from"@mantine/core";import{useState as useState24}from"react";import{jsx as jsx55,jsxs as jsxs29}from"react/jsx-runtime";function RatioInput(props){let[value,setValue]=useState24(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs29(Group16,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx55(QuantityInput,{name:props.name+"-numerator",defaultValue:value?.numerator,onChange:v2=>setValueWrapper({...value,numerator:v2})}),jsx55(QuantityInput,{name:props.name+"-denominator",defaultValue:value?.denominator,onChange:v2=>setValueWrapper({...value,denominator:v2})})]})}import{Group as Group18,NativeSelect as NativeSelect7}from"@mantine/core";import{LRUCache,ReadablePromise,createReference as createReference2,isEmpty as isEmpty4,isPopulated as isPopulated9,tryGetProfile as tryGetProfile4}from"@medplum/core";import{useCallback as useCallback7,useEffect as useEffect6,useMemo as useMemo8,useRef as useRef7,useState as useState26}from"react";import{Group as Group17,Text as Text6}from"@mantine/core";import{getDisplayString as getDisplayString3,getReferenceString as getReferenceString3,isPopulated as isPopulated8}from"@medplum/core";import{forwardRef as forwardRef4,useCallback as useCallback6,useState as useState25}from"react";import{jsx as jsx56,jsxs as jsxs30}from"react/jsx-runtime";var SEARCH_CODES={Device:"device-name",Observation:"code",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","RiskEvidenceSynthesis","SearchParameter","StructureDefinition","StructureMap","TerminologyCapabilities","TestScript","UserConfiguration","ValueSet"];function toOption3(resource){return{value:getReferenceString3(resource),label:getDisplayString3(resource),resource}}function ResourceInput(props){let medplum=a(),{resourceType,searchCriteria}=props,[outcome,setOutcome]=useState25(),defaultValue2=pe(props.defaultValue,setOutcome),onChange=props.onChange,loadValues=useCallback6(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=useCallback6(newResources=>{onChange&&onChange(newResources[0])},[onChange]);return isPopulated8(props.defaultValue)&&!outcome&&!defaultValue2?null:jsx56(AsyncAutocomplete,{name:props.name,required:props.required,itemComponent:ItemComponent3,defaultValue:defaultValue2,placeholder:props.placeholder,maxValues:1,toOption:toOption3,loadOptions:loadValues,onChange:handleChange,clearable:!0})}var ItemComponent3=forwardRef4(({label,resource,...others},ref)=>jsx56("div",{ref,...others,children:jsxs30(Group17,{wrap:"nowrap",children:[jsx56(ResourceAvatar,{value:resource}),jsxs30("div",{children:[jsx56(Text6,{children:label}),jsx56(Text6,{size:"xs",c:"dimmed",children:resource.birthDate})]})]})}));function getSearchParamForResourceType(resourceType){return SEARCH_CODES[resourceType]??(NAME_RESOURCE_TYPES.includes(resourceType)?"name":"_id")}import{jsx as jsx57,jsxs as jsxs31}from"react/jsx-runtime";function ReferenceInput(props){let{onChange}=props,medplum=a(),[value,setValue]=useState26(props.defaultValue),[targetTypes,setTargetTypes]=useState26(()=>createTargetTypes(props.targetTypes)),[targetType,setTargetType]=useState26(()=>getInitialTargetType(props.defaultValue,targetTypes)),promiseCache=useRef7(new LRUCache),searchCriteria=useMemo8(()=>targetType?.type==="profile"?{...props.searchCriteria,_profile:targetType.value}:props.searchCriteria,[props.searchCriteria,targetType]);useEffect6(()=>{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?isPopulated9(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=useCallback7(item=>{let newValue=item?createReference2(item):void 0;setValue(newValue),onChange&&onChange(newValue)},[onChange]),typeSelectOptions=useMemo8(()=>targetTypes?targetTypes.map(tt=>({value:tt.value,label:tt.type==="profile"?tt.title??tt.name??tt.resourceType??tt.value:tt.value})):[],[targetTypes]);return jsxs31(Group18,{gap:"xs",grow:!0,wrap:"nowrap",children:[targetTypes&&targetTypes.length>1&&jsx57(NativeSelect7,{"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&&jsx57(ResourceTypeInput,{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"}),jsx57(ResourceInput,{resourceType:targetType?.resourceType,name:props.name+"-id",required:props.required,placeholder:props.placeholder,defaultValue:value,searchCriteria,onChange:setValueHelper})]})}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=tryGetProfile4(profileUrl);if(profile)return{type:profile.type,name:profile.name,title:profile.title};let query=`{
66
66
  StructureDefinitionList(url: "${profileUrl}", _sort: "_lastUpdated", _count: 1) {
67
67
  type,
68
68
  name,
69
69
  title,
70
70
  }
71
- }`.replace(/\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 Group20,Stack as Stack4}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useContext as useContext10,useEffect as useEffect7,useState as useState28}from"react";import{Group as Group19,Stack as Stack3}from"@mantine/core";import{buildElementsContext as buildElementsContext3,getPropertyDisplayName,isEmpty as isEmpty5,isPopulated as isPopulated9}from"@medplum/core";import{useContext as useContext9,useMemo as useMemo9,useState as useState27}from"react";import{Button as Button4,ActionIcon as ActionIcon3}from"@mantine/core";import{jsx as jsx58}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx58(Button4,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx58(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx58(ActionIcon3,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx58(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon4}from"@mantine/core";import{jsx as jsx59}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx59(ActionIcon4,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx59(IconCircleMinus,{size:"1.25rem"})})}var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{jsx as jsx60,jsxs as jsxs32}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState27(props.defaultValue),sliceElements=slice.typeSchema?.elements??slice.elements,parentElementsContextValue=useContext9(ElementsContext),contextValue=useMemo9(()=>{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);return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx60(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,children:jsxs32(Stack3,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs32(Group19,{wrap:"nowrap",children:[jsx60("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx60(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})}),values.length>slice.min&&jsx60(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}`)),values.length<slice.max&&jsx60(Group19,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx60(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx61,jsxs as jsxs33}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=a(),[loading,setLoading]=useState28(!0),[slices,setSlices]=useState28([]),[defaultValue2]=useState28(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState28(()=>[defaultValue2]),ctx=useContext10(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect7(()=>{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 jsx61("div",{children:"Loading..."});let nonSliceIndex=slices.length,nonSliceValues=slicedValues[nonSliceIndex],showNonSliceValues=!(props.hideNonSliceValues??(propertyTypeCode==="Extension"&&slices.length>0)),propertyDisplayName=getPathDisplayName4(property.path);return jsxs33(Stack4,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[slices.map((slice,sliceIndex)=>jsx61(SliceInput,{slice,path:props.path,property,defaultValue:slicedValues[sliceIndex],onChange:newValue=>{setValuesWrapper(newValue,sliceIndex)},testId:`slice-${slice.name}`},slice.name)),showNonSliceValues&&nonSliceValues.map((value,valueIndex)=>jsxs33(Group20,{wrap:"nowrap",style:{flexGrow:1},children:[jsx61("div",{style:{flexGrow:1},children:jsx61(ResourcePropertyInput,{arrayElement:!0,property:props.property,name:props.name+"."+valueIndex,path:props.path,defaultValue:value,onChange:newValue=>{let newNonSliceValues=[...nonSliceValues];newNonSliceValues[valueIndex]=newValue,setValuesWrapper(newNonSliceValues,nonSliceIndex)},defaultPropertyType:void 0,outcome:props.outcome})}),jsx61(ArrayRemoveButton,{propertyDisplayName,testId:`nonsliced-remove-${valueIndex}`,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.splice(valueIndex,1),setValuesWrapper(newNonSliceValues,nonSliceIndex)}})]},`${valueIndex}-${nonSliceValues.length}`)),showNonSliceValues&&slicedValues.flat().length<property.max&&jsx61(Group20,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx61(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 ActionIcon5,Flex,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification4}from"@mantine/notifications";import{useRef as useRef8,useState as useState29}from"react";import{jsx as jsx62,jsxs as jsxs34}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState29(!1),clipboard=useClipboard(),ref=useRef8(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs34(Flex,{gap:"xs",children:[jsx62(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx62(ActionIcon5,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification4({color:"green",message:"Copied"})},children:jsx62(IconCopy,{})})]})}import{Button as Button5,Chip,Group as Group21,Modal as Modal2,NativeSelect as NativeSelect8,Stack as Stack5,Switch,TextInput as TextInput11}from"@mantine/core";import{formatTiming as formatTiming2}from"@medplum/core";import{useRef as useRef9,useState as useState30}from"react";import{Fragment as Fragment22,jsx as jsx63,jsxs as jsxs35}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState30(props.defaultValue),[open,setOpen]=useState30(!1),valueRef=useRef9();return valueRef.current=value,jsxs35(Fragment22,{children:[jsxs35(Group21,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx63("span",{children:formatTiming2(valueRef.current)||"No repeat"}),jsx63(Button5,{onClick:()=>setOpen(!0),children:"Edit"})]}),jsx63(TimingEditorDialog,{visible:open,defaultValue:valueRef.current,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]=useState30(props.defaultValue||defaultValue),valueRef=useRef9();valueRef.current=value;function setStart(newStart){setValue({...valueRef.current,event:[newStart]})}function setRepeat(repeat){setValue({...valueRef.current,repeat})}function setPeriod(newPeriod){setRepeat({...valueRef.current?.repeat,period:newPeriod})}function setPeriodUnit(newPeriodUnit){setRepeat({...valueRef.current?.repeat,periodUnit:newPeriodUnit})}function setDaysOfWeek(newDaysOfWeek){setRepeat({...valueRef.current?.repeat,dayOfWeek:newDaysOfWeek})}return jsx63(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs35(Stack5,{children:[jsx63(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx63(DateTimeInput,{name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx63(Switch,{label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs35(Fragment22,{children:[jsx63(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs35(Group21,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx63(TextInput11,{type:"number",step:1,id:"timing-dialog-period",name:"timing-dialog-period",defaultValue:value.repeat.period||1,onChange:e=>setPeriod(parseInt(e.currentTarget.value,10)||1)}),jsx63(NativeSelect8,{id:"timing-dialog-periodUnit",name:"timing-dialog-periodUnit",defaultValue:value.repeat.periodUnit,onChange:e=>setPeriodUnit(e.currentTarget.value),data:[{label:"second",value:"s"},{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"&&jsx63(FormSection,{title:"Repeat on",children:jsx63(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,children:jsx63(Group21,{justify:"space-between",mt:"md",gap:"xs",children:daysOfWeek.map(day=>jsx63(Chip,{value:day,size:"xs",radius:"xl",children:day.charAt(0).toUpperCase()},day))})})})]}),jsx63(Group21,{justify:"flex-end",children:jsx63(Button5,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx64,jsxs as jsxs36}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 jsx64(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx64(ResourceArrayInput,{property,name,path:props.path,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx64(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx64(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})}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]=useState31(initialPropertyType);return jsxs36(Group22,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx64(NativeSelect9,{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}))}),jsx64(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})]})}function ElementDefinitionTypeInput(props){let{name,onChange,outcome,binding,path}=props,required=props.min!==void 0&&props.min>0,propertyType=props.elementDefinitionType.code,elementsContext=useContext11(ElementsContext),defaultValue2=useMemo10(()=>{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 jsx64("div",{children:"Property type not specified "});let properties={name,defaultValue:defaultValue2,onChange,outcome,path};switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.string:case PropertyType2.time:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"?jsx64(SensitiveTextarea,{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)},error:getErrorsForInput(props.outcome,name)}):jsx64(TextInput12,{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,onChange:e=>{onChange&&onChange(e.currentTarget.value)},error:getErrorsForInput(outcome,name)});case PropertyType2.date:return jsx64(TextInput12,{type:"date",id:name,name,"data-testid":name,defaultValue:defaultValue2,required,onChange:e=>{onChange&&onChange(e.currentTarget.value)},error:getErrorsForInput(outcome,name)});case PropertyType2.dateTime:case PropertyType2.instant:return jsx64(DateTimeInput,{name,defaultValue:defaultValue2,onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx64(TextInput12,{type:"number",step:propertyType===PropertyType2.decimal?"any":"1",id:name,name,"data-testid":name,defaultValue:defaultValue2,required,onChange:e=>{onChange&&onChange(e.currentTarget.valueAsNumber)}});case PropertyType2.code:return jsx64(CodeInput,{...properties,binding:binding?.valueSet});case PropertyType2.boolean:return jsx64(Checkbox,{id:name,name,"data-testid":name,defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:return jsx64(Textarea2,{id:name,spellCheck:propertyType!==PropertyType2.base64Binary,name,"data-testid":name,defaultValue:defaultValue2,required,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx64(AddressInput,{...properties});case PropertyType2.Annotation:return jsx64(AnnotationInput,{...properties});case PropertyType2.Attachment:return jsx64(AttachmentInput,{...properties});case PropertyType2.CodeableConcept:return jsx64(CodeableConceptInput,{binding:binding?.valueSet,...properties});case PropertyType2.Coding:return jsx64(CodingInput,{binding:binding?.valueSet,...properties});case PropertyType2.ContactDetail:return jsx64(ContactDetailInput,{...properties});case PropertyType2.ContactPoint:return jsx64(ContactPointInput,{...properties});case PropertyType2.Extension:return jsx64(ExtensionInput,{...properties,propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx64(HumanNameInput,{...properties});case PropertyType2.Identifier:return jsx64(IdentifierInput,{...properties});case PropertyType2.Money:return jsx64(MoneyInput,{...properties});case PropertyType2.Period:return jsx64(PeriodInput,{...properties});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx64(QuantityInput,{...properties});case PropertyType2.Range:return jsx64(RangeInput,{...properties});case PropertyType2.Ratio:return jsx64(RatioInput,{...properties});case PropertyType2.Reference:return jsx64(ReferenceInput,{...properties,targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx64(TimingInput,{...properties});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx64(BackboneElementInput,{typeName:propertyType,path:properties.path,defaultValue:defaultValue2,onChange,outcome})}}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 jsx65}from"react/jsx-runtime";var EXTENSION_KEYS2=["extension","modifierExtension"],IGNORED_PROPERTIES2=["id",...DEFAULT_IGNORED_PROPERTIES].filter(prop=>!EXTENSION_KEYS2.includes(prop));function ElementsInput(props){let[value,setValue]=useState32(props.defaultValue??{}),elementsContext=useContext12(ElementsContext),elementsToRender=useMemo11(()=>getElementsToRender(elementsContext.elements),[elementsContext.elements]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let typedValue={type:props.type,value};return jsx65(Stack6,{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,resourcePropertyInput=jsx65(ResourcePropertyInput,{property:element,name:key,path:props.path+"."+key,defaultValue:propertyValue,defaultPropertyType:propertyType,onChange:(newValue,propName)=>{setValueWrapper(setPropertyValue({...value},key,propName??key,element,newValue))},arrayElement:void 0,outcome:props.outcome},key);return props.type==="Extension"||EXTENSION_KEYS2.includes(key)?resourcePropertyInput:element.type.length===1&&element.type[0].code==="boolean"?jsx65(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,children:resourcePropertyInput},key):jsx65(FormSection,{title:getPathDisplayName5(key),description:element.description,withAsterisk:required,htmlFor:key,outcome:props.outcome,fhirPath:element.path,children:resourcePropertyInput},key)})})}function getElementsToRender(inputElements){return Object.entries(inputElements).filter(([key,element])=>!isPopulated11(element.type)||element.max===0||element.path.toLowerCase().endsWith("extension.url")&&element.fixed||EXTENSION_KEYS2.includes(key)&&!isPopulated11(element.slicing?.slices)||IGNORED_PROPERTIES2.includes(key)?!1:!(DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key)&&element.path.split(".").length===2||key.includes(".")))}import{jsx as jsx66,jsxs as jsxs37}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState33(()=>props.defaultValue??{}),parentElementsContext=useContext13(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo12(()=>tryGetDataType2(props.typeName,profileUrl),[props.typeName,profileUrl]),type=typeSchema?.type??props.typeName,contextValue=useMemo12(()=>{if(typeSchema)return buildElementsContext4({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url})},[typeSchema,props.path,parentElementsContext]);return typeSchema?maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx66(ElementsInput,{path:props.path,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})):jsxs37("div",{children:[type,"\xA0not implemented"]})}import{ActionIcon as ActionIcon6,Avatar as Avatar3,Group as Group23,Paper,ScrollArea as ScrollArea2,Stack as Stack7,TextInput as TextInput13,Title}from"@mantine/core";import{showNotification as showNotification5}from"@mantine/notifications";import{getReferenceString as getReferenceString4,normalizeErrorString as normalizeErrorString4}from"@medplum/core";import{useCallback as useCallback8,useEffect as useEffect8,useMemo as useMemo13,useRef as useRef10,useState as useState34}from"react";var BaseChat_default={iconContainer:"BaseChat_iconContainer",icon:"BaseChat_icon",chatContainer:"BaseChat_chatContainer",chatPaper:"BaseChat_chatPaper",chatTitle:"BaseChat_chatTitle",chatBody:"BaseChat_chatBody",chatScrollArea:"BaseChat_chatScrollArea",chatInputContainer:"BaseChat_chatInputContainer",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble"};import{Fragment as Fragment23,jsx as jsx67,jsxs as jsxs38}from"react/jsx-runtime";function parseSentTime(communication){let sentTime=new Date(communication.sent??0),sentTimeMins=sentTime.getMinutes().toString();return`${sentTime.getHours()}:${sentTimeMins.length===1?"0":""}${sentTimeMins}`}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((a2,b2)=>a2.sent.localeCompare(b2.sent)),setCommunications(newCommunications)}function BaseChat(props){let{title,communications,setCommunications,query,sendMessage,open,onMessageReceived}=props,medplum=a(),[opened,setOpened]=useState34(open??!1),inputRef=useRef10(null),scrollAreaRef=useRef10(null),[profile,setProfile]=useState34(medplum.getProfile()),profileRefStr=useMemo13(()=>profile?getReferenceString4(medplum.getProfile()):"",[profile,medplum]);useEffect8(()=>{setOpened(prevVal=>open??prevVal)},[open]),Oe(`Communication?${query}`,bundle=>{let communication=bundle.entry?.[1]?.resource;upsertCommunications(communicationsRef.current,[communication],setCommunications),onMessageReceived&&getReferenceString4(communication.sender)!==profileRefStr&&onMessageReceived(communication)});let sendMessageInternal=useCallback8(formData=>{inputRef.current&&(inputRef.current.value=""),sendMessage(formData.message),scrollToBottomRef.current=!0},[sendMessage]);useEffect8(()=>{let latestProfile=medplum.getProfile();profile?.id!==latestProfile?.id&&(setProfile(latestProfile),setCommunications([]))});let communicationsRef=useRef10(communications);communicationsRef.current=communications;let prevCommunicationsRef=useRef10(communications),scrollToBottomRef=useRef10(!0),searchMessages=useCallback8(async()=>{let searchParams=new URLSearchParams(query);searchParams.append("_sort","-sent");let searchResult=await medplum.searchResources("Communication",searchParams,{cache:"no-cache"});upsertCommunications(communicationsRef.current,searchResult,setCommunications)},[medplum,setCommunications,query]);useEffect8(()=>{searchMessages().catch(err=>showNotification5({color:"red",message:normalizeErrorString4(err)}))},[searchMessages]),useEffect8(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),useEffect8(()=>{scrollToBottomRef.current&&scrollAreaRef.current?.scrollTo&&(scrollAreaRef.current.scrollTo({top:scrollAreaRef.current.scrollHeight,behavior:"smooth"}),scrollToBottomRef.current=!1)});let myLastDeliveredId=useMemo13(()=>{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?opened?jsxs38(Fragment23,{children:[jsx67("div",{className:BaseChat_default.chatContainer,children:jsxs38(Paper,{className:BaseChat_default.chatPaper,shadow:"xl",p:0,radius:"md",withBorder:!0,children:[jsx67(Title,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx67("div",{className:BaseChat_default.chatBody,children:jsx67(ScrollArea2,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,w:400,h:360,children:communications.map((c,i)=>{let prevCommunication=i>0?communications[i-1]:void 0,prevCommTime=prevCommunication?parseSentTime(prevCommunication):void 0,currCommTime=parseSentTime(c);return jsxs38(Stack7,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx67("div",{style:{textAlign:"center"},children:currCommTime}),c.sender?.reference===profileRefStr?jsxs38(Group23,{justify:"flex-end",gap:"xs",mb:"sm",children:[jsx67(ChatBubble,{alignment:"right",communication:c,showDelivered:!!c.received&&c.id===myLastDeliveredId}),jsx67(Avatar3,{radius:"xl",color:"orange"})]}):jsxs38(Group23,{align:"flex-start",gap:"xs",mb:"sm",children:[jsx67(Avatar3,{radius:"xl",color:"teal"}),jsx67(ChatBubble,{alignment:"left",communication:c})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})})}),jsx67("div",{className:BaseChat_default.chatInputContainer,children:jsx67(Form,{onSubmit:sendMessageInternal,children:jsx67(TextInput13,{ref:inputRef,name:"message",placeholder:"Type a message...",radius:"xl",rightSectionWidth:42,rightSection:jsx67(ActionIcon6,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx67(IconArrowRight,{size:"1rem",stroke:1.5})})})})})]})}),jsx67("div",{className:BaseChat_default.iconContainer,children:jsx67(ActionIcon6,{className:BaseChat_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx67(IconChevronDown,{size:"1.625rem"})})})]}):jsx67("div",{className:BaseChat_default.iconContainer,children:jsx67(ActionIcon6,{className:BaseChat_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>{setOpened(!0),scrollToBottomRef.current=!0},"aria-label":"Open chat",children:jsx67(IconMessage,{size:"1.625rem"})})}):null}function ChatBubble(props){let content=props.communication.payload?.[0]?.contentString||"",seenTime=new Date(props.communication.received??-1);return jsxs38("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx67("div",{className:props.alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx67("div",{className:BaseChat_default.chatBubble,children:content})}),props.showDelivered&&jsxs38("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}import{Button as Button6,Group as Group24}from"@mantine/core";import{useMemo as useMemo14,useState as useState35}from"react";var CalendarInput_default={table:"CalendarInput_table"};function getMonthString(date){return date.toLocaleString("default",{month:"long"})+" "+date.getFullYear()}function getStartMonth(){let result=new Date;return result.setDate(1),result.setHours(0,0,0,0),result}import{jsx as jsx68,jsxs as jsxs39}from"react/jsx-runtime";function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState35(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth.getTime());return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=useMemo14(()=>buildGrid(month,props.slots),[month,props.slots]);return jsxs39("div",{children:[jsxs39(Group24,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx68("p",{style:{flex:1},children:getMonthString(month)}),jsxs39(Group24,{justify:"flex-end",gap:"xs",children:[jsx68(Button6,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx68(Button6,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs39("table",{className:CalendarInput_default.table,children:[jsx68("thead",{children:jsxs39("tr",{children:[jsx68("th",{children:"SUN"}),jsx68("th",{children:"MON"}),jsx68("th",{children:"TUE"}),jsx68("th",{children:"WED"}),jsx68("th",{children:"THU"}),jsx68("th",{children:"FRI"}),jsx68("th",{children:"SAT"})]})}),jsx68("tbody",{children:grid.map((week,weekIndex)=>jsx68("tr",{children:week.map((day,dayIndex)=>jsx68("td",{children:day&&jsx68(Button6,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,slots){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d.getTime()),available:isDayAvailable(d,slots)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,slots){for(let slot of slots){let slotStart=new Date(slot.start);if(slotStart.getFullYear()===day.getFullYear()&&slotStart.getMonth()===day.getMonth()&&slotStart.getDate()===day.getDate())return!0}return!1}import{Container as MantineContainer}from"@mantine/core";var Container_default={root:"Container_root"};import{jsx as jsx69}from"react/jsx-runtime";function Container(props){let{children,...others}=props;return jsx69(MantineContainer,{className:Container_default.root,...others,children})}import{ActionIcon as ActionIcon8,Center as Center2,Group as Group28,Loader as Loader3,Menu as Menu4,ScrollArea as ScrollArea3,TextInput as TextInput14}from"@mantine/core";import{showNotification as showNotification6,updateNotification}from"@mantine/notifications";import{createReference as createReference3,getReferenceString as getReferenceString6,normalizeErrorString as normalizeErrorString6}from"@medplum/core";import{useCallback as useCallback9,useEffect as useEffect12,useRef as useRef11,useState as useState40}from"react";import{Group as Group26,List,Stack as Stack9,Text as Text8,Title as Title2}from"@mantine/core";import{capitalize as capitalize3,formatCodeableConcept as formatCodeableConcept2,formatDateTime as formatDateTime2,formatObservationValue,isReference as isReference2}from"@medplum/core";import{useEffect as useEffect9,useState as useState37}from"react";import{Blockquote,Stack as Stack8}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx70}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx70(Stack8,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx70(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 Group25}from"@mantine/core";import{Text as Text7}from"@mantine/core";import{getDisplayString as getDisplayString4,isOk,normalizeErrorString as normalizeErrorString5}from"@medplum/core";import{useState as useState36}from"react";import{jsx as jsx71}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState36(),resource=pe(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString5(outcome)}]`;else if(resource)text=getDisplayString4(resource);else return null;return link?jsx71(MedplumLink,{to:value,...rest,children:text}):jsx71(Text7,{component:"span",...rest,children:text})}import{jsx as jsx72,jsxs as jsxs40}from"react/jsx-runtime";function ResourceBadge(props){return jsxs40(Group25,{gap:"xs",children:[jsx72(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx72(ResourceName,{value:props.value,link:props.link})]})}import{Badge}from"@mantine/core";import{jsx as jsx73}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"};function StatusBadge(props){return jsx73(Badge,{color:statusToColor[props.status],children:props.status})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment24,jsx as jsx74,jsxs as jsxs41}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1};function DiagnosticReportDisplay(props){let medplum=a(),diagnosticReport=pe(props.value),[specimens,setSpecimens]=useState37();if(useEffect9(()=>{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 jsxs41(Stack9,{children:[jsx74(Title2,{children:"Diagnostic Report"}),jsx74(DiagnosticReportHeader,{value:diagnosticReport}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx74(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx74(NoteDisplay,{value:specimenNotes})]})}function DiagnosticReportHeader({value}){return jsxs41(Group26,{mt:"md",gap:30,children:[value.subject&&jsxs41("div",{children:[jsx74(Text8,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx74(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs41("div",{children:[jsx74(Text8,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx74(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs41("div",{children:[jsx74(Text8,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx74(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs41("div",{children:[jsx74(Text8,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx74(Text8,{children:formatDateTime2(value.issued)})]}),value.status&&jsxs41("div",{children:[jsx74(Text8,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx74(Text8,{children:capitalize3(value.status)})]})]})}function SpecimenInfo(specimens){return jsxs41(Stack9,{gap:"xs",children:[jsx74(Title2,{order:2,size:"h6",children:"Specimens"}),jsx74(List,{type:"ordered",children:specimens?.map(specimen=>jsx74(List.Item,{ml:"sm",children:jsxs41(Group26,{gap:20,children:[jsxs41(Group26,{gap:5,children:[jsx74(Text8,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs41(Group26,{gap:5,children:[jsx74(Text8,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs41("table",{className:DiagnosticReportDisplay_default.table,children:[jsx74("thead",{children:jsxs41("tr",{children:[jsx74("th",{children:"Test"}),jsx74("th",{children:"Value"}),jsx74("th",{children:"Reference Range"}),jsx74("th",{children:"Interpretation"}),jsx74("th",{children:"Category"}),jsx74("th",{children:"Performer"}),jsx74("th",{children:"Status"})]})}),jsx74("tbody",{children:jsx74(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx74(Fragment24,{children:props.value?.map(observation=>jsx74(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference2(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=pe(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs41(Fragment24,{children:[jsxs41("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx74("td",{rowSpan:displayNotes?2:1,children:jsx74(MedplumLink,{to:observation,children:jsx74(CodeableConceptDisplay,{value:observation.code})})}),jsx74("td",{children:jsx74(ObservationValueDisplay,{value:observation})}),jsx74("td",{children:jsx74(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx74("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx74(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx74("td",{children:observation.category&&observation.category.length>0&&jsx74(Fragment24,{children:observation.category.map(concept=>jsx74("div",{children:jsx74(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept2(concept)}`))})}),jsx74("td",{children:observation.performer?.map(performer=>jsx74(ReferenceDisplay,{value:performer},performer.reference))}),jsx74("td",{children:observation.status&&jsx74(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx74(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx74("tr",{children:jsx74("td",{colSpan:6,children:jsx74(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx74(Fragment24,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx74(Fragment24,{children:range.text}):jsx74(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{Paper as Paper2}from"@mantine/core";var Panel_default={paper:"Panel_paper",fill:"Panel_fill"};import{jsx as jsx75}from"react/jsx-runtime";function Panel(props){let{width,fill,className,children,...rest}=props,style=width?{maxWidth:width}:void 0;return jsx75(Paper2,{className:clsx_default(Panel_default.paper,fill&&Panel_default.fill,className),style,shadow:"sm",radius:"sm",withBorder:!0,...rest,children})}import{Table}from"@mantine/core";import{arrayify,capitalize as capitalize4,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";var import_rfc6902=__toESM(require_rfc6902(),1);import{useEffect as useEffect10,useMemo as useMemo15,useState as useState38}from"react";var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx76,jsxs as jsxs42}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=a(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState38(!1);useEffect10(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo15(()=>{if(!schemaLoaded)return null;let typedOriginal=[toTypedValue(original)],typedRevised=[toTypedValue(revised)],result=[],patch=mergePatchOperations((0,import_rfc6902.createPatch)(original,revised));for(let op of patch){let path=op.path,fhirPath=jsonPathToFhirPath(path),property=tryGetElementDefinition(original.resourceType,fhirPath),originalValue=op.op==="add"?void 0:evalFhirPathTyped(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:evalFhirPathTyped(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${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?jsxs42(Table,{className:ResourceDiffTable_default.root,children:[jsx76(Table.Thead,{children:jsxs42(Table.Tr,{children:[jsx76(Table.Th,{}),jsx76(Table.Th,{children:"Before"}),jsx76(Table.Th,{children:"After"})]})}),jsx76(Table.Tbody,{children:diffTable.map(row=>jsxs42(Table.Tr,{children:[jsx76(Table.Td,{children:row.name}),jsx76(Table.Td,{className:ResourceDiffTable_default.removed,children:row.originalValue&&jsx76(ResourcePropertyDisplay,{path:row.path,property:row.property,propertyType:row.originalValue.type,value:row.originalValue.value,ignoreMissingValues:!0})}),jsx76(Table.Td,{className:ResourceDiffTable_default.added,children:row.revisedValue&&jsx76(ResourcePropertyDisplay,{path:row.path,property:row.property,propertyType:row.revisedValue.type,value:row.revisedValue.value,ignoreMissingValues:!0})})]},row.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){return getSearchParameterDetails(resourceType,{resourceType:"SearchParameter",base:[resourceType],code:resourceType+"."+fhirPath,expression:resourceType+"."+fhirPath})?.elementDefinitions?.[0]}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(v2=>v2.value);return isArray?inputValue:inputValue[0]}import{useEffect as useEffect11,useState as useState39}from"react";import{tryGetProfile as tryGetProfile5}from"@medplum/core";import{jsx as jsx77}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=a(),value=pe(props.value),[schemaLoaded,setSchemaLoaded]=useState39();return useEffect11(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{let profile=tryGetProfile5(profileUrl);profile?setSchemaLoaded(profile.name):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(schemaName)}).catch(console.error)}},[medplum,profileUrl,value]),!schemaLoaded||!value?null:jsx77(BackboneElementDisplay,{path:value.resourceType,value:{type:schemaLoaded,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues})}import{ActionIcon as ActionIcon7,Group as Group27,Menu as Menu3,Text as Text9}from"@mantine/core";import{formatDateTime as formatDateTime3,getReferenceString as getReferenceString5}from"@medplum/core";import{Fragment as Fragment25,jsx as jsx78,jsxs as jsxs43}from"react/jsx-runtime";function Timeline(props){return jsx78(Container,{children:props.children})}function TimelineItem(props){let{resource,profile,padding,popupMenuItems,...others}=props,author=profile??resource.meta?.author,dateTime=props.dateTime??resource.meta?.lastUpdated;return jsxs43(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs43(Group27,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx78(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs43("div",{style:{flex:1},children:[jsx78(Text9,{size:"sm",children:jsx78(ResourceName,{c:"dark",fw:500,value:author,link:!0})}),jsxs43(Text9,{size:"xs",children:[jsx78(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime3(dateTime)}),jsx78(Text9,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx78(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs43(Menu3,{position:"bottom-end",shadow:"md",width:200,children:[jsx78(Menu3.Target,{children:jsx78(ActionIcon7,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString5(props.resource)}`,children:jsx78(IconDots,{})})}),popupMenuItems]})]}),jsxs43(ErrorBoundary,{children:[padding&&jsx78("div",{style:{padding:"0 16px 16px 16px"},children:props.children}),!padding&&jsx78(Fragment25,{children:props.children})]})]})}function sortByDateAndPriority(resources,timelineResource){resources.sort((a2,b2)=>{let priority1=getPriorityScore(a2,timelineResource),priority2=getPriorityScore(b2,timelineResource);return priority1>priority2?1:priority1<priority2?-1:getTime(a2,timelineResource)-getTime(b2,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(a2,b2){return!!b2&&a2.resourceType===b2.resourceType&&a2.id===b2.id}var ResourceTimeline_default={pinnedComment:"ResourceTimeline_pinnedComment"};import{Fragment as Fragment26,jsx as jsx79,jsxs as jsxs44}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=a(),navigate=V(),sender=medplum.getProfile(),inputRef=useRef11(null),resource=pe(props.value),[history,setHistory]=useState40(),[items,setItems]=useState40([]),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef11(items);itemsRef.current=items;let sortAndSetItems=useCallback9(newItmes=>{sortByDateAndPriority(newItmes,resource),newItmes.reverse(),setItems(newItmes)},[resource]),handleBatchResponse=useCallback9(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=useCallback9(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback9(()=>{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.log)},[medplum,props.value,loadTimelineResources,handleBatchResponse]);useEffect12(()=>loadTimeline(),[loadTimeline]);function createComment(contentString){!resource||!props.createCommunication||medplum.createResource(props.createCommunication(resource,sender,contentString)).then(result=>addResource(result)).catch(console.log)}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:jsx79(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString6(reason),icon:jsx79(IconFileAlert,{size:16}),autoClose:2e3}))}function setPriority(communication,priority){return medplum.updateResource({...communication,priority})}function onPin(communication){setPriority(communication,"stat").then(loadTimeline).catch(console.log)}function onUnpin(communication){setPriority(communication,"routine").then(loadTimeline).catch(console.log)}function onDetails(timelineItem){navigate(`/${timelineItem.resourceType}/${timelineItem.id}`)}function onEdit(timelineItem){navigate(`/${timelineItem.resourceType}/${timelineItem.id}/edit`)}function onDelete(timelineItem){navigate(`/${timelineItem.resourceType}/${timelineItem.id}/delete`)}function onVersionDetails(version){navigate(`/${version.resourceType}/${version.id}/_history/${version.meta?.versionId}`)}function onUploadStart(){showNotification6({id:"upload-notification",loading:!0,title:"Initializing upload...",message:"Please wait...",autoClose:!1,withCloseButton:!1})}function onUploadProgress(e){updateNotification({id:"upload-notification",loading:!0,title:"Uploading...",message:getProgressMessage(e),autoClose:!1,withCloseButton:!1})}function onUploadError(outcome){updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString6(outcome),icon:jsx79(IconFileAlert,{size:16}),autoClose:2e3})}return resource?jsxs44(Timeline,{children:[props.createCommunication&&jsx79(Panel,{children:jsx79(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs44(Group28,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx79(ResourceAvatar,{value:sender}),jsx79(TextInput14,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx79(ActionIcon8,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx79(IconMessage,{size:16})}),jsx79(AttachmentButton,{securityContext:createReference3(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx79(ActionIcon8,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx79(IconCloudUpload,{size:16})})})]})})}),items.map(item=>{if(!item)return null;let key=`${item.resourceType}/${item.id}/${item.meta?.versionId}`;if(item.resourceType===resource.resourceType&&item.id===resource.id)return jsx79(HistoryTimelineItem,{history,resource:item,onDetails:onVersionDetails},key);switch(item.resourceType){case"AuditEvent":return jsx79(AuditEventTimelineItem,{resource:item,onDetails},key);case"Communication":return jsx79(CommunicationTimelineItem,{resource:item,onPin:item.priority!=="stat"?onPin:void 0,onUnpin:item.priority==="stat"?onUnpin:void 0,onDetails,onEdit,onDelete},key);case"DiagnosticReport":return jsx79(DiagnosticReportTimelineItem,{resource:item,onDetails,onEdit,onDelete},key);case"Media":return jsx79(MediaTimelineItem,{resource:item,onDetails,onEdit,onDelete},key);default:return jsx79(TimelineItem,{resource:item,padding:!0,children:jsx79(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}})]}):jsx79(Center2,{style:{width:"100%",height:"100%"},children:jsx79(Loader3,{})})}function TimelineItemPopupMenu(props){return jsxs44(Menu4.Dropdown,{children:[jsx79(Menu4.Label,{children:"Resource"}),props.onPin&&jsx79(Menu4.Item,{leftSection:jsx79(IconPin,{size:14}),onClick:()=>props.onPin(props.resource),"aria-label":`Pin ${getReferenceString6(props.resource)}`,children:"Pin"}),props.onUnpin&&jsx79(Menu4.Item,{leftSection:jsx79(IconPinnedOff,{size:14}),onClick:()=>props.onUnpin(props.resource),"aria-label":`Unpin ${getReferenceString6(props.resource)}`,children:"Unpin"}),props.onDetails&&jsx79(Menu4.Item,{leftSection:jsx79(IconListDetails,{size:14}),onClick:()=>props.onDetails(props.resource),"aria-label":`Details ${getReferenceString6(props.resource)}`,children:"Details"}),props.onEdit&&jsx79(Menu4.Item,{leftSection:jsx79(IconEdit,{size:14}),onClick:()=>props.onEdit(props.resource),"aria-label":`Edit ${getReferenceString6(props.resource)}`,children:"Edit"}),props.onDelete&&jsxs44(Fragment26,{children:[jsx79(Menu4.Divider,{}),jsx79(Menu4.Label,{children:"Danger zone"}),jsx79(Menu4.Item,{color:"red",leftSection:jsx79(IconTrash,{size:14}),onClick:()=>props.onDelete(props.resource),"aria-label":`Delete ${getReferenceString6(props.resource)}`,children:"Delete"})]})]})}function HistoryTimelineItem(props){let previous=getPrevious(props.history,props.resource);return previous?jsx79(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:jsx79(TimelineItemPopupMenu,{...props}),children:jsx79(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs44(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:jsx79(TimelineItemPopupMenu,{...props}),children:[jsx79("h3",{children:"Created"}),jsx79(ResourceTable,{value:props.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 jsx79(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:jsx79(TimelineItemPopupMenu,{...props}),children:jsx79("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 jsx79(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:jsx79(TimelineItemPopupMenu,{...props}),children:jsx79(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx79(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:jsx79(TimelineItemPopupMenu,{...props}),children:jsx79(ScrollArea3,{children:jsx79("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx79(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:jsx79(TimelineItemPopupMenu,{...props}),children:jsx79(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 jsx80}from"react/jsx-runtime";function DefaultResourceTimeline(props){return jsx80(ResourceTimeline,{value:props.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})])}})}import{jsx as jsx81}from"react/jsx-runtime";function Document(props){let{children,...others}=props;return jsx81(Container,{children:jsx81(Panel,{...others,children})})}import{createReference as createReference4}from"@medplum/core";import{jsx as jsx82}from"react/jsx-runtime";function EncounterTimeline(props){return jsx82(ResourceTimeline,{value:props.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:createReference4(resource),subject:resource.subject,sender:createReference4(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference4(resource),subject:resource.subject,operator:createReference4(operator),issued:new Date().toISOString(),content})})}import{Button as Button12,Loader as Loader5,Table as Table3}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome2}from"@medplum/core";import{memo as memo2,useEffect as useEffect16,useRef as useRef15,useState as useState45}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx83}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 jsx83(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon9,Button as Button11,Center as Center3,Group as Group31,Loader as Loader4,Menu as Menu6,Pagination,Table as Table2,Text as Text11,UnstyledButton as UnstyledButton2}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,formatSearchQuery,isDataTypeLoaded}from"@medplum/core";import{memo,useCallback as useCallback10,useEffect as useEffect15,useRef as useRef14,useState as useState44}from"react";import{Box as Box2,Button as Button7,Modal as Modal3,Text as Text10}from"@mantine/core";import{jsx as jsx84,jsxs as jsxs45}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs45(Modal3,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs45(Box2,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx84(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx84(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx84(Text10,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx84(Button7,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button8,Group as Group29,Modal as Modal4,MultiSelect,Stack as Stack10}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,stringify as stringify2}from"@medplum/core";import{useEffect as useEffect13,useMemo as useMemo16,useRef as useRef12,useState as useState41}from"react";import{capitalize as capitalize5,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime4,Operator}from"@medplum/core";import{Fragment as Fragment27,jsx as jsx85}from"react/jsx-runtime";var searchParamToOperators={string:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],fulltext:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],token:[Operator.EQUALS,Operator.NOT],reference:[Operator.EQUALS,Operator.NOT],numeric:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],quantity:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],date:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],datetime:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY]},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",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",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(f2=>f2.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 addLastMonthFilter(definition,field){return addMonthFilter(definition,field,-1)}function addThisMonthFilter(definition,field){return addMonthFilter(definition,field,0)}function addNextMonthFilter(definition,field){return addMonthFilter(definition,field,1)}function addMonthFilter(definition,field,delta){let startTime=new Date;startTime.setMonth(startTime.getMonth()+delta),startTime.setDate(1),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setMonth(endTime.getMonth()+1),endTime.setDate(1),endTime.setHours(0,0,0,0),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addYearToDateFilter(definition,field){let startTime=new Date;return startTime.setMonth(0),startTime.setDate(1),startTime.setHours(0,0,0,0),addDateFilterBetween(definition,field,startTime,new Date)}function addDateFilterBetween(definition,field,d1,d2){return definition=clearFiltersOnField(definition,field),definition=addDateFilterImpl(definition,field,Operator.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.replace(/([A-Z])/g," $1"),tmp=tmp.replace(/[-_]/g," "),tmp=tmp.replace(/\s+/g," "),tmp=tmp.trim(),tmp.toLowerCase()==="id"?"ID":tmp.split(/\s/).map(capitalize5).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?resource.id:key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?formatDateTime4(resource.meta?.lastUpdated):field.elementDefinition&&`${resource.resourceType}.${field.name}`===field.elementDefinition.path?renderPropertyValue(resource,field.elementDefinition):field.searchParams&&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?jsx85(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:jsx85(Fragment27,{children:value.map((v2,index)=>jsx85(ResourcePropertyDisplay,{propertyType:v2.type,value:v2.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx86,jsxs as jsxs46}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef12(!1),[state,setState]=useState41({search:JSON.parse(stringify2(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState41(!1);useEffect13(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo16(()=>{if(!props.visible)return[];let resourceType=props.search.resourceType,typeSchema=getDataType2(resourceType),searchParams=getSearchParameters(resourceType);return getFieldsList(typeSchema,searchParams).sort((a2,b2)=>a2.localeCompare(b2)).map(field=>({value:field,label:buildFieldNameString(field)}))},[props.visible,props.search.resourceType]);if(!props.visible)return null;function handleChange(newFields){setState({search:{...state.search,fields:newFields}})}return jsx86(Modal4,{title:"Fields",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>{props.onCancel()},size:"auto",withOverlay:!0,closeOnClickOutside:!1,overlayProps:{onMouseDownCapture:()=>{wasDropdownOpen.current=isDropdownOpen},onClick:()=>{wasDropdownOpen.current||props.onCancel(),wasDropdownOpen.current=!1},children:jsx86("div",{"data-testid":"overlay-child"})},children:jsxs46(Stack10,{children:[jsx86(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}),jsx86(Group29,{justify:"flex-end",children:jsx86(Button8,{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{Button as Button9,Group as Group30,Modal as Modal5,NativeSelect as NativeSelect10}from"@mantine/core";import{getSearchParameters as getSearchParameters2,stringify as stringify3}from"@medplum/core";import{useEffect as useEffect14,useRef as useRef13,useState as useState42}from"react";import{formatDateTime as formatDateTime5,getSearchParameterDetails as getSearchParameterDetails2,globalSchema,Operator as Operator2,SearchParameterType}from"@medplum/core";import{Fragment as Fragment28,jsx as jsx87}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===Operator2.EQUALS||filter.operator===Operator2.NOT_EQUALS))return jsx87(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails2(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType.DATETIME)return jsx87(Fragment28,{children:formatDateTime5(filter.value)})}return jsx87(Fragment28,{children:filter.value})}import{Checkbox as Checkbox2,TextInput as TextInput15}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails3,SearchParameterType as SearchParameterType2}from"@medplum/core";import{jsx as jsx88}from"react/jsx-runtime";function SearchFilterValueInput(props){let details=getSearchParameterDetails3(props.resourceType,props.searchParam),name="filter-value";switch(details.type){case SearchParameterType2.REFERENCE:return jsx88(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 SearchParameterType2.BOOLEAN:return jsx88(Checkbox2,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType2.DATE:return jsx88(TextInput15,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType2.DATETIME:return jsx88(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType2.NUMBER:return jsx88(TextInput15,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType2.QUANTITY:return jsx88(QuantityInput,{name,defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx88(TextInput15,{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:parseFloat(valueString),system:systemString,unit:unitString}}}import{jsx as jsx89,jsxs as jsxs47}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState42(JSON.parse(stringify3(props.search))),[editingIndex,setEditingIndex]=useState42(-1),searchRef=useRef13(search);searchRef.current=search,useEffect14(()=>{setSearch(JSON.parse(stringify3(props.search)))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}if(!props.visible)return null;let resourceType=props.search.resourceType,searchParams=getSearchParameters2(resourceType)??{},filters=search.filters||[];return jsxs47(Modal5,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:[jsx89("div",{children:jsxs47("table",{children:[jsxs47("colgroup",{children:[jsx89("col",{style:{width:200}}),jsx89("col",{style:{width:200}}),jsx89("col",{style:{width:380}}),jsx89("col",{style:{width:120}})]}),jsx89("thead",{children:jsxs47("tr",{children:[jsx89("th",{children:"Field"}),jsx89("th",{children:"Operation"}),jsx89("th",{children:"Value"}),jsx89("th",{children:"Actions"})]})}),jsxs47("tbody",{children:[filters.map((filter,index)=>index===editingIndex?jsx89(FilterRowInput,{resourceType,searchParams,defaultValue:filter,okText:"Save",onOk:newFilter=>{let newFilters=[...filters];newFilters[index]=newFilter,setSearch(setFilters(searchRef.current,newFilters)),setEditingIndex(-1)},onCancel:()=>setEditingIndex(-1)},`filter-${filter.code}-${filter.operator}-${filter.value}-input`):jsx89(FilterRowDisplay,{resourceType,filter,onEdit:()=>setEditingIndex(index),onDelete:()=>setSearch(deleteFilter(searchRef.current,index))},`filter-${filter.code}-${filter.operator}-${filter.value}-display`)),jsx89(FilterRowInput,{resourceType,searchParams,okText:"Add",onOk:onAddFilter})]})]})}),jsx89(Group30,{justify:"flex-end",mt:"xl",children:jsx89(Button9,{onClick:()=>props.onOk(searchRef.current),children:"OK"})})]})}function FilterRowDisplay(props){let{filter}=props;return jsxs47("tr",{children:[jsx89("td",{children:buildFieldNameString(filter.code)}),jsx89("td",{children:getOpString(filter.operator)}),jsx89("td",{children:jsx89(SearchFilterValueDisplay,{resourceType:props.resourceType,filter})}),jsxs47("td",{children:[jsx89(Button9,{size:"compact-md",variant:"outline",onClick:props.onEdit,children:"Edit"}),jsx89(Button9,{size:"compact-md",variant:"outline",onClick:props.onDelete,children:"Delete"})]})]})}function FilterRowInput(props){let[value,setValue]=useState42(props.defaultValue??{}),valueRef=useRef13(value);valueRef.current=value;function setFilterCode(newCode){setValue({...valueRef.current,code:newCode})}function setFilterOperator(newOperator){setValue({...valueRef.current,operator:newOperator})}function setFilterValue(newFilterValue){setValue({...valueRef.current,value:newFilterValue})}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return jsxs47("tr",{children:[jsx89("td",{children:jsx89(NativeSelect10,{"data-testid":"filter-field",defaultValue:valueRef.current.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...Object.keys(props.searchParams).map(param=>({value:param,label:buildFieldNameString(param)}))]})}),jsx89("td",{children:operators&&jsx89(NativeSelect10,{"data-testid":"filter-operation",defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]})}),jsx89("td",{children:searchParam&&value.operator&&jsx89(SearchFilterValueInput,{resourceType:props.resourceType,searchParam,defaultValue:value.value,onChange:setFilterValue})}),jsxs47("td",{children:[value.code&&value.operator&&jsx89(Button9,{size:"compact-md",variant:"outline",onClick:()=>{props.onOk(valueRef.current),setValue({})},children:props.okText}),props.onCancel&&jsx89(Button9,{size:"compact-md",variant:"outline",onClick:props.onCancel,children:"Cancel"})]})]})}import{Button as Button10,Grid,Modal as Modal6}from"@mantine/core";import{useState as useState43}from"react";import{jsx as jsx90,jsxs as jsxs48}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState43(props.defaultValue??"");if(!props.visible||!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx90(Modal6,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx90(Form,{onSubmit:onOk,children:jsxs48(Grid,{children:[jsx90(Grid.Col,{span:10,children:jsx90(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx90(Grid.Col,{span:2,children:jsx90(Button10,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{Menu as Menu5}from"@mantine/core";import{Operator as Operator4}from"@medplum/core";import{Fragment as Fragment29,jsx as jsx91,jsxs as jsxs49}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?jsx91(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx91(Menu5.Dropdown,{children:props.searchParams.map(searchParam=>jsx91(Menu5.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx91(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx91(NumericFilterSubMenu,{...props});case"reference":return jsx91(ReferenceFilterSubMenu,{...props});case"string":return jsx91(TextFilterSubMenu,{...props});case"token":case"uri":return jsx91(TokenFilterSubMenu,{...props});default:return jsxs49(Fragment29,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs49(Menu5.Dropdown,{children:[jsx91(Menu5.Item,{leftSection:jsx91(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx91(Menu5.Item,{leftSection:jsx91(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx91(Menu5.Divider,{}),jsx91(Menu5.Item,{leftSection:jsx91(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx91(Menu5.Item,{leftSection:jsx91(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx91(Menu5.Divider,{}),jsx91(Menu5.Item,{leftSection:jsx91(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.ENDS_BEFORE),children:"Before..."}),jsx91(Menu5.Item,{leftSection:jsx91(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.STARTS_AFTER),children:"After..."}),jsx91(Menu5.Item,{leftSection:jsx91(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Between..."}),jsx91(Menu5.Divider,{}),jsx91(Menu5.Item,{leftSection:jsx91(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx91(Menu5.Item,{leftSection:jsx91(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx91(Menu5.Item,{leftSection:jsx91(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx91(Menu5.Divider,{}),jsx91(Menu5.Item,{leftSection:jsx91(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx91(Menu5.Item,{leftSection:jsx91(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx91(Menu5.Item,{leftSection:jsx91(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx91(Menu5.Divider,{}),jsx91(Menu5.Item,{leftSection:jsx91(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx91(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs49(Menu5.Dropdown,{children:[jsx91(Menu5.Item,{leftSection:jsx91(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx91(Menu5.Item,{leftSection:jsx91(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx91(Menu5.Divider,{}),jsx91(Menu5.Item,{leftSection:jsx91(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx91(Menu5.Item,{leftSection:jsx91(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx91(Menu5.Divider,{}),jsx91(Menu5.Item,{leftSection:jsx91(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN),children:"Greater than..."}),jsx91(Menu5.Item,{leftSection:jsx91(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx91(Menu5.Item,{leftSection:jsx91(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN),children:"Less than..."}),jsx91(Menu5.Item,{leftSection:jsx91(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx91(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs49(Menu5.Dropdown,{children:[jsx91(Menu5.Item,{leftSection:jsx91(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx91(Menu5.Item,{leftSection:jsx91(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx91(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs49(Menu5.Dropdown,{children:[jsx91(Menu5.Item,{leftSection:jsx91(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx91(Menu5.Item,{leftSection:jsx91(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx91(Menu5.Divider,{}),jsx91(Menu5.Item,{leftSection:jsx91(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx91(Menu5.Item,{leftSection:jsx91(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx91(Menu5.Divider,{}),jsx91(Menu5.Item,{leftSection:jsx91(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.CONTAINS),children:"Contains..."}),jsx91(Menu5.Item,{leftSection:jsx91(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Does not contain..."}),jsx91(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs49(Menu5.Dropdown,{children:[jsx91(Menu5.Item,{leftSection:jsx91(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx91(Menu5.Item,{leftSection:jsx91(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx91(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs49(Fragment29,{children:[jsx91(Menu5.Divider,{}),jsx91(Menu5.Item,{leftSection:jsx91(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx91(Menu5.Item,{leftSection:jsx91(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx91(Menu5.Divider,{}),jsx91(Menu5.Item,{leftSection:jsx91(IconX,{size:14}),onClick:()=>props.onClear(searchParam),children:"Clear filters"})]})}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 Fragment30,jsx as jsx92,jsxs as jsxs50}from"react/jsx-runtime";var SearchChangeEvent=class extends Event{constructor(definition){super("change"),this.definition=definition}},SearchLoadEvent=class extends Event{constructor(response){super("load"),this.response=response}},SearchClickEvent=class extends Event{constructor(resource,browserEvent){super("click"),this.resource=resource,this.browserEvent=browserEvent}};function SearchControl(props){let medplum=a(),[loadingSchema,setLoadingSchema]=useState44(),[outcome,setOutcome]=useState44(),{search,onLoad}=props,[state,setState]=useState44({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef14(state);stateRef.current=state;let total=search.total??"accurate",loadResults=useCallback10(options=>{setOutcome(void 0),medplum.search(search.resourceType,formatSearchQuery({...search,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(reason)})},[medplum,search,total,onLoad]),refreshResults=useCallback10(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect15(()=>{loadResults()},[loadResults]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...stateRef.current.selected};checked?newSelected[id]=!0:delete newSelected[id],setState({...stateRef.current,selected:newSelected})}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},searchResponse=stateRef.current.searchResponse;checked&&searchResponse?.entry&&searchResponse.entry.forEach(entry=>{entry.resource?.id&&(newSelected[entry.resource.id]=!0)}),setState({...stateRef.current,selected:newSelected})}function isAllSelected(){let state2=stateRef.current;if(!state2.searchResponse?.entry||state2.searchResponse.entry.length===0)return!1;for(let e of state2.searchResponse.entry)if(e.resource?.id&&!state2.selected[e.resource.id])return!1;return!0}function emitSearchChange(newSearch){props.onChange&&props.onChange(new SearchChangeEvent(newSearch))}function handleRowClick(e,resource){if(isCheckboxCell(e.target)||e.button===2)return;killEvent(e);let isAux=e.button===1||e.ctrlKey||e.metaKey;!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(useEffect15(()=>{setLoadingSchema(props.search.resourceType),medplum.requestSchema(props.search.resourceType).catch(console.error).finally(()=>setLoadingSchema(void 0))},[medplum,props.search.resourceType]),!isDataTypeLoaded(props.search.resourceType)||loadingSchema===props.search.resourceType)return jsx92(Center3,{style:{width:"100%",height:"100%"},children:jsx92(Loader4,{})});let checkboxColumn=props.checkboxesEnabled,fields=getFieldDefinitions(search),resourceType=search.resourceType,lastResult=state.searchResponse,resources=lastResult?.entry?.map(e=>e.resource),buttonVariant="subtle",buttonColor="gray",iconSize=16,isMobile=window.innerWidth<768;return jsxs50("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs50(Group31,{justify:"space-between",mb:"xl",children:[jsxs50(Group31,{gap:2,children:[jsx92(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx92(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0}),children:"Fields"}),jsx92(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx92(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0}),children:"Filters"}),props.onNew&&jsx92(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx92(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx92(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx92(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0}),children:"Export..."}),!isMobile&&props.onDelete&&jsx92(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx92(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx92(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx92(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs50(Group31,{gap:2,children:[lastResult&&jsxs50(Text11,{size:"xs",c:"dimmed","data-testid":"count-display",children:[getStart(search,lastResult).toLocaleString(),"-",getEnd(search,lastResult).toLocaleString(),lastResult.total!==void 0&&` of ${search.total==="estimate"?"~":""}${lastResult.total?.toLocaleString()}`]}),jsx92(ActionIcon9,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx92(IconRefresh,{size:iconSize})})]})]}),jsxs50(Table2,{className:SearchControl_default.table,children:[jsxs50(Table2.Thead,{children:[jsxs50(Table2.Tr,{children:[checkboxColumn&&jsx92(Table2.Th,{children:jsx92("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx92(Table2.Th,{children:jsxs50(Menu6,{shadow:"md",width:240,position:"bottom-end",children:[jsx92(Menu6.Target,{children:jsx92(UnstyledButton2,{className:SearchControl_default.control,p:2,children:jsxs50(Group31,{justify:"space-between",wrap:"nowrap",children:[jsx92(Text11,{fw:500,children:buildFieldNameString(field.name)}),jsx92(Center3,{className:SearchControl_default.icon,children:jsx92(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx92(SearchPopupMenu,{search:props.search,searchParams:field.searchParams,onPrompt:(searchParam,filter)=>{setState({...stateRef.current,filterDialogVisible:!0,filterDialogSearchParam:searchParam,filterDialogFilter:filter})},onChange:result=>{emitSearchChange(result)}})]})},field.name))]}),!props.hideFilters&&jsxs50(Table2.Tr,{children:[checkboxColumn&&jsx92(Table2.Th,{}),fields.map(field=>jsx92(Table2.Th,{children:field.searchParams&&jsx92(FilterDescription,{resourceType,searchParams:field.searchParams,filters:props.search.filters})},field.name))]})]}),jsx92(Table2.Tbody,{children:resources?.map(resource=>resource&&jsxs50(Table2.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx92(Table2.Td,{children:jsx92("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=>jsx92(Table2.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),resources?.length===0&&jsx92(Container,{children:jsx92(Center3,{style:{height:150},children:jsx92(Text11,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx92(Center3,{m:"md",p:"md",children:jsx92(Pagination,{value:getPage(search),total:getTotalPages(search,lastResult),onChange:newPage=>emitSearchChange(setPage(search,newPage)),getControlProps:control=>{switch(control){case"previous":return{"aria-label":"Previous page"};case"next":return{"aria-label":"Next page"};default:return{}}}})}),outcome&&jsx92("div",{"data-testid":"search-error",children:jsx92("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),jsx92(SearchFieldEditor,{search:props.search,visible:stateRef.current.fieldEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,fieldEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,fieldEditorVisible:!1})}}),jsx92(SearchFilterEditor,{search:props.search,visible:stateRef.current.filterEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,filterEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterEditorVisible:!1})}}),jsx92(SearchExportDialog,{visible:stateRef.current.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}}),jsx92(SearchFilterValueDialog,{visible:stateRef.current.filterDialogVisible,title:state.filterDialogSearchParam?.code?buildFieldNameString(state.filterDialogSearchParam.code):"",resourceType,searchParam:state.filterDialogSearchParam,filter:state.filterDialogFilter,defaultValue:"",onOk:filter=>{emitSearchChange(addFilter(props.search,filter.code,filter.operator,filter.value)),setState({...stateRef.current,filterDialogVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterDialogVisible:!1})}},state.filterDialogSearchParam?.code)]})}var MemoizedSearchControl=memo(SearchControl);function FilterDescription(props){let filters=(props.filters??[]).filter(f2=>props.searchParams.find(p=>p.code===f2.code));return filters.length===0?jsx92("span",{children:"no filters"}):jsx92(Fragment30,{children:filters.map(filter=>jsxs50("div",{children:[getOpString(filter.operator),"\xA0",jsx92(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 jsx93,jsxs as jsxs51}from"react/jsx-runtime";function FhirPathTable(props){let medplum=a(),[schemaLoaded,setSchemaLoaded]=useState45(!1),[outcome,setOutcome]=useState45(),{query,fields}=props,[response,setResponse]=useState45(),[selected,setSelected]=useState45({}),responseRef=useRef15();responseRef.current=response;let selectedRef=useRef15({});selectedRef.current=selected,useEffect16(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome2(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selectedRef.current};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=responseRef.current?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=responseRef.current?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selectedRef.current[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if(useEffect16(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx93(Loader5,{});let checkboxColumn=props.checkboxesEnabled;return jsxs51("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs51(Table3,{children:[jsx93(Table3.Thead,{children:jsxs51(Table3.Tr,{children:[checkboxColumn&&jsx93(Table3.Th,{children:jsx93("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx93(Table3.Th,{children:field.name},field.name))]})}),jsx93(Table3.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs51(Table3.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx93(Table3.Td,{children:jsx93("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=>jsx93(Table3.Td,{children:jsx93(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx93("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx93("div",{"data-testid":"search-error",children:jsx93("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx93(Button12,{onClick:()=>props.onBulk(Object.keys(selectedRef.current)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo2(FhirPathTable);import{jsx as jsx94,jsxs as jsxs52}from"react/jsx-runtime";function Logo(props){return jsxs52("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 491 491",style:{width:props.size,height:props.size},children:[jsx94("title",{children:"Medplum Logo"}),jsx94("path",{fill:props.fill??"#ad7136",d:"M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z"}),jsx94("path",{fill:props.fill??"#946af9",d:"M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z"}),jsx94("path",{fill:props.fill??"#7857c5",d:"M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z"}),jsx94("path",{fill:props.fill??"#40bc26",d:"M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z"}),jsx94("path",{fill:props.fill??"#33961e",d:"M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z"})]})}import{Box as Box4,SimpleGrid}from"@mantine/core";import{Box as Box3,Flex as Flex2,Group as Group32,Paper as Paper3,RingProgress,Text as Text12,Title as Title3}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept3}from"@medplum/core";import{Fragment as Fragment31,jsx as jsx95,jsxs as jsxs53}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx95(Paper3,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs53(Group32,{children:[group.measureScore&&jsx95(MeasureScore,{group}),!group.measureScore&&jsx95(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs53(Fragment31,{children:[jsx95(Text12,{fz:"md",fw:500,mb:8,children:measure.title}),jsx95(Text12,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept3(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept3(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs53(Box3,{children:[jsx95(Title3,{order:3,children:"Not Applicable"}),jsx95(Text12,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs53(Box3,{children:[jsx95(Title3,{order:3,children:"Insufficient Data"}),jsx95(Text12,{children:`Numerator: ${numeratorCount}`}),jsx95(Text12,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx95(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx95(Flex2,{justify:"center",children:jsxs53(Text12,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx95(Fragment31,{children:unit==="%"?jsx95(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx95(Flex2,{justify:"center",children:jsx95(Text12,{fw:700,fz:18,children:jsx95(QuantityDisplay,{value:group.measureScore})})})}):jsx95(Flex2,{h:120,align:"center",children:jsx95(Title3,{order:3,children:jsx95(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 jsx96,jsxs as jsxs54}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=pe(props.measureReport),[measure]=Ce("Measure",{url:report?.measure});return report?jsxs54(Box4,{children:[measure&&jsx96(MeasureTitle,{measure}),jsx96(SimpleGrid,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx96(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon10,Indicator,Tooltip as Tooltip2}from"@mantine/core";import{useCallback as useCallback11,useEffect as useEffect17,useState as useState46}from"react";import{jsx as jsx97}from"react/jsx-runtime";function NotificationIcon(props){let medplum=a(),{label,resourceType,countCriteria,subscriptionCriteria,onClick}=props,[unreadCount,setUnreadCount]=useState46(0),updateCount=useCallback11(cache=>{medplum.search(resourceType,countCriteria,{cache}).then(result=>setUnreadCount(result.total)).catch(console.error)},[medplum,resourceType,countCriteria]);useEffect17(()=>{updateCount("default")},[updateCount]),Oe(subscriptionCriteria,()=>{updateCount("reload")});let icon=jsx97(Tooltip2,{label,children:jsx97(ActionIcon10,{variant:"subtle",color:"gray",size:"lg","aria-label":label,onClick,children:props.iconComponent})});return unreadCount>0?jsx97(Indicator,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:icon}):icon}import{Alert as Alert2}from"@mantine/core";import{operationOutcomeIssueToString}from"@medplum/core";import{jsx as jsx98}from"react/jsx-runtime";function OperationOutcomeAlert(props){let issues=props.outcome?.issue||props.issues;return!issues||issues.length===0?null:jsx98(Alert2,{icon:jsx98(IconAlertCircle,{size:16}),color:"red",children:issues.map(issue=>jsx98("div",{"data-testid":"text-field-error",children:operationOutcomeIssueToString(issue)},issue.details?.text))})}import{Anchor as Anchor8,Card,Divider,Flex as Flex3,Group as Group41,Paper as Paper4,Stack as Stack16,Text as Text18}from"@mantine/core";import{calculateAgeString,formatHumanName as formatHumanName4,resolveId}from"@medplum/core";import{useEffect as useEffect18,useState as useState55}from"react";import{Anchor as Anchor3,Box as Box5,Group as Group34,Modal as Modal7,Text as Text13}from"@mantine/core";import{useDisclosure}from"@mantine/hooks";import{useCallback as useCallback13,useState as useState48}from"react";import{Button as Button13,Group as Group33,Stack as Stack11,TextInput as TextInput16}from"@mantine/core";import{createReference as createReference5}from"@medplum/core";import{useCallback as useCallback12,useState as useState47}from"react";import{jsx as jsx99,jsxs as jsxs55}from"react/jsx-runtime";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState47(allergy?.code),[clinicalStatus,setClinicalStatus]=useState47(allergy?.clinicalStatus),handleSubmit=useCallback12(formData=>{onSubmit({...allergy,resourceType:"AllergyIntolerance",patient:createReference5(patient),encounter:encounter?createReference5(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0})},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx99(Form,{onSubmit:handleSubmit,children:jsxs55(Stack11,{children:[jsx99(CodeableConceptInput,{name:"allergy",label:"Code",path:"AllergyIntolerance.code","data-autofocus":!0,binding:"http://hl7.org/fhir/us/core/ValueSet/us-core-allergy-substance",defaultValue:allergy?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx99(TextInput16,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx99(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:"http://hl7.org/fhir/ValueSet/allergyintolerance-clinical",defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx99(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx99(Group33,{justify:"flex-end",gap:4,mt:"md",children:jsx99(Button13,{type:"submit",children:"Save"})})]})},allergy?.id)}import{Badge as Badge2}from"@mantine/core";import{getDisplayString as getDisplayString5}from"@medplum/core";import{jsx as jsx100}from"react/jsx-runtime";function ConceptBadge(props){let{resource,onEdit}=props,rightSection;return onEdit&&(rightSection=jsx100(IconEdit,{"aria-label":`Edit ${getDisplayString5(resource)}`,size:12,onClick:e=>{killEvent(e),onEdit(resource)}})),jsx100(MedplumLink,{to:resource,children:jsx100(Badge2,{variant:"light",maw:"100%",rightSection,children:getDisplayString5(resource)})},resource.id)}import{Fragment as Fragment32,jsx as jsx101,jsxs as jsxs56}from"react/jsx-runtime";function Allergies(props){let medplum=a(),{patient,encounter}=props,[allergies,setAllergies]=useState48(props.allergies),[opened,{open,close}]=useDisclosure(!1),[editAllergy,setEditAllergy]=useState48(),handleSubmit=useCallback13(async allergy=>{if(allergy.id){let updatedAllergy=await medplum.updateResource(allergy);setAllergies(allergies.map(a2=>a2.id===updatedAllergy.id?updatedAllergy:a2))}else{let newAllergy=await medplum.createResource(allergy);setAllergies([...allergies,newAllergy])}setEditAllergy(void 0),close()},[medplum,allergies,close]);return jsxs56(Fragment32,{children:[jsxs56(Group34,{justify:"space-between",children:[jsx101(Text13,{fz:"md",fw:700,children:"Allergies"}),jsx101(Anchor3,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Add"})]}),allergies.length>0?jsx101(Box5,{children:allergies.map(allergy=>jsx101(ConceptBadge,{resource:allergy,onEdit:a2=>{setEditAllergy(a2),open()}},allergy.id))}):jsx101(Text13,{children:"(none)"}),jsx101(Modal7,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx101(AllergyDialog,{patient,encounter,allergy:editAllergy,onSubmit:handleSubmit})})]})}import{Anchor as Anchor4,Box as Box6,Group as Group36,Modal as Modal8,Text as Text14}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{useCallback as useCallback15,useState as useState50}from"react";import{Button as Button14,Group as Group35,Radio,Stack as Stack12}from"@mantine/core";import{createReference as createReference6}from"@medplum/core";import{useCallback as useCallback14,useState as useState49}from"react";import{jsx as jsx102,jsxs as jsxs57}from"react/jsx-runtime";function MedicationDialog(props){let{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState49(),handleSubmit=useCallback14(formData=>{let status=formData.status;onSubmit({...medication,resourceType:"MedicationRequest",status,intent:"order",encounter:encounter?createReference6(encounter):void 0,medicationCodeableConcept:code,subject:createReference6(patient)})},[patient,encounter,medication,code,onSubmit]);return jsx102(Form,{onSubmit:handleSubmit,children:jsxs57(Stack12,{h:275,children:[jsx102(CodeableConceptInput,{name:"request",path:"MedicationRequest.medication[x]","data-autofocus":!0,binding:"https://app.medplum.com/ValueSet/16d6f7b7-7eeb-4d0e-a83b-83be082aa10b",defaultValue:medication?.medicationCodeableConcept,onChange:request=>setCode(request),outcome:void 0}),jsxs57(Radio.Group,{mt:32,name:"status",label:"Request Status",required:!0,children:[jsx102(Radio,{value:"active",label:"active",my:"xs"},"active"),jsx102(Radio,{value:"stopped",label:"stopped",my:"xs"},"stopped")]}),jsx102(Group35,{justify:"flex-end",gap:4,mt:"md",children:jsx102(Button14,{type:"submit",children:"Save"})})]})})}import{Fragment as Fragment33,jsx as jsx103,jsxs as jsxs58}from"react/jsx-runtime";function Medications(props){let medplum=a(),[medicationRequests,setMedicationRequests]=useState50(props.medicationRequests),[editMedication,setEditMedication]=useState50(),[opened,{open,close}]=useDisclosure2(!1),handleSubmit=useCallback15(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m2=>m2.id===updatedMedication.id?updatedMedication:m2))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs58(Fragment33,{children:[jsxs58(Group36,{justify:"space-between",children:[jsx103(Text14,{fz:"md",fw:700,children:"Medications"}),jsx103(Anchor4,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Add"})]}),medicationRequests.length>0?jsx103(Box6,{children:medicationRequests.map(request=>jsx103(ConceptBadge,{resource:request,onEdit:mr=>{setEditMedication(mr),open()}},request.id))}):jsx103(Text14,{children:"(none)"}),jsx103(Modal8,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx103(MedicationDialog,{patient:props.patient,encounter:props.encounter,medication:editMedication,onSubmit:handleSubmit})})]})}import{Anchor as Anchor5,Grid as Grid2,Group as Group38,Modal as Modal9,Text as Text15}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{Fragment as Fragment34,useCallback as useCallback17,useState as useState52}from"react";import{Button as Button15,Group as Group37,Stack as Stack13}from"@mantine/core";import{createReference as createReference7}from"@medplum/core";import{useCallback as useCallback16,useState as useState51}from"react";import{jsx as jsx104,jsxs as jsxs59}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState51(condition?.code),[clinicalStatus,setClinicalStatus]=useState51(condition?.clinicalStatus),handleSubmit=useCallback16(formData=>{onSubmit({...condition,resourceType:"Condition",subject:createReference7(patient),encounter:encounter?createReference7(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0})},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx104(Form,{onSubmit:handleSubmit,children:jsxs59(Stack13,{children:[jsx104(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:"http://hl7.org/fhir/ValueSet/condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx104(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:"http://hl7.org/fhir/ValueSet/Condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx104(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx104(Group37,{justify:"flex-end",gap:4,mt:"md",children:jsx104(Button15,{type:"submit",children:"Save"})})]})},condition?.id)}import{Fragment as Fragment35,jsx as jsx105,jsxs as jsxs60}from"react/jsx-runtime";function ProblemList(props){let medplum=a(),{patient,encounter}=props,[problems,setProblems]=useState52(props.problems),[editCondition,setEditCondition]=useState52(),[opened,{open,close}]=useDisclosure3(!1),handleSubmit=useCallback17(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([...problems,newCondition])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs60(Fragment35,{children:[jsxs60(Group38,{justify:"space-between",children:[jsx105(Text15,{fz:"md",fw:700,children:"Problem List"}),jsx105(Anchor5,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Add"})]}),problems.length>0?jsx105(Grid2,{gutter:"xs",children:problems.map(problem=>jsxs60(Fragment34,{children:[jsx105(Grid2.Col,{span:2,children:problem.onsetDateTime?.substring(0,4)}),jsx105(Grid2.Col,{span:10,children:jsx105(ConceptBadge,{resource:problem,onEdit:p=>{setEditCondition(p),open()}},problem.id)})]},problem.id))}):jsx105(Text15,{children:"(none)"}),jsx105(Modal9,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx105(ConditionDialog,{patient,encounter,condition:editCondition,onSubmit:handleSubmit})})]})}import{Anchor as Anchor6,Badge as Badge3,Box as Box7,Button as Button16,Group as Group39,Modal as Modal10,Radio as Radio2,Stack as Stack14,Text as Text16}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG2,LOINC,SNOMED,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback18,useState as useState53}from"react";import{Fragment as Fragment36,jsx as jsx106,jsxs as jsxs61}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=a(),{patient,encounter}=props,[smokingStatus,setSmokingStatus]=useState53(props.smokingStatus),[opened,{open,close}]=useDisclosure4(!1),handleSubmit=useCallback18(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG2+"/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:LOINC,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference8(patient),encounter:encounter?createReference8(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED,version:SNOMED+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs61(Fragment36,{children:[jsxs61(Group39,{justify:"space-between",children:[jsx106(Text16,{fz:"md",fw:700,children:"Smoking Status"}),jsx106(Anchor6,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Edit"})]}),smokingStatus?.valueCodeableConcept?jsx106(Box7,{children:jsx106(Badge3,{variant:"light",children:jsx106(CodeableConceptDisplay,{value:smokingStatus.valueCodeableConcept})})}):jsx106(Text16,{children:"(none)"}),jsx106(Modal10,{opened,onClose:close,title:"Set Smoking Status",children:jsx106(Form,{onSubmit:handleSubmit,children:jsxs61(Stack14,{children:[jsx106(Radio2.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx106(Radio2,{value:code,label:text,my:"xs"},code))}),jsx106(Group39,{justify:"flex-end",gap:4,mt:"md",children:jsx106(Button16,{type:"submit",children:"Save"})})]})})})]})}import{Anchor as Anchor7,Button as Button17,Grid as Grid3,Group as Group40,Modal as Modal11,Stack as Stack15,Text as Text17,Textarea as Textarea3,TextInput as TextInput17}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{useCallback as useCallback19,useState as useState54}from"react";import{LOINC as LOINC2,UCUM,createReference as createReference9}from"@medplum/core";function getObservationValue(observations,code){return observations.find(o=>o.code?.coding?.[0].code===code)?.valueQuantity}function getCompoundObservationValue(observations,code,innerCode){return observations.find(o=>o.code?.coding?.[0].code===code)?.component?.find(c=>c.code?.coding?.[0].code===innerCode)?.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:createReference9(patient),encounter:encounter?createReference9(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:LOINC2}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!isNaN(value)&&isFinite(value)}import{Fragment as Fragment37,jsx as jsx107,jsxs as jsxs62}from"react/jsx-runtime";var LOINC_CODES={bloodPressure:{code:"85354-9",title:"Blood Pressure",unit:"mm[Hg]"},heartRate:{code:"8867-4",title:"Heart Rate",unit:"/min"},bodyTemperature:{code:"8310-5",title:"Body Temperature",unit:"Cel"},respiratoryRate:{code:"9279-1",title:"Respiratory Rate",unit:"/min"},height:{code:"8302-2",title:"height",unit:"cm"},weight:{code:"29463-7",title:"weight",unit:"kg"},bmi:{code:"39156-5",title:"BMI",unit:"kg/m2"},oxygen:{code:"2708-6",title:"Oxygen",unit:"%"},headCircumference:{code:"9843-4",title:"Head Circumference",unit:"cm"}},SYSTOLIC="8480-6",DIASTOLIC="8462-4";function Vitals(props){let medplum=a(),{patient,encounter}=props,[vitals,setVitals]=useState54(props.vitals),[opened,{open,close}]=useDisclosure5(!1),handleSubmit=useCallback19(formData=>{let newObservations=Object.entries(LOINC_CODES).map(([name,meta])=>name==="bloodPressure"?createCompoundObservation(patient,encounter,meta.code,meta.title,[{code:createLoincCode(SYSTOLIC,"Systolic blood pressure"),valueQuantity:createQuantity(parseFloat(formData.systolic),"mm[Hg]")},{code:createLoincCode(DIASTOLIC,"Diastolic blood pressure"),valueQuantity:createQuantity(parseFloat(formData.diastolic),"mm[Hg]")}]):createObservation(patient,encounter,meta.code,meta.title,createQuantity(parseFloat(formData[name]),meta.unit))).filter(Boolean);Promise.all(newObservations.map(obs=>medplum.createResource(obs))).then(newVitals=>setVitals([...newVitals,...vitals])).catch(console.error),close()},[medplum,patient,encounter,vitals,close]);return jsxs62(Fragment37,{children:[jsxs62(Group40,{justify:"space-between",children:[jsx107(Text17,{fz:"md",fw:700,children:"Vitals"}),jsx107(Anchor7,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Add"})]}),jsxs62(Grid3,{children:[jsx107(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"BP Sys"}),jsx107(Grid3.Col,{span:3,children:jsx107(QuantityDisplay,{value:getCompoundObservationValue(vitals,LOINC_CODES.bloodPressure.code,SYSTOLIC)})}),jsx107(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"BP Dias"}),jsx107(Grid3.Col,{span:3,children:jsx107(QuantityDisplay,{value:getCompoundObservationValue(vitals,LOINC_CODES.bloodPressure.code,DIASTOLIC)})}),jsx107(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"HR"}),jsx107(Grid3.Col,{span:3,children:jsx107(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.heartRate.code)})}),jsx107(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"Temp"}),jsx107(Grid3.Col,{span:3,children:jsx107(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.bodyTemperature.code)})}),jsx107(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"RR"}),jsx107(Grid3.Col,{span:3,children:jsx107(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.respiratoryRate.code)})}),jsx107(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"Height"}),jsx107(Grid3.Col,{span:3,children:jsx107(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.height.code)})}),jsx107(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"Weight"}),jsx107(Grid3.Col,{span:3,children:jsx107(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.weight.code)})}),jsx107(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"BMI"}),jsx107(Grid3.Col,{span:3,children:jsx107(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.bmi.code)})}),jsx107(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"O2"}),jsx107(Grid3.Col,{span:3,children:jsx107(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.oxygen.code)})}),jsx107(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"HC"}),jsx107(Grid3.Col,{span:3,children:jsx107(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.headCircumference.code)})})]}),jsx107(Modal11,{opened,onClose:close,title:"Add Vitals",children:jsxs62(Form,{onSubmit:handleSubmit,children:[jsxs62(Stack15,{children:[jsxs62(Group40,{grow:!0,children:[jsx107(TextInput17,{name:"systolic",label:"BP Sys","data-autofocus":!0,autoFocus:!0}),jsx107(TextInput17,{name:"diastolic",label:"BP Dias"})]}),jsxs62(Group40,{grow:!0,children:[jsx107(TextInput17,{name:"heartRate",label:"HR"}),jsx107(TextInput17,{name:"bodyTemperature",label:"Temp"})]}),jsxs62(Group40,{grow:!0,children:[jsx107(TextInput17,{name:"respiratoryRate",label:"RR"}),jsx107(TextInput17,{name:"height",label:"height"})]}),jsxs62(Group40,{grow:!0,children:[jsx107(TextInput17,{name:"weight",label:"Wt"}),jsx107(TextInput17,{name:"bmi",label:"BMI"})]}),jsxs62(Group40,{grow:!0,children:[jsx107(TextInput17,{name:"oxygen",label:"O2"}),jsx107(TextInput17,{name:"headCircumference",label:"HC"})]}),jsx107(Textarea3,{name:"notes",label:"Notes"})]}),jsx107(Group40,{justify:"flex-end",gap:4,mt:"md",children:jsx107(Button17,{type:"submit",children:"Save"})})]})})]})}import{jsx as jsx108,jsxs as jsxs63}from"react/jsx-runtime";function PatientSummary(props){let medplum=a(),{patient:propsPatient,background,...rest}=props,[patient,setPatient]=useState55(),[allergies,setAllergies]=useState55(),[problems,setProblems]=useState55(),[smokingStatus,setSmokingStatus]=useState55(),[vitals,setVitals]=useState55(),[medicationRequest,setMedicationRequest]=useState55();return useEffect18(()=>{let id=resolveId(propsPatient),ref=`Patient/${id}`,searchMeta={_count:100,_sort:"-_lastUpdated"};Promise.all([medplum.readResource("Patient",id),medplum.searchResources("AllergyIntolerance",{patient:ref,...searchMeta}),medplum.searchResources("Condition",{patient:ref,...searchMeta}),medplum.searchResources("MedicationRequest",{subject:ref,...searchMeta}),medplum.searchResources("Observation",{subject:ref,...searchMeta})]).then(results=>{setPatient(results[0]),setAllergies(results[1]),setProblems(results[2]),setMedicationRequest(results[3]);let observations=results[4];setSmokingStatus(observations.find(obs=>obs.code?.coding?.[0].code==="72166-2")),setVitals(observations.filter(obs=>obs.category?.[0]?.coding?.[0].code==="vital-signs"))}).catch(console.error)},[medplum,propsPatient]),patient?jsxs63(Card,{...rest,children:[jsx108(Card.Section,{h:100,style:{background}}),jsx108(ResourceAvatar,{value:patient,size:80,radius:80,mx:"auto",mt:-50,style:{border:"2px solid white"}}),jsx108(Text18,{ta:"center",fz:"lg",fw:500,children:formatHumanName4(patient.name?.[0])}),jsxs63(Text18,{ta:"center",fz:"xs",color:"dimmed",children:[patient.birthDate," (",calculateAgeString(patient.birthDate),")"]}),jsx108(Paper4,{withBorder:!0,p:"md",my:"md",children:jsxs63(Group41,{grow:!0,children:[jsxs63(Flex3,{justify:"center",align:"center",direction:"column",gap:0,maw:"33%",children:[jsx108(IconUserSquare,{size:24,color:"gray"}),jsx108(Text18,{fz:"xs",ta:"center",style:{whiteSpace:"nowrap"},children:"Self"})]}),jsxs63(Flex3,{justify:"center",align:"center",direction:"column",gap:0,children:[jsx108(IconStethoscope,{size:24,color:"gray"}),jsx108(Text18,{fz:"xs",style:{whiteSpace:"nowrap"},children:patient?.generalPractitioner?.[0]?.display??"No provider"})]}),jsxs63(Flex3,{justify:"center",align:"center",direction:"column",gap:0,children:[jsx108(IconGenderFemale,{size:24,color:"gray"}),jsx108(Text18,{fz:"xs",style:{whiteSpace:"nowrap"},children:patient.gender})]})]})}),jsxs63(Stack16,{gap:"xs",children:[jsx108(Anchor8,{href:"#",children:"No upcoming appointments"}),jsx108(Anchor8,{href:"#",children:"No documented visits"}),jsx108(Divider,{}),jsx108(Allergies,{patient,allergies}),jsx108(Divider,{}),jsx108(ProblemList,{patient,problems}),jsx108(Divider,{}),jsx108(Medications,{patient,medicationRequests:medicationRequest}),jsx108(Divider,{}),jsx108(SmokingStatus,{patient,smokingStatus}),jsx108(Divider,{}),jsx108(Vitals,{patient,vitals})]})]}):null}import{createReference as createReference10}from"@medplum/core";import{useCallback as useCallback20}from"react";import{jsx as jsx109}from"react/jsx-runtime";function PatientTimeline(props){let loadTimelineResources=useCallback20((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),medplum.search("Communication",{subject:ref,_count}),medplum.search("Device",{patient:ref,_count}),medplum.search("DeviceRequest",{patient:ref,_count}),medplum.search("DiagnosticReport",{subject:ref,_count}),medplum.search("Media",{subject:ref,_count}),medplum.search("ServiceRequest",{subject:ref,_count}),medplum.search("Task",{subject:ref,_count})])},[]);return jsx109(ResourceTimeline,{value:props.patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference10(resource),sender:createReference10(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference10(resource),operator:createReference10(operator),issued:new Date().toISOString(),content})})}import{Anchor as Anchor9,Button as Button18,NativeSelect as NativeSelect11,Stack as Stack17,TextInput as TextInput18}from"@mantine/core";import{getReferenceString as getReferenceString7}from"@medplum/core";import{useEffect as useEffect19,useRef as useRef16,useState as useState56}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing",bottomActions:"PlanDefinitionBuilder_bottomActions"};import{jsx as jsx110,jsxs as jsxs64}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=a(),defaultValue2=pe(props.value),[schemaLoaded,setSchemaLoaded]=useState56(!1),[selectedKey,setSelectedKey]=useState56(),[hoverKey,setHoverKey]=useState56(),[value,setValue]=useState56();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}let valueRef=useRef16();if(valueRef.current=value,useEffect19(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect19(()=>(setValue(ensurePlanDefinitionKeys(defaultValue2??{resourceType:"PlanDefinition",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]),!schemaLoaded||!value)return null;function changeProperty(property,newValue){setValue({...valueRef.current,[property]:newValue})}return jsx110("div",{children:jsxs64(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx110(TextInput18,{label:"Plan Title",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx110(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x2=>changeProperty("action",x2)}),jsx110(Button18,{type:"submit",children:"Save"})]})})}function ActionArrayBuilder(props){let actionsRef=useRef16();actionsRef.current=props.actions;function changeAction(changedAction){props.onChange(actionsRef.current.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...actionsRef.current,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(actionsRef.current.filter(i=>i!==removedAction))}return jsxs64("div",{className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx110("div",{children:jsx110(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)})},action.id)),jsx110("div",{className:PlanDefinitionBuilder_default.bottomActions,children:jsx110(Anchor9,{href:"#",onClick:e=>{killEvent(e),addAction({id:generateId()})},children:"Add action"})})]})}function ActionBuilder(props){let{action}=props,actionType=getInitialActionType(action),editing=props.selectedKey===props.action.id,hovering=props.hoverKey===props.action.id;function onClick(e){e.stopPropagation(),props.setSelectedKey(props.action.id)}function onHover(e){killEvent(e),props.setHoverKey(props.action.id)}let className=clsx_default(PlanDefinitionBuilder_default.section,{[PlanDefinitionBuilder_default.editing]:editing,[PlanDefinitionBuilder_default.hovering]:hovering&&!editing});return jsxs64("div",{"data-testid":action.id,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[editing?jsx110(ActionEditor,{action,actionType,onChange:props.onChange,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onRemove:props.onRemove}):jsx110(ActionDisplay,{action,actionType}),jsx110("div",{className:PlanDefinitionBuilder_default.bottomActions,children:jsx110(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),props.onRemove()},children:"Remove"})})]})}var timingProperty={path:"PlanDefinition.action.timing[x]",min:0,max:1,description:"",isArray:!1,constraints:[],type:["dateTime","Period","Range","Timing"].map(t=>({code:t}))};function ActionDisplay(props){let{action,actionType}=props,[propertyValue,propertyType]=getActionTiming(action);return jsxs64("div",{children:[jsxs64("div",{children:[action.title||"Untitled"," ",actionType&&`(${actionType})`]}),action.definitionCanonical&&jsx110("div",{children:jsx110(ReferenceDisplay,{value:{reference:action.definitionCanonical}})}),propertyValue&&jsx110("div",{children:jsx110(ResourcePropertyDisplay,{property:timingProperty,propertyType,value:propertyValue})})]})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState56(props.actionType);function changeProperty(property,value){props.onChange({...action,[property]:value})}return jsxs64(Stack17,{gap:"xl",children:[jsx110(TextInput18,{name:`actionTitle-${action.id}`,label:"Title",defaultValue:action.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx110(TextInput18,{name:`actionDescription-${action.id}`,label:"Description",defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)}),jsx110(NativeSelect11,{label:"Type of Action",description:"The type of the action to be performed.",name:`actionType-${action.id}`,defaultValue:actionType,onChange:e=>setActionType(e.currentTarget.value),data:["","appointment","lab","questionnaire","task"]}),action.action&&action.action.length>0&&jsx110(ActionArrayBuilder,{actions:action.action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:x2=>changeProperty("action",x2)}),(()=>{switch(actionType){case"appointment":return jsx110(ActionResourceTypeBuilder,{title:"Appointment",description:"The subject must schedule an appointment from the schedule.",resourceType:"Schedule",action,onChange:props.onChange});case"lab":return jsx110(ActionResourceTypeBuilder,{title:"Lab",description:"The subject must complete the following lab panel.",resourceType:"ActivityDefinition",action,onChange:props.onChange});case"questionnaire":return jsx110(ActionResourceTypeBuilder,{title:"Questionnaire",description:"The subject must complete the selected questionnaire.",resourceType:"Questionnaire",action,onChange:props.onChange});case"task":return jsx110(ActionResourceTypeBuilder,{title:"Task",description:"The subject must complete the following task.",resourceType:"ActivityDefinition",action,onChange:props.onChange});default:return null}})(),jsx110(FormSection,{title:"Timing",description:"When the action should take place.",children:jsx110(ActionTimingInput,{name:"timing-"+action.id,action,onChange:props.onChange})})]})}function ActionResourceTypeBuilder(props){let{id,definitionCanonical}=props.action,reference=definitionCanonical?.startsWith(props.resourceType+"/")?{reference:definitionCanonical}:void 0;return jsx110(ResourceInput,{name:id,resourceType:props.resourceType,defaultValue:reference,loadOnFocus:!0,onChange:newValue=>{newValue?props.onChange({...props.action,definitionCanonical:getReferenceString7(newValue)}):props.onChange({...props.action,definitionCanonical:void 0})}})}function ActionTimingInput(props){let value=props.action,key="timing",[propertyValue,propertyType]=getActionTiming(value);return jsx110(ResourcePropertyInput,{property:timingProperty,name:"timing[x]",path:"PlanDefinition.timing[x]",defaultValue:propertyValue,defaultPropertyType:propertyType,onChange:(newValue,propName)=>{props.onChange(setPropertyValue(value,key,propName??key,timingProperty,newValue))},outcome:void 0})}function getInitialActionType(action){if(action.definitionCanonical?.startsWith("Schedule"))return"appointment";if(action.definitionCanonical?.startsWith("Questionnaire/"))return"questionnaire";if(action.definitionCanonical?.startsWith("ActivityDefinition/"))return"task"}function getActionTiming(action){return getValueAndType({type:"PlanDefinitionAction",value:action},"timing")}var nextId=1;function generateId(existing){if(existing){if(existing.startsWith("id-")){let existingNum=parseInt(existing.substring(3),10);isNaN(existingNum)||(nextId=Math.max(nextId,existingNum+1))}return existing}return"id-"+nextId++}function ensurePlanDefinitionKeys(planDefinition){return{...planDefinition,action:ensurePlanDefinitionActionKeys(planDefinition.action)}}function ensurePlanDefinitionActionKeys(actions){if(actions)return actions.map(action=>({...action,id:generateId(action.id),action:ensurePlanDefinitionActionKeys(action.action)}))}import{Anchor as Anchor10,Box as Box8,Button as Button19,Group as Group43,NativeSelect as NativeSelect13,Space as Space2,Textarea as Textarea5,TextInput as TextInput20,Title as Title4}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{useEffect as useEffect20,useRef as useRef17,useState as useState57}from"react";import{Checkbox as Checkbox3,Group as Group42,MultiSelect as MultiSelect2,NativeSelect as NativeSelect12,Radio as Radio3,Textarea as Textarea4,TextInput as TextInput19}from"@mantine/core";import{capitalize as capitalize6,deepEquals,formatCodeableConcept as formatCodeableConcept4,formatCoding as formatCoding3,getElementDefinition as getElementDefinition2,getTypedPropertyValue as getTypedPropertyValue3,stringify as stringify5}from"@medplum/core";import{useContext as useContext14}from"react";import{deepClone as deepClone2,evalFhirPathTyped as evalFhirPathTyped3,formatCoding as formatCoding2,getExtension,getReferenceString as getReferenceString8,getTypedPropertyValue as getTypedPropertyValue2,splitN,stringify as stringify4}from"@medplum/core";var QuestionnaireItemType=(QuestionnaireItemType2=>(QuestionnaireItemType2.group="group",QuestionnaireItemType2.display="display",QuestionnaireItemType2.question="question",QuestionnaireItemType2.boolean="boolean",QuestionnaireItemType2.decimal="decimal",QuestionnaireItemType2.integer="integer",QuestionnaireItemType2.date="date",QuestionnaireItemType2.dateTime="dateTime",QuestionnaireItemType2.time="time",QuestionnaireItemType2.string="string",QuestionnaireItemType2.text="text",QuestionnaireItemType2.url="url",QuestionnaireItemType2.choice="choice",QuestionnaireItemType2.openChoice="open-choice",QuestionnaireItemType2.attachment="attachment",QuestionnaireItemType2.reference="reference",QuestionnaireItemType2.quantity="quantity",QuestionnaireItemType2))(QuestionnaireItemType||{});function isChoiceQuestion(item){return item.type==="choice"||item.type==="open-choice"}function isQuestionEnabled(item,responseItems){if(!item.enableWhen)return!0;let enableBehavior=item.enableBehavior??"any";for(let enableWhen of item.enableWhen){let actualAnswers=getByLinkId(responseItems,enableWhen.question);if(enableWhen.operator==="exists"&&!enableWhen.answerBoolean&&!actualAnswers?.length){if(enableBehavior==="any")return!0;continue}let{anyMatch,allMatch}=checkAnswers(enableWhen,actualAnswers,enableBehavior);if(enableBehavior==="any"&&anyMatch)return!0;if(enableBehavior==="all"&&!allMatch)return!1}return enableBehavior!=="any"}function getNewMultiSelectValues(selected,propertyName,item){return selected.map(o=>{let option=item.answerOption?.find(option2=>formatCoding2(option2.valueCoding)===o||option2[propertyName]===o),optionValue=getTypedPropertyValue2({type:"QuestionnaireItemAnswerOption",value:option},"value");return{[propertyName]:optionValue?.value}})}function getByLinkId(responseItems,linkId){if(responseItems)for(let response of responseItems){if(response.linkId===linkId)return response.answer;if(response.item){let nestedAnswer=getByLinkId(response.item,linkId);if(nestedAnswer)return nestedAnswer}}}function evaluateMatch(actualAnswer,expectedAnswer,operator){if(operator==="exists")return!!actualAnswer===expectedAnswer.value;if(actualAnswer){let fhirPathOperator=operator==="="||operator==="!="?operator?.replace("=","~"):operator,[{value}]=evalFhirPathTyped3(`%actualAnswer ${fhirPathOperator} %expectedAnswer`,[actualAnswer],{"%actualAnswer":actualAnswer,"%expectedAnswer":expectedAnswer});return value}else return!1}function checkAnswers(enableWhen,answers,enableBehavior){let actualAnswers=answers||[],expectedAnswer=getTypedPropertyValue2({type:"QuestionnaireItemEnableWhen",value:enableWhen},"answer[x]"),anyMatch=!1,allMatch=!0;for(let actualAnswerValue of actualAnswers){let actualAnswer=getTypedPropertyValue2({type:"QuestionnaireResponseItemAnswer",value:actualAnswerValue},"value[x]"),{operator}=enableWhen;if(evaluateMatch(actualAnswer,expectedAnswer,operator)?anyMatch=!0:allMatch=!1,enableBehavior==="any"&&anyMatch)break}return{anyMatch,allMatch}}function getQuestionnaireItemReferenceTargetTypes(item){let extension=getExtension(item,"http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource");if(extension){if(extension.valueCode!==void 0)return[extension.valueCode];if(extension.valueCodeableConcept)return extension.valueCodeableConcept?.coding?.map(c=>c.code)}}function setQuestionnaireItemReferenceTargetTypes(item,targetTypes){let result=deepClone2(item),extension=getExtension(result,"http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource");return!targetTypes||targetTypes.length===0?(extension&&(result.extension=result.extension?.filter(e=>e!==extension)),result):(extension||(result.extension||(result.extension=[]),extension={url:"http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource"},result.extension.push(extension)),targetTypes.length===1?(extension.valueCode=targetTypes[0],delete extension.valueCodeableConcept):(extension.valueCodeableConcept={coding:targetTypes.map(t=>({code:t}))},delete extension.valueCode),result)}function getQuestionnaireItemReferenceFilter(item,subject,encounter){let extension=getExtension(item,"http://hl7.org/fhir/StructureDefinition/questionnaire-referenceFilter");if(!extension?.valueString)return;let filter=extension.valueString;subject?.reference&&(filter=filter.replaceAll("$subj",subject.reference)),encounter?.reference&&(filter=filter.replaceAll("$encounter",encounter.reference));let result={},parts=filter.split("&");for(let part of parts){let[key,value]=splitN(part,"=",2);result[key]=value}return result}function buildInitialResponse(questionnaire){return{resourceType:"QuestionnaireResponse",questionnaire:getReferenceString8(questionnaire),item:buildInitialResponseItems(questionnaire.item),status:"in-progress"}}function buildInitialResponseItems(items){return items?.map(buildInitialResponseItem)??[]}function buildInitialResponseItem(item){return{id:generateId2(),linkId:item.linkId,text:item.text,item:buildInitialResponseItems(item.item),answer:item.initial?.map(buildInitialResponseAnswer)??[]}}var nextId2=1;function generateId2(){return"id-"+nextId2++}function buildInitialResponseAnswer(answer){return{...answer}}function formatReferenceString(typedValue){return typedValue.value.display||typedValue.value.reference||stringify4(typedValue.value)}function getNumberOfPages(questionnaire){let firstItem=questionnaire?.item?.[0];return firstItem&&getExtension(firstItem,"http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl")?.valueCodeableConcept?.coding?.[0]?.code==="page"?questionnaire.item.length:1}import{createContext}from"react";var QuestionnaireFormContext=createContext({});import{jsx as jsx111}from"react/jsx-runtime";function QuestionnaireFormItem(props){let context=useContext14(QuestionnaireFormContext),item=props.item,response=props.response;function onChangeAnswer(newResponseAnswer){let updatedAnswers;Array.isArray(newResponseAnswer)?updatedAnswers=newResponseAnswer:props.index>=(props.response?.answer?.length??0)?updatedAnswers=(props.response?.answer??[]).concat([newResponseAnswer]):updatedAnswers=(props.response?.answer??[]).map((a2,idx)=>idx===props.index?newResponseAnswer:a2)??[],props.onChange({id:response?.id,linkId:response?.linkId,text:item.text,answer:updatedAnswers})}let type=item.type;if(!type)return null;let name=item.linkId;if(!name)return null;let initial=item.initial&&item.initial.length>0?item.initial[0]:void 0,defaultValue2=getCurrentAnswer(response,props.index)??getTypedPropertyValue3({type:"QuestionnaireItemInitial",value:initial},"value");switch(type){case"display":return jsx111("p",{children:props.item.text},props.item.linkId);case"boolean":return jsx111(CheckboxFormSection,{title:props.item.text,htmlFor:props.item.linkId,children:jsx111(Checkbox3,{id:props.item.linkId,name:props.item.linkId,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer({valueBoolean:e.currentTarget.checked})})},props.item.linkId);case"decimal":return jsx111(TextInput19,{type:"number",step:"any",id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueDecimal:e.currentTarget.valueAsNumber})});case"integer":return jsx111(TextInput19,{type:"number",step:1,id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueInteger:e.currentTarget.valueAsNumber})});case"date":return jsx111(TextInput19,{type:"date",id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueDate:e.currentTarget.value})});case"dateTime":return jsx111(DateTimeInput,{name,required:item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueDateTime:newValue})});case"time":return jsx111(TextInput19,{type:"time",id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueTime:e.currentTarget.value})});case"string":case"url":return jsx111(TextInput19,{id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueString:e.currentTarget.value})});case"text":return jsx111(Textarea4,{id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueString:e.currentTarget.value})});case"attachment":return jsx111(Group42,{py:4,children:jsx111(AttachmentInput,{name,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueAttachment:newValue})})});case"reference":return jsx111(ReferenceInput,{name,required:item.required,targetTypes:getQuestionnaireItemReferenceTargetTypes(item),searchCriteria:getQuestionnaireItemReferenceFilter(item,context.subject,context.encounter),defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueReference:newValue})});case"quantity":return jsx111(QuantityInput,{name,required:item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueQuantity:newValue}),disableWheel:!0});case"choice":case"open-choice":return isDropDownChoice(item)&&!item.answerValueSet?jsx111(QuestionnaireChoiceDropDownInput,{name,item,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):jsx111(QuestionnaireChoiceSetInput,{name,item,initial,response,onChangeAnswer:e=>onChangeAnswer(e)});default:return null}}function QuestionnaireChoiceDropDownInput(props){let{name,item,initial,response}=props;if(!item.answerOption?.length)return jsx111(NoAnswerDisplay,{});let initialValue=getTypedPropertyValue3({type:"QuestionnaireItemInitial",value:initial},"value"),data2=[""];for(let option of item.answerOption){let optionValue=getTypedPropertyValue3({type:"QuestionnaireItemAnswerOption",value:option},"value");data2.push(typedValueToString(optionValue))}let defaultValue2=getCurrentAnswer(response)??initialValue;if(item.repeats){let{propertyName,data:data3}=formatSelectData(props.item),currentAnswer=getCurrentMultiSelectAnswer(response);return jsx111(MultiSelect2,{data:data3,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[typedValueToString(initialValue)],onChange:selected=>{let values=getNewMultiSelectValues(selected,propertyName,item);props.onChangeAnswer(values)}})}return jsx111(NativeSelect12,{id:name,name,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){props.onChangeAnswer({});return}let option=item.answerOption[index-1],optionValue=getTypedPropertyValue3({type:"QuestionnaireItemAnswerOption",value:option},"value"),propertyName="value"+capitalize6(optionValue.type);props.onChangeAnswer({[propertyName]:optionValue.value})},defaultValue:formatCoding3(defaultValue2?.value)||defaultValue2?.value,data:data2})}function QuestionnaireChoiceSetInput(props){let{name,item,initial,onChangeAnswer,response}=props;return!item.answerOption?.length&&!item.answerValueSet?jsx111(NoAnswerDisplay,{}):item.answerValueSet?jsx111(CodingInput,{name,binding:item.answerValueSet,onChange:code=>onChangeAnswer({valueCoding:code}),creatable:item.type==="open-choice"}):jsx111(QuestionnaireChoiceRadioInput,{name:response?.id??name,item,initial,response,onChangeAnswer})}function QuestionnaireChoiceRadioInput(props){let{name,item,initial,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition2("QuestionnaireItemAnswerOption","value[x]"),initialValue=getTypedPropertyValue3({type:"QuestionnaireItemInitial",value:initial},"value"),options=[],defaultValue2;if(item.answerOption)for(let i=0;i<item.answerOption.length;i++){let option=item.answerOption[i],optionName=`${name}-option-${i}`,optionValue=getTypedPropertyValue3({type:"QuestionnaireItemAnswerOption",value:option},"value");optionValue?.value&&(initialValue&&stringify5(optionValue)===stringify5(initialValue)&&(defaultValue2=optionName),options.push([optionName,optionValue]))}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);return jsx111(Radio3.Group,{name,value:answerLinkId??defaultValue2,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:options.map(([optionName,optionValue])=>jsx111(Radio3,{id:optionName,value:optionName,py:4,label:jsx111(ResourcePropertyDisplay,{property:valueElementDefinition,propertyType:optionValue.type,value:optionValue.value})},optionName))})}function NoAnswerDisplay(){return jsx111(TextInput19,{disabled:!0,placeholder:"No Answers Defined"})}function getItemValue(answer){return getTypedPropertyValue3({type:"QuestionnaireItemAnswer",value:answer},"value")}function getCurrentAnswer(response,index=0){let results=response.answer;return getItemValue(results?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response.answer;return results?results.map(a2=>getItemValue(a2)).map(type=>formatCoding3(type?.value)||type?.value):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals(option[1].value,defaultAnswer?.value))?.[0]}function typedValueToString(typedValue){if(typedValue)return typedValue.type==="CodeableConcept"?formatCodeableConcept4(typedValue.value):typedValue.type==="Coding"?formatCoding3(typedValue.value):typedValue.type==="Reference"?formatReferenceString(typedValue):typedValue.value.toString()}function isDropDownChoice(item){return!!item.extension?.some(e=>e.url==="http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl"&&e.valueCodeableConcept?.coding?.[0]?.code==="drop-down")}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=getTypedPropertyValue3({type:"QuestionnaireItemAnswerOption",value:option},"value"),propertyName="value"+capitalize6(optionValue.type),data2=(item.answerOption??[]).map(a2=>({value:getValueAndLabel(a2,propertyName),label:getValueAndLabel(a2,propertyName)}));return{propertyName,data:data2}}function getValueAndLabel(option,propertyName){return formatCoding3(option.valueCoding)||option[propertyName]?.toString()}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"};import{Fragment as Fragment38,jsx as jsx112,jsxs as jsxs65}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=a(),defaultValue2=pe(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState57(!1),[value,setValue]=useState57(),[selectedKey,setSelectedKey]=useState57(),[hoverKey,setHoverKey]=useState57();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect20(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect20(()=>(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:jsx112("div",{children:jsxs65(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx112(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx112(Button19,{type:"submit",children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource2=isResourceType(props.item),isContainer=isResource2||item.type==="group",linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef17();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 jsxs65("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx112("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs65(Fragment38,{children:[isResource2&&jsx112(TextInput20,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource2&&jsx112(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx112(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx112(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs65(Fragment38,{children:[resource.title&&jsx112(Title4,{children:resource.title}),item.text&&jsx112("div",{children:item.text}),!isContainer&&jsx112(QuestionnaireFormItem,{item,index:0,onChange:()=>{},response:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx112("div",{children:jsx112(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&&jsx112("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs65(Fragment38,{children:[jsx112(TextInput20,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx112(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"}]})]}):jsx112("div",{children:linkId})}),!isResource2&&jsx112(Box8,{className:QuestionnaireBuilder_default.movementActions,children:jsxs65(Box8,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx112(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx112(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx112(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx112(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs65("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs65(Fragment38,{children:[jsx112(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId3(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx112(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId3(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource2&&jsx112(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource2&&jsxs65(Fragment38,{children:[jsx112(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx112(Anchor10,{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 jsxs65("div",{children:[props.item.answerValueSet!==void 0?jsx112(TextInput20,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx112(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs65(Box8,{display:"flex",children:[jsx112(Anchor10,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId3()}]})},children:"Add choice"}),jsx112(Space2,{w:"lg"}),jsx112(Anchor10,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx112("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs65("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx112("div",{children:jsx112(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)}),jsx112("div",{children:jsx112(Anchor10,{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=getQuestionnaireItemReferenceTargetTypes(props.item)??[];return jsxs65(Fragment38,{children:[targetTypes.map((targetType,index)=>jsxs65(Group43,{children:[jsx112(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx112(Anchor10,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx112(Anchor10,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId3=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId3(){return"id-"+nextId3++}function ensureQuestionnaireKeys(questionnaire){return{...questionnaire,id:questionnaire.id||generateId3(),item:ensureQuestionnaireItemKeys(questionnaire.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId3=Math.max(nextId3,parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId3(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId3()}))}function createPage(){return{id:generateId3(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:"http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",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{Title as Title6}from"@mantine/core";import{createReference as createReference11,getReferenceString as getReferenceString9}from"@medplum/core";import{useEffect as useEffect21,useState as useState60}from"react";import{Button as Button20,Group as Group44,Stack as Stack19,Stepper}from"@mantine/core";import{Anchor as Anchor11}from"@mantine/core";import{useState as useState58}from"react";import{jsx as jsx113,jsxs as jsxs66}from"react/jsx-runtime";function QuestionnaireRepeatableItem(props){let{item,response,onChange}=props,[number,setNumber]=useState58(getNumberOfRepeats(item,response??{linkId:item.linkId}));if(!props.checkForQuestionEnabled(item)||!response)return null;if(item.type==="display")return jsx113("p",{children:item.text},item.linkId);let showAddButton=item?.repeats&&item.type!=="choice"&&item.type!=="open-choice";return item.type==="boolean"?jsx113(QuestionnaireFormItem,{item,response,onChange:r2=>onChange([r2]),index:0},item.linkId):jsxs66(FormSection,{htmlFor:props.item.linkId,title:props.item.text,withAsterisk:props.item.required,children:[[...Array(number)].map((_2,index)=>jsx113(QuestionnaireFormItem,{item,response,onChange:r2=>onChange([r2]),index},`${item.linkId}-${index}`)),showAddButton&&jsx113(Anchor11,{onClick:()=>setNumber(n=>n+1),children:"Add Item"})]},props.item.linkId)}function getNumberOfRepeats(item,response){if(item.type==="choice"||item.type==="open-choice")return 1;let answers=response.answer;return answers?.length?answers.length:1}import{Anchor as Anchor12,Stack as Stack18,Title as Title5}from"@mantine/core";import{useState as useState59}from"react";import{Fragment as Fragment39,jsx as jsx114,jsxs as jsxs67}from"react/jsx-runtime";function QuestionnaireRepeatedGroup(props){let[responses,setResponses]=useState59(props.response);if(responses.length===0)return null;function handleRepeatableGroup(newResponseItems,index){let newResponses=responses.map((responses2,idx)=>idx===index?newResponseItems[0]:responses2);setResponses(newResponses),props.onChange(newResponses)}function insertNewGroup(){let newResponse=buildInitialResponseItem(props.item);setResponses([...responses,newResponse])}return jsxs67(Fragment39,{children:[responses.map((response,idx)=>jsx114(QuestionnaireGroup,{item:props.item,response,checkForQuestionEnabled:props.checkForQuestionEnabled,onChange:r2=>handleRepeatableGroup(r2,idx)},response.id)),props.item.repeats&&jsx114(Anchor12,{onClick:insertNewGroup,children:`Add Group: ${props.item.text}`})]})}function QuestionnaireGroup(props){let{response,checkForQuestionEnabled,onChange}=props;function onSetGroup(newResponseItem){let mergedResponse=response.item?.map(current=>newResponseItem.find(newResponse2=>newResponse2.id===current.id)??current)?.concat(newResponseItem.slice(1)),groupResponse={...response,item:mergedResponse};onChange([groupResponse])}return props.checkForQuestionEnabled(props.item)?jsxs67("div",{children:[props.item.text&&jsx114(Title5,{order:3,mb:"md",children:props.item.text}),jsx114(Stack18,{children:props.item.item?.map(item=>item.type==="group"?item.repeats?jsx114(QuestionnaireRepeatedGroup,{item,response:response.item?.filter(i=>i.linkId===item.linkId)??[],checkForQuestionEnabled,onChange:onSetGroup},item.linkId):jsx114(QuestionnaireGroup,{item,checkForQuestionEnabled,response:response.item?.find(i=>i.linkId===item.linkId)??{linkId:item.linkId},onChange:onSetGroup},item.linkId):jsx114(QuestionnaireRepeatableItem,{item,response:response.item?.find(i=>i.linkId===item.linkId),onChange:onSetGroup,checkForQuestionEnabled},item.linkId))})]},props.item.linkId):null}import{Fragment as Fragment40,jsx as jsx115,jsxs as jsxs68}from"react/jsx-runtime";function QuestionnairePageSequence(props){let{items,response,activePage,onChange,nextStep,prevStep,numberOfPages,renderPages,submitButtonText,checkForQuestionEnabled}=props,form=items.map(item=>{let itemResponse=response?.item?.filter(i=>i.linkId===item.linkId)??[],repeatedItem=item.type==="group"?jsx115(QuestionnaireRepeatedGroup,{item,response:itemResponse,onChange,checkForQuestionEnabled},item.linkId):jsx115(QuestionnaireRepeatableItem,{item,response:itemResponse?.[0],onChange,checkForQuestionEnabled},item.linkId);return renderPages?jsx115(Stepper.Step,{label:item.text,children:repeatedItem},item.linkId):repeatedItem});return jsxs68(Fragment40,{children:[renderPages&&jsx115(Stepper,{active:activePage??0,allowNextStepsSelect:!1,p:6,children:form}),!renderPages&&jsx115(Stack19,{children:form}),jsx115(ButtonGroup,{activePage:activePage??0,numberOfPages,nextStep,prevStep,submitButtonText})]})}function ButtonGroup(props){let showBackButton=props.activePage>0,showNextButton=props.activePage<props.numberOfPages-1,showSubmitButton=props.activePage===props.numberOfPages-1;return jsxs68(Group44,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx115(Button20,{onClick:props.prevStep,children:"Back"}),showNextButton&&jsx115(Button20,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&props.nextStep()},children:"Next"}),showSubmitButton&&jsx115(Button20,{type:"submit",children:props.submitButtonText??"Submit"})]})}import{jsx as jsx116,jsxs as jsxs69}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=a(),source=medplum.getProfile(),[schemaLoaded,setSchemaLoaded]=useState60(!1),questionnaire=pe(props.questionnaire),[response,setResponse]=useState60(),[activePage,setActivePage]=useState60(0);useEffect21(()=>{medplum.requestSchema("Questionnaire").then(()=>medplum.requestSchema("QuestionnaireResponse")).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect21(()=>{setResponse(questionnaire?buildInitialResponse(questionnaire):void 0)},[questionnaire]);function setItems(newResponseItems){let currentItems=response?.item??[],newResponse={resourceType:"QuestionnaireResponse",status:"in-progress",item:mergeItems(currentItems,Array.isArray(newResponseItems)?newResponseItems:[newResponseItems])};setResponse(newResponse)}function checkForQuestionEnabled(item){return isQuestionEnabled(item,response?.item??[])}if(!schemaLoaded||!questionnaire||!response)return null;let numberOfPages=getNumberOfPages(questionnaire),nextStep=()=>setActivePage(current=>current+1),prevStep=()=>setActivePage(current=>current-1);return jsx116(QuestionnaireFormContext.Provider,{value:{subject:props.subject,encounter:props.encounter},children:jsxs69(Form,{testid:"questionnaire-form",onSubmit:()=>{props.onSubmit&&response&&props.onSubmit({...response,questionnaire:getReferenceString9(questionnaire),subject:props.subject,source:createReference11(source),authored:new Date().toISOString(),status:"completed"})},children:[questionnaire.title&&jsx116(Title6,{children:questionnaire.title}),jsx116(QuestionnairePageSequence,{items:questionnaire.item??[],response,onChange:setItems,renderPages:numberOfPages>1,activePage,numberOfPages,submitButtonText:props.submitButtonText,checkForQuestionEnabled,nextStep,prevStep})]})})}function mergeIndividualItems(prevItem,newItem){let mergedNestedItems=mergeItems(prevItem.item??[],newItem.item??[]);return{...newItem,item:mergedNestedItems.length>0?mergedNestedItems:void 0,answer:newItem.answer&&newItem.answer.length>0?newItem.answer:prevItem.answer}}function mergeItems(prevItems,newItems){let result=[],usedIds=new Set;for(let prevItem of prevItems){let itemId=prevItem.id,newItem=newItems.find(item=>item.id===itemId);newItem?(result.push(mergeIndividualItems(prevItem,newItem)),usedIds.add(newItem.id)):result.push(prevItem)}for(let newItem of newItems)usedIds.has(newItem.id)||result.push(newItem);return result}import{ActionIcon as ActionIcon11,Button as Button21,Divider as Divider2,Group as Group45,NativeSelect as NativeSelect14,Stack as Stack20,Text as Text19,TextInput as TextInput21}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect22,useState as useState61}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx117,jsxs as jsxs70}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]=useState61([]),[groupId,setGroupId]=useState61(1),[intervalId,setIntervalId]=useState61(1);return useEffect22(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs70(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx117(Stack20,{children:intervalGroups.map(intervalGroup=>jsx117(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx117(ActionIcon11,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx117(IconCirclePlus,{})}),jsx117(Group45,{justify:"flex-end",children:jsx117(Button21,{type:"submit",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(g2=>g2.id===groupId2),index=currentGroup?.intervals.findIndex(interval=>interval.id===changedInterval.id);return index!==void 0&&currentGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g2=>g2.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(g2=>g2.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx117(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs70(Stack20,{gap:"lg",children:[jsx117(Group45,{justify:"flex-end",children:jsx117(ActionIcon11,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx117(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx117(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx117(Divider2,{}),intervalGroup.intervals.map(interval=>jsxs70(Stack20,{gap:"xs",children:[jsxs70(Group45,{children:[jsx117(TextInput21,{"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}`),jsx117(ActionIcon11,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx117(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx117(RangeInput,{onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx117(ActionIcon11,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx117(IconCirclePlus,{})})]})})}function ReferenceRangeGroupFilters(props){let{intervalGroup,onChange}=props;intervalGroup.filters.age||(intervalGroup.filters.age={});for(let key of["low","high"])intervalGroup.filters.age[key]?.unit||(intervalGroup.filters.age[key]={...intervalGroup.filters.age[key],unit:"years",system:"http://unitsofmeasure.org"});return jsxs70(Stack20,{style:{maxWidth:"50%"},children:[jsx117(Group45,{children:jsx117(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})}}})}),jsxs70(Group45,{gap:"xs",children:[jsx117(Text19,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx117("div",{id:`div-age-${intervalGroup.id}`,children:jsx117(RangeInput,{name:`age-${intervalGroup.id}`,defaultValue:intervalGroup.filters.age,onChange:ageRange=>{for(let interval of intervalGroup.intervals)onChange(intervalGroup.id,{...interval,age:ageRange})}},`age-${intervalGroup.id}`)})]}),jsx117(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"}]}})}}}),jsx117(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||[],nextId4=Math.max(...intervals.map(interval=>{let existingNum=parseInt(interval.id?.substring(3)||"",10);return isNaN(existingNum)?Number.NEGATIVE_INFINITY:existingNum}))+1;return Number.isFinite(nextId4)||(nextId4=1),definition={...definition,qualifiedInterval:intervals.map(interval=>({...interval,id:interval.id||`id-${nextId4++}`}))},setIntervalId(nextId4),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(f2=>[f2,interval[f2]])),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 Button22,Grid as Grid4,Text as Text20}from"@mantine/core";import{formatDateTime as formatDateTime6,getReferenceString as getReferenceString10}from"@medplum/core";import{Fragment as Fragment41,useEffect as useEffect23,useState as useState62}from"react";import{jsx as jsx118,jsxs as jsxs71}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=a(),requestGroup=pe(props.value),[startedLoading,setStartedLoading]=useState62(!1),[responseBundle,setResponseBundle]=useState62();if(useEffect23(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx118(Grid4,{children:requestGroup.action?.map((action,index)=>{let task=action.resource&&findBundleEntry(action.resource),taskInput=task?.input?.[0]?.valueReference,taskOutput=task?.output?.[0]?.valueReference;return jsxs71(Fragment41,{children:[jsx118(Grid4.Col,{span:1,p:"md",children:task?.status==="completed"?jsx118(IconCheckbox,{}):jsx118(IconSquare,{color:"gray"})}),jsxs71(Grid4.Col,{span:9,p:"xs",children:[jsx118(Text20,{fw:500,children:action.title}),action.description&&jsx118("div",{children:action.description}),jsxs71("div",{children:["Last edited by\xA0",jsx118(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime6(task?.meta?.lastUpdated)]}),jsxs71("div",{children:["Status: ",jsx118(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs71(Grid4.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx118(Button22,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx118(Button22,{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===getReferenceString10(entry.resource))return entry.resource}}import{useEffect as useEffect24,useState as useState63}from"react";import{stringify as stringify6}from"@medplum/core";function diff(original,revised){let path=buildPath(original,revised);return buildRevisions(path,original,revised)}function buildPath(orig,rev){let N2=orig.length,M2=rev.length,MAX=N2+M2+1,size=1+2*MAX,middle=size/2|0,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 k2=-d;k2<=d;k2+=2){let kmiddle=middle+k2,kplus=kmiddle+1,kminus=kmiddle-1,kplusNode=diagonal[kplus],kminusNode=diagonal[kminus],prev,i=0;k2===-d||k2!==d&&kminusNode.i<kplusNode.i?(i=kplusNode.i,prev=kplusNode):(i=kminusNode.i+1,prev=kminusNode),diagonal[kminus]=void 0;let j=i-k2,node={i,j,prev:previousSnake(prev),snake:!1};for(;i<N2&&j<M2&&orig[i]===rev[j];)i++,j++;if(i>node.i&&(node={i,j,prev:node,snake:!0}),diagonal[kmiddle]=node,i>=N2&&j>=M2)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:stringify6(entry.resource,!0).match(/[^\r\n]+/g)})).sort((a2,b2)=>a2.meta.lastUpdated.localeCompare(b2.meta.lastUpdated)),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 k2=0;k2<revision.revised.lines.length;k2++)table.splice(position+k2,0,{id:versions[i].meta.versionId,meta:versions[i].meta,value:newLines[k2],span:1})}}}function combineSpans(table){let start=0;for(;start<table.length;){let curr=start;for(;curr<table.length&&table[curr].id===table[start].id;)table[curr].span=-1,curr++;table[start].span=curr-start,start=curr}}var ResourceBlame_default={container:"ResourceBlame_container",root:"ResourceBlame_root",startRow:"ResourceBlame_startRow",normalRow:"ResourceBlame_normalRow",author:"ResourceBlame_author",dateTime:"ResourceBlame_dateTime",lineNumber:"ResourceBlame_lineNumber",line:"ResourceBlame_line",pre:"ResourceBlame_pre"};function getVersionUrl(resource,versionId){return`/${resource.resourceType}/${resource.id}/_history/${versionId}`}function getTimeString(lastUpdated){let seconds=Math.floor((Date.now()-Date.parse(lastUpdated))/1e3),years=Math.floor(seconds/31536e3);if(years>0)return pluralizeTime(years,"year");let months=Math.floor(seconds/2592e3);if(months>0)return pluralizeTime(months,"month");let days=Math.floor(seconds/86400);if(days>0)return pluralizeTime(days,"day");let hours=Math.floor(seconds/3600);if(hours>0)return pluralizeTime(hours,"hour");let minutes=Math.floor(seconds/60);return minutes>0?pluralizeTime(minutes,"minute"):pluralizeTime(seconds,"second")}function pluralizeTime(count,noun){return`${count} ${count===1?noun:noun+"s"} ago`}import{Fragment as Fragment42,jsx as jsx119,jsxs as jsxs72}from"react/jsx-runtime";function ResourceBlame(props){let medplum=a(),[value,setValue]=useState63(props.history);if(useEffect24(()=>{!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 jsx119("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx119("div",{className:ResourceBlame_default.container,children:jsx119("table",{className:ResourceBlame_default.root,children:jsx119("tbody",{children:table.map((row,index)=>jsxs72("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs72(Fragment42,{children:[jsx119("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:jsx119(ResourceBadge,{value:row.meta.author,link:!0})}),jsx119("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx119(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),children:getTimeString(row.meta.lastUpdated)})})]}),jsx119("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx119("td",{className:ResourceBlame_default.line,children:jsx119("pre",{className:ResourceBlame_default.pre,children:row.value})})]},"row-"+index))})})})}import{stringify as stringify7}from"@medplum/core";var ResourceDiff_default={removed:"ResourceDiff_removed",added:"ResourceDiff_added"};import{Fragment as Fragment43,jsx as jsx120,jsxs as jsxs73}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=stringify7(originalResource,!0).match(/[^\r\n]+/g),revised=stringify7(revisedResource,!0).match(/[^\r\n]+/g),deltas=diff(original,revised);return jsx120("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx120(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs73(Fragment43,{children:["...",jsx120("br",{}),props.delta.original.lines.length>0&&jsx120("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
72
- `)}),props.delta.revised.lines.length>0&&jsx120("div",{className:ResourceDiff_default.added,children:props.delta.revised.lines.join(`
73
- `)}),"...",jsx120("br",{})]})}import{Button as Button23,Group as Group46,Stack as Stack21,TextInput as TextInput22}from"@mantine/core";import{applyDefaultValuesToResource,tryGetProfile as tryGetProfile6}from"@medplum/core";import{useEffect as useEffect25,useState as useState64}from"react";import{jsx as jsx121,jsxs as jsxs74}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=a(),defaultValue2=pe(props.defaultValue),[schemaLoaded,setSchemaLoaded]=useState64(),[value,setValue]=useState64();return useEffect25(()=>{if(defaultValue2)if(props.profileUrl){let profileUrl=props.profileUrl;medplum.requestProfileSchema(props.profileUrl,{expandProfile:!0}).then(()=>{let profile=tryGetProfile6(profileUrl);if(profile){setSchemaLoaded(profile.name);let modifiedDefaultValue=applyDefaultValuesToResource(defaultValue2,profile);setValue(modifiedDefaultValue)}else console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)})}else{let schemaName=props.schemaName??defaultValue2?.resourceType;medplum.requestSchema(schemaName).then(()=>{setValue(defaultValue2),setSchemaLoaded(schemaName)}).catch(console.log)}},[medplum,defaultValue2,props.schemaName,props.profileUrl]),!schemaLoaded||!value?jsx121("div",{children:"Loading..."}):jsxs74("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs74(Stack21,{mb:"xl",children:[jsx121(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx121(TextInput22,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx121(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx121(TextInput22,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx121(BackboneElementInput,{path:value.resourceType,typeName:schemaLoaded,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl}),jsxs74(Group46,{justify:"flex-end",mt:"xl",children:[jsx121(Button23,{type:"submit",children:"OK"}),props.onDelete&&jsx121(Button23,{variant:"outline",color:"red",type:"button",onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})}import{Table as Table4}from"@mantine/core";import{formatDateTime as formatDateTime7,normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useEffect as useEffect26,useState as useState65}from"react";import{jsx as jsx122,jsxs as jsxs75}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=a(),[value,setValue]=useState65(props.history);return useEffect26(()=>{!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?jsxs75(Table4,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx122(Table4.Thead,{children:jsxs75(Table4.Tr,{children:[jsx122(Table4.Th,{children:"Author"}),jsx122(Table4.Th,{children:"Date"}),jsx122(Table4.Th,{children:"Version"})]})}),jsx122(Table4.Tbody,{children:value.entry?.map((entry,index)=>jsx122(HistoryRow,{entry},"entry-"+index))})]}):jsx122("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs75(Table4.Tr,{children:[jsx122(Table4.Td,{children:jsx122(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx122(Table4.Td,{children:formatDateTime7(resource.meta?.lastUpdated)}),jsx122(Table4.Td,{children:jsx122(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx122(Table4.Tr,{children:jsx122(Table4.Td,{colSpan:3,children:normalizeErrorString7(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button24,Stack as Stack22,Text as Text21}from"@mantine/core";import{getReferenceString as getReferenceString11,isReference as isReference3}from"@medplum/core";import{useState as useState66}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx123,jsxs as jsxs76}from"react/jsx-runtime";function Scheduler(props){let schedule=pe(props.schedule),questionnaire=pe(props.questionnaire),[month,setMonth]=useState66(getStartMonth()),[date,setDate]=useState66(),[slot,setSlot]=useState66(),[response,setResponse]=useState66(),[slots]=Ee("Slot",new URLSearchParams([["_count",(30*24).toString()],["schedule",isReference3(props.schedule)?props.schedule.reference:getReferenceString11(props.schedule)],["start","gt"+getStart2(month)],["start","lt"+getEnd2(month)]]));if(!schedule||!slots||!questionnaire)return null;let actor=schedule.actor?.[0];return jsxs76("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs76("div",{className:Scheduler_default.info,children:[actor&&jsx123(ResourceAvatar,{value:actor,size:"xl"}),actor&&jsx123(Text21,{size:"xl",fw:500,children:jsx123(ResourceName,{value:actor})}),jsx123("p",{children:"1 hour"}),date&&jsx123("p",{children:date.toLocaleDateString()}),slot&&jsx123("p",{children:formatTime(new Date(slot.start))})]}),jsxs76("div",{className:Scheduler_default.selection,children:[!date&&jsxs76("div",{children:[jsx123("h3",{children:"Select date"}),jsx123(CalendarInput,{slots,onChangeMonth:setMonth,onClick:setDate})]}),date&&!slot&&jsxs76("div",{children:[jsx123("h3",{children:"Select time"}),jsx123(Stack22,{children:slots.map(s=>{let slotStart=new Date(s.start);return slotStart.getTime()>date.getTime()&&slotStart.getTime()<date.getTime()+24*3600*1e3&&jsx123("div",{children:jsx123(Button24,{variant:"outline",style:{width:150},onClick:()=>setSlot(s),children:formatTime(slotStart)})},s.id)})})]}),date&&slot&&!response&&jsx123(QuestionnaireForm,{questionnaire,submitButtonText:"Next",onSubmit:setResponse}),date&&slot&&response&&jsxs76("div",{children:[jsx123("h3",{children:"You're all set!"}),jsx123("p",{children:"Check your email for a calendar invite."})]})]})]})}function getStart2(month){return formatSlotInstant(month.getTime())}function getEnd2(month){return formatSlotInstant(month.getTime()+31*24*60*60*1e3)}function formatSlotInstant(time){let date=new Date(Math.max(Date.now(),time));return date.setHours(0,0,0,0),date.toISOString()}function formatTime(date){return date.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})}import{createReference as createReference12}from"@medplum/core";import{jsx as jsx124}from"react/jsx-runtime";function ServiceRequestTimeline(props){return jsx124(ResourceTimeline,{value:props.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:[createReference12(resource)],subject:resource.subject,sender:createReference12(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference12(resource)],subject:resource.subject,operator:createReference12(operator),issued:new Date().toISOString(),content})})}import{Anchor as Anchor13}from"@mantine/core";import{showNotification as showNotification7}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{jsx as jsx125}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=a(),{client,patient,encounter,children,...rest}=props;function launchApp(){medplum.createResource({resourceType:"SmartAppLaunch",patient,encounter}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",medplum.getBaseUrl()+"fhir/R4"),url.searchParams.set("launch",result.id),window.location.assign(url.toString())}).catch(err=>showNotification7({color:"red",message:normalizeErrorString8(err),autoClose:!1}))}return jsx125(Anchor13,{onClick:()=>launchApp(),...rest,children})}import{createReference as createReference13,getReferenceString as getReferenceString12}from"@medplum/core";import{useCallback as useCallback21,useEffect as useEffect27,useMemo as useMemo17,useState as useState67}from"react";import{jsx as jsx126}from"react/jsx-runtime";function ThreadChat(props){let{title,thread,open,onMessageSent}=props,medplum=a(),profile=W(),prevThreadId=se(thread?.id),[communications,setCommunications]=useState67([]),profileRef=useMemo17(()=>profile?createReference13(profile):void 0,[profile]),threadRef=useMemo17(()=>createReference13(thread),[thread]);useEffect27(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=useCallback21(message=>{let profileRefStr=profileRef?getReferenceString12(profileRef):void 0;profileRefStr&&medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>getReferenceString12(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload:[{contentString:message}],partOf:[threadRef]}).then(communication=>{setCommunications([...communications,communication]),onMessageSent?.(communication)}).catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent]),onMessageReceived=useMemo17(()=>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?jsx126(BaseChat,{title,communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,open}):null}import{normalizeOperationOutcome as normalizeOperationOutcome5}from"@medplum/core";import{useEffect as useEffect30,useState as useState71}from"react";import{Anchor as Anchor14,Button as Button25,Center as Center4,Group as Group47,Stack as Stack23,Text as Text22,TextInput as TextInput23,Title as Title7}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome3}from"@medplum/core";import{useState as useState68}from"react";import{jsx as jsx127,jsxs as jsxs77}from"react/jsx-runtime";function NewProjectForm(props){let medplum=a(),[outcome,setOutcome]=useState68();return jsxs77(Form,{style:{maxWidth:400},onSubmit:async formData=>{try{props.handleAuthResponse(await medplum.startNewProject({login:props.login,projectName:formData.projectName}))}catch(err){setOutcome(normalizeOperationOutcome3(err))}},children:[jsxs77(Center4,{style:{flexDirection:"column"},children:[jsx127(Logo,{size:32}),jsx127(Title7,{children:"Create project"})]}),jsxs77(Stack23,{gap:"xl",children:[jsx127(TextInput23,{name:"projectName",label:"Project Name",placeholder:"My Project",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"firstName")}),jsxs77(Text22,{c:"dimmed",size:"xs",children:["By clicking submit you agree to the Medplum"," ",jsx127(Anchor14,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx127(Anchor14,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]})]}),jsx127(Group47,{justify:"flex-end",mt:"xl",wrap:"nowrap",children:jsx127(Button25,{type:"submit",children:"Create project"})})]})}import{Anchor as Anchor15,Button as Button26,Center as Center5,Checkbox as Checkbox4,Divider as Divider3,Group as Group48,PasswordInput,Stack as Stack24,Text as Text23,TextInput as TextInput24}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome4}from"@medplum/core";import{useEffect as useEffect29,useState as useState70}from"react";import{useEffect as useEffect28,useRef as useRef18,useState as useState69}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 jsx128}from"react/jsx-runtime";function GoogleButton(props){let medplum=a(),{googleClientId,handleGoogleCredential}=props,parentRef=useRef18(null),[scriptLoaded,setScriptLoaded]=useState69(typeof google<"u"),[initialized,setInitialized]=useState69(!1),[buttonRendered,setButtonRendered]=useState69(!1);return useEffect28(()=>{if(typeof google>"u"){createScriptTag("https://accounts.google.com/gsi/client",()=>setScriptLoaded(!0));return}initialized||(google.accounts.id.initialize({client_id:googleClientId,callback:handleGoogleCredential}),setInitialized(!0)),parentRef.current&&!buttonRendered&&(google.accounts.id.renderButton(parentRef.current,{}),setButtonRendered(!0))},[medplum,googleClientId,initialized,scriptLoaded,parentRef,buttonRendered,handleGoogleCredential]),googleClientId?jsx128("div",{ref:parentRef}):null}function getGoogleClientId(clientId){if(clientId)return clientId;if(typeof window<"u"){let origin=window.location.protocol+"//"+window.location.host;if(("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 Fragment44,jsx as jsx129,jsxs as jsxs78}from"react/jsx-runtime";function NewUserForm(props){let googleClientId=getGoogleClientId(props.googleClientId),recaptchaSiteKey=props.recaptchaSiteKey,medplum=a(),[outcome,setOutcome]=useState70(),issues=getIssuesForExpression(outcome,void 0);return useEffect29(()=>{recaptchaSiteKey&&initRecaptcha(recaptchaSiteKey)},[recaptchaSiteKey]),jsxs78(Form,{style:{maxWidth:400},onSubmit:async formData=>{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:[jsx129(Center5,{style:{flexDirection:"column"},children:props.children}),jsx129(OperationOutcomeAlert,{issues}),googleClientId&&jsxs78(Fragment44,{children:[jsx129(Group48,{justify:"center",p:"xl",style:{height:70},children:jsx129(GoogleButton,{googleClientId,handleGoogleCredential:async response=>{try{props.handleAuthResponse(await medplum.startGoogleLogin({googleClientId:response.clientId,googleCredential:response.credential,createUser:!0}))}catch(err){setOutcome(normalizeOperationOutcome4(err))}}})}),jsx129(Divider3,{label:"or",labelPosition:"center",my:"lg"})]}),jsxs78(Stack24,{gap:"xl",children:[jsx129(TextInput24,{name:"firstName",type:"text",label:"First name",placeholder:"First name",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"firstName")}),jsx129(TextInput24,{name:"lastName",type:"text",label:"Last name",placeholder:"Last name",required:!0,error:getErrorsForInput(outcome,"lastName")}),jsx129(TextInput24,{name:"email",type:"email",label:"Email",placeholder:"name@domain.com",required:!0,error:getErrorsForInput(outcome,"email")}),jsx129(PasswordInput,{name:"password",label:"Password",autoComplete:"off",required:!0,error:getErrorsForInput(outcome,"password")}),jsxs78(Text23,{c:"dimmed",size:"xs",children:["By clicking submit you agree to the Medplum"," ",jsx129(Anchor15,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx129(Anchor15,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]}),jsxs78(Text23,{c:"dimmed",size:"xs",children:["This site is protected by reCAPTCHA and the Google"," ",jsx129(Anchor15,{href:"https://policies.google.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx129(Anchor15,{href:"https://policies.google.com/terms",children:"Terms\xA0of\xA0Service"})," apply."]})]}),jsxs78(Group48,{justify:"space-between",mt:"xl",wrap:"nowrap",children:[jsx129(Checkbox4,{name:"remember",label:"Remember me",size:"xs"}),jsx129(Button26,{type:"submit",children:"Create account"})]})]})}import{jsx as jsx130,jsxs as jsxs79}from"react/jsx-runtime";function RegisterForm(props){let{type,projectId,clientId,googleClientId,recaptchaSiteKey,onSuccess}=props,medplum=a(),[login,setLogin]=useState71(),[outcome,setOutcome]=useState71();useEffect30(()=>{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(console.log):response.login&&setLogin(response.login)}return jsxs79(Document,{width:450,children:[outcome&&jsx130("pre",{children:JSON.stringify(outcome,null,2)}),!login&&jsx130(NewUserForm,{projectId,clientId,googleClientId,recaptchaSiteKey,handleAuthResponse,children:props.children}),login&&type==="project"&&jsx130(NewProjectForm,{login,handleAuthResponse})]})}import{showNotification as showNotification8}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString10}from"@medplum/core";import{useCallback as useCallback23,useEffect as useEffect31,useRef as useRef19,useState as useState75}from"react";import{Anchor as Anchor16,Button as Button27,Center as Center6,Checkbox as Checkbox5,Divider as Divider4,Group as Group49,PasswordInput as PasswordInput2,Stack as Stack25,TextInput as TextInput25}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome6}from"@medplum/core";import{useCallback as useCallback22,useState as useState72}from"react";import{Fragment as Fragment45,jsx as jsx131,jsxs as jsxs80}from"react/jsx-runtime";function AuthenticationForm(props){let[email,setEmail]=useState72();return email?jsx131(PasswordForm,{email,...props}):jsx131(EmailForm,{setEmail,...props})}function EmailForm(props){let{setEmail,onRegister,handleAuthResponse,children,disableEmailAuth,...baseLoginRequest}=props,medplum=a(),googleClientId=!props.disableGoogleAuth&&getGoogleClientId(props.googleClientId),[outcome,setOutcome]=useState72(),issues=getIssuesForExpression(outcome,void 0),isExternalAuth=useCallback22(async authMethod=>{if(!authMethod.authorizeUrl)return!1;let state=JSON.stringify({...await medplum.ensureCodeChallenge(baseLoginRequest),domain:authMethod.domain}),url=new URL(authMethod.authorizeUrl);return url.searchParams.set("state",state),window.location.assign(url.toString()),!0},[medplum,baseLoginRequest]),handleSubmit=useCallback22(async formData=>{let authMethod=await medplum.post("auth/method",{email:formData.email});await isExternalAuth(authMethod)||setEmail(formData.email)},[medplum,isExternalAuth,setEmail]),handleGoogleCredential=useCallback22(async response=>{try{let authResponse=await medplum.startGoogleLogin({...baseLoginRequest,googleCredential:response.credential});await isExternalAuth(authResponse)||handleAuthResponse(authResponse)}catch(err){setOutcome(normalizeOperationOutcome6(err))}},[medplum,baseLoginRequest,isExternalAuth,handleAuthResponse]);return jsxs80(Form,{onSubmit:handleSubmit,children:[jsx131(Center6,{style:{flexDirection:"column"},children}),jsx131(OperationOutcomeAlert,{issues}),googleClientId&&jsxs80(Fragment45,{children:[jsx131(Group49,{justify:"center",p:"xl",style:{height:70},children:jsx131(GoogleButton,{googleClientId,handleGoogleCredential})}),!disableEmailAuth&&jsx131(Divider4,{label:"or",labelPosition:"center",my:"lg"})]}),!disableEmailAuth&&jsx131(TextInput25,{name:"email",type:"email",label:"Email",placeholder:"name@domain.com",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"email")}),jsxs80(Group49,{justify:"space-between",mt:"xl",gap:0,wrap:"nowrap",children:[jsx131("div",{children:onRegister&&jsx131(Anchor16,{component:"button",type:"button",color:"dimmed",onClick:onRegister,size:"xs",children:"Register"})}),!disableEmailAuth&&jsx131(Button27,{type:"submit",children:"Next"})]})]})}function PasswordForm(props){let{onForgotPassword,handleAuthResponse,children,...baseLoginRequest}=props,medplum=a(),[outcome,setOutcome]=useState72(),issues=getIssuesForExpression(outcome,void 0),handleSubmit=useCallback22(formData=>{medplum.startLogin({...baseLoginRequest,password:formData.password,remember:formData.remember==="on"}).then(handleAuthResponse).catch(err=>setOutcome(normalizeOperationOutcome6(err)))},[medplum,baseLoginRequest,handleAuthResponse]);return jsxs80(Form,{style:{maxWidth:400},onSubmit:handleSubmit,children:[jsx131(Center6,{style:{flexDirection:"column"},children}),jsx131(OperationOutcomeAlert,{issues}),jsx131(Stack25,{gap:"xl",children:jsx131(PasswordInput2,{name:"password",label:"Password",autoComplete:"off",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"password")})}),jsxs80(Group49,{justify:"space-between",mt:"xl",gap:0,wrap:"nowrap",children:[onForgotPassword&&jsx131(Anchor16,{component:"button",type:"button",c:"dimmed",onClick:onForgotPassword,size:"xs",children:"Forgot password"}),jsx131(Checkbox5,{id:"remember",name:"remember",label:"Remember me",size:"xs",style:{lineHeight:1}}),jsx131(Button27,{type:"submit",children:"Sign in"})]})]})}import{Avatar as Avatar4,Combobox as Combobox2,Flex as Flex4,Group as Group50,Stack as Stack26,Text as Text24,TextInput as TextInput26,Title as Title8,useCombobox as useCombobox2}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome7}from"@medplum/core";import{useState as useState73}from"react";import{jsx as jsx132,jsxs as jsxs81}from"react/jsx-runtime";function ChooseProfileForm(props){let medplum=a(),combobox=useCombobox2(),[search,setSearch]=useState73(""),[outcome,setOutcome]=useState73();function filterDisplay(display){return!!display?.toLowerCase()?.includes(search.toLowerCase())}function filterMembership(membership){return filterDisplay(membership.profile?.display)||filterDisplay(membership.project?.display)}function handleValueSelect(membershipId){medplum.post("auth/profile",{login:props.login,profile:membershipId}).then(props.handleAuthResponse).catch(err=>setOutcome(normalizeOperationOutcome7(err)))}let options=props.memberships.filter(filterMembership).slice(0,10).map(item=>jsx132(Combobox2.Option,{value:item.id,children:jsx132(SelectOption,{...item})},item.id));return jsxs81(Stack26,{children:[jsxs81(Flex4,{gap:"md",mb:"md",justify:"center",align:"center",direction:"column",wrap:"nowrap",children:[jsx132(Logo,{size:32}),jsx132(Title8,{order:3,children:"Choose profile"})]}),jsx132(OperationOutcomeAlert,{outcome}),jsxs81(Combobox2,{store:combobox,onOptionSubmit:handleValueSelect,children:[jsx132(Combobox2.EventsTarget,{children:jsx132(TextInput26,{placeholder:"Search",value:search,onChange:event=>{setSearch(event.currentTarget.value),combobox.updateSelectedOptionIndex()}})}),jsx132("div",{children:jsx132(Combobox2.Options,{children:options.length>0?options:jsx132(Combobox2.Empty,{children:"Nothing found..."})})})]})]})}function SelectOption(membership){return jsxs81(Group50,{children:[jsx132(Avatar4,{radius:"xl"}),jsxs81("div",{children:[jsx132(Text24,{fz:"sm",fw:500,children:membership.profile?.display}),jsx132(Text24,{fz:"xs",opacity:.6,children:membership.project?.display})]})]})}import{Button as Button28,Center as Center7,Checkbox as Checkbox6,Group as Group51,Stack as Stack27,Title as Title9}from"@mantine/core";import{jsx as jsx133,jsxs as jsxs82}from"react/jsx-runtime";function ChooseScopeForm(props){let medplum=a();return jsx133(Form,{style:{maxWidth:400},onSubmit:formData=>{medplum.post("auth/scope",{login:props.login,scope:Object.keys(formData).join(" ")}).then(props.handleAuthResponse).catch(console.log)},children:jsxs82(Stack27,{children:[jsxs82(Center7,{style:{flexDirection:"column"},children:[jsx133(Logo,{size:32}),jsx133(Title9,{children:"Choose scope"})]}),jsx133(Stack27,{children:(props.scope??"openid").split(" ").map(scopeName=>jsx133(Checkbox6,{id:scopeName,name:scopeName,label:scopeName,defaultChecked:!0},scopeName))}),jsx133(Group51,{justify:"flex-end",mt:"xl",children:jsx133(Button28,{type:"submit",children:"Set scope"})})]})})}import{Alert as Alert3,Button as Button29,Center as Center8,Group as Group52,Stack as Stack28,TextInput as TextInput27,Title as Title10}from"@mantine/core";import{normalizeErrorString as normalizeErrorString9}from"@medplum/core";import{useState as useState74}from"react";import{jsx as jsx134,jsxs as jsxs83}from"react/jsx-runtime";function MfaForm(props){let medplum=a(),[errorMessage,setErrorMessage]=useState74();return jsx134(Form,{style:{maxWidth:400},onSubmit:formData=>{setErrorMessage(void 0),medplum.post("auth/mfa/verify",{login:props.login,token:formData.token}).then(props.handleAuthResponse).catch(err=>setErrorMessage(normalizeErrorString9(err)))},children:jsxs83(Stack28,{children:[jsxs83(Center8,{style:{flexDirection:"column"},children:[jsx134(Logo,{size:32}),jsx134(Title10,{children:"Enter MFA code"})]}),errorMessage&&jsx134(Alert3,{icon:jsx134(IconAlertCircle,{size:16}),title:"Error",color:"red",children:errorMessage}),jsx134(Stack28,{children:jsx134(TextInput27,{name:"token",label:"MFA code",required:!0,autoFocus:!0})}),jsx134(Group52,{justify:"flex-end",mt:"xl",children:jsx134(Button29,{type:"submit",children:"Submit code"})})]})})}import{jsx as jsx135}from"react/jsx-runtime";function SignInForm(props){let{login:loginCode,chooseScopes,onSuccess,onForgotPassword,onRegister,onCode,...baseLoginRequest}=props,medplum=a(),[login,setLogin]=useState75(),loginRequested=useRef19(!1),[mfaRequired,setAuthenticatorRequired]=useState75(!1),[memberships,setMemberships]=useState75(),handleCode=useCallback23(code=>{onCode?onCode(code):medplum.processCode(code).then(()=>{onSuccess&&onSuccess()}).catch(err=>showNotification8({color:"red",message:normalizeErrorString10(err)}))},[medplum,onCode,onSuccess]),handleAuthResponse=useCallback23(response=>{setAuthenticatorRequired(!!response.mfaRequired),response.login&&setLogin(response.login),response.memberships&&setMemberships(response.memberships),response.code&&(chooseScopes?setMemberships(void 0):handleCode(response.code))},[chooseScopes,handleCode]),handleScopeResponse=useCallback23(response=>{handleCode(response.code)},[handleCode]);return useEffect31(()=>{loginCode&&!loginRequested.current&&!login&&(loginRequested.current=!0,medplum.get("auth/login/"+loginCode).then(handleAuthResponse).catch(err=>showNotification8({color:"red",message:normalizeErrorString10(err)})))},[medplum,loginCode,loginRequested,login,handleAuthResponse]),jsx135(Document,{width:450,px:"sm",py:"md",children:login?mfaRequired?jsx135(MfaForm,{login,handleAuthResponse}):memberships?jsx135(ChooseProfileForm,{login,memberships,handleAuthResponse}):props.projectId==="new"?jsx135(NewProjectForm,{login,handleAuthResponse}):props.chooseScopes?jsx135(ChooseScopeForm,{login,scope:props.scope,handleAuthResponse:handleScopeResponse}):jsx135("div",{children:"Success"}):jsx135(AuthenticationForm,{onForgotPassword,onRegister,handleAuthResponse,disableGoogleAuth:props.disableGoogleAuth,disableEmailAuth:props.disableEmailAuth,...baseLoginRequest,children:props.children})})}export{AddressDisplay,AddressInput,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,CalendarInput,CheckboxFormSection,CodeInput,CodeableConceptDisplay,CodeableConceptInput,CodingDisplay,CodingInput,ContactDetailDisplay,ContactDetailInput,ContactPointDisplay,ContactPointInput,Container,DateTimeInput,DefaultResourceTimeline,DescriptionList,DescriptionListEntry,DiagnosticReportDisplay,Document,ElementDefinitionInputSelector,ElementDefinitionTypeInput,EncounterTimeline,ErrorBoundary,FhirPathTable,Form,FormSection,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,Loading,Logo,MeasureReportDisplay,MedplumLink,ee as MedplumProvider,MemoizedFhirPathTable,MemoizedSearchControl,MoneyDisplay,MoneyInput,Navbar,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,Panel,PatientSummary,PatientTimeline,PlanDefinitionBuilder,QuantityDisplay,QuantityInput,QuestionnaireBuilder,QuestionnaireForm,QuestionnaireItemType,RangeDisplay,RangeInput,ReferenceDisplay,ReferenceInput,ReferenceRangeEditor,ReferenceRangeGroupEditor,RegisterForm,RequestGroupDisplay,ResourceArrayDisplay,ResourceArrayInput,ResourceAvatar,ResourceBadge,ResourceBlame,ResourceDiff,ResourceForm,ResourceHistoryTable,ResourceInput,ResourceName,ResourcePropertyDisplay,ResourcePropertyInput,ResourceTable,ResourceTimeline,Scheduler,SearchChangeEvent,SearchClickEvent,SearchControl,SearchFieldEditor,SearchFilterEditor,SearchLoadEvent,ServiceRequestTimeline,SignInForm,SmartAppLaunchLink,StatusBadge,ThreadChat,Timeline,TimelineItem,TimingInput,ValueSetAutocomplete,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNextMonthFilter,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,buildInitialResponse,buildInitialResponseItem,clearFilters,clearFiltersOnField,convertIsoToLocal,convertLocalToIso,createScriptTag,deleteFilter,formatReferenceString,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getNewMultiSelectValues,getNumberOfPages,getOpString,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,getRecaptcha,getSearchOperators,getSortField,initRecaptcha,isChoiceQuestion,isQuestionEnabled,isSortDescending,isSupportedProfileStructureDefinition,parseForm,R as reactContext,renderValue,setFilters,setOffset,setPage,setPropertyValue,setQuestionnaireItemReferenceTargetTypes,setSort,sortByDateAndPriority,toggleSort,oe as useCachedBinaryUrl,a as useMedplum,x as useMedplumContext,V as useMedplumNavigate,W as useMedplumProfile,se as usePrevious,pe as useResource,Me as useSearch,Ce as useSearchOne,Ee as useSearchResources,Oe as useSubscription};
71
+ }`.replace(/\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 Group20,Stack as Stack4}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useContext as useContext10,useEffect as useEffect7,useState as useState28}from"react";import{Group as Group19,Stack as Stack3}from"@mantine/core";import{buildElementsContext as buildElementsContext3,getPropertyDisplayName,isEmpty as isEmpty5,isPopulated as isPopulated10}from"@medplum/core";import{useContext as useContext9,useMemo as useMemo9,useState as useState27}from"react";import{Button as Button4,ActionIcon as ActionIcon3}from"@mantine/core";import{jsx as jsx58}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx58(Button4,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx58(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx58(ActionIcon3,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx58(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon4}from"@mantine/core";import{jsx as jsx59}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx59(ActionIcon4,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx59(IconCircleMinus,{size:"1.25rem"})})}var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{jsx as jsx60,jsxs as jsxs32}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState27(props.defaultValue),sliceElements=slice.typeSchema?.elements??slice.elements,parentElementsContextValue=useContext9(ElementsContext),contextValue=useMemo9(()=>{if(isPopulated10(sliceElements))return buildElementsContext3({parentContext:parentElementsContextValue,elements:sliceElements,path:props.path,profileUrl:slice.typeSchema?.url})},[parentElementsContextValue,props.path,slice.typeSchema?.url,sliceElements]);function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}let required=slice.min>0,indentedStack=isEmpty5(slice.elements),propertyDisplayName=getPropertyDisplayName(slice.name);return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx60(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,children:jsxs32(Stack3,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs32(Group19,{wrap:"nowrap",children:[jsx60("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx60(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})}),values.length>slice.min&&jsx60(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}`)),values.length<slice.max&&jsx60(Group19,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx60(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{jsx as jsx61,jsxs as jsxs33}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=a(),[loading,setLoading]=useState28(!0),[slices,setSlices]=useState28([]),[defaultValue2]=useState28(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState28(()=>[defaultValue2]),ctx=useContext10(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect7(()=>{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 jsx61("div",{children:"Loading..."});let nonSliceIndex=slices.length,nonSliceValues=slicedValues[nonSliceIndex],showNonSliceValues=!(props.hideNonSliceValues??(propertyTypeCode==="Extension"&&slices.length>0)),propertyDisplayName=getPathDisplayName4(property.path);return jsxs33(Stack4,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[slices.map((slice,sliceIndex)=>jsx61(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)=>jsxs33(Group20,{wrap:"nowrap",style:{flexGrow:1},children:[jsx61("div",{style:{flexGrow:1},children:jsx61(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})}),jsx61(ArrayRemoveButton,{propertyDisplayName,testId:`nonsliced-remove-${valueIndex}`,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.splice(valueIndex,1),setValuesWrapper(newNonSliceValues,nonSliceIndex)}})]},`${valueIndex}-${nonSliceValues.length}`)),showNonSliceValues&&slicedValues.flat().length<property.max&&jsx61(Group20,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx61(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 ActionIcon5,Flex,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification4}from"@mantine/notifications";import{useRef as useRef8,useState as useState29}from"react";import{jsx as jsx62,jsxs as jsxs34}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState29(!1),clipboard=useClipboard(),ref=useRef8(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs34(Flex,{gap:"xs",children:[jsx62(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx62(ActionIcon5,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification4({color:"green",message:"Copied"})},children:jsx62(IconCopy,{})})]})}import{Button as Button5,Chip,Group as Group21,Modal as Modal2,NativeSelect as NativeSelect8,Stack as Stack5,Switch,TextInput as TextInput11}from"@mantine/core";import{formatTiming as formatTiming2}from"@medplum/core";import{useRef as useRef9,useState as useState30}from"react";import{Fragment as Fragment22,jsx as jsx63,jsxs as jsxs35}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState30(props.defaultValue),[open,setOpen]=useState30(!1),valueRef=useRef9();return valueRef.current=value,jsxs35(Fragment22,{children:[jsxs35(Group21,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx63("span",{children:formatTiming2(valueRef.current)||"No repeat"}),jsx63(Button5,{onClick:()=>setOpen(!0),children:"Edit"})]}),jsx63(TimingEditorDialog,{visible:open,defaultValue:valueRef.current,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]=useState30(props.defaultValue||defaultValue),valueRef=useRef9();valueRef.current=value;function setStart(newStart){setValue({...valueRef.current,event:[newStart]})}function setRepeat(repeat){setValue({...valueRef.current,repeat})}function setPeriod(newPeriod){setRepeat({...valueRef.current?.repeat,period:newPeriod})}function setPeriodUnit(newPeriodUnit){setRepeat({...valueRef.current?.repeat,periodUnit:newPeriodUnit})}function setDaysOfWeek(newDaysOfWeek){setRepeat({...valueRef.current?.repeat,dayOfWeek:newDaysOfWeek})}return jsx63(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs35(Stack5,{children:[jsx63(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx63(DateTimeInput,{name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx63(Switch,{label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs35(Fragment22,{children:[jsx63(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs35(Group21,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx63(TextInput11,{type:"number",step:1,id:"timing-dialog-period",name:"timing-dialog-period",defaultValue:value.repeat.period||1,onChange:e=>setPeriod(parseInt(e.currentTarget.value,10)||1)}),jsx63(NativeSelect8,{id:"timing-dialog-periodUnit",name:"timing-dialog-periodUnit",defaultValue:value.repeat.periodUnit,onChange:e=>setPeriodUnit(e.currentTarget.value),data:[{label:"second",value:"s"},{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"&&jsx63(FormSection,{title:"Repeat on",children:jsx63(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,children:jsx63(Group21,{justify:"space-between",mt:"md",gap:"xs",children:daysOfWeek.map(day=>jsx63(Chip,{value:day,size:"xs",radius:"xl",children:day.charAt(0).toUpperCase()},day))})})})]}),jsx63(Group21,{justify:"flex-end",children:jsx63(Button5,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx64,jsxs as jsxs36}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 jsx64(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx64(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx64(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx64(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})}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]=useState31(initialPropertyType);return jsxs36(Group22,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx64(NativeSelect9,{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}))}),jsx64(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})]})}function ElementDefinitionTypeInput(props){let{name,onChange,outcome,binding,path,valuePath}=props,required=props.min!==void 0&&props.min>0,propertyType=props.elementDefinitionType.code,elementsContext=useContext11(ElementsContext),defaultValue2=useMemo10(()=>{if(!isComplexTypeCode(propertyType)||!isEmpty6(props.defaultValue))return props.defaultValue;let withDefaults=Object.create(null);if(elementsContext.path===props.path)applyDefaultValuesToElement(withDefaults,elementsContext.elements);else{let key=getPathDifference(elementsContext.path,props.path);if(key===void 0)return props.defaultValue;applyDefaultValuesToElement(withDefaults,elementsContext.elements,key)}return isPopulated11(withDefaults)?withDefaults:props.defaultValue},[propertyType,elementsContext.path,elementsContext.elements,props.path,props.defaultValue]);if(!propertyType)return jsx64("div",{children:"Property type not specified "});function getComplexInputProps(){return{name,defaultValue:defaultValue2,onChange,outcome,path,valuePath}}function getPrimitiveInputProps(){let error=getErrorsForInput(props.outcome,valuePath??path);return{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,error}}switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.string:case PropertyType2.time:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"?jsx64(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx64(TextInput12,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx64(TextInput12,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx64(DateTimeInput,{name,defaultValue:defaultValue2,onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx64(TextInput12,{...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 jsx64(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet});case PropertyType2.boolean:return jsx64(Checkbox,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:return jsx64(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx64(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx64(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx64(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx64(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx64(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx64(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx64(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx64(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx64(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx64(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx64(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx64(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx64(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx64(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx64(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx64(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx64(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx64(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 jsx65}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState32(props.defaultValue??{}),elementsContext=useContext12(ElementsContext),elementsToRender=useMemo11(()=>getElementsToRender(elementsContext.elements),[elementsContext.elements]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let typedValue={type:props.type,value};return jsx65(Stack6,{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=jsx65(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"?jsx65(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,children:resourcePropertyInput},key):jsx65(FormSection,{title:getPathDisplayName5(key),description:element.description,withAsterisk:required,htmlFor:key,outcome:props.outcome,fhirPath:element.path,errorExpression:valuePath,children:resourcePropertyInput},key)})})}import{jsx as jsx66,jsxs as jsxs37}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState33(()=>props.defaultValue??{}),parentElementsContext=useContext13(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo12(()=>tryGetDataType2(props.typeName,profileUrl),[props.typeName,profileUrl]),type=typeSchema?.type??props.typeName,contextValue=useMemo12(()=>{if(typeSchema)return buildElementsContext4({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url})},[typeSchema,props.path,parentElementsContext]);return typeSchema?maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx66(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})):jsxs37("div",{children:[type,"\xA0not implemented"]})}import{Button as Button6,Group as Group23}from"@mantine/core";import{useMemo as useMemo13,useState as useState34}from"react";var CalendarInput_default={table:"CalendarInput_table"};function getMonthString(date){return date.toLocaleString("default",{month:"long"})+" "+date.getFullYear()}function getStartMonth(){let result=new Date;return result.setDate(1),result.setHours(0,0,0,0),result}import{jsx as jsx67,jsxs as jsxs38}from"react/jsx-runtime";function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState34(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth.getTime());return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=useMemo13(()=>buildGrid(month,props.slots),[month,props.slots]);return jsxs38("div",{children:[jsxs38(Group23,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx67("p",{style:{flex:1},children:getMonthString(month)}),jsxs38(Group23,{justify:"flex-end",gap:"xs",children:[jsx67(Button6,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx67(Button6,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs38("table",{className:CalendarInput_default.table,children:[jsx67("thead",{children:jsxs38("tr",{children:[jsx67("th",{children:"SUN"}),jsx67("th",{children:"MON"}),jsx67("th",{children:"TUE"}),jsx67("th",{children:"WED"}),jsx67("th",{children:"THU"}),jsx67("th",{children:"FRI"}),jsx67("th",{children:"SAT"})]})}),jsx67("tbody",{children:grid.map((week,weekIndex)=>jsx67("tr",{children:week.map((day,dayIndex)=>jsx67("td",{children:day&&jsx67(Button6,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,slots){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d.getTime()),available:isDayAvailable(d,slots)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,slots){for(let slot of slots){let slotStart=new Date(slot.start);if(slotStart.getFullYear()===day.getFullYear()&&slotStart.getMonth()===day.getMonth()&&slotStart.getDate()===day.getDate())return!0}return!1}import{Container as MantineContainer}from"@mantine/core";var Container_default={root:"Container_root"};import{jsx as jsx68}from"react/jsx-runtime";function Container(props){let{children,...others}=props;return jsx68(MantineContainer,{className:Container_default.root,...others,children})}import{ActionIcon as ActionIcon7,Center as Center2,Group as Group27,Loader as Loader3,Menu as Menu4,ScrollArea as ScrollArea2,TextInput as TextInput13}from"@mantine/core";import{showNotification as showNotification5,updateNotification}from"@mantine/notifications";import{createReference as createReference3,getReferenceString as getReferenceString5,normalizeErrorString as normalizeErrorString5}from"@medplum/core";import{useCallback as useCallback8,useEffect as useEffect11,useRef as useRef10,useState as useState39}from"react";import{Group as Group25,List,Stack as Stack8,Text as Text8,Title}from"@mantine/core";import{capitalize as capitalize3,formatCodeableConcept as formatCodeableConcept2,formatDateTime as formatDateTime2,formatObservationValue,isReference as isReference2}from"@medplum/core";import{useEffect as useEffect8,useState as useState36}from"react";import{Blockquote,Stack as Stack7}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx69}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx69(Stack7,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx69(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 Group24}from"@mantine/core";import{Text as Text7}from"@mantine/core";import{getDisplayString as getDisplayString4,isOk,normalizeErrorString as normalizeErrorString4}from"@medplum/core";import{useState as useState35}from"react";import{jsx as jsx70}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState35(),resource=pe(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString4(outcome)}]`;else if(resource)text=getDisplayString4(resource);else return null;return link?jsx70(MedplumLink,{to:value,...rest,children:text}):jsx70(Text7,{component:"span",...rest,children:text})}import{jsx as jsx71,jsxs as jsxs39}from"react/jsx-runtime";function ResourceBadge(props){return jsxs39(Group24,{gap:"xs",children:[jsx71(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx71(ResourceName,{value:props.value,link:props.link})]})}import{Badge}from"@mantine/core";import{jsx as jsx72}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"};function StatusBadge(props){return jsx72(Badge,{color:statusToColor[props.status],children:props.status})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment23,jsx as jsx73,jsxs as jsxs40}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1};function DiagnosticReportDisplay(props){let medplum=a(),diagnosticReport=pe(props.value),[specimens,setSpecimens]=useState36();if(useEffect8(()=>{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 jsxs40(Stack8,{children:[jsx73(Title,{children:"Diagnostic Report"}),jsx73(DiagnosticReportHeader,{value:diagnosticReport}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx73(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx73(NoteDisplay,{value:specimenNotes})]})}function DiagnosticReportHeader({value}){return jsxs40(Group25,{mt:"md",gap:30,children:[value.subject&&jsxs40("div",{children:[jsx73(Text8,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx73(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs40("div",{children:[jsx73(Text8,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx73(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs40("div",{children:[jsx73(Text8,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx73(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs40("div",{children:[jsx73(Text8,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx73(Text8,{children:formatDateTime2(value.issued)})]}),value.status&&jsxs40("div",{children:[jsx73(Text8,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx73(Text8,{children:capitalize3(value.status)})]})]})}function SpecimenInfo(specimens){return jsxs40(Stack8,{gap:"xs",children:[jsx73(Title,{order:2,size:"h6",children:"Specimens"}),jsx73(List,{type:"ordered",children:specimens?.map(specimen=>jsx73(List.Item,{ml:"sm",children:jsxs40(Group25,{gap:20,children:[jsxs40(Group25,{gap:5,children:[jsx73(Text8,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs40(Group25,{gap:5,children:[jsx73(Text8,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs40("table",{className:DiagnosticReportDisplay_default.table,children:[jsx73("thead",{children:jsxs40("tr",{children:[jsx73("th",{children:"Test"}),jsx73("th",{children:"Value"}),jsx73("th",{children:"Reference Range"}),jsx73("th",{children:"Interpretation"}),jsx73("th",{children:"Category"}),jsx73("th",{children:"Performer"}),jsx73("th",{children:"Status"})]})}),jsx73("tbody",{children:jsx73(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx73(Fragment23,{children:props.value?.map(observation=>jsx73(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference2(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=pe(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs40(Fragment23,{children:[jsxs40("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx73("td",{rowSpan:displayNotes?2:1,children:jsx73(MedplumLink,{to:observation,children:jsx73(CodeableConceptDisplay,{value:observation.code})})}),jsx73("td",{children:jsx73(ObservationValueDisplay,{value:observation})}),jsx73("td",{children:jsx73(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx73("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx73(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx73("td",{children:observation.category&&observation.category.length>0&&jsx73(Fragment23,{children:observation.category.map(concept=>jsx73("div",{children:jsx73(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept2(concept)}`))})}),jsx73("td",{children:observation.performer?.map(performer=>jsx73(ReferenceDisplay,{value:performer},performer.reference))}),jsx73("td",{children:observation.status&&jsx73(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx73(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx73("tr",{children:jsx73("td",{colSpan:6,children:jsx73(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx73(Fragment23,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx73(Fragment23,{children:range.text}):jsx73(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{Paper}from"@mantine/core";var Panel_default={paper:"Panel_paper",fill:"Panel_fill"};import{jsx as jsx74}from"react/jsx-runtime";function Panel(props){let{width,fill,className,children,...rest}=props,style=width?{maxWidth:width}:void 0;return jsx74(Paper,{className:clsx_default(Panel_default.paper,fill&&Panel_default.fill,className),style,shadow:"sm",radius:"sm",withBorder:!0,...rest,children})}import{Table}from"@mantine/core";import{arrayify,capitalize as capitalize4,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";var import_rfc6902=__toESM(require_rfc6902(),1);import{useEffect as useEffect9,useMemo as useMemo14,useState as useState37}from"react";var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx75,jsxs as jsxs41}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=a(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState37(!1);useEffect9(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo14(()=>{if(!schemaLoaded)return null;let typedOriginal=[toTypedValue(original)],typedRevised=[toTypedValue(revised)],result=[],patch=mergePatchOperations((0,import_rfc6902.createPatch)(original,revised));for(let op of patch){let path=op.path,fhirPath=jsonPathToFhirPath(path),property=tryGetElementDefinition(original.resourceType,fhirPath),originalValue=op.op==="add"?void 0:evalFhirPathTyped(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:evalFhirPathTyped(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${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?jsxs41(Table,{className:ResourceDiffTable_default.root,children:[jsx75(Table.Thead,{children:jsxs41(Table.Tr,{children:[jsx75(Table.Th,{}),jsx75(Table.Th,{children:"Before"}),jsx75(Table.Th,{children:"After"})]})}),jsx75(Table.Tbody,{children:diffTable.map(row=>jsxs41(Table.Tr,{children:[jsx75(Table.Td,{children:row.name}),jsx75(Table.Td,{className:ResourceDiffTable_default.removed,children:row.originalValue&&jsx75(ResourcePropertyDisplay,{path:row.path,property:row.property,propertyType:row.originalValue.type,value:row.originalValue.value,ignoreMissingValues:!0})}),jsx75(Table.Td,{className:ResourceDiffTable_default.added,children:row.revisedValue&&jsx75(ResourcePropertyDisplay,{path:row.path,property:row.property,propertyType:row.revisedValue.type,value:row.revisedValue.value,ignoreMissingValues:!0})})]},row.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){return getSearchParameterDetails(resourceType,{resourceType:"SearchParameter",base:[resourceType],code:resourceType+"."+fhirPath,expression:resourceType+"."+fhirPath})?.elementDefinitions?.[0]}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(v2=>v2.value);return isArray?inputValue:inputValue[0]}import{useEffect as useEffect10,useState as useState38}from"react";import{tryGetProfile as tryGetProfile5}from"@medplum/core";import{jsx as jsx76}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=a(),value=pe(props.value),[schemaLoaded,setSchemaLoaded]=useState38();return useEffect10(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{let profile=tryGetProfile5(profileUrl);profile?setSchemaLoaded(profile.name):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(schemaName)}).catch(console.error)}},[medplum,profileUrl,value]),!schemaLoaded||!value?null:jsx76(BackboneElementDisplay,{path:value.resourceType,value:{type:schemaLoaded,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues})}import{ActionIcon as ActionIcon6,Group as Group26,Menu as Menu3,Text as Text9}from"@mantine/core";import{formatDateTime as formatDateTime3,getReferenceString as getReferenceString4}from"@medplum/core";import{Fragment as Fragment24,jsx as jsx77,jsxs as jsxs42}from"react/jsx-runtime";function Timeline(props){return jsx77(Container,{children:props.children})}function TimelineItem(props){let{resource,profile,padding,popupMenuItems,...others}=props,author=profile??resource.meta?.author,dateTime=props.dateTime??resource.meta?.lastUpdated;return jsxs42(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs42(Group26,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx77(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs42("div",{style:{flex:1},children:[jsx77(Text9,{size:"sm",children:jsx77(ResourceName,{c:"dark",fw:500,value:author,link:!0})}),jsxs42(Text9,{size:"xs",children:[jsx77(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime3(dateTime)}),jsx77(Text9,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx77(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs42(Menu3,{position:"bottom-end",shadow:"md",width:200,children:[jsx77(Menu3.Target,{children:jsx77(ActionIcon6,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString4(props.resource)}`,children:jsx77(IconDots,{})})}),popupMenuItems]})]}),jsxs42(ErrorBoundary,{children:[padding&&jsx77("div",{style:{padding:"0 16px 16px 16px"},children:props.children}),!padding&&jsx77(Fragment24,{children:props.children})]})]})}function sortByDateAndPriority(resources,timelineResource){resources.sort((a2,b2)=>{let priority1=getPriorityScore(a2,timelineResource),priority2=getPriorityScore(b2,timelineResource);return priority1>priority2?1:priority1<priority2?-1:getTime(a2,timelineResource)-getTime(b2,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(a2,b2){return!!b2&&a2.resourceType===b2.resourceType&&a2.id===b2.id}var ResourceTimeline_default={pinnedComment:"ResourceTimeline_pinnedComment"};import{Fragment as Fragment25,jsx as jsx78,jsxs as jsxs43}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=a(),navigate=V(),sender=medplum.getProfile(),inputRef=useRef10(null),resource=pe(props.value),[history,setHistory]=useState39(),[items,setItems]=useState39([]),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef10(items);itemsRef.current=items;let sortAndSetItems=useCallback8(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback8(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=useCallback8(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback8(()=>{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]);useEffect11(()=>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:jsx78(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString5(reason),icon:jsx78(IconFileAlert,{size:16}),autoClose:2e3}))}function setPriority(communication,priority){return medplum.updateResource({...communication,priority})}function onPin(communication){setPriority(communication,"stat").then(loadTimeline).catch(console.error)}function onUnpin(communication){setPriority(communication,"routine").then(loadTimeline).catch(console.error)}function onDetails(timelineItem){navigate(`/${timelineItem.resourceType}/${timelineItem.id}`)}function onEdit(timelineItem){navigate(`/${timelineItem.resourceType}/${timelineItem.id}/edit`)}function onDelete(timelineItem){navigate(`/${timelineItem.resourceType}/${timelineItem.id}/delete`)}function onVersionDetails(version){navigate(`/${version.resourceType}/${version.id}/_history/${version.meta?.versionId}`)}function onUploadStart(){showNotification5({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:normalizeErrorString5(outcome),icon:jsx78(IconFileAlert,{size:16}),autoClose:2e3})}return resource?jsxs43(Timeline,{children:[props.createCommunication&&jsx78(Panel,{children:jsx78(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs43(Group27,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx78(ResourceAvatar,{value:sender}),jsx78(TextInput13,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx78(ActionIcon7,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx78(IconMessage,{size:16})}),jsx78(AttachmentButton,{securityContext:createReference3(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx78(ActionIcon7,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx78(IconCloudUpload,{size:16})})})]})})}),items.map(item=>{if(!item)return null;let key=`${item.resourceType}/${item.id}/${item.meta?.versionId}`;if(item.resourceType===resource.resourceType&&item.id===resource.id)return jsx78(HistoryTimelineItem,{history,resource:item,onDetails:onVersionDetails},key);switch(item.resourceType){case"AuditEvent":return jsx78(AuditEventTimelineItem,{resource:item,onDetails},key);case"Communication":return jsx78(CommunicationTimelineItem,{resource:item,onPin:item.priority!=="stat"?onPin:void 0,onUnpin:item.priority==="stat"?onUnpin:void 0,onDetails,onEdit,onDelete},key);case"DiagnosticReport":return jsx78(DiagnosticReportTimelineItem,{resource:item,onDetails,onEdit,onDelete},key);case"Media":return jsx78(MediaTimelineItem,{resource:item,onDetails,onEdit,onDelete},key);default:return jsx78(TimelineItem,{resource:item,padding:!0,children:jsx78(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}})]}):jsx78(Center2,{style:{width:"100%",height:"100%"},children:jsx78(Loader3,{})})}function TimelineItemPopupMenu(props){return jsxs43(Menu4.Dropdown,{children:[jsx78(Menu4.Label,{children:"Resource"}),props.onPin&&jsx78(Menu4.Item,{leftSection:jsx78(IconPin,{size:14}),onClick:()=>props.onPin(props.resource),"aria-label":`Pin ${getReferenceString5(props.resource)}`,children:"Pin"}),props.onUnpin&&jsx78(Menu4.Item,{leftSection:jsx78(IconPinnedOff,{size:14}),onClick:()=>props.onUnpin(props.resource),"aria-label":`Unpin ${getReferenceString5(props.resource)}`,children:"Unpin"}),props.onDetails&&jsx78(Menu4.Item,{leftSection:jsx78(IconListDetails,{size:14}),onClick:()=>props.onDetails(props.resource),"aria-label":`Details ${getReferenceString5(props.resource)}`,children:"Details"}),props.onEdit&&jsx78(Menu4.Item,{leftSection:jsx78(IconEdit,{size:14}),onClick:()=>props.onEdit(props.resource),"aria-label":`Edit ${getReferenceString5(props.resource)}`,children:"Edit"}),props.onDelete&&jsxs43(Fragment25,{children:[jsx78(Menu4.Divider,{}),jsx78(Menu4.Label,{children:"Danger zone"}),jsx78(Menu4.Item,{color:"red",leftSection:jsx78(IconTrash,{size:14}),onClick:()=>props.onDelete(props.resource),"aria-label":`Delete ${getReferenceString5(props.resource)}`,children:"Delete"})]})]})}function HistoryTimelineItem(props){let previous=getPrevious(props.history,props.resource);return previous?jsx78(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:jsx78(TimelineItemPopupMenu,{...props}),children:jsx78(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs43(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:jsx78(TimelineItemPopupMenu,{...props}),children:[jsx78("h3",{children:"Created"}),jsx78(ResourceTable,{value:props.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 jsx78(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:jsx78(TimelineItemPopupMenu,{...props}),children:jsx78("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 jsx78(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:jsx78(TimelineItemPopupMenu,{...props}),children:jsx78(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx78(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:jsx78(TimelineItemPopupMenu,{...props}),children:jsx78(ScrollArea2,{children:jsx78("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx78(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:jsx78(TimelineItemPopupMenu,{...props}),children:jsx78(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 jsx79}from"react/jsx-runtime";function DefaultResourceTimeline(props){return jsx79(ResourceTimeline,{value:props.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})])}})}import{jsx as jsx80}from"react/jsx-runtime";function Document(props){let{children,...others}=props;return jsx80(Container,{children:jsx80(Panel,{...others,children})})}import{createReference as createReference4}from"@medplum/core";import{jsx as jsx81}from"react/jsx-runtime";function EncounterTimeline(props){return jsx81(ResourceTimeline,{value:props.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:createReference4(resource),subject:resource.subject,sender:createReference4(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference4(resource),subject:resource.subject,operator:createReference4(operator),issued:new Date().toISOString(),content})})}import{Button as Button12,Loader as Loader5,Table as Table3}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome2}from"@medplum/core";import{memo as memo2,useEffect as useEffect15,useRef as useRef14,useState as useState44}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx82}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 jsx82(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon8,Button as Button11,Center as Center3,Group as Group30,Loader as Loader4,Menu as Menu6,Pagination,Table as Table2,Text as Text11,UnstyledButton as UnstyledButton2}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,formatSearchQuery,isDataTypeLoaded}from"@medplum/core";import{memo,useCallback as useCallback9,useEffect as useEffect14,useRef as useRef13,useState as useState43}from"react";import{Box as Box2,Button as Button7,Modal as Modal3,Text as Text10}from"@mantine/core";import{jsx as jsx83,jsxs as jsxs44}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs44(Modal3,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs44(Box2,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx83(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx83(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx83(Text10,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx83(Button7,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button8,Group as Group28,Modal as Modal4,MultiSelect,Stack as Stack9}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify2}from"@medplum/core";import{useEffect as useEffect12,useMemo as useMemo15,useRef as useRef11,useState as useState40}from"react";import{capitalize as capitalize5,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime4,Operator}from"@medplum/core";import{Fragment as Fragment26,jsx as jsx84}from"react/jsx-runtime";var searchParamToOperators={string:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],fulltext:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],token:[Operator.EQUALS,Operator.NOT],reference:[Operator.EQUALS,Operator.NOT],numeric:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],quantity:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],date:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],datetime:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY]},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",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",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(f2=>f2.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 addLastMonthFilter(definition,field){return addMonthFilter(definition,field,-1)}function addThisMonthFilter(definition,field){return addMonthFilter(definition,field,0)}function addNextMonthFilter(definition,field){return addMonthFilter(definition,field,1)}function addMonthFilter(definition,field,delta){let startTime=new Date;startTime.setMonth(startTime.getMonth()+delta),startTime.setDate(1),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setMonth(endTime.getMonth()+1),endTime.setDate(1),endTime.setHours(0,0,0,0),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addYearToDateFilter(definition,field){let startTime=new Date;return startTime.setMonth(0),startTime.setDate(1),startTime.setHours(0,0,0,0),addDateFilterBetween(definition,field,startTime,new Date)}function addDateFilterBetween(definition,field,d1,d2){return definition=clearFiltersOnField(definition,field),definition=addDateFilterImpl(definition,field,Operator.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.replace(/([A-Z])/g," $1"),tmp=tmp.replace(/[-_]/g," "),tmp=tmp.replace(/\s+/g," "),tmp=tmp.trim(),tmp.toLowerCase()==="id"?"ID":tmp.split(/\s/).map(capitalize5).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?resource.id:key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?formatDateTime4(resource.meta?.lastUpdated):field.elementDefinition&&`${resource.resourceType}.${field.name}`===field.elementDefinition.path?renderPropertyValue(resource,field.elementDefinition):field.searchParams&&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?jsx84(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:jsx84(Fragment26,{children:value.map((v2,index)=>jsx84(ResourcePropertyDisplay,{propertyType:v2.type,value:v2.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx85,jsxs as jsxs45}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef11(!1),[state,setState]=useState40({search:JSON.parse(stringify2(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState40(!1);useEffect12(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo15(()=>{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]);if(!props.visible)return null;function handleChange(newFields){setState({search:{...state.search,fields:newFields}})}return jsx85(Modal4,{title:"Fields",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>{props.onCancel()},size:"auto",withOverlay:!0,closeOnClickOutside:!1,overlayProps:{onMouseDownCapture:()=>{wasDropdownOpen.current=isDropdownOpen},onClick:()=>{wasDropdownOpen.current||props.onCancel(),wasDropdownOpen.current=!1},children:jsx85("div",{"data-testid":"overlay-child"})},children:jsxs45(Stack9,{children:[jsx85(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}),jsx85(Group28,{justify:"flex-end",children:jsx85(Button8,{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{Button as Button9,Group as Group29,Modal as Modal5,NativeSelect as NativeSelect10}from"@mantine/core";import{getSearchParameters as getSearchParameters2,stringify as stringify3}from"@medplum/core";import{useEffect as useEffect13,useRef as useRef12,useState as useState41}from"react";import{formatDateTime as formatDateTime5,getSearchParameterDetails as getSearchParameterDetails2,globalSchema,Operator as Operator2,SearchParameterType}from"@medplum/core";import{Fragment as Fragment27,jsx as jsx86}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===Operator2.EQUALS||filter.operator===Operator2.NOT_EQUALS))return jsx86(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails2(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType.DATETIME)return jsx86(Fragment27,{children:formatDateTime5(filter.value)})}return jsx86(Fragment27,{children:filter.value})}import{Checkbox as Checkbox2,TextInput as TextInput14}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails3,SearchParameterType as SearchParameterType2}from"@medplum/core";import{jsx as jsx87}from"react/jsx-runtime";function SearchFilterValueInput(props){let details=getSearchParameterDetails3(props.resourceType,props.searchParam),name="filter-value";switch(details.type){case SearchParameterType2.REFERENCE:return jsx87(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 SearchParameterType2.BOOLEAN:return jsx87(Checkbox2,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType2.DATE:return jsx87(TextInput14,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType2.DATETIME:return jsx87(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType2.NUMBER:return jsx87(TextInput14,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType2.QUANTITY:return jsx87(QuantityInput,{name,defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx87(TextInput14,{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:parseFloat(valueString),system:systemString,unit:unitString}}}import{jsx as jsx88,jsxs as jsxs46}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState41(JSON.parse(stringify3(props.search))),[editingIndex,setEditingIndex]=useState41(-1),searchRef=useRef12(search);searchRef.current=search,useEffect13(()=>{setSearch(JSON.parse(stringify3(props.search)))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}if(!props.visible)return null;let resourceType=props.search.resourceType,searchParams=getSearchParameters2(resourceType)??{},filters=search.filters||[];return jsxs46(Modal5,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:[jsx88("div",{children:jsxs46("table",{children:[jsxs46("colgroup",{children:[jsx88("col",{style:{width:200}}),jsx88("col",{style:{width:200}}),jsx88("col",{style:{width:380}}),jsx88("col",{style:{width:120}})]}),jsx88("thead",{children:jsxs46("tr",{children:[jsx88("th",{children:"Field"}),jsx88("th",{children:"Operation"}),jsx88("th",{children:"Value"}),jsx88("th",{children:"Actions"})]})}),jsxs46("tbody",{children:[filters.map((filter,index)=>index===editingIndex?jsx88(FilterRowInput,{resourceType,searchParams,defaultValue:filter,okText:"Save",onOk:newFilter=>{let newFilters=[...filters];newFilters[index]=newFilter,setSearch(setFilters(searchRef.current,newFilters)),setEditingIndex(-1)},onCancel:()=>setEditingIndex(-1)},`filter-${filter.code}-${filter.operator}-${filter.value}-input`):jsx88(FilterRowDisplay,{resourceType,filter,onEdit:()=>setEditingIndex(index),onDelete:()=>setSearch(deleteFilter(searchRef.current,index))},`filter-${filter.code}-${filter.operator}-${filter.value}-display`)),jsx88(FilterRowInput,{resourceType,searchParams,okText:"Add",onOk:onAddFilter})]})]})}),jsx88(Group29,{justify:"flex-end",mt:"xl",children:jsx88(Button9,{onClick:()=>props.onOk(searchRef.current),children:"OK"})})]})}function FilterRowDisplay(props){let{filter}=props;return jsxs46("tr",{children:[jsx88("td",{children:buildFieldNameString(filter.code)}),jsx88("td",{children:getOpString(filter.operator)}),jsx88("td",{children:jsx88(SearchFilterValueDisplay,{resourceType:props.resourceType,filter})}),jsxs46("td",{children:[jsx88(Button9,{size:"compact-md",variant:"outline",onClick:props.onEdit,children:"Edit"}),jsx88(Button9,{size:"compact-md",variant:"outline",onClick:props.onDelete,children:"Delete"})]})]})}function FilterRowInput(props){let[value,setValue]=useState41(props.defaultValue??{}),valueRef=useRef12(value);valueRef.current=value;function setFilterCode(newCode){setValue({...valueRef.current,code:newCode})}function setFilterOperator(newOperator){setValue({...valueRef.current,operator:newOperator})}function setFilterValue(newFilterValue){setValue({...valueRef.current,value:newFilterValue})}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return jsxs46("tr",{children:[jsx88("td",{children:jsx88(NativeSelect10,{"data-testid":"filter-field",defaultValue:valueRef.current.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...Object.keys(props.searchParams).map(param=>({value:param,label:buildFieldNameString(param)}))]})}),jsx88("td",{children:operators&&jsx88(NativeSelect10,{"data-testid":"filter-operation",defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]})}),jsx88("td",{children:searchParam&&value.operator&&jsx88(SearchFilterValueInput,{resourceType:props.resourceType,searchParam,defaultValue:value.value,onChange:setFilterValue})}),jsxs46("td",{children:[value.code&&value.operator&&jsx88(Button9,{size:"compact-md",variant:"outline",onClick:()=>{props.onOk(valueRef.current),setValue({})},children:props.okText}),props.onCancel&&jsx88(Button9,{size:"compact-md",variant:"outline",onClick:props.onCancel,children:"Cancel"})]})]})}import{Button as Button10,Grid,Modal as Modal6}from"@mantine/core";import{useState as useState42}from"react";import{jsx as jsx89,jsxs as jsxs47}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState42(props.defaultValue??"");if(!props.visible||!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx89(Modal6,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx89(Form,{onSubmit:onOk,children:jsxs47(Grid,{children:[jsx89(Grid.Col,{span:10,children:jsx89(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx89(Grid.Col,{span:2,children:jsx89(Button10,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{Menu as Menu5}from"@mantine/core";import{Operator as Operator4}from"@medplum/core";import{Fragment as Fragment28,jsx as jsx90,jsxs as jsxs48}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?jsx90(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx90(Menu5.Dropdown,{children:props.searchParams.map(searchParam=>jsx90(Menu5.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx90(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx90(NumericFilterSubMenu,{...props});case"reference":return jsx90(ReferenceFilterSubMenu,{...props});case"string":return jsx90(TextFilterSubMenu,{...props});case"token":case"uri":return jsx90(TokenFilterSubMenu,{...props});default:return jsxs48(Fragment28,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs48(Menu5.Dropdown,{children:[jsx90(Menu5.Item,{leftSection:jsx90(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx90(Menu5.Item,{leftSection:jsx90(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx90(Menu5.Divider,{}),jsx90(Menu5.Item,{leftSection:jsx90(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx90(Menu5.Item,{leftSection:jsx90(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx90(Menu5.Divider,{}),jsx90(Menu5.Item,{leftSection:jsx90(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.ENDS_BEFORE),children:"Before..."}),jsx90(Menu5.Item,{leftSection:jsx90(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.STARTS_AFTER),children:"After..."}),jsx90(Menu5.Item,{leftSection:jsx90(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Between..."}),jsx90(Menu5.Divider,{}),jsx90(Menu5.Item,{leftSection:jsx90(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx90(Menu5.Item,{leftSection:jsx90(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx90(Menu5.Item,{leftSection:jsx90(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx90(Menu5.Divider,{}),jsx90(Menu5.Item,{leftSection:jsx90(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx90(Menu5.Item,{leftSection:jsx90(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx90(Menu5.Item,{leftSection:jsx90(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx90(Menu5.Divider,{}),jsx90(Menu5.Item,{leftSection:jsx90(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx90(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs48(Menu5.Dropdown,{children:[jsx90(Menu5.Item,{leftSection:jsx90(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx90(Menu5.Item,{leftSection:jsx90(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx90(Menu5.Divider,{}),jsx90(Menu5.Item,{leftSection:jsx90(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx90(Menu5.Item,{leftSection:jsx90(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx90(Menu5.Divider,{}),jsx90(Menu5.Item,{leftSection:jsx90(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN),children:"Greater than..."}),jsx90(Menu5.Item,{leftSection:jsx90(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx90(Menu5.Item,{leftSection:jsx90(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN),children:"Less than..."}),jsx90(Menu5.Item,{leftSection:jsx90(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx90(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs48(Menu5.Dropdown,{children:[jsx90(Menu5.Item,{leftSection:jsx90(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx90(Menu5.Item,{leftSection:jsx90(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx90(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs48(Menu5.Dropdown,{children:[jsx90(Menu5.Item,{leftSection:jsx90(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx90(Menu5.Item,{leftSection:jsx90(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx90(Menu5.Divider,{}),jsx90(Menu5.Item,{leftSection:jsx90(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx90(Menu5.Item,{leftSection:jsx90(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx90(Menu5.Divider,{}),jsx90(Menu5.Item,{leftSection:jsx90(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.CONTAINS),children:"Contains..."}),jsx90(Menu5.Item,{leftSection:jsx90(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Does not contain..."}),jsx90(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs48(Menu5.Dropdown,{children:[jsx90(Menu5.Item,{leftSection:jsx90(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx90(Menu5.Item,{leftSection:jsx90(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx90(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs48(Fragment28,{children:[jsx90(Menu5.Divider,{}),jsx90(Menu5.Item,{leftSection:jsx90(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx90(Menu5.Item,{leftSection:jsx90(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx90(Menu5.Divider,{}),jsx90(Menu5.Item,{leftSection:jsx90(IconX,{size:14}),onClick:()=>props.onClear(searchParam),children:"Clear filters"})]})}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 Fragment29,jsx as jsx91,jsxs as jsxs49}from"react/jsx-runtime";var SearchChangeEvent=class extends Event{constructor(definition){super("change"),this.definition=definition}},SearchLoadEvent=class extends Event{constructor(response){super("load"),this.response=response}},SearchClickEvent=class extends Event{constructor(resource,browserEvent){super("click"),this.resource=resource,this.browserEvent=browserEvent}};function SearchControl(props){let medplum=a(),[loadingSchema,setLoadingSchema]=useState43(),[outcome,setOutcome]=useState43(),{search,onLoad}=props,[state,setState]=useState43({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef13(state);stateRef.current=state;let total=search.total??"accurate",loadResults=useCallback9(options=>{setOutcome(void 0),medplum.search(search.resourceType,formatSearchQuery({...search,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(reason)})},[medplum,search,total,onLoad]),refreshResults=useCallback9(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect14(()=>{loadResults()},[loadResults]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...stateRef.current.selected};checked?newSelected[id]=!0:delete newSelected[id],setState({...stateRef.current,selected:newSelected})}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},searchResponse=stateRef.current.searchResponse;checked&&searchResponse?.entry&&searchResponse.entry.forEach(entry=>{entry.resource?.id&&(newSelected[entry.resource.id]=!0)}),setState({...stateRef.current,selected:newSelected})}function isAllSelected(){let state2=stateRef.current;if(!state2.searchResponse?.entry||state2.searchResponse.entry.length===0)return!1;for(let e of state2.searchResponse.entry)if(e.resource?.id&&!state2.selected[e.resource.id])return!1;return!0}function emitSearchChange(newSearch){props.onChange&&props.onChange(new SearchChangeEvent(newSearch))}function handleRowClick(e,resource){if(isCheckboxCell(e.target)||e.button===2)return;killEvent(e);let isAux=e.button===1||e.ctrlKey||e.metaKey;!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(useEffect14(()=>{setLoadingSchema(props.search.resourceType),medplum.requestSchema(props.search.resourceType).catch(console.error).finally(()=>setLoadingSchema(void 0))},[medplum,props.search.resourceType]),!isDataTypeLoaded(props.search.resourceType)||loadingSchema===props.search.resourceType)return jsx91(Center3,{style:{width:"100%",height:"100%"},children:jsx91(Loader4,{})});let checkboxColumn=props.checkboxesEnabled,fields=getFieldDefinitions(search),resourceType=search.resourceType,lastResult=state.searchResponse,resources=lastResult?.entry?.map(e=>e.resource),buttonVariant="subtle",buttonColor="gray",iconSize=16,isMobile=window.innerWidth<768;return jsxs49("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs49(Group30,{justify:"space-between",mb:"xl",children:[jsxs49(Group30,{gap:2,children:[jsx91(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx91(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0}),children:"Fields"}),jsx91(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx91(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0}),children:"Filters"}),props.onNew&&jsx91(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx91(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx91(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx91(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0}),children:"Export..."}),!isMobile&&props.onDelete&&jsx91(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx91(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx91(Button11,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx91(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs49(Group30,{gap:2,children:[lastResult&&jsxs49(Text11,{size:"xs",c:"dimmed","data-testid":"count-display",children:[getStart(search,lastResult).toLocaleString(),"-",getEnd(search,lastResult).toLocaleString(),lastResult.total!==void 0&&` of ${search.total==="estimate"?"~":""}${lastResult.total?.toLocaleString()}`]}),jsx91(ActionIcon8,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx91(IconRefresh,{size:iconSize})})]})]}),jsxs49(Table2,{className:SearchControl_default.table,children:[jsxs49(Table2.Thead,{children:[jsxs49(Table2.Tr,{children:[checkboxColumn&&jsx91(Table2.Th,{children:jsx91("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx91(Table2.Th,{children:jsxs49(Menu6,{shadow:"md",width:240,position:"bottom-end",children:[jsx91(Menu6.Target,{children:jsx91(UnstyledButton2,{className:SearchControl_default.control,p:2,children:jsxs49(Group30,{justify:"space-between",wrap:"nowrap",children:[jsx91(Text11,{fw:500,children:buildFieldNameString(field.name)}),jsx91(Center3,{className:SearchControl_default.icon,children:jsx91(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx91(SearchPopupMenu,{search:props.search,searchParams:field.searchParams,onPrompt:(searchParam,filter)=>{setState({...stateRef.current,filterDialogVisible:!0,filterDialogSearchParam:searchParam,filterDialogFilter:filter})},onChange:result=>{emitSearchChange(result)}})]})},field.name))]}),!props.hideFilters&&jsxs49(Table2.Tr,{children:[checkboxColumn&&jsx91(Table2.Th,{}),fields.map(field=>jsx91(Table2.Th,{children:field.searchParams&&jsx91(FilterDescription,{resourceType,searchParams:field.searchParams,filters:props.search.filters})},field.name))]})]}),jsx91(Table2.Tbody,{children:resources?.map(resource=>resource&&jsxs49(Table2.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx91(Table2.Td,{children:jsx91("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=>jsx91(Table2.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),resources?.length===0&&jsx91(Container,{children:jsx91(Center3,{style:{height:150},children:jsx91(Text11,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx91(Center3,{m:"md",p:"md",children:jsx91(Pagination,{value:getPage(search),total:getTotalPages(search,lastResult),onChange:newPage=>emitSearchChange(setPage(search,newPage)),getControlProps:control=>{switch(control){case"previous":return{"aria-label":"Previous page"};case"next":return{"aria-label":"Next page"};default:return{}}}})}),outcome&&jsx91("div",{"data-testid":"search-error",children:jsx91("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),jsx91(SearchFieldEditor,{search:props.search,visible:stateRef.current.fieldEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,fieldEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,fieldEditorVisible:!1})}}),jsx91(SearchFilterEditor,{search:props.search,visible:stateRef.current.filterEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,filterEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterEditorVisible:!1})}}),jsx91(SearchExportDialog,{visible:stateRef.current.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}}),jsx91(SearchFilterValueDialog,{visible:stateRef.current.filterDialogVisible,title:state.filterDialogSearchParam?.code?buildFieldNameString(state.filterDialogSearchParam.code):"",resourceType,searchParam:state.filterDialogSearchParam,filter:state.filterDialogFilter,defaultValue:"",onOk:filter=>{emitSearchChange(addFilter(props.search,filter.code,filter.operator,filter.value)),setState({...stateRef.current,filterDialogVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterDialogVisible:!1})}},state.filterDialogSearchParam?.code)]})}var MemoizedSearchControl=memo(SearchControl);function FilterDescription(props){let filters=(props.filters??[]).filter(f2=>props.searchParams.find(p=>p.code===f2.code));return filters.length===0?jsx91("span",{children:"no filters"}):jsx91(Fragment29,{children:filters.map(filter=>jsxs49("div",{children:[getOpString(filter.operator),"\xA0",jsx91(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 jsx92,jsxs as jsxs50}from"react/jsx-runtime";function FhirPathTable(props){let medplum=a(),[schemaLoaded,setSchemaLoaded]=useState44(!1),[outcome,setOutcome]=useState44(),{query,fields}=props,[response,setResponse]=useState44(),[selected,setSelected]=useState44({}),responseRef=useRef14();responseRef.current=response;let selectedRef=useRef14({});selectedRef.current=selected,useEffect15(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome2(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selectedRef.current};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=responseRef.current?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=responseRef.current?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selectedRef.current[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if(useEffect15(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx92(Loader5,{});let checkboxColumn=props.checkboxesEnabled;return jsxs50("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs50(Table3,{children:[jsx92(Table3.Thead,{children:jsxs50(Table3.Tr,{children:[checkboxColumn&&jsx92(Table3.Th,{children:jsx92("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx92(Table3.Th,{children:field.name},field.name))]})}),jsx92(Table3.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs50(Table3.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx92(Table3.Td,{children:jsx92("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=>jsx92(Table3.Td,{children:jsx92(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx92("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx92("div",{"data-testid":"search-error",children:jsx92("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx92(Button12,{onClick:()=>props.onBulk(Object.keys(selectedRef.current)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo2(FhirPathTable);import{jsx as jsx93,jsxs as jsxs51}from"react/jsx-runtime";function Logo(props){return jsxs51("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 491 491",style:{width:props.size,height:props.size},children:[jsx93("title",{children:"Medplum Logo"}),jsx93("path",{fill:props.fill??"#ad7136",d:"M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z"}),jsx93("path",{fill:props.fill??"#946af9",d:"M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z"}),jsx93("path",{fill:props.fill??"#7857c5",d:"M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z"}),jsx93("path",{fill:props.fill??"#40bc26",d:"M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z"}),jsx93("path",{fill:props.fill??"#33961e",d:"M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z"})]})}import{Box as Box4,SimpleGrid}from"@mantine/core";import{Box as Box3,Flex as Flex2,Group as Group31,Paper as Paper2,RingProgress,Text as Text12,Title as Title2}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept3}from"@medplum/core";import{Fragment as Fragment30,jsx as jsx94,jsxs as jsxs52}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx94(Paper2,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs52(Group31,{children:[group.measureScore&&jsx94(MeasureScore,{group}),!group.measureScore&&jsx94(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs52(Fragment30,{children:[jsx94(Text12,{fz:"md",fw:500,mb:8,children:measure.title}),jsx94(Text12,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept3(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept3(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs52(Box3,{children:[jsx94(Title2,{order:3,children:"Not Applicable"}),jsx94(Text12,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs52(Box3,{children:[jsx94(Title2,{order:3,children:"Insufficient Data"}),jsx94(Text12,{children:`Numerator: ${numeratorCount}`}),jsx94(Text12,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx94(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx94(Flex2,{justify:"center",children:jsxs52(Text12,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx94(Fragment30,{children:unit==="%"?jsx94(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx94(Flex2,{justify:"center",children:jsx94(Text12,{fw:700,fz:18,children:jsx94(QuantityDisplay,{value:group.measureScore})})})}):jsx94(Flex2,{h:120,align:"center",children:jsx94(Title2,{order:3,children:jsx94(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 jsx95,jsxs as jsxs53}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=pe(props.measureReport),[measure]=Ce("Measure",{url:report?.measure});return report?jsxs53(Box4,{children:[measure&&jsx95(MeasureTitle,{measure}),jsx95(SimpleGrid,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx95(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon9,Indicator,Tooltip as Tooltip2}from"@mantine/core";import{useCallback as useCallback10,useEffect as useEffect16,useState as useState45}from"react";import{jsx as jsx96}from"react/jsx-runtime";function NotificationIcon(props){let medplum=a(),{label,resourceType,countCriteria,subscriptionCriteria,onClick}=props,[unreadCount,setUnreadCount]=useState45(0),updateCount=useCallback10(cache=>{medplum.search(resourceType,countCriteria,{cache}).then(result=>setUnreadCount(result.total)).catch(console.error)},[medplum,resourceType,countCriteria]);useEffect16(()=>{updateCount("default")},[updateCount]),Oe(subscriptionCriteria,()=>{updateCount("reload")});let icon=jsx96(Tooltip2,{label,children:jsx96(ActionIcon9,{variant:"subtle",color:"gray",size:"lg","aria-label":label,onClick,children:props.iconComponent})});return unreadCount>0?jsx96(Indicator,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:icon}):icon}import{Alert as Alert2}from"@mantine/core";import{operationOutcomeIssueToString}from"@medplum/core";import{jsx as jsx97}from"react/jsx-runtime";function OperationOutcomeAlert(props){let issues=props.outcome?.issue||props.issues;return!issues||issues.length===0?null:jsx97(Alert2,{icon:jsx97(IconAlertCircle,{size:16}),color:"red",children:issues.map(issue=>jsx97("div",{"data-testid":"text-field-error",children:operationOutcomeIssueToString(issue)},issue.details?.text))})}import{Anchor as Anchor8,Card,Divider,Flex as Flex3,Group as Group40,Paper as Paper3,Stack as Stack15,Text as Text18}from"@mantine/core";import{calculateAgeString,formatHumanName as formatHumanName4,resolveId}from"@medplum/core";import{useEffect as useEffect17,useState as useState54}from"react";import{Anchor as Anchor3,Box as Box5,Group as Group33,Modal as Modal7,Text as Text13}from"@mantine/core";import{useDisclosure}from"@mantine/hooks";import{useCallback as useCallback12,useState as useState47}from"react";import{Button as Button13,Group as Group32,Stack as Stack10,TextInput as TextInput15}from"@mantine/core";import{createReference as createReference5}from"@medplum/core";import{useCallback as useCallback11,useState as useState46}from"react";import{jsx as jsx98,jsxs as jsxs54}from"react/jsx-runtime";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState46(allergy?.code),[clinicalStatus,setClinicalStatus]=useState46(allergy?.clinicalStatus),handleSubmit=useCallback11(formData=>{onSubmit({...allergy,resourceType:"AllergyIntolerance",patient:createReference5(patient),encounter:encounter?createReference5(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0})},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx98(Form,{onSubmit:handleSubmit,children:jsxs54(Stack10,{children:[jsx98(CodeableConceptInput,{name:"allergy",label:"Code",path:"AllergyIntolerance.code","data-autofocus":!0,binding:"http://hl7.org/fhir/us/core/ValueSet/us-core-allergy-substance",defaultValue:allergy?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx98(TextInput15,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx98(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:"http://hl7.org/fhir/ValueSet/allergyintolerance-clinical",defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx98(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx98(Group32,{justify:"flex-end",gap:4,mt:"md",children:jsx98(Button13,{type:"submit",children:"Save"})})]})},allergy?.id)}import{Badge as Badge2}from"@mantine/core";import{getDisplayString as getDisplayString5}from"@medplum/core";import{jsx as jsx99}from"react/jsx-runtime";function ConceptBadge(props){let{resource,onEdit}=props,rightSection;return onEdit&&(rightSection=jsx99(IconEdit,{"aria-label":`Edit ${getDisplayString5(resource)}`,size:12,onClick:e=>{killEvent(e),onEdit(resource)}})),jsx99(MedplumLink,{to:resource,children:jsx99(Badge2,{variant:"light",maw:"100%",rightSection,children:getDisplayString5(resource)})},resource.id)}import{Fragment as Fragment31,jsx as jsx100,jsxs as jsxs55}from"react/jsx-runtime";function Allergies(props){let medplum=a(),{patient,encounter}=props,[allergies,setAllergies]=useState47(props.allergies),[opened,{open,close}]=useDisclosure(!1),[editAllergy,setEditAllergy]=useState47(),handleSubmit=useCallback12(async allergy=>{if(allergy.id){let updatedAllergy=await medplum.updateResource(allergy);setAllergies(allergies.map(a2=>a2.id===updatedAllergy.id?updatedAllergy:a2))}else{let newAllergy=await medplum.createResource(allergy);setAllergies([...allergies,newAllergy])}setEditAllergy(void 0),close()},[medplum,allergies,close]);return jsxs55(Fragment31,{children:[jsxs55(Group33,{justify:"space-between",children:[jsx100(Text13,{fz:"md",fw:700,children:"Allergies"}),jsx100(Anchor3,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Add"})]}),allergies.length>0?jsx100(Box5,{children:allergies.map(allergy=>jsx100(ConceptBadge,{resource:allergy,onEdit:a2=>{setEditAllergy(a2),open()}},allergy.id))}):jsx100(Text13,{children:"(none)"}),jsx100(Modal7,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx100(AllergyDialog,{patient,encounter,allergy:editAllergy,onSubmit:handleSubmit})})]})}import{Anchor as Anchor4,Box as Box6,Group as Group35,Modal as Modal8,Text as Text14}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{useCallback as useCallback14,useState as useState49}from"react";import{Button as Button14,Group as Group34,Radio,Stack as Stack11}from"@mantine/core";import{createReference as createReference6}from"@medplum/core";import{useCallback as useCallback13,useState as useState48}from"react";import{jsx as jsx101,jsxs as jsxs56}from"react/jsx-runtime";function MedicationDialog(props){let{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState48(),handleSubmit=useCallback13(formData=>{let status=formData.status;onSubmit({...medication,resourceType:"MedicationRequest",status,intent:"order",encounter:encounter?createReference6(encounter):void 0,medicationCodeableConcept:code,subject:createReference6(patient)})},[patient,encounter,medication,code,onSubmit]);return jsx101(Form,{onSubmit:handleSubmit,children:jsxs56(Stack11,{h:275,children:[jsx101(CodeableConceptInput,{name:"request",path:"MedicationRequest.medication[x]","data-autofocus":!0,binding:"https://app.medplum.com/ValueSet/16d6f7b7-7eeb-4d0e-a83b-83be082aa10b",defaultValue:medication?.medicationCodeableConcept,onChange:request=>setCode(request),outcome:void 0}),jsxs56(Radio.Group,{mt:32,name:"status",label:"Request Status",required:!0,children:[jsx101(Radio,{value:"active",label:"active",my:"xs"},"active"),jsx101(Radio,{value:"stopped",label:"stopped",my:"xs"},"stopped")]}),jsx101(Group34,{justify:"flex-end",gap:4,mt:"md",children:jsx101(Button14,{type:"submit",children:"Save"})})]})})}import{Fragment as Fragment32,jsx as jsx102,jsxs as jsxs57}from"react/jsx-runtime";function Medications(props){let medplum=a(),[medicationRequests,setMedicationRequests]=useState49(props.medicationRequests),[editMedication,setEditMedication]=useState49(),[opened,{open,close}]=useDisclosure2(!1),handleSubmit=useCallback14(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m2=>m2.id===updatedMedication.id?updatedMedication:m2))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs57(Fragment32,{children:[jsxs57(Group35,{justify:"space-between",children:[jsx102(Text14,{fz:"md",fw:700,children:"Medications"}),jsx102(Anchor4,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Add"})]}),medicationRequests.length>0?jsx102(Box6,{children:medicationRequests.map(request=>jsx102(ConceptBadge,{resource:request,onEdit:mr=>{setEditMedication(mr),open()}},request.id))}):jsx102(Text14,{children:"(none)"}),jsx102(Modal8,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx102(MedicationDialog,{patient:props.patient,encounter:props.encounter,medication:editMedication,onSubmit:handleSubmit})})]})}import{Anchor as Anchor5,Grid as Grid2,Group as Group37,Modal as Modal9,Text as Text15}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{Fragment as Fragment33,useCallback as useCallback16,useState as useState51}from"react";import{Button as Button15,Group as Group36,Stack as Stack12}from"@mantine/core";import{createReference as createReference7}from"@medplum/core";import{useCallback as useCallback15,useState as useState50}from"react";import{jsx as jsx103,jsxs as jsxs58}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState50(condition?.code),[clinicalStatus,setClinicalStatus]=useState50(condition?.clinicalStatus),handleSubmit=useCallback15(formData=>{onSubmit({...condition,resourceType:"Condition",subject:createReference7(patient),encounter:encounter?createReference7(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0})},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx103(Form,{onSubmit:handleSubmit,children:jsxs58(Stack12,{children:[jsx103(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:"http://hl7.org/fhir/ValueSet/condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx103(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:"http://hl7.org/fhir/ValueSet/Condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx103(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx103(Group36,{justify:"flex-end",gap:4,mt:"md",children:jsx103(Button15,{type:"submit",children:"Save"})})]})},condition?.id)}import{Fragment as Fragment34,jsx as jsx104,jsxs as jsxs59}from"react/jsx-runtime";function ProblemList(props){let medplum=a(),{patient,encounter}=props,[problems,setProblems]=useState51(props.problems),[editCondition,setEditCondition]=useState51(),[opened,{open,close}]=useDisclosure3(!1),handleSubmit=useCallback16(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([...problems,newCondition])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs59(Fragment34,{children:[jsxs59(Group37,{justify:"space-between",children:[jsx104(Text15,{fz:"md",fw:700,children:"Problem List"}),jsx104(Anchor5,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Add"})]}),problems.length>0?jsx104(Grid2,{gutter:"xs",children:problems.map(problem=>jsxs59(Fragment33,{children:[jsx104(Grid2.Col,{span:2,children:problem.onsetDateTime?.substring(0,4)}),jsx104(Grid2.Col,{span:10,children:jsx104(ConceptBadge,{resource:problem,onEdit:p=>{setEditCondition(p),open()}},problem.id)})]},problem.id))}):jsx104(Text15,{children:"(none)"}),jsx104(Modal9,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx104(ConditionDialog,{patient,encounter,condition:editCondition,onSubmit:handleSubmit})})]})}import{Anchor as Anchor6,Badge as Badge3,Box as Box7,Button as Button16,Group as Group38,Modal as Modal10,Radio as Radio2,Stack as Stack13,Text as Text16}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG2,LOINC,SNOMED,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback17,useState as useState52}from"react";import{Fragment as Fragment35,jsx as jsx105,jsxs as jsxs60}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=a(),{patient,encounter}=props,[smokingStatus,setSmokingStatus]=useState52(props.smokingStatus),[opened,{open,close}]=useDisclosure4(!1),handleSubmit=useCallback17(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG2+"/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:LOINC,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference8(patient),encounter:encounter?createReference8(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED,version:SNOMED+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs60(Fragment35,{children:[jsxs60(Group38,{justify:"space-between",children:[jsx105(Text16,{fz:"md",fw:700,children:"Smoking Status"}),jsx105(Anchor6,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Edit"})]}),smokingStatus?.valueCodeableConcept?jsx105(Box7,{children:jsx105(Badge3,{variant:"light",children:jsx105(CodeableConceptDisplay,{value:smokingStatus.valueCodeableConcept})})}):jsx105(Text16,{children:"(none)"}),jsx105(Modal10,{opened,onClose:close,title:"Set Smoking Status",children:jsx105(Form,{onSubmit:handleSubmit,children:jsxs60(Stack13,{children:[jsx105(Radio2.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx105(Radio2,{value:code,label:text,my:"xs"},code))}),jsx105(Group38,{justify:"flex-end",gap:4,mt:"md",children:jsx105(Button16,{type:"submit",children:"Save"})})]})})})]})}import{Anchor as Anchor7,Button as Button17,Grid as Grid3,Group as Group39,Modal as Modal11,Stack as Stack14,Text as Text17,Textarea as Textarea3,TextInput as TextInput16}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{useCallback as useCallback18,useState as useState53}from"react";import{LOINC as LOINC2,UCUM,createReference as createReference9}from"@medplum/core";function getObservationValue(observations,code){return observations.find(o=>o.code?.coding?.[0].code===code)?.valueQuantity}function getCompoundObservationValue(observations,code,innerCode){return observations.find(o=>o.code?.coding?.[0].code===code)?.component?.find(c=>c.code?.coding?.[0].code===innerCode)?.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:createReference9(patient),encounter:encounter?createReference9(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:LOINC2}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!isNaN(value)&&isFinite(value)}import{Fragment as Fragment36,jsx as jsx106,jsxs as jsxs61}from"react/jsx-runtime";var LOINC_CODES={bloodPressure:{code:"85354-9",title:"Blood Pressure",unit:"mm[Hg]"},heartRate:{code:"8867-4",title:"Heart Rate",unit:"/min"},bodyTemperature:{code:"8310-5",title:"Body Temperature",unit:"Cel"},respiratoryRate:{code:"9279-1",title:"Respiratory Rate",unit:"/min"},height:{code:"8302-2",title:"height",unit:"cm"},weight:{code:"29463-7",title:"weight",unit:"kg"},bmi:{code:"39156-5",title:"BMI",unit:"kg/m2"},oxygen:{code:"2708-6",title:"Oxygen",unit:"%"},headCircumference:{code:"9843-4",title:"Head Circumference",unit:"cm"}},SYSTOLIC="8480-6",DIASTOLIC="8462-4";function Vitals(props){let medplum=a(),{patient,encounter}=props,[vitals,setVitals]=useState53(props.vitals),[opened,{open,close}]=useDisclosure5(!1),handleSubmit=useCallback18(formData=>{let newObservations=Object.entries(LOINC_CODES).map(([name,meta])=>name==="bloodPressure"?createCompoundObservation(patient,encounter,meta.code,meta.title,[{code:createLoincCode(SYSTOLIC,"Systolic blood pressure"),valueQuantity:createQuantity(parseFloat(formData.systolic),"mm[Hg]")},{code:createLoincCode(DIASTOLIC,"Diastolic blood pressure"),valueQuantity:createQuantity(parseFloat(formData.diastolic),"mm[Hg]")}]):createObservation(patient,encounter,meta.code,meta.title,createQuantity(parseFloat(formData[name]),meta.unit))).filter(Boolean);Promise.all(newObservations.map(obs=>medplum.createResource(obs))).then(newVitals=>setVitals([...newVitals,...vitals])).catch(console.error),close()},[medplum,patient,encounter,vitals,close]);return jsxs61(Fragment36,{children:[jsxs61(Group39,{justify:"space-between",children:[jsx106(Text17,{fz:"md",fw:700,children:"Vitals"}),jsx106(Anchor7,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Add"})]}),jsxs61(Grid3,{children:[jsx106(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"BP Sys"}),jsx106(Grid3.Col,{span:3,children:jsx106(QuantityDisplay,{value:getCompoundObservationValue(vitals,LOINC_CODES.bloodPressure.code,SYSTOLIC)})}),jsx106(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"BP Dias"}),jsx106(Grid3.Col,{span:3,children:jsx106(QuantityDisplay,{value:getCompoundObservationValue(vitals,LOINC_CODES.bloodPressure.code,DIASTOLIC)})}),jsx106(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"HR"}),jsx106(Grid3.Col,{span:3,children:jsx106(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.heartRate.code)})}),jsx106(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"Temp"}),jsx106(Grid3.Col,{span:3,children:jsx106(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.bodyTemperature.code)})}),jsx106(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"RR"}),jsx106(Grid3.Col,{span:3,children:jsx106(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.respiratoryRate.code)})}),jsx106(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"Height"}),jsx106(Grid3.Col,{span:3,children:jsx106(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.height.code)})}),jsx106(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"Weight"}),jsx106(Grid3.Col,{span:3,children:jsx106(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.weight.code)})}),jsx106(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"BMI"}),jsx106(Grid3.Col,{span:3,children:jsx106(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.bmi.code)})}),jsx106(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"O2"}),jsx106(Grid3.Col,{span:3,children:jsx106(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.oxygen.code)})}),jsx106(Grid3.Col,{span:3,ta:"right",c:"dimmed",children:"HC"}),jsx106(Grid3.Col,{span:3,children:jsx106(QuantityDisplay,{value:getObservationValue(vitals,LOINC_CODES.headCircumference.code)})})]}),jsx106(Modal11,{opened,onClose:close,title:"Add Vitals",children:jsxs61(Form,{onSubmit:handleSubmit,children:[jsxs61(Stack14,{children:[jsxs61(Group39,{grow:!0,children:[jsx106(TextInput16,{name:"systolic",label:"BP Sys","data-autofocus":!0,autoFocus:!0}),jsx106(TextInput16,{name:"diastolic",label:"BP Dias"})]}),jsxs61(Group39,{grow:!0,children:[jsx106(TextInput16,{name:"heartRate",label:"HR"}),jsx106(TextInput16,{name:"bodyTemperature",label:"Temp"})]}),jsxs61(Group39,{grow:!0,children:[jsx106(TextInput16,{name:"respiratoryRate",label:"RR"}),jsx106(TextInput16,{name:"height",label:"height"})]}),jsxs61(Group39,{grow:!0,children:[jsx106(TextInput16,{name:"weight",label:"Wt"}),jsx106(TextInput16,{name:"bmi",label:"BMI"})]}),jsxs61(Group39,{grow:!0,children:[jsx106(TextInput16,{name:"oxygen",label:"O2"}),jsx106(TextInput16,{name:"headCircumference",label:"HC"})]}),jsx106(Textarea3,{name:"notes",label:"Notes"})]}),jsx106(Group39,{justify:"flex-end",gap:4,mt:"md",children:jsx106(Button17,{type:"submit",children:"Save"})})]})})]})}import{jsx as jsx107,jsxs as jsxs62}from"react/jsx-runtime";function PatientSummary(props){let medplum=a(),{patient:propsPatient,background,...rest}=props,[patient,setPatient]=useState54(),[allergies,setAllergies]=useState54(),[problems,setProblems]=useState54(),[smokingStatus,setSmokingStatus]=useState54(),[vitals,setVitals]=useState54(),[medicationRequest,setMedicationRequest]=useState54();return useEffect17(()=>{let id=resolveId(propsPatient),ref=`Patient/${id}`,searchMeta={_count:100,_sort:"-_lastUpdated"};Promise.all([medplum.readResource("Patient",id),medplum.searchResources("AllergyIntolerance",{patient:ref,...searchMeta}),medplum.searchResources("Condition",{patient:ref,...searchMeta}),medplum.searchResources("MedicationRequest",{subject:ref,...searchMeta}),medplum.searchResources("Observation",{subject:ref,...searchMeta})]).then(results=>{setPatient(results[0]),setAllergies(results[1]),setProblems(results[2]),setMedicationRequest(results[3]);let observations=results[4];setSmokingStatus(observations.find(obs=>obs.code?.coding?.[0].code==="72166-2")),setVitals(observations.filter(obs=>obs.category?.[0]?.coding?.[0].code==="vital-signs"))}).catch(console.error)},[medplum,propsPatient]),patient?jsxs62(Card,{...rest,children:[jsx107(Card.Section,{h:100,style:{background}}),jsx107(ResourceAvatar,{value:patient,size:80,radius:80,mx:"auto",mt:-50,style:{border:"2px solid white"}}),jsx107(Text18,{ta:"center",fz:"lg",fw:500,children:formatHumanName4(patient.name?.[0])}),jsxs62(Text18,{ta:"center",fz:"xs",color:"dimmed",children:[patient.birthDate," (",calculateAgeString(patient.birthDate),")"]}),jsx107(Paper3,{withBorder:!0,p:"md",my:"md",children:jsxs62(Group40,{grow:!0,children:[jsxs62(Flex3,{justify:"center",align:"center",direction:"column",gap:0,maw:"33%",children:[jsx107(IconUserSquare,{size:24,color:"gray"}),jsx107(Text18,{fz:"xs",ta:"center",style:{whiteSpace:"nowrap"},children:"Self"})]}),jsxs62(Flex3,{justify:"center",align:"center",direction:"column",gap:0,children:[jsx107(IconStethoscope,{size:24,color:"gray"}),jsx107(Text18,{fz:"xs",style:{whiteSpace:"nowrap"},children:patient?.generalPractitioner?.[0]?.display??"No provider"})]}),jsxs62(Flex3,{justify:"center",align:"center",direction:"column",gap:0,children:[jsx107(IconGenderFemale,{size:24,color:"gray"}),jsx107(Text18,{fz:"xs",style:{whiteSpace:"nowrap"},children:patient.gender})]})]})}),jsxs62(Stack15,{gap:"xs",children:[jsx107(Anchor8,{href:"#",children:"No upcoming appointments"}),jsx107(Anchor8,{href:"#",children:"No documented visits"}),jsx107(Divider,{}),jsx107(Allergies,{patient,allergies}),jsx107(Divider,{}),jsx107(ProblemList,{patient,problems}),jsx107(Divider,{}),jsx107(Medications,{patient,medicationRequests:medicationRequest}),jsx107(Divider,{}),jsx107(SmokingStatus,{patient,smokingStatus}),jsx107(Divider,{}),jsx107(Vitals,{patient,vitals})]})]}):null}import{createReference as createReference10}from"@medplum/core";import{useCallback as useCallback19}from"react";import{jsx as jsx108}from"react/jsx-runtime";function PatientTimeline(props){let loadTimelineResources=useCallback19((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),medplum.search("Communication",{subject:ref,_count}),medplum.search("Device",{patient:ref,_count}),medplum.search("DeviceRequest",{patient:ref,_count}),medplum.search("DiagnosticReport",{subject:ref,_count}),medplum.search("Media",{subject:ref,_count}),medplum.search("ServiceRequest",{subject:ref,_count}),medplum.search("Task",{subject:ref,_count})])},[]);return jsx108(ResourceTimeline,{value:props.patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference10(resource),sender:createReference10(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference10(resource),operator:createReference10(operator),issued:new Date().toISOString(),content})})}import{Anchor as Anchor9,Button as Button18,NativeSelect as NativeSelect11,Stack as Stack16,TextInput as TextInput17}from"@mantine/core";import{getReferenceString as getReferenceString6}from"@medplum/core";import{useEffect as useEffect18,useRef as useRef15,useState as useState55}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing",bottomActions:"PlanDefinitionBuilder_bottomActions"};import{jsx as jsx109,jsxs as jsxs63}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=a(),defaultValue2=pe(props.value),[schemaLoaded,setSchemaLoaded]=useState55(!1),[selectedKey,setSelectedKey]=useState55(),[hoverKey,setHoverKey]=useState55(),[value,setValue]=useState55();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}let valueRef=useRef15();if(valueRef.current=value,useEffect18(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect18(()=>(setValue(ensurePlanDefinitionKeys(defaultValue2??{resourceType:"PlanDefinition",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]),!schemaLoaded||!value)return null;function changeProperty(property,newValue){setValue({...valueRef.current,[property]:newValue})}return jsx109("div",{children:jsxs63(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx109(TextInput17,{label:"Plan Title",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx109(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x2=>changeProperty("action",x2)}),jsx109(Button18,{type:"submit",children:"Save"})]})})}function ActionArrayBuilder(props){let actionsRef=useRef15();actionsRef.current=props.actions;function changeAction(changedAction){props.onChange(actionsRef.current.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...actionsRef.current,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(actionsRef.current.filter(i=>i!==removedAction))}return jsxs63("div",{className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx109("div",{children:jsx109(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)})},action.id)),jsx109("div",{className:PlanDefinitionBuilder_default.bottomActions,children:jsx109(Anchor9,{href:"#",onClick:e=>{killEvent(e),addAction({id:generateId()})},children:"Add action"})})]})}function ActionBuilder(props){let{action}=props,actionType=getInitialActionType(action),editing=props.selectedKey===props.action.id,hovering=props.hoverKey===props.action.id;function onClick(e){e.stopPropagation(),props.setSelectedKey(props.action.id)}function onHover(e){killEvent(e),props.setHoverKey(props.action.id)}let className=clsx_default(PlanDefinitionBuilder_default.section,{[PlanDefinitionBuilder_default.editing]:editing,[PlanDefinitionBuilder_default.hovering]:hovering&&!editing});return jsxs63("div",{"data-testid":action.id,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[editing?jsx109(ActionEditor,{action,actionType,onChange:props.onChange,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onRemove:props.onRemove}):jsx109(ActionDisplay,{action,actionType}),jsx109("div",{className:PlanDefinitionBuilder_default.bottomActions,children:jsx109(Anchor9,{href:"#",onClick:e=>{e.preventDefault(),props.onRemove()},children:"Remove"})})]})}var timingProperty={path:"PlanDefinition.action.timing[x]",min:0,max:1,description:"",isArray:!1,constraints:[],type:["dateTime","Period","Range","Timing"].map(t=>({code:t}))};function ActionDisplay(props){let{action,actionType}=props,[propertyValue,propertyType]=getActionTiming(action);return jsxs63("div",{children:[jsxs63("div",{children:[action.title||"Untitled"," ",actionType&&`(${actionType})`]}),action.definitionCanonical&&jsx109("div",{children:jsx109(ReferenceDisplay,{value:{reference:action.definitionCanonical}})}),propertyValue&&jsx109("div",{children:jsx109(ResourcePropertyDisplay,{property:timingProperty,propertyType,value:propertyValue})})]})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState55(props.actionType);function changeProperty(property,value){props.onChange({...action,[property]:value})}return jsxs63(Stack16,{gap:"xl",children:[jsx109(TextInput17,{name:`actionTitle-${action.id}`,label:"Title",defaultValue:action.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx109(TextInput17,{name:`actionDescription-${action.id}`,label:"Description",defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)}),jsx109(NativeSelect11,{label:"Type of Action",description:"The type of the action to be performed.",name:`actionType-${action.id}`,defaultValue:actionType,onChange:e=>setActionType(e.currentTarget.value),data:["","appointment","lab","questionnaire","task"]}),action.action&&action.action.length>0&&jsx109(ActionArrayBuilder,{actions:action.action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:x2=>changeProperty("action",x2)}),(()=>{switch(actionType){case"appointment":return jsx109(ActionResourceTypeBuilder,{title:"Appointment",description:"The subject must schedule an appointment from the schedule.",resourceType:"Schedule",action,onChange:props.onChange});case"lab":return jsx109(ActionResourceTypeBuilder,{title:"Lab",description:"The subject must complete the following lab panel.",resourceType:"ActivityDefinition",action,onChange:props.onChange});case"questionnaire":return jsx109(ActionResourceTypeBuilder,{title:"Questionnaire",description:"The subject must complete the selected questionnaire.",resourceType:"Questionnaire",action,onChange:props.onChange});case"task":return jsx109(ActionResourceTypeBuilder,{title:"Task",description:"The subject must complete the following task.",resourceType:"ActivityDefinition",action,onChange:props.onChange});default:return null}})(),jsx109(FormSection,{title:"Timing",description:"When the action should take place.",children:jsx109(ActionTimingInput,{name:"timing-"+action.id,action,onChange:props.onChange})})]})}function ActionResourceTypeBuilder(props){let{id,definitionCanonical}=props.action,reference=definitionCanonical?.startsWith(props.resourceType+"/")?{reference:definitionCanonical}:void 0;return jsx109(ResourceInput,{name:id,resourceType:props.resourceType,defaultValue:reference,loadOnFocus:!0,onChange:newValue=>{newValue?props.onChange({...props.action,definitionCanonical:getReferenceString6(newValue)}):props.onChange({...props.action,definitionCanonical:void 0})}})}function ActionTimingInput(props){let value=props.action,key="timing",[propertyValue,propertyType]=getActionTiming(value);return jsx109(ResourcePropertyInput,{property:timingProperty,name:"timing[x]",path:"PlanDefinition.timing[x]",defaultValue:propertyValue,defaultPropertyType:propertyType,onChange:(newValue,propName)=>{props.onChange(setPropertyValue(value,key,propName??key,timingProperty,newValue))},outcome:void 0})}function getInitialActionType(action){if(action.definitionCanonical?.startsWith("Schedule"))return"appointment";if(action.definitionCanonical?.startsWith("Questionnaire/"))return"questionnaire";if(action.definitionCanonical?.startsWith("ActivityDefinition/"))return"task"}function getActionTiming(action){return getValueAndType({type:"PlanDefinitionAction",value:action},"timing")}var nextId=1;function generateId(existing){if(existing){if(existing.startsWith("id-")){let existingNum=parseInt(existing.substring(3),10);isNaN(existingNum)||(nextId=Math.max(nextId,existingNum+1))}return existing}return"id-"+nextId++}function ensurePlanDefinitionKeys(planDefinition){return{...planDefinition,action:ensurePlanDefinitionActionKeys(planDefinition.action)}}function ensurePlanDefinitionActionKeys(actions){if(actions)return actions.map(action=>({...action,id:generateId(action.id),action:ensurePlanDefinitionActionKeys(action.action)}))}import{Anchor as Anchor10,Box as Box8,Button as Button19,Group as Group42,NativeSelect as NativeSelect13,Space as Space2,Textarea as Textarea5,TextInput as TextInput19,Title as Title3}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{useEffect as useEffect19,useRef as useRef16,useState as useState56}from"react";import{Checkbox as Checkbox3,Group as Group41,MultiSelect as MultiSelect2,NativeSelect as NativeSelect12,Radio as Radio3,Textarea as Textarea4,TextInput as TextInput18}from"@mantine/core";import{capitalize as capitalize6,deepEquals,formatCodeableConcept as formatCodeableConcept4,formatCoding as formatCoding3,getElementDefinition as getElementDefinition2,getTypedPropertyValue as getTypedPropertyValue3,stringify as stringify5}from"@medplum/core";import{useContext as useContext14}from"react";import{deepClone as deepClone2,evalFhirPathTyped as evalFhirPathTyped3,formatCoding as formatCoding2,getExtension,getReferenceString as getReferenceString7,getTypedPropertyValue as getTypedPropertyValue2,splitN,stringify as stringify4}from"@medplum/core";var QuestionnaireItemType=(QuestionnaireItemType2=>(QuestionnaireItemType2.group="group",QuestionnaireItemType2.display="display",QuestionnaireItemType2.question="question",QuestionnaireItemType2.boolean="boolean",QuestionnaireItemType2.decimal="decimal",QuestionnaireItemType2.integer="integer",QuestionnaireItemType2.date="date",QuestionnaireItemType2.dateTime="dateTime",QuestionnaireItemType2.time="time",QuestionnaireItemType2.string="string",QuestionnaireItemType2.text="text",QuestionnaireItemType2.url="url",QuestionnaireItemType2.choice="choice",QuestionnaireItemType2.openChoice="open-choice",QuestionnaireItemType2.attachment="attachment",QuestionnaireItemType2.reference="reference",QuestionnaireItemType2.quantity="quantity",QuestionnaireItemType2))(QuestionnaireItemType||{});function isChoiceQuestion(item){return item.type==="choice"||item.type==="open-choice"}function isQuestionEnabled(item,responseItems){if(!item.enableWhen)return!0;let enableBehavior=item.enableBehavior??"any";for(let enableWhen of item.enableWhen){let actualAnswers=getByLinkId(responseItems,enableWhen.question);if(enableWhen.operator==="exists"&&!enableWhen.answerBoolean&&!actualAnswers?.length){if(enableBehavior==="any")return!0;continue}let{anyMatch,allMatch}=checkAnswers(enableWhen,actualAnswers,enableBehavior);if(enableBehavior==="any"&&anyMatch)return!0;if(enableBehavior==="all"&&!allMatch)return!1}return enableBehavior!=="any"}function getNewMultiSelectValues(selected,propertyName,item){return selected.map(o=>{let option=item.answerOption?.find(option2=>formatCoding2(option2.valueCoding)===o||option2[propertyName]===o),optionValue=getTypedPropertyValue2({type:"QuestionnaireItemAnswerOption",value:option},"value");return{[propertyName]:optionValue?.value}})}function getByLinkId(responseItems,linkId){if(responseItems)for(let response of responseItems){if(response.linkId===linkId)return response.answer;if(response.item){let nestedAnswer=getByLinkId(response.item,linkId);if(nestedAnswer)return nestedAnswer}}}function evaluateMatch(actualAnswer,expectedAnswer,operator){if(operator==="exists")return!!actualAnswer===expectedAnswer.value;if(actualAnswer){let fhirPathOperator=operator==="="||operator==="!="?operator?.replace("=","~"):operator,[{value}]=evalFhirPathTyped3(`%actualAnswer ${fhirPathOperator} %expectedAnswer`,[actualAnswer],{"%actualAnswer":actualAnswer,"%expectedAnswer":expectedAnswer});return value}else return!1}function checkAnswers(enableWhen,answers,enableBehavior){let actualAnswers=answers||[],expectedAnswer=getTypedPropertyValue2({type:"QuestionnaireItemEnableWhen",value:enableWhen},"answer[x]"),anyMatch=!1,allMatch=!0;for(let actualAnswerValue of actualAnswers){let actualAnswer=getTypedPropertyValue2({type:"QuestionnaireResponseItemAnswer",value:actualAnswerValue},"value[x]"),{operator}=enableWhen;if(evaluateMatch(actualAnswer,expectedAnswer,operator)?anyMatch=!0:allMatch=!1,enableBehavior==="any"&&anyMatch)break}return{anyMatch,allMatch}}function getQuestionnaireItemReferenceTargetTypes(item){let extension=getExtension(item,"http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource");if(extension){if(extension.valueCode!==void 0)return[extension.valueCode];if(extension.valueCodeableConcept)return extension.valueCodeableConcept?.coding?.map(c=>c.code)}}function setQuestionnaireItemReferenceTargetTypes(item,targetTypes){let result=deepClone2(item),extension=getExtension(result,"http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource");return!targetTypes||targetTypes.length===0?(extension&&(result.extension=result.extension?.filter(e=>e!==extension)),result):(extension||(result.extension||(result.extension=[]),extension={url:"http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource"},result.extension.push(extension)),targetTypes.length===1?(extension.valueCode=targetTypes[0],delete extension.valueCodeableConcept):(extension.valueCodeableConcept={coding:targetTypes.map(t=>({code:t}))},delete extension.valueCode),result)}function getQuestionnaireItemReferenceFilter(item,subject,encounter){let extension=getExtension(item,"http://hl7.org/fhir/StructureDefinition/questionnaire-referenceFilter");if(!extension?.valueString)return;let filter=extension.valueString;subject?.reference&&(filter=filter.replaceAll("$subj",subject.reference)),encounter?.reference&&(filter=filter.replaceAll("$encounter",encounter.reference));let result={},parts=filter.split("&");for(let part of parts){let[key,value]=splitN(part,"=",2);result[key]=value}return result}function buildInitialResponse(questionnaire){return{resourceType:"QuestionnaireResponse",questionnaire:getReferenceString7(questionnaire),item:buildInitialResponseItems(questionnaire.item),status:"in-progress"}}function buildInitialResponseItems(items){return items?.map(buildInitialResponseItem)??[]}function buildInitialResponseItem(item){return{id:generateId2(),linkId:item.linkId,text:item.text,item:buildInitialResponseItems(item.item),answer:item.initial?.map(buildInitialResponseAnswer)??[]}}var nextId2=1;function generateId2(){return"id-"+nextId2++}function buildInitialResponseAnswer(answer){return{...answer}}function formatReferenceString(typedValue){return typedValue.value.display||typedValue.value.reference||stringify4(typedValue.value)}function getNumberOfPages(questionnaire){let firstItem=questionnaire?.item?.[0];return firstItem&&getExtension(firstItem,"http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl")?.valueCodeableConcept?.coding?.[0]?.code==="page"?questionnaire.item.length:1}import{createContext}from"react";var QuestionnaireFormContext=createContext({});import{jsx as jsx110}from"react/jsx-runtime";function QuestionnaireFormItem(props){let context=useContext14(QuestionnaireFormContext),item=props.item,response=props.response;function onChangeAnswer(newResponseAnswer){let updatedAnswers;Array.isArray(newResponseAnswer)?updatedAnswers=newResponseAnswer:props.index>=(props.response?.answer?.length??0)?updatedAnswers=(props.response?.answer??[]).concat([newResponseAnswer]):updatedAnswers=(props.response?.answer??[]).map((a2,idx)=>idx===props.index?newResponseAnswer:a2)??[],props.onChange({id:response?.id,linkId:response?.linkId,text:item.text,answer:updatedAnswers})}let type=item.type;if(!type)return null;let name=item.linkId;if(!name)return null;let initial=item.initial&&item.initial.length>0?item.initial[0]:void 0,defaultValue2=getCurrentAnswer(response,props.index)??getTypedPropertyValue3({type:"QuestionnaireItemInitial",value:initial},"value");switch(type){case"display":return jsx110("p",{children:props.item.text},props.item.linkId);case"boolean":return jsx110(CheckboxFormSection,{title:props.item.text,htmlFor:props.item.linkId,children:jsx110(Checkbox3,{id:props.item.linkId,name:props.item.linkId,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer({valueBoolean:e.currentTarget.checked})})},props.item.linkId);case"decimal":return jsx110(TextInput18,{type:"number",step:"any",id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueDecimal:e.currentTarget.valueAsNumber})});case"integer":return jsx110(TextInput18,{type:"number",step:1,id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueInteger:e.currentTarget.valueAsNumber})});case"date":return jsx110(TextInput18,{type:"date",id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueDate:e.currentTarget.value})});case"dateTime":return jsx110(DateTimeInput,{name,required:item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueDateTime:newValue})});case"time":return jsx110(TextInput18,{type:"time",id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueTime:e.currentTarget.value})});case"string":case"url":return jsx110(TextInput18,{id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueString:e.currentTarget.value})});case"text":return jsx110(Textarea4,{id:name,name,required:item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueString:e.currentTarget.value})});case"attachment":return jsx110(Group41,{py:4,children:jsx110(AttachmentInput,{name,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueAttachment:newValue})})});case"reference":return jsx110(ReferenceInput,{name,required:item.required,targetTypes:getQuestionnaireItemReferenceTargetTypes(item),searchCriteria:getQuestionnaireItemReferenceFilter(item,context.subject,context.encounter),defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueReference:newValue})});case"quantity":return jsx110(QuantityInput,{name,required:item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueQuantity:newValue}),disableWheel:!0});case"choice":case"open-choice":return isDropDownChoice(item)&&!item.answerValueSet?jsx110(QuestionnaireChoiceDropDownInput,{name,item,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):jsx110(QuestionnaireChoiceSetInput,{name,item,initial,response,onChangeAnswer:e=>onChangeAnswer(e)});default:return null}}function QuestionnaireChoiceDropDownInput(props){let{name,item,initial,response}=props;if(!item.answerOption?.length)return jsx110(NoAnswerDisplay,{});let initialValue=getTypedPropertyValue3({type:"QuestionnaireItemInitial",value:initial},"value"),data2=[""];for(let option of item.answerOption){let optionValue=getTypedPropertyValue3({type:"QuestionnaireItemAnswerOption",value:option},"value");data2.push(typedValueToString(optionValue))}let defaultValue2=getCurrentAnswer(response)??initialValue;if(item.repeats){let{propertyName,data:data3}=formatSelectData(props.item),currentAnswer=getCurrentMultiSelectAnswer(response);return jsx110(MultiSelect2,{data:data3,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[typedValueToString(initialValue)],onChange:selected=>{let values=getNewMultiSelectValues(selected,propertyName,item);props.onChangeAnswer(values)}})}return jsx110(NativeSelect12,{id:name,name,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){props.onChangeAnswer({});return}let option=item.answerOption[index-1],optionValue=getTypedPropertyValue3({type:"QuestionnaireItemAnswerOption",value:option},"value"),propertyName="value"+capitalize6(optionValue.type);props.onChangeAnswer({[propertyName]:optionValue.value})},defaultValue:formatCoding3(defaultValue2?.value)||defaultValue2?.value,data:data2})}function QuestionnaireChoiceSetInput(props){let{name,item,initial,onChangeAnswer,response}=props;return!item.answerOption?.length&&!item.answerValueSet?jsx110(NoAnswerDisplay,{}):item.answerValueSet?jsx110(CodingInput,{name,binding:item.answerValueSet,onChange:code=>onChangeAnswer({valueCoding:code}),creatable:item.type==="open-choice"}):jsx110(QuestionnaireChoiceRadioInput,{name:response?.id??name,item,initial,response,onChangeAnswer})}function QuestionnaireChoiceRadioInput(props){let{name,item,initial,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition2("QuestionnaireItemAnswerOption","value[x]"),initialValue=getTypedPropertyValue3({type:"QuestionnaireItemInitial",value:initial},"value"),options=[],defaultValue2;if(item.answerOption)for(let i=0;i<item.answerOption.length;i++){let option=item.answerOption[i],optionName=`${name}-option-${i}`,optionValue=getTypedPropertyValue3({type:"QuestionnaireItemAnswerOption",value:option},"value");optionValue?.value&&(initialValue&&stringify5(optionValue)===stringify5(initialValue)&&(defaultValue2=optionName),options.push([optionName,optionValue]))}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);return jsx110(Radio3.Group,{name,value:answerLinkId??defaultValue2,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:options.map(([optionName,optionValue])=>jsx110(Radio3,{id:optionName,value:optionName,py:4,label:jsx110(ResourcePropertyDisplay,{property:valueElementDefinition,propertyType:optionValue.type,value:optionValue.value})},optionName))})}function NoAnswerDisplay(){return jsx110(TextInput18,{disabled:!0,placeholder:"No Answers Defined"})}function getItemValue(answer){return getTypedPropertyValue3({type:"QuestionnaireItemAnswer",value:answer},"value")}function getCurrentAnswer(response,index=0){let results=response.answer;return getItemValue(results?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response.answer;return results?results.map(a2=>getItemValue(a2)).map(type=>formatCoding3(type?.value)||type?.value):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals(option[1].value,defaultAnswer?.value))?.[0]}function typedValueToString(typedValue){if(typedValue)return typedValue.type==="CodeableConcept"?formatCodeableConcept4(typedValue.value):typedValue.type==="Coding"?formatCoding3(typedValue.value):typedValue.type==="Reference"?formatReferenceString(typedValue):typedValue.value.toString()}function isDropDownChoice(item){return!!item.extension?.some(e=>e.url==="http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl"&&e.valueCodeableConcept?.coding?.[0]?.code==="drop-down")}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=getTypedPropertyValue3({type:"QuestionnaireItemAnswerOption",value:option},"value"),propertyName="value"+capitalize6(optionValue.type),data2=(item.answerOption??[]).map(a2=>({value:getValueAndLabel(a2,propertyName),label:getValueAndLabel(a2,propertyName)}));return{propertyName,data:data2}}function getValueAndLabel(option,propertyName){return formatCoding3(option.valueCoding)||option[propertyName]?.toString()}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"};import{Fragment as Fragment37,jsx as jsx111,jsxs as jsxs64}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=a(),defaultValue2=pe(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState56(!1),[value,setValue]=useState56(),[selectedKey,setSelectedKey]=useState56(),[hoverKey,setHoverKey]=useState56();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect19(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect19(()=>(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:jsx111("div",{children:jsxs64(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx111(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx111(Button19,{type:"submit",children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource2=isResourceType(props.item),isContainer=isResource2||item.type==="group",linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef16();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 jsxs64("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx111("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs64(Fragment37,{children:[isResource2&&jsx111(TextInput19,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource2&&jsx111(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx111(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx111(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs64(Fragment37,{children:[resource.title&&jsx111(Title3,{children:resource.title}),item.text&&jsx111("div",{children:item.text}),!isContainer&&jsx111(QuestionnaireFormItem,{item,index:0,onChange:()=>{},response:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx111("div",{children:jsx111(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&&jsx111("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs64(Fragment37,{children:[jsx111(TextInput19,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx111(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"}]})]}):jsx111("div",{children:linkId})}),!isResource2&&jsx111(Box8,{className:QuestionnaireBuilder_default.movementActions,children:jsxs64(Box8,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx111(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx111(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx111(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx111(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs64("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs64(Fragment37,{children:[jsx111(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId3(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx111(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId3(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource2&&jsx111(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource2&&jsxs64(Fragment37,{children:[jsx111(Anchor10,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx111(Anchor10,{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 jsxs64("div",{children:[props.item.answerValueSet!==void 0?jsx111(TextInput19,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx111(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs64(Box8,{display:"flex",children:[jsx111(Anchor10,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId3()}]})},children:"Add choice"}),jsx111(Space2,{w:"lg"}),jsx111(Anchor10,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx111("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs64("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx111("div",{children:jsx111(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)}),jsx111("div",{children:jsx111(Anchor10,{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=getQuestionnaireItemReferenceTargetTypes(props.item)??[];return jsxs64(Fragment37,{children:[targetTypes.map((targetType,index)=>jsxs64(Group42,{children:[jsx111(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx111(Anchor10,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx111(Anchor10,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId3=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId3(){return"id-"+nextId3++}function ensureQuestionnaireKeys(questionnaire){return{...questionnaire,id:questionnaire.id||generateId3(),item:ensureQuestionnaireItemKeys(questionnaire.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId3=Math.max(nextId3,parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId3(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId3()}))}function createPage(){return{id:generateId3(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:"http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",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{Title as Title5}from"@mantine/core";import{createReference as createReference11,getReferenceString as getReferenceString8}from"@medplum/core";import{useEffect as useEffect20,useState as useState59}from"react";import{Button as Button20,Group as Group43,Stack as Stack18,Stepper}from"@mantine/core";import{Anchor as Anchor11}from"@mantine/core";import{useState as useState57}from"react";import{jsx as jsx112,jsxs as jsxs65}from"react/jsx-runtime";function QuestionnaireRepeatableItem(props){let{item,response,onChange}=props,[number,setNumber]=useState57(getNumberOfRepeats(item,response??{linkId:item.linkId}));if(!props.checkForQuestionEnabled(item)||!response)return null;if(item.type==="display")return jsx112("p",{children:item.text},item.linkId);let showAddButton=item?.repeats&&item.type!=="choice"&&item.type!=="open-choice";return item.type==="boolean"?jsx112(QuestionnaireFormItem,{item,response,onChange:r2=>onChange([r2]),index:0},item.linkId):jsxs65(FormSection,{htmlFor:props.item.linkId,title:props.item.text,withAsterisk:props.item.required,children:[[...Array(number)].map((_2,index)=>jsx112(QuestionnaireFormItem,{item,response,onChange:r2=>onChange([r2]),index},`${item.linkId}-${index}`)),showAddButton&&jsx112(Anchor11,{onClick:()=>setNumber(n=>n+1),children:"Add Item"})]},props.item.linkId)}function getNumberOfRepeats(item,response){if(item.type==="choice"||item.type==="open-choice")return 1;let answers=response.answer;return answers?.length?answers.length:1}import{Anchor as Anchor12,Stack as Stack17,Title as Title4}from"@mantine/core";import{useState as useState58}from"react";import{Fragment as Fragment38,jsx as jsx113,jsxs as jsxs66}from"react/jsx-runtime";function QuestionnaireRepeatedGroup(props){let[responses,setResponses]=useState58(props.response);if(responses.length===0)return null;function handleRepeatableGroup(newResponseItems,index){let newResponses=responses.map((responses2,idx)=>idx===index?newResponseItems[0]:responses2);setResponses(newResponses),props.onChange(newResponses)}function insertNewGroup(){let newResponse=buildInitialResponseItem(props.item);setResponses([...responses,newResponse])}return jsxs66(Fragment38,{children:[responses.map((response,idx)=>jsx113(QuestionnaireGroup,{item:props.item,response,checkForQuestionEnabled:props.checkForQuestionEnabled,onChange:r2=>handleRepeatableGroup(r2,idx)},response.id)),props.item.repeats&&jsx113(Anchor12,{onClick:insertNewGroup,children:`Add Group: ${props.item.text}`})]})}function QuestionnaireGroup(props){let{response,checkForQuestionEnabled,onChange}=props;function onSetGroup(newResponseItem){let mergedResponse=response.item?.map(current=>newResponseItem.find(newResponse2=>newResponse2.id===current.id)??current)?.concat(newResponseItem.slice(1)),groupResponse={...response,item:mergedResponse};onChange([groupResponse])}return props.checkForQuestionEnabled(props.item)?jsxs66("div",{children:[props.item.text&&jsx113(Title4,{order:3,mb:"md",children:props.item.text}),jsx113(Stack17,{children:props.item.item?.map(item=>item.type==="group"?item.repeats?jsx113(QuestionnaireRepeatedGroup,{item,response:response.item?.filter(i=>i.linkId===item.linkId)??[],checkForQuestionEnabled,onChange:onSetGroup},item.linkId):jsx113(QuestionnaireGroup,{item,checkForQuestionEnabled,response:response.item?.find(i=>i.linkId===item.linkId)??{linkId:item.linkId},onChange:onSetGroup},item.linkId):jsx113(QuestionnaireRepeatableItem,{item,response:response.item?.find(i=>i.linkId===item.linkId),onChange:onSetGroup,checkForQuestionEnabled},item.linkId))})]},props.item.linkId):null}import{Fragment as Fragment39,jsx as jsx114,jsxs as jsxs67}from"react/jsx-runtime";function QuestionnairePageSequence(props){let{items,response,activePage,onChange,nextStep,prevStep,numberOfPages,renderPages,submitButtonText,checkForQuestionEnabled}=props,form=items.map(item=>{let itemResponse=response?.item?.filter(i=>i.linkId===item.linkId)??[],repeatedItem=item.type==="group"?jsx114(QuestionnaireRepeatedGroup,{item,response:itemResponse,onChange,checkForQuestionEnabled},item.linkId):jsx114(QuestionnaireRepeatableItem,{item,response:itemResponse?.[0],onChange,checkForQuestionEnabled},item.linkId);return renderPages?jsx114(Stepper.Step,{label:item.text,children:repeatedItem},item.linkId):repeatedItem});return jsxs67(Fragment39,{children:[renderPages&&jsx114(Stepper,{active:activePage??0,allowNextStepsSelect:!1,p:6,children:form}),!renderPages&&jsx114(Stack18,{children:form}),jsx114(ButtonGroup,{activePage:activePage??0,numberOfPages,nextStep,prevStep,submitButtonText})]})}function ButtonGroup(props){let showBackButton=props.activePage>0,showNextButton=props.activePage<props.numberOfPages-1,showSubmitButton=props.activePage===props.numberOfPages-1;return jsxs67(Group43,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx114(Button20,{onClick:props.prevStep,children:"Back"}),showNextButton&&jsx114(Button20,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&props.nextStep()},children:"Next"}),showSubmitButton&&jsx114(Button20,{type:"submit",children:props.submitButtonText??"Submit"})]})}import{jsx as jsx115,jsxs as jsxs68}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=a(),source=medplum.getProfile(),[schemaLoaded,setSchemaLoaded]=useState59(!1),questionnaire=pe(props.questionnaire),[response,setResponse]=useState59(),[activePage,setActivePage]=useState59(0);useEffect20(()=>{medplum.requestSchema("Questionnaire").then(()=>medplum.requestSchema("QuestionnaireResponse")).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect20(()=>{setResponse(questionnaire?buildInitialResponse(questionnaire):void 0)},[questionnaire]);function setItems(newResponseItems){let currentItems=response?.item??[],newResponse={resourceType:"QuestionnaireResponse",status:"in-progress",item:mergeItems(currentItems,Array.isArray(newResponseItems)?newResponseItems:[newResponseItems])};setResponse(newResponse)}function checkForQuestionEnabled(item){return isQuestionEnabled(item,response?.item??[])}if(!schemaLoaded||!questionnaire||!response)return null;let numberOfPages=getNumberOfPages(questionnaire),nextStep=()=>setActivePage(current=>current+1),prevStep=()=>setActivePage(current=>current-1);return jsx115(QuestionnaireFormContext.Provider,{value:{subject:props.subject,encounter:props.encounter},children:jsxs68(Form,{testid:"questionnaire-form",onSubmit:()=>{props.onSubmit&&response&&props.onSubmit({...response,questionnaire:getReferenceString8(questionnaire),subject:props.subject,source:createReference11(source),authored:new Date().toISOString(),status:"completed"})},children:[questionnaire.title&&jsx115(Title5,{children:questionnaire.title}),jsx115(QuestionnairePageSequence,{items:questionnaire.item??[],response,onChange:setItems,renderPages:numberOfPages>1,activePage,numberOfPages,submitButtonText:props.submitButtonText,checkForQuestionEnabled,nextStep,prevStep})]})})}function mergeIndividualItems(prevItem,newItem){let mergedNestedItems=mergeItems(prevItem.item??[],newItem.item??[]);return{...newItem,item:mergedNestedItems.length>0?mergedNestedItems:void 0,answer:newItem.answer&&newItem.answer.length>0?newItem.answer:prevItem.answer}}function mergeItems(prevItems,newItems){let result=[],usedIds=new Set;for(let prevItem of prevItems){let itemId=prevItem.id,newItem=newItems.find(item=>item.id===itemId);newItem?(result.push(mergeIndividualItems(prevItem,newItem)),usedIds.add(newItem.id)):result.push(prevItem)}for(let newItem of newItems)usedIds.has(newItem.id)||result.push(newItem);return result}import{ActionIcon as ActionIcon10,Button as Button21,Divider as Divider2,Group as Group44,NativeSelect as NativeSelect14,Stack as Stack19,Text as Text19,TextInput as TextInput20}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect21,useState as useState60}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx116,jsxs as jsxs69}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]=useState60([]),[groupId,setGroupId]=useState60(1),[intervalId,setIntervalId]=useState60(1);return useEffect21(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs69(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx116(Stack19,{children:intervalGroups.map(intervalGroup=>jsx116(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx116(ActionIcon10,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx116(IconCirclePlus,{})}),jsx116(Group44,{justify:"flex-end",children:jsx116(Button21,{type:"submit",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(g2=>g2.id===groupId2),index=currentGroup?.intervals.findIndex(interval=>interval.id===changedInterval.id);return index!==void 0&&currentGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g2=>g2.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(g2=>g2.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx116(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs69(Stack19,{gap:"lg",children:[jsx116(Group44,{justify:"flex-end",children:jsx116(ActionIcon10,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx116(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx116(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx116(Divider2,{}),intervalGroup.intervals.map(interval=>jsxs69(Stack19,{gap:"xs",children:[jsxs69(Group44,{children:[jsx116(TextInput20,{"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}`),jsx116(ActionIcon10,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx116(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx116(RangeInput,{onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx116(ActionIcon10,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx116(IconCirclePlus,{})})]})})}function ReferenceRangeGroupFilters(props){let{intervalGroup,onChange}=props;intervalGroup.filters.age||(intervalGroup.filters.age={});for(let key of["low","high"])intervalGroup.filters.age[key]?.unit||(intervalGroup.filters.age[key]={...intervalGroup.filters.age[key],unit:"years",system:"http://unitsofmeasure.org"});return jsxs69(Stack19,{style:{maxWidth:"50%"},children:[jsx116(Group44,{children:jsx116(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})}}})}),jsxs69(Group44,{gap:"xs",children:[jsx116(Text19,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx116("div",{id:`div-age-${intervalGroup.id}`,children:jsx116(RangeInput,{name:`age-${intervalGroup.id}`,defaultValue:intervalGroup.filters.age,onChange:ageRange=>{for(let interval of intervalGroup.intervals)onChange(intervalGroup.id,{...interval,age:ageRange})}},`age-${intervalGroup.id}`)})]}),jsx116(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"}]}})}}}),jsx116(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||[],nextId4=Math.max(...intervals.map(interval=>{let existingNum=parseInt(interval.id?.substring(3)||"",10);return isNaN(existingNum)?Number.NEGATIVE_INFINITY:existingNum}))+1;return Number.isFinite(nextId4)||(nextId4=1),definition={...definition,qualifiedInterval:intervals.map(interval=>({...interval,id:interval.id||`id-${nextId4++}`}))},setIntervalId(nextId4),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(f2=>[f2,interval[f2]])),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 Button22,Grid as Grid4,Text as Text20}from"@mantine/core";import{formatDateTime as formatDateTime6,getReferenceString as getReferenceString9}from"@medplum/core";import{Fragment as Fragment40,useEffect as useEffect22,useState as useState61}from"react";import{jsx as jsx117,jsxs as jsxs70}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=a(),requestGroup=pe(props.value),[startedLoading,setStartedLoading]=useState61(!1),[responseBundle,setResponseBundle]=useState61();if(useEffect22(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx117(Grid4,{children:requestGroup.action?.map((action,index)=>{let task=action.resource&&findBundleEntry(action.resource),taskInput=task?.input?.[0]?.valueReference,taskOutput=task?.output?.[0]?.valueReference;return jsxs70(Fragment40,{children:[jsx117(Grid4.Col,{span:1,p:"md",children:task?.status==="completed"?jsx117(IconCheckbox,{}):jsx117(IconSquare,{color:"gray"})}),jsxs70(Grid4.Col,{span:9,p:"xs",children:[jsx117(Text20,{fw:500,children:action.title}),action.description&&jsx117("div",{children:action.description}),jsxs70("div",{children:["Last edited by\xA0",jsx117(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime6(task?.meta?.lastUpdated)]}),jsxs70("div",{children:["Status: ",jsx117(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs70(Grid4.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx117(Button22,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx117(Button22,{onClick:()=>props.onEdit(task,taskInput,taskOutput),children:"Edit"})]})]},`action-${index}`)})});function buildBatchRequest(request){let batchEntries=[];if(request.action)for(let action of request.action)action.resource?.reference&&batchEntries.push({request:{method:"GET",url:action.resource.reference}});return{resourceType:"Bundle",type:"batch",entry:batchEntries}}function findBundleEntry(reference){for(let entry of responseBundle?.entry)if(entry.resource&&reference.reference===getReferenceString9(entry.resource))return entry.resource}}import{useEffect as useEffect23,useState as useState62}from"react";import{stringify as stringify6}from"@medplum/core";function diff(original,revised){let path=buildPath(original,revised);return buildRevisions(path,original,revised)}function buildPath(orig,rev){let N2=orig.length,M2=rev.length,MAX=N2+M2+1,size=1+2*MAX,middle=size/2|0,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 k2=-d;k2<=d;k2+=2){let kmiddle=middle+k2,kplus=kmiddle+1,kminus=kmiddle-1,kplusNode=diagonal[kplus],kminusNode=diagonal[kminus],prev,i=0;k2===-d||k2!==d&&kminusNode.i<kplusNode.i?(i=kplusNode.i,prev=kplusNode):(i=kminusNode.i+1,prev=kminusNode),diagonal[kminus]=void 0;let j=i-k2,node={i,j,prev:previousSnake(prev),snake:!1};for(;i<N2&&j<M2&&orig[i]===rev[j];)i++,j++;if(i>node.i&&(node={i,j,prev:node,snake:!0}),diagonal[kmiddle]=node,i>=N2&&j>=M2)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:stringify6(entry.resource,!0).match(/[^\r\n]+/g)})).sort((a2,b2)=>a2.meta.lastUpdated.localeCompare(b2.meta.lastUpdated)),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 k2=0;k2<revision.revised.lines.length;k2++)table.splice(position+k2,0,{id:versions[i].meta.versionId,meta:versions[i].meta,value:newLines[k2],span:1})}}}function combineSpans(table){let start=0;for(;start<table.length;){let curr=start;for(;curr<table.length&&table[curr].id===table[start].id;)table[curr].span=-1,curr++;table[start].span=curr-start,start=curr}}var ResourceBlame_default={container:"ResourceBlame_container",root:"ResourceBlame_root",startRow:"ResourceBlame_startRow",normalRow:"ResourceBlame_normalRow",author:"ResourceBlame_author",dateTime:"ResourceBlame_dateTime",lineNumber:"ResourceBlame_lineNumber",line:"ResourceBlame_line",pre:"ResourceBlame_pre"};function getVersionUrl(resource,versionId){return`/${resource.resourceType}/${resource.id}/_history/${versionId}`}function getTimeString(lastUpdated){let seconds=Math.floor((Date.now()-Date.parse(lastUpdated))/1e3),years=Math.floor(seconds/31536e3);if(years>0)return pluralizeTime(years,"year");let months=Math.floor(seconds/2592e3);if(months>0)return pluralizeTime(months,"month");let days=Math.floor(seconds/86400);if(days>0)return pluralizeTime(days,"day");let hours=Math.floor(seconds/3600);if(hours>0)return pluralizeTime(hours,"hour");let minutes=Math.floor(seconds/60);return minutes>0?pluralizeTime(minutes,"minute"):pluralizeTime(seconds,"second")}function pluralizeTime(count,noun){return`${count} ${count===1?noun:noun+"s"} ago`}import{Fragment as Fragment41,jsx as jsx118,jsxs as jsxs71}from"react/jsx-runtime";function ResourceBlame(props){let medplum=a(),[value,setValue]=useState62(props.history);if(useEffect23(()=>{!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 jsx118("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx118("div",{className:ResourceBlame_default.container,children:jsx118("table",{className:ResourceBlame_default.root,children:jsx118("tbody",{children:table.map((row,index)=>jsxs71("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs71(Fragment41,{children:[jsx118("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:jsx118(ResourceBadge,{value:row.meta.author,link:!0})}),jsx118("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx118(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),children:getTimeString(row.meta.lastUpdated)})})]}),jsx118("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx118("td",{className:ResourceBlame_default.line,children:jsx118("pre",{className:ResourceBlame_default.pre,children:row.value})})]},"row-"+index))})})})}import{stringify as stringify7}from"@medplum/core";var ResourceDiff_default={removed:"ResourceDiff_removed",added:"ResourceDiff_added"};import{Fragment as Fragment42,jsx as jsx119,jsxs as jsxs72}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=stringify7(originalResource,!0).match(/[^\r\n]+/g),revised=stringify7(revisedResource,!0).match(/[^\r\n]+/g),deltas=diff(original,revised);return jsx119("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx119(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs72(Fragment42,{children:["...",jsx119("br",{}),props.delta.original.lines.length>0&&jsx119("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
72
+ `)}),props.delta.revised.lines.length>0&&jsx119("div",{className:ResourceDiff_default.added,children:props.delta.revised.lines.join(`
73
+ `)}),"...",jsx119("br",{})]})}import{Button as Button23,Group as Group45,Stack as Stack20,TextInput as TextInput21}from"@mantine/core";import{applyDefaultValuesToResource,tryGetProfile as tryGetProfile6}from"@medplum/core";import{useEffect as useEffect24,useState as useState63}from"react";import{jsx as jsx120,jsxs as jsxs73}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=a(),defaultValue2=pe(props.defaultValue),[schemaLoaded,setSchemaLoaded]=useState63(),[value,setValue]=useState63();return useEffect24(()=>{if(defaultValue2)if(props.profileUrl){let profileUrl=props.profileUrl;medplum.requestProfileSchema(props.profileUrl,{expandProfile:!0}).then(()=>{let profile=tryGetProfile6(profileUrl);if(profile){setSchemaLoaded(profile.name);let modifiedDefaultValue=applyDefaultValuesToResource(defaultValue2,profile);setValue(modifiedDefaultValue)}else console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)})}else{let schemaName=props.schemaName??defaultValue2?.resourceType;medplum.requestSchema(schemaName).then(()=>{setValue(defaultValue2),setSchemaLoaded(schemaName)}).catch(console.log)}},[medplum,defaultValue2,props.schemaName,props.profileUrl]),!schemaLoaded||!value?jsx120("div",{children:"Loading..."}):jsxs73("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs73(Stack20,{mb:"xl",children:[jsx120(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx120(TextInput21,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx120(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx120(TextInput21,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx120(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:schemaLoaded,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl}),jsxs73(Group45,{justify:"flex-end",mt:"xl",children:[jsx120(Button23,{type:"submit",children:"OK"}),props.onDelete&&jsx120(Button23,{variant:"outline",color:"red",type:"button",onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})}import{Table as Table4}from"@mantine/core";import{formatDateTime as formatDateTime7,normalizeErrorString as normalizeErrorString6}from"@medplum/core";import{useEffect as useEffect25,useState as useState64}from"react";import{jsx as jsx121,jsxs as jsxs74}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=a(),[value,setValue]=useState64(props.history);return useEffect25(()=>{!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?jsxs74(Table4,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx121(Table4.Thead,{children:jsxs74(Table4.Tr,{children:[jsx121(Table4.Th,{children:"Author"}),jsx121(Table4.Th,{children:"Date"}),jsx121(Table4.Th,{children:"Version"})]})}),jsx121(Table4.Tbody,{children:value.entry?.map((entry,index)=>jsx121(HistoryRow,{entry},"entry-"+index))})]}):jsx121("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs74(Table4.Tr,{children:[jsx121(Table4.Td,{children:jsx121(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx121(Table4.Td,{children:formatDateTime7(resource.meta?.lastUpdated)}),jsx121(Table4.Td,{children:jsx121(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx121(Table4.Tr,{children:jsx121(Table4.Td,{colSpan:3,children:normalizeErrorString6(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button24,Stack as Stack21,Text as Text21}from"@mantine/core";import{getReferenceString as getReferenceString10,isReference as isReference3}from"@medplum/core";import{useState as useState65}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx122,jsxs as jsxs75}from"react/jsx-runtime";function Scheduler(props){let schedule=pe(props.schedule),questionnaire=pe(props.questionnaire),[month,setMonth]=useState65(getStartMonth()),[date,setDate]=useState65(),[slot,setSlot]=useState65(),[response,setResponse]=useState65(),[slots]=Ee("Slot",new URLSearchParams([["_count",(30*24).toString()],["schedule",isReference3(props.schedule)?props.schedule.reference:getReferenceString10(props.schedule)],["start","gt"+getStart2(month)],["start","lt"+getEnd2(month)]]));if(!schedule||!slots||!questionnaire)return null;let actor=schedule.actor?.[0];return jsxs75("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs75("div",{className:Scheduler_default.info,children:[actor&&jsx122(ResourceAvatar,{value:actor,size:"xl"}),actor&&jsx122(Text21,{size:"xl",fw:500,children:jsx122(ResourceName,{value:actor})}),jsx122("p",{children:"1 hour"}),date&&jsx122("p",{children:date.toLocaleDateString()}),slot&&jsx122("p",{children:formatTime(new Date(slot.start))})]}),jsxs75("div",{className:Scheduler_default.selection,children:[!date&&jsxs75("div",{children:[jsx122("h3",{children:"Select date"}),jsx122(CalendarInput,{slots,onChangeMonth:setMonth,onClick:setDate})]}),date&&!slot&&jsxs75("div",{children:[jsx122("h3",{children:"Select time"}),jsx122(Stack21,{children:slots.map(s=>{let slotStart=new Date(s.start);return slotStart.getTime()>date.getTime()&&slotStart.getTime()<date.getTime()+24*3600*1e3&&jsx122("div",{children:jsx122(Button24,{variant:"outline",style:{width:150},onClick:()=>setSlot(s),children:formatTime(slotStart)})},s.id)})})]}),date&&slot&&!response&&jsx122(QuestionnaireForm,{questionnaire,submitButtonText:"Next",onSubmit:setResponse}),date&&slot&&response&&jsxs75("div",{children:[jsx122("h3",{children:"You're all set!"}),jsx122("p",{children:"Check your email for a calendar invite."})]})]})]})}function getStart2(month){return formatSlotInstant(month.getTime())}function getEnd2(month){return formatSlotInstant(month.getTime()+31*24*60*60*1e3)}function formatSlotInstant(time){let date=new Date(Math.max(Date.now(),time));return date.setHours(0,0,0,0),date.toISOString()}function formatTime(date){return date.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})}import{createReference as createReference12}from"@medplum/core";import{jsx as jsx123}from"react/jsx-runtime";function ServiceRequestTimeline(props){return jsx123(ResourceTimeline,{value:props.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:[createReference12(resource)],subject:resource.subject,sender:createReference12(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference12(resource)],subject:resource.subject,operator:createReference12(operator),issued:new Date().toISOString(),content})})}import{Anchor as Anchor13}from"@mantine/core";import{showNotification as showNotification6}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{jsx as jsx124}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=a(),{client,patient,encounter,children,...rest}=props;function launchApp(){medplum.createResource({resourceType:"SmartAppLaunch",patient,encounter}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",medplum.getBaseUrl()+"fhir/R4"),url.searchParams.set("launch",result.id),window.location.assign(url.toString())}).catch(err=>showNotification6({color:"red",message:normalizeErrorString7(err),autoClose:!1}))}return jsx124(Anchor13,{onClick:()=>launchApp(),...rest,children})}import{normalizeOperationOutcome as normalizeOperationOutcome5}from"@medplum/core";import{useEffect as useEffect28,useState as useState69}from"react";import{Anchor as Anchor14,Button as Button25,Center as Center4,Group as Group46,Stack as Stack22,Text as Text22,TextInput as TextInput22,Title as Title6}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome3}from"@medplum/core";import{useState as useState66}from"react";import{jsx as jsx125,jsxs as jsxs76}from"react/jsx-runtime";function NewProjectForm(props){let medplum=a(),[outcome,setOutcome]=useState66();return jsxs76(Form,{style:{maxWidth:400},onSubmit:async formData=>{try{props.handleAuthResponse(await medplum.startNewProject({login:props.login,projectName:formData.projectName}))}catch(err){setOutcome(normalizeOperationOutcome3(err))}},children:[jsxs76(Center4,{style:{flexDirection:"column"},children:[jsx125(Logo,{size:32}),jsx125(Title6,{children:"Create project"})]}),jsxs76(Stack22,{gap:"xl",children:[jsx125(TextInput22,{name:"projectName",label:"Project Name",placeholder:"My Project",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"firstName")}),jsxs76(Text22,{c:"dimmed",size:"xs",children:["By clicking submit you agree to the Medplum"," ",jsx125(Anchor14,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx125(Anchor14,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]})]}),jsx125(Group46,{justify:"flex-end",mt:"xl",wrap:"nowrap",children:jsx125(Button25,{type:"submit",children:"Create project"})})]})}import{Anchor as Anchor15,Button as Button26,Center as Center5,Checkbox as Checkbox4,Divider as Divider3,Group as Group47,PasswordInput,Stack as Stack23,Text as Text23,TextInput as TextInput23}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome4}from"@medplum/core";import{useEffect as useEffect27,useState as useState68}from"react";import{useEffect as useEffect26,useRef as useRef17,useState as useState67}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 jsx126}from"react/jsx-runtime";function GoogleButton(props){let medplum=a(),{googleClientId,handleGoogleCredential}=props,parentRef=useRef17(null),[scriptLoaded,setScriptLoaded]=useState67(typeof google<"u"),[initialized,setInitialized]=useState67(!1),[buttonRendered,setButtonRendered]=useState67(!1);return useEffect26(()=>{if(typeof google>"u"){createScriptTag("https://accounts.google.com/gsi/client",()=>setScriptLoaded(!0));return}initialized||(google.accounts.id.initialize({client_id:googleClientId,callback:handleGoogleCredential}),setInitialized(!0)),parentRef.current&&!buttonRendered&&(google.accounts.id.renderButton(parentRef.current,{}),setButtonRendered(!0))},[medplum,googleClientId,initialized,scriptLoaded,parentRef,buttonRendered,handleGoogleCredential]),googleClientId?jsx126("div",{ref:parentRef}):null}function getGoogleClientId(clientId){if(clientId)return clientId;if(typeof window<"u"){let origin=window.location.protocol+"//"+window.location.host;if(("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 Fragment43,jsx as jsx127,jsxs as jsxs77}from"react/jsx-runtime";function NewUserForm(props){let googleClientId=getGoogleClientId(props.googleClientId),recaptchaSiteKey=props.recaptchaSiteKey,medplum=a(),[outcome,setOutcome]=useState68(),issues=getIssuesForExpression(outcome,void 0);return useEffect27(()=>{recaptchaSiteKey&&initRecaptcha(recaptchaSiteKey)},[recaptchaSiteKey]),jsxs77(Form,{style:{maxWidth:400},onSubmit:async formData=>{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:[jsx127(Center5,{style:{flexDirection:"column"},children:props.children}),jsx127(OperationOutcomeAlert,{issues}),googleClientId&&jsxs77(Fragment43,{children:[jsx127(Group47,{justify:"center",p:"xl",style:{height:70},children:jsx127(GoogleButton,{googleClientId,handleGoogleCredential:async response=>{try{props.handleAuthResponse(await medplum.startGoogleLogin({googleClientId:response.clientId,googleCredential:response.credential,createUser:!0}))}catch(err){setOutcome(normalizeOperationOutcome4(err))}}})}),jsx127(Divider3,{label:"or",labelPosition:"center",my:"lg"})]}),jsxs77(Stack23,{gap:"xl",children:[jsx127(TextInput23,{name:"firstName",type:"text",label:"First name",placeholder:"First name",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"firstName")}),jsx127(TextInput23,{name:"lastName",type:"text",label:"Last name",placeholder:"Last name",required:!0,error:getErrorsForInput(outcome,"lastName")}),jsx127(TextInput23,{name:"email",type:"email",label:"Email",placeholder:"name@domain.com",required:!0,error:getErrorsForInput(outcome,"email")}),jsx127(PasswordInput,{name:"password",label:"Password",autoComplete:"off",required:!0,error:getErrorsForInput(outcome,"password")}),jsxs77(Text23,{c:"dimmed",size:"xs",children:["By clicking submit you agree to the Medplum"," ",jsx127(Anchor15,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx127(Anchor15,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]}),jsxs77(Text23,{c:"dimmed",size:"xs",children:["This site is protected by reCAPTCHA and the Google"," ",jsx127(Anchor15,{href:"https://policies.google.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx127(Anchor15,{href:"https://policies.google.com/terms",children:"Terms\xA0of\xA0Service"})," apply."]})]}),jsxs77(Group47,{justify:"space-between",mt:"xl",wrap:"nowrap",children:[jsx127(Checkbox4,{name:"remember",label:"Remember me",size:"xs"}),jsx127(Button26,{type:"submit",children:"Create account"})]})]})}import{jsx as jsx128,jsxs as jsxs78}from"react/jsx-runtime";function RegisterForm(props){let{type,projectId,clientId,googleClientId,recaptchaSiteKey,onSuccess}=props,medplum=a(),[login,setLogin]=useState69(),[outcome,setOutcome]=useState69();useEffect28(()=>{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(console.log):response.login&&setLogin(response.login)}return jsxs78(Document,{width:450,children:[outcome&&jsx128("pre",{children:JSON.stringify(outcome,null,2)}),!login&&jsx128(NewUserForm,{projectId,clientId,googleClientId,recaptchaSiteKey,handleAuthResponse,children:props.children}),login&&type==="project"&&jsx128(NewProjectForm,{login,handleAuthResponse})]})}import{showNotification as showNotification7}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString9}from"@medplum/core";import{useCallback as useCallback21,useEffect as useEffect29,useRef as useRef18,useState as useState73}from"react";import{Anchor as Anchor16,Button as Button27,Center as Center6,Checkbox as Checkbox5,Divider as Divider4,Group as Group48,PasswordInput as PasswordInput2,Stack as Stack24,TextInput as TextInput24}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome6}from"@medplum/core";import{useCallback as useCallback20,useState as useState70}from"react";import{Fragment as Fragment44,jsx as jsx129,jsxs as jsxs79}from"react/jsx-runtime";function AuthenticationForm(props){let[email,setEmail]=useState70();return email?jsx129(PasswordForm,{email,...props}):jsx129(EmailForm,{setEmail,...props})}function EmailForm(props){let{setEmail,onRegister,handleAuthResponse,children,disableEmailAuth,...baseLoginRequest}=props,medplum=a(),googleClientId=!props.disableGoogleAuth&&getGoogleClientId(props.googleClientId),[outcome,setOutcome]=useState70(),issues=getIssuesForExpression(outcome,void 0),isExternalAuth=useCallback20(async authMethod=>{if(!authMethod.authorizeUrl)return!1;let state=JSON.stringify({...await medplum.ensureCodeChallenge(baseLoginRequest),domain:authMethod.domain}),url=new URL(authMethod.authorizeUrl);return url.searchParams.set("state",state),window.location.assign(url.toString()),!0},[medplum,baseLoginRequest]),handleSubmit=useCallback20(async formData=>{let authMethod=await medplum.post("auth/method",{email:formData.email});await isExternalAuth(authMethod)||setEmail(formData.email)},[medplum,isExternalAuth,setEmail]),handleGoogleCredential=useCallback20(async response=>{try{let authResponse=await medplum.startGoogleLogin({...baseLoginRequest,googleCredential:response.credential});await isExternalAuth(authResponse)||handleAuthResponse(authResponse)}catch(err){setOutcome(normalizeOperationOutcome6(err))}},[medplum,baseLoginRequest,isExternalAuth,handleAuthResponse]);return jsxs79(Form,{onSubmit:handleSubmit,children:[jsx129(Center6,{style:{flexDirection:"column"},children}),jsx129(OperationOutcomeAlert,{issues}),googleClientId&&jsxs79(Fragment44,{children:[jsx129(Group48,{justify:"center",p:"xl",style:{height:70},children:jsx129(GoogleButton,{googleClientId,handleGoogleCredential})}),!disableEmailAuth&&jsx129(Divider4,{label:"or",labelPosition:"center",my:"lg"})]}),!disableEmailAuth&&jsx129(TextInput24,{name:"email",type:"email",label:"Email",placeholder:"name@domain.com",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"email")}),jsxs79(Group48,{justify:"space-between",mt:"xl",gap:0,wrap:"nowrap",children:[jsx129("div",{children:onRegister&&jsx129(Anchor16,{component:"button",type:"button",color:"dimmed",onClick:onRegister,size:"xs",children:"Register"})}),!disableEmailAuth&&jsx129(Button27,{type:"submit",children:"Next"})]})]})}function PasswordForm(props){let{onForgotPassword,handleAuthResponse,children,...baseLoginRequest}=props,medplum=a(),[outcome,setOutcome]=useState70(),issues=getIssuesForExpression(outcome,void 0),handleSubmit=useCallback20(formData=>{medplum.startLogin({...baseLoginRequest,password:formData.password,remember:formData.remember==="on"}).then(handleAuthResponse).catch(err=>setOutcome(normalizeOperationOutcome6(err)))},[medplum,baseLoginRequest,handleAuthResponse]);return jsxs79(Form,{style:{maxWidth:400},onSubmit:handleSubmit,children:[jsx129(Center6,{style:{flexDirection:"column"},children}),jsx129(OperationOutcomeAlert,{issues}),jsx129(Stack24,{gap:"xl",children:jsx129(PasswordInput2,{name:"password",label:"Password",autoComplete:"off",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"password")})}),jsxs79(Group48,{justify:"space-between",mt:"xl",gap:0,wrap:"nowrap",children:[onForgotPassword&&jsx129(Anchor16,{component:"button",type:"button",c:"dimmed",onClick:onForgotPassword,size:"xs",children:"Forgot password"}),jsx129(Checkbox5,{id:"remember",name:"remember",label:"Remember me",size:"xs",style:{lineHeight:1}}),jsx129(Button27,{type:"submit",children:"Sign in"})]})]})}import{Avatar as Avatar3,Combobox as Combobox2,Flex as Flex4,Group as Group49,Stack as Stack25,Text as Text24,TextInput as TextInput25,Title as Title7,useCombobox as useCombobox2}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome7}from"@medplum/core";import{useState as useState71}from"react";import{jsx as jsx130,jsxs as jsxs80}from"react/jsx-runtime";function ChooseProfileForm(props){let medplum=a(),combobox=useCombobox2(),[search,setSearch]=useState71(""),[outcome,setOutcome]=useState71();function filterDisplay(display){return!!display?.toLowerCase()?.includes(search.toLowerCase())}function filterMembership(membership){return filterDisplay(membership.profile?.display)||filterDisplay(membership.project?.display)}function handleValueSelect(membershipId){medplum.post("auth/profile",{login:props.login,profile:membershipId}).then(props.handleAuthResponse).catch(err=>setOutcome(normalizeOperationOutcome7(err)))}let options=props.memberships.filter(filterMembership).slice(0,10).map(item=>jsx130(Combobox2.Option,{value:item.id,children:jsx130(SelectOption,{...item})},item.id));return jsxs80(Stack25,{children:[jsxs80(Flex4,{gap:"md",mb:"md",justify:"center",align:"center",direction:"column",wrap:"nowrap",children:[jsx130(Logo,{size:32}),jsx130(Title7,{order:3,children:"Choose profile"})]}),jsx130(OperationOutcomeAlert,{outcome}),jsxs80(Combobox2,{store:combobox,onOptionSubmit:handleValueSelect,children:[jsx130(Combobox2.EventsTarget,{children:jsx130(TextInput25,{placeholder:"Search",value:search,onChange:event=>{setSearch(event.currentTarget.value),combobox.updateSelectedOptionIndex()}})}),jsx130("div",{children:jsx130(Combobox2.Options,{children:options.length>0?options:jsx130(Combobox2.Empty,{children:"Nothing found..."})})})]})]})}function SelectOption(membership){return jsxs80(Group49,{children:[jsx130(Avatar3,{radius:"xl"}),jsxs80("div",{children:[jsx130(Text24,{fz:"sm",fw:500,children:membership.profile?.display}),jsx130(Text24,{fz:"xs",opacity:.6,children:membership.project?.display})]})]})}import{Button as Button28,Center as Center7,Checkbox as Checkbox6,Group as Group50,Stack as Stack26,Title as Title8}from"@mantine/core";import{jsx as jsx131,jsxs as jsxs81}from"react/jsx-runtime";function ChooseScopeForm(props){let medplum=a();return jsx131(Form,{style:{maxWidth:400},onSubmit:formData=>{medplum.post("auth/scope",{login:props.login,scope:Object.keys(formData).join(" ")}).then(props.handleAuthResponse).catch(console.log)},children:jsxs81(Stack26,{children:[jsxs81(Center7,{style:{flexDirection:"column"},children:[jsx131(Logo,{size:32}),jsx131(Title8,{children:"Choose scope"})]}),jsx131(Stack26,{children:(props.scope??"openid").split(" ").map(scopeName=>jsx131(Checkbox6,{id:scopeName,name:scopeName,label:scopeName,defaultChecked:!0},scopeName))}),jsx131(Group50,{justify:"flex-end",mt:"xl",children:jsx131(Button28,{type:"submit",children:"Set scope"})})]})})}import{Alert as Alert3,Button as Button29,Center as Center8,Group as Group51,Stack as Stack27,TextInput as TextInput26,Title as Title9}from"@mantine/core";import{normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useState as useState72}from"react";import{jsx as jsx132,jsxs as jsxs82}from"react/jsx-runtime";function MfaForm(props){let medplum=a(),[errorMessage,setErrorMessage]=useState72();return jsx132(Form,{style:{maxWidth:400},onSubmit:formData=>{setErrorMessage(void 0),medplum.post("auth/mfa/verify",{login:props.login,token:formData.token}).then(props.handleAuthResponse).catch(err=>setErrorMessage(normalizeErrorString8(err)))},children:jsxs82(Stack27,{children:[jsxs82(Center8,{style:{flexDirection:"column"},children:[jsx132(Logo,{size:32}),jsx132(Title9,{children:"Enter MFA code"})]}),errorMessage&&jsx132(Alert3,{icon:jsx132(IconAlertCircle,{size:16}),title:"Error",color:"red",children:errorMessage}),jsx132(Stack27,{children:jsx132(TextInput26,{name:"token",label:"MFA code",required:!0,autoFocus:!0})}),jsx132(Group51,{justify:"flex-end",mt:"xl",children:jsx132(Button29,{type:"submit",children:"Submit code"})})]})})}import{jsx as jsx133}from"react/jsx-runtime";function SignInForm(props){let{login:loginCode,chooseScopes,onSuccess,onForgotPassword,onRegister,onCode,...baseLoginRequest}=props,medplum=a(),[login,setLogin]=useState73(),loginRequested=useRef18(!1),[mfaRequired,setAuthenticatorRequired]=useState73(!1),[memberships,setMemberships]=useState73(),handleCode=useCallback21(code=>{onCode?onCode(code):medplum.processCode(code).then(()=>{onSuccess&&onSuccess()}).catch(err=>showNotification7({color:"red",message:normalizeErrorString9(err)}))},[medplum,onCode,onSuccess]),handleAuthResponse=useCallback21(response=>{setAuthenticatorRequired(!!response.mfaRequired),response.login&&setLogin(response.login),response.memberships&&setMemberships(response.memberships),response.code&&(chooseScopes?setMemberships(void 0):handleCode(response.code))},[chooseScopes,handleCode]),handleScopeResponse=useCallback21(response=>{handleCode(response.code)},[handleCode]);return useEffect29(()=>{loginCode&&!loginRequested.current&&!login&&(loginRequested.current=!0,medplum.get("auth/login/"+loginCode).then(handleAuthResponse).catch(err=>showNotification7({color:"red",message:normalizeErrorString9(err)})))},[medplum,loginCode,loginRequested,login,handleAuthResponse]),jsx133(Document,{width:450,px:"sm",py:"md",children:login?mfaRequired?jsx133(MfaForm,{login,handleAuthResponse}):memberships?jsx133(ChooseProfileForm,{login,memberships,handleAuthResponse}):props.projectId==="new"?jsx133(NewProjectForm,{login,handleAuthResponse}):props.chooseScopes?jsx133(ChooseScopeForm,{login,scope:props.scope,handleAuthResponse:handleScopeResponse}):jsx133("div",{children:"Success"}):jsx133(AuthenticationForm,{onForgotPassword,onRegister,handleAuthResponse,disableGoogleAuth:props.disableGoogleAuth,disableEmailAuth:props.disableEmailAuth,...baseLoginRequest,children:props.children})})}import{ActionIcon as ActionIcon11,Group as Group52,Paper as Paper4,ScrollArea as ScrollArea3,Stack as Stack28,TextInput as TextInput27,Title as Title10}from"@mantine/core";import{useResizeObserver}from"@mantine/hooks";import{showNotification as showNotification8}from"@mantine/notifications";import{getDisplayString as getDisplayString6,getReferenceString as getReferenceString11,normalizeErrorString as normalizeErrorString10}from"@medplum/core";import{useCallback as useCallback22,useEffect as useEffect30,useMemo as useMemo16,useRef as useRef19,useState as useState74}from"react";var BaseChat_default={chatPaper:"BaseChat_chatPaper",chatTitle:"BaseChat_chatTitle",chatBody:"BaseChat_chatBody",chatScrollArea:"BaseChat_chatScrollArea",chatInputContainer:"BaseChat_chatInputContainer",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble",chatBubbleName:"BaseChat_chatBubbleName",chatBubbleNameRight:"BaseChat_chatBubbleNameRight"};import{jsx as jsx134,jsxs as jsxs83}from"react/jsx-runtime";function parseSentTime(communication){let sentTime=new Date(communication.sent??0),sentTimeMins=sentTime.getMinutes().toString();return`${sentTime.getHours()}:${sentTimeMins.length===1?"0":""}${sentTimeMins}`}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((a2,b2)=>a2.sent.localeCompare(b2.sent)),setCommunications(newCommunications)}function BaseChat(props){let{title,communications,setCommunications,query,sendMessage,onMessageReceived,inputDisabled}=props,medplum=a(),inputRef=useRef19(null),scrollAreaRef=useRef19(null),[profile,setProfile]=useState74(medplum.getProfile()),profileRefStr=useMemo16(()=>profile?getReferenceString11(medplum.getProfile()):"",[profile,medplum]);Oe(`Communication?${query}`,bundle=>{let communication=bundle.entry?.[1]?.resource;upsertCommunications(communicationsRef.current,[communication],setCommunications),onMessageReceived&&getReferenceString11(communication.sender)!==profileRefStr&&onMessageReceived(communication)});let sendMessageInternal=useCallback22(formData=>{inputDisabled||(inputRef.current&&(inputRef.current.value=""),sendMessage(formData.message),scrollToBottomRef.current=!0)},[inputDisabled,sendMessage]);useEffect30(()=>{let latestProfile=medplum.getProfile();profile?.id!==latestProfile?.id&&(setProfile(latestProfile),setCommunications([]))});let[parentRef,parentRect]=useResizeObserver(),communicationsRef=useRef19(communications);communicationsRef.current=communications;let prevCommunicationsRef=useRef19(communications),scrollToBottomRef=useRef19(!0),searchMessages=useCallback22(async()=>{let searchParams=new URLSearchParams(query);searchParams.append("_sort","-sent");let searchResult=await medplum.searchResources("Communication",searchParams,{cache:"no-cache"});upsertCommunications(communicationsRef.current,searchResult,setCommunications)},[medplum,setCommunications,query]);useEffect30(()=>{searchMessages().catch(err=>showNotification8({color:"red",message:normalizeErrorString10(err)}))},[searchMessages]),useEffect30(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),useEffect30(()=>{scrollToBottomRef.current&&scrollAreaRef.current?.scrollTo&&(scrollAreaRef.current.scrollTo({top:scrollAreaRef.current.scrollHeight,behavior:"smooth"}),scrollToBottomRef.current=!1)});let myLastDeliveredId=useMemo16(()=>{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?jsxs83(Paper4,{className:BaseChat_default.chatPaper,p:0,radius:"md",children:[jsx134(Title10,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx134("div",{className:BaseChat_default.chatBody,ref:parentRef,children:jsx134(ScrollArea3,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:communications.map((c,i)=>{let prevCommunication=i>0?communications[i-1]:void 0,prevCommTime=prevCommunication?parseSentTime(prevCommunication):void 0,currCommTime=parseSentTime(c);return jsxs83(Stack28,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx134("div",{style:{textAlign:"center"},children:currCommTime}),c.sender?.reference===profileRefStr?jsxs83(Group52,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx134(ChatBubble,{alignment:"right",communication:c,showDelivered:!!c.received&&c.id===myLastDeliveredId}),jsx134(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender})]}):jsxs83(Group52,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx134(ResourceAvatar,{radius:"xl",value:c.sender}),jsx134(ChatBubble,{alignment:"left",communication:c})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})})}),jsx134("div",{className:BaseChat_default.chatInputContainer,children:jsx134(Form,{onSubmit:sendMessageInternal,children:jsx134(TextInput27,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",rightSectionWidth:42,disabled:inputDisabled,rightSection:inputDisabled?void 0:jsx134(ActionIcon11,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx134(IconArrowRight,{size:"1rem",stroke:1.5})})})})})]}):null}function ChatBubble(props){let{communication,alignment,showDelivered}=props,content=communication.payload?.[0]?.contentString||"",seenTime=new Date(communication.received??-1),senderResource=pe(communication.sender);return jsxs83("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx134("div",{className:clsx_default(BaseChat_default.chatBubbleName,alignment==="right"&&BaseChat_default.chatBubbleNameRight),"aria-label":"Sender name",children:senderResource?getDisplayString6(senderResource):"[Unknown sender]"}),jsx134("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx134("div",{className:BaseChat_default.chatBubble,children:content})}),showDelivered&&jsxs83("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}import{ActionIcon as ActionIcon12}from"@mantine/core";import{useEffect as useEffect31,useState as useState75}from"react";var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};import{Fragment as Fragment45,jsx as jsx135,jsxs as jsxs84}from"react/jsx-runtime";function ChatModal(props){let{open,children}=props,profile=W(),[opened,setOpened]=useState75(open??!1);return useEffect31(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?jsxs84(Fragment45,{children:[opened&&jsx135("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx135("div",{className:ChatModal_default.iconContainer,children:jsx135(ActionIcon12,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx135(IconChevronDown,{size:"1.625rem"})})}):jsx135("div",{className:ChatModal_default.iconContainer,children:jsx135(ActionIcon12,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx135(IconChevronUp,{size:"1.625rem"})})})]}):null}import{createReference as createReference13,formatCodeableConcept as formatCodeableConcept5,getReferenceString as getReferenceString12}from"@medplum/core";import{useCallback as useCallback23,useEffect as useEffect32,useMemo as useMemo17,useState as useState76}from"react";import{jsx as jsx136}from"react/jsx-runtime";function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled}=props,medplum=a(),profile=W(),prevThreadId=se(thread?.id),[communications,setCommunications]=useState76([]),profileRef=useMemo17(()=>profile?createReference13(profile):void 0,[profile]),threadRef=useMemo17(()=>createReference13(thread),[thread]);useEffect32(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=useCallback23(message=>{let profileRefStr=profileRef?getReferenceString12(profileRef):void 0;profileRefStr&&medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>getReferenceString12(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload:[{contentString:message}],partOf:[threadRef]}).then(communication=>{setCommunications([...communications,communication]),onMessageSent?.(communication)}).catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent]),onMessageReceived=useMemo17(()=>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?jsx136(BaseChat,{title:title??(thread?.topic?formatCodeableConcept5(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled}):null}export{AddressDisplay,AddressInput,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,CalendarInput,ChatModal,CheckboxFormSection,CodeInput,CodeableConceptDisplay,CodeableConceptInput,CodingDisplay,CodingInput,ContactDetailDisplay,ContactDetailInput,ContactPointDisplay,ContactPointInput,Container,DateTimeInput,DefaultResourceTimeline,DescriptionList,DescriptionListEntry,DiagnosticReportDisplay,Document,ElementDefinitionInputSelector,ElementDefinitionTypeInput,EncounterTimeline,ErrorBoundary,FhirPathTable,Form,FormSection,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,Loading,Logo,MeasureReportDisplay,MedplumLink,ee as MedplumProvider,MemoizedFhirPathTable,MemoizedSearchControl,MoneyDisplay,MoneyInput,Navbar,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,Panel,PatientSummary,PatientTimeline,PlanDefinitionBuilder,QuantityDisplay,QuantityInput,QuestionnaireBuilder,QuestionnaireForm,QuestionnaireItemType,RangeDisplay,RangeInput,ReferenceDisplay,ReferenceInput,ReferenceRangeEditor,ReferenceRangeGroupEditor,RegisterForm,RequestGroupDisplay,ResourceArrayDisplay,ResourceArrayInput,ResourceAvatar,ResourceBadge,ResourceBlame,ResourceDiff,ResourceForm,ResourceHistoryTable,ResourceInput,ResourceName,ResourcePropertyDisplay,ResourcePropertyInput,ResourceTable,ResourceTimeline,Scheduler,SearchChangeEvent,SearchClickEvent,SearchControl,SearchFieldEditor,SearchFilterEditor,SearchLoadEvent,ServiceRequestTimeline,SignInForm,SmartAppLaunchLink,StatusBadge,ThreadChat,Timeline,TimelineItem,TimingInput,ValueSetAutocomplete,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNextMonthFilter,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,buildInitialResponse,buildInitialResponseItem,clearFilters,clearFiltersOnField,convertIsoToLocal,convertLocalToIso,createScriptTag,deleteFilter,formatReferenceString,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getNewMultiSelectValues,getNumberOfPages,getOpString,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,getRecaptcha,getSearchOperators,getSortField,getValuePath,initRecaptcha,isChoiceQuestion,isQuestionEnabled,isSortDescending,isSupportedProfileStructureDefinition,parseForm,R as reactContext,renderValue,setFilters,setOffset,setPage,setPropertyValue,setQuestionnaireItemReferenceTargetTypes,setSort,sortByDateAndPriority,toggleSort,oe as useCachedBinaryUrl,a as useMedplum,x as useMedplumContext,V as useMedplumNavigate,W as useMedplumProfile,se as usePrevious,pe as useResource,Me as useSearch,Ce as useSearchOne,Ee as useSearchResources,Oe as useSubscription};
74
74
  /*! Bundled license information:
75
75
 
76
76
  @tabler/icons-react/dist/esm/defaultAttributes.mjs:
@@ -209,6 +209,14 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
209
209
  * See the LICENSE file in the root directory of this source tree.
210
210
  *)
211
211
 
212
+ @tabler/icons-react/dist/esm/icons/IconChevronUp.mjs:
213
+ (**
214
+ * @license @tabler/icons-react v3.1.0 - MIT
215
+ *
216
+ * This source code is licensed under the MIT license.
217
+ * See the LICENSE file in the root directory of this source tree.
218
+ *)
219
+
212
220
  @tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs:
213
221
  (**
214
222
  * @license @tabler/icons-react v3.1.0 - MIT