@medplum/react 4.1.5 → 4.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +9 -8
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/cjs/index.css +1 -1
- package/dist/cjs/index.css.map +4 -4
- package/dist/cjs/index.d.ts +5 -8
- package/dist/esm/index.css +1 -1
- package/dist/esm/index.css.map +4 -4
- package/dist/esm/index.d.ts +5 -8
- package/dist/esm/index.mjs +9 -8
- package/dist/esm/index.mjs.map +4 -4
- package/package.json +22 -22
package/dist/esm/index.mjs
CHANGED
|
@@ -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=exports.escapeToken=exports.unescapeToken=void 0;function unescapeToken(token){return token.replace(/~1/g,"/").replace(/~0/g,"~")}exports.unescapeToken=unescapeToken;function escapeToken(token){return token.replace(/~/g,"~0").replace(/\//g,"~1")}exports.escapeToken=escapeToken;var Pointer=function(){function Pointer2(tokens){tokens===void 0&&(tokens=[""]),this.tokens=tokens}return Pointer2.fromJSON=function(path){var tokens=path.split("/").map(unescapeToken);if(tokens[0]!=="")throw new Error("Invalid JSON Pointer: ".concat(path));return new Pointer2(tokens)},Pointer2.prototype.toString=function(){return this.tokens.map(escapeToken).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 memo2={"0,0":{operations:[],cost:0}};function dist(i,j){var memo_key="".concat(i,",").concat(j),memoized=memo2[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(a,b){return a.cost-b.cost})[0];memoized=best}memo2[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,b){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d2,b2){d2.__proto__=b2}||function(d2,b2){for(var p in b2)Object.prototype.hasOwnProperty.call(b2,p)&&(d2[p]=b2[p])},extendStatics(d,b)};return function(d,b){if(typeof b!="function"&&b!==null)throw new TypeError("Class extends value "+String(b)+" is not a constructor or null");extendStatics(d,b);function __(){this.constructor=d}d.prototype=b===null?Object.create(b):(__.prototype=b.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}});export*from"@medplum/react-hooks";import{formatAddress}from"@medplum/core";import{Fragment,jsx}from"react/jsx-runtime";function AddressDisplay(props){let address=props.value;return address?jsx(Fragment,{children:formatAddress(address)}):null}import{Group,NativeSelect,TextInput}from"@mantine/core";import{useContext,useMemo,useRef,useState}from"react";import{isPopulated}from"@medplum/core";import{createContext}from"react";var DEFAULT_IGNORED_PROPERTIES=["meta","implicitRules","contained","extension","modifierExtension"],DEFAULT_IGNORED_NON_NESTED_PROPERTIES=["language","text"];var ElementsContext=createContext({path:"",profileUrl:void 0,elements:Object.create(null),elementsByPath:Object.create(null),getExtendedProps:()=>({readonly:!1,hidden:!1}),accessPolicyResource:void 0,debugMode:!1,isDefaultContext:!0});ElementsContext.displayName="ElementsContext";var EXTENSION_KEYS=["extension","modifierExtension"],IGNORED_PROPERTIES=["id",...DEFAULT_IGNORED_PROPERTIES].filter(prop=>!EXTENSION_KEYS.includes(prop));function getElementsToRender(inputElements){return Object.entries(inputElements).filter(([key,element])=>!isPopulated(element.type)||element.max===0||element.path.toLowerCase().endsWith("extension.url")&&element.fixed||EXTENSION_KEYS.includes(key)&&!isPopulated(element.slicing?.slices)||IGNORED_PROPERTIES.includes(key)?!1:!(DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key)&&element.path.split(".").length===2||key.includes(".")))}import{jsx as jsx2,jsxs}from"react/jsx-runtime";function getLine(address,index){return address.line&&address.line.length>index?address.line[index]:""}function setLine(address,index,str){let line=address.line||[];for(;line.length<=index;)line.push("");return line[index]=str,{...address,line}}function AddressInput(props){let[value,setValue]=useState(props.defaultValue||{}),valueRef=useRef(value);valueRef.current=value;let{getExtendedProps}=useContext(ElementsContext),[useProps,typeProps,line1Props,line2Props,cityProps,stateProps,postalCodeProps]=useMemo(()=>["use","type","line1","line2","city","state","postalCode"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(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,{disabled:props.disabled||useProps?.readonly,"data-testid":"address-use",defaultValue:value.use,onChange:e=>setUse(e.currentTarget.value),data:["","home","work","temp","old","billing"]}),jsx2(NativeSelect,{disabled:props.disabled||typeProps?.readonly,"data-testid":"address-type",defaultValue:value.type,onChange:e=>setType(e.currentTarget.value),data:["","postal","physical","both"]}),jsx2(TextInput,{disabled:props.disabled||line1Props?.readonly,placeholder:"Line 1",defaultValue:getLine(value,0),onChange:e=>setLine1(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||line2Props?.readonly,placeholder:"Line 2",defaultValue:getLine(value,1),onChange:e=>setLine2(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||cityProps?.readonly,placeholder:"City",defaultValue:value.city,onChange:e=>setCity(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||stateProps?.readonly,placeholder:"State",defaultValue:value.state,onChange:e=>setState(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||postalCodeProps?.readonly,placeholder:"Postal Code",defaultValue:value.postalCode,onChange:e=>setPostalCode(e.currentTarget.value)})]})}import{TextInput as TextInput2}from"@mantine/core";import{createReference}from"@medplum/core";import{useMedplumProfile}from"@medplum/react-hooks";import{useState as useState2}from"react";import{jsx as jsx3}from"react/jsx-runtime";function AnnotationInput(props){let author=useMedplumProfile(),[value,setValue]=useState2(props.defaultValue||{});function setText(text){let newValue=text?{text,authorReference:author&&createReference(author),time:new Date().toISOString()}:{};setValue(newValue),props.onChange&&props.onChange(newValue)}return jsx3(TextInput2,{disabled:props.disabled,name:props.name,placeholder:"Annotation text",defaultValue:value.text,onChange:e=>setText(e.currentTarget.value)})}import{AppShell as MantineAppShell3}from"@mantine/core";import{showNotification as showNotification3}from"@mantine/notifications";import{useMedplum as useMedplum4,useMedplumProfile as useMedplumProfile3}from"@medplum/react-hooks";import{Suspense,useEffect as useEffect2,useState as useState9}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,title,className,children,...rest},ref)=>createElement("svg",{ref,...defaultAttributes[type],width:size,height:size,className:["tabler-icon",`tabler-icon-${iconName}`,className].join(" "),...type==="filled"?{fill:color}:{strokeWidth:stroke,stroke:color},...rest},[title&&createElement("title",{key:"svg-title"},title),...iconNode.map(([tag,attrs])=>createElement(tag,attrs)),...Array.isArray(children)?children:[children]]));return Component2.displayName=`${iconNamePascal}`,Component2};var 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 IconGenderMale=createReactComponent("outline","gender-male","IconGenderMale",[["path",{d:"M10 14m-5 0a5 5 0 1 0 10 0a5 5 0 1 0 -10 0",key:"svg-0"}],["path",{d:"M19 5l-5.4 5.4",key:"svg-1"}],["path",{d:"M19 5h-5",key:"svg-2"}],["path",{d:"M19 5v5",key:"svg-3"}]]);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 IconPencil=createReactComponent("outline","pencil","IconPencil",[["path",{d:"M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4",key:"svg-0"}],["path",{d:"M13.5 6.5l4 4",key:"svg-1"}]]);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";import{useMedplumProfile as useMedplumProfile2}from"@medplum/react-hooks";function r(e){var t,f,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f)}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}var clsx_default=clsx;import{useState as useState4}from"react";import{Avatar}from"@mantine/core";import{getDisplayString,getImageSrc}from"@medplum/core";import{useCachedBinaryUrl,useResource}from"@medplum/react-hooks";import{Anchor}from"@mantine/core";import{isReference,isResource}from"@medplum/core";import{useMedplumNavigate}from"@medplum/react-hooks";import{ContentType}from"@medplum/core";function killEvent(e){e.preventDefault(),e.stopPropagation()}function isAuxClick(e){return e.button===1||e.ctrlKey||e.metaKey}function isCheckboxCell(el){if(isCheckboxElement(el))return!0;if(el instanceof HTMLTableCellElement){let children=el.children;if(children.length===1&&isCheckboxElement(children[0]))return!0}return!1}function isCheckboxElement(el){return el instanceof HTMLInputElement&&el.type==="checkbox"}async function sendCommand(frame,command){return new Promise((resolve,reject)=>{let channel=new MessageChannel;channel.port1.onmessage=({data:data2})=>{channel.port1.close(),data2.error?reject(data2.error):resolve(data2.result)},frame.contentWindow?.postMessage(command,new URL(frame.src).origin,[channel.port2])})}function exportJsonFile(jsonString,fileName){let blobForExport=new Blob([jsonString],{type:ContentType.JSON}),url=URL.createObjectURL(blobForExport),link=document.createElement("a");link.href=url;let linkName=fileName??new Date().toISOString().replace(/\D/g,"");link.download=`${linkName}.json`,document.body.appendChild(link),link.click(),URL.revokeObjectURL(url)}import{jsx as jsx6}from"react/jsx-runtime";function MedplumLink(props){let navigate=useMedplumNavigate(),{to,suffix,label,onClick,children,...rest}=props,href=getHref(to);return suffix&&(href+="/"+suffix),jsx6(Anchor,{href,"aria-label":label,onAuxClick:e=>{e.stopPropagation()},onClick:e=>{e.stopPropagation(),onClick?(e.preventDefault(),onClick(e)):to&&(isAuxClick(e)||(e.preventDefault(),navigate(href)))},...rest,children})}function getHref(to){if(to){if(typeof to=="string")return getStringHref(to);if(isResource(to))return getResourceHref(to);if(isReference(to))return getReferenceHref(to)}return"#"}function getStringHref(to){return to.startsWith("http://")||to.startsWith("https://")||to.startsWith("/")?to:"/"+to}function getResourceHref(to){return`/${to.resourceType}/${to.id}`}function getReferenceHref(to){return`/${to.reference}`}function getInitials(input){let words=input.split(" ").filter(Boolean);return words.length>1?words[0][0]+words[words.length-1][0]:words.length===1?words[0][0]:""}import{jsx as jsx7}from"react/jsx-runtime";function ResourceAvatar(props){let resource=useResource(props.value),text=resource?getDisplayString(resource):props.alt??"",initials=getInitials(text),uncachedImageUrl=(resource&&getImageSrc(resource))??props.src,imageUrl=useCachedBinaryUrl(uncachedImageUrl??void 0),radius=props.radius??"xl",avatarProps={...props,value:void 0,link:void 0};return props.link?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{useMedplumContext}from"@medplum/react-hooks";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=useMedplumContext(),{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{Group as Group4,Text as Text2}from"@mantine/core";import{formatHumanName as formatHumanName2,getDisplayString as getDisplayString2,getReferenceString as getReferenceString2,isUUID}from"@medplum/core";import{useMedplum,useMedplumNavigate as useMedplumNavigate2}from"@medplum/react-hooks";import{forwardRef as forwardRef2,useCallback as useCallback2}from"react";import{Combobox,Group as Group3,Loader as Loader2,Pill,PillsInput,ScrollAreaAutosize,useCombobox}from"@mantine/core";import{showNotification}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString2}from"@medplum/core";import{useCallback,useEffect,useMemo as useMemo2,useRef as useRef2,useState as useState3}from"react";var AsyncAutocompleteTestIds={selectedItems:"selected-items",options:"options"};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,pillComponent,emptyComponent,onChange,onCreate,creatable,clearable,required,placeholder,leftSection,maxValues,optionsDropdownMaxHeight=320,minInputLength=0,...rest}=props,disabled=rest.disabled,defaultItems=toDefaultItems(defaultValue2),[search,setSearch]=useState3(""),[timer,setTimer]=useState3(),[abortController,setAbortController]=useState3(),[autoSubmit,setAutoSubmit]=useState3(),[selected,setSelected]=useState3(defaultItems.map(toOption4)),[options,setOptions]=useState3([]),ItemComponent3=itemComponent??DefaultItemComponent,PillComponent=pillComponent??DefaultPillComponent,EmptyComponent=emptyComponent??DefaultEmptyComponent,searchRef=useRef2(search);searchRef.current=search;let lastLoadOptionsRef=useRef2(void 0),lastValueRef=useRef2(void 0),timerRef=useRef2(timer);timerRef.current=timer;let abortControllerRef=useRef2(abortController);abortControllerRef.current=abortController;let autoSubmitRef=useRef2(autoSubmit);autoSubmitRef.current=autoSubmit;let optionsRef=useRef2(options);optionsRef.current=options;let handleTimer=useCallback(()=>{if(setTimer(void 0),searchRef.current===lastValueRef.current&&loadOptions===lastLoadOptionsRef.current||(searchRef.current?.length??0)<minInputLength)return;lastValueRef.current=searchRef.current,lastLoadOptionsRef.current=loadOptions;let newAbortController=new AbortController;setAbortController(newAbortController),loadOptions(searchRef.current??"",newAbortController.signal).then(newValues=>{newAbortController.signal.aborted||(setOptions(newValues.map(toOption4)),autoSubmitRef.current?(newValues.length>0&&onChange(newValues.slice(0,1)),setAutoSubmit(!1)):newValues.length>0&&combobox.openDropdown())}).catch(err=>{newAbortController.signal.aborted||err.message.includes("aborted")||showNotification({color:"red",message:normalizeErrorString2(err)})}).finally(()=>{newAbortController.signal.aborted||setAbortController(void 0)})},[combobox,loadOptions,onChange,toOption4,minInputLength]),handleSearchChange=useCallback(e=>{(options&&options.length>0||creatable)&&combobox.openDropdown(),combobox.updateSelectedOptionIndex(),setSearch(e.currentTarget.value),abortControllerRef.current&&(abortControllerRef.current.abort(),setAbortController(void 0)),timerRef.current!==void 0&&window.clearTimeout(timerRef.current);let newTimer=window.setTimeout(()=>handleTimer(),100);setTimer(newTimer)},[combobox,options,creatable,handleTimer]),addSelected=useCallback(newValue=>{let alreadySelected=selected.some(v=>v.value===newValue),newSelected=alreadySelected?selected.filter(v=>v.value!==newValue):[...selected],option=options?.find(option2=>option2.value===newValue);if(!option&&creatable!==!1&&onCreate){let createdResource=onCreate(newValue);option=toOption4(createdResource)}if(option){if(maxValues===0){onChange([option.resource]),selected.length>0&&setSelected([]);return}alreadySelected||newSelected.push(option)}if(maxValues!==void 0)for(;newSelected.length>maxValues;)newSelected.shift();onChange(newSelected.map(v=>v.resource)),setSelected(newSelected)},[creatable,options,selected,maxValues,onChange,onCreate,toOption4]),handleValueSelect=useMemo2(()=>{if(!disabled)return val=>{disabled||(maxValues===1&&(setSearch(""),setOptions([]),combobox.closeDropdown()),lastValueRef.current=void 0,val==="$create"?(setSearch(""),addSelected(search)):addSelected(val))}},[addSelected,combobox,disabled,maxValues,search]),handleValueRemove=useCallback(item=>{let newSelected=selected.filter(v=>v.value!==item.value);onChange(newSelected.map(v=>v.resource)),setSelected(newSelected)},[selected,onChange]),handleKeyDown=useCallback(e=>{e.key==="Enter"?(timer||abortController)&&setAutoSubmit(!0):e.key==="Backspace"&&search.length===0&&(killEvent(e),handleValueRemove(selected[selected.length-1]))},[abortController,handleValueRemove,search.length,selected,timer]);useEffect(()=>()=>{abortControllerRef.current&&abortControllerRef.current.abort()},[]);let clearButton=!disabled&&clearable&&selected.length>0&&jsx10(Combobox.ClearButton,{title:"Clear all",size:"sm",onClear:()=>{setSearch(""),setSelected([]),onChange([]),combobox.closeDropdown()}}),createVisible=creatable&&search.trim().length>0,comboboxVisible=options.length>0||createVisible;return 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,disabled,children:jsxs3(Pill.Group,{"data-testid":AsyncAutocompleteTestIds.selectedItems,children:[selected.map(item=>jsx10(PillComponent,{item,disabled,onRemove:()=>handleValueRemove(item)},item.value)),!disabled&&(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(),setSearch("")},onKeyDown:handleKeyDown,onChange:handleSearchChange})})]})})}),jsx10(Combobox.Dropdown,{hidden:!comboboxVisible,"data-testid":AsyncAutocompleteTestIds.options,children:jsx10(Combobox.Options,{children:jsxs3(ScrollAreaAutosize,{type:"scroll",mah:optionsDropdownMaxHeight,children:[options.map(item=>{let active=selected.some(v=>v.value===item.value);return jsx10(Combobox.Option,{value:item.value,active,children:jsx10(ItemComponent3,{...item,active})},item.value)}),createVisible&&jsxs3(Combobox.Option,{value:"$create",children:["+ Create ",search]}),!creatable&&search.trim().length>0&&options.length===0&&jsx10(EmptyComponent,{search})]})})})]})}function toDefaultItems(defaultValue2){return defaultValue2?Array.isArray(defaultValue2)?defaultValue2:[defaultValue2]:[]}function DefaultItemComponent(props){return jsxs3(Group3,{gap:"xs",children:[props.active&&jsx10(IconCheck,{size:12}),jsx10("span",{children:props.label})]})}function DefaultPillComponent({item,disabled,onRemove}){return jsx10(Pill,{withRemoveButton:!disabled,onRemove,children:item.label})}function DefaultEmptyComponent(){return jsx10(Combobox.Empty,{children:"Nothing found"})}var HeaderSearchInput_default={searchInput:"HeaderSearchInput_searchInput"};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=useMedplumNavigate2(),medplum=useMedplum(),loadData=useCallback2(async(input,signal)=>{let query=buildGraphQLQuery(input),options={signal},response=await medplum.graphql(query,void 0,void 0,options);return getResourcesFromResponse(response,input)},[medplum]),handleSelect=useCallback2(item=>{item.length>0&&navigate(`/${getReferenceString2(item[0])}`)},[navigate]);return 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,active:_active,...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=exports.escapeToken=exports.unescapeToken=void 0;function unescapeToken(token){return token.replace(/~1/g,"/").replace(/~0/g,"~")}exports.unescapeToken=unescapeToken;function escapeToken(token){return token.replace(/~/g,"~0").replace(/\//g,"~1")}exports.escapeToken=escapeToken;var Pointer=function(){function Pointer2(tokens){tokens===void 0&&(tokens=[""]),this.tokens=tokens}return Pointer2.fromJSON=function(path){var tokens=path.split("/").map(unescapeToken);if(tokens[0]!=="")throw new Error("Invalid JSON Pointer: ".concat(path));return new Pointer2(tokens)},Pointer2.prototype.toString=function(){return this.tokens.map(escapeToken).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 memo2={"0,0":{operations:[],cost:0}};function dist(i,j){var memo_key="".concat(i,",").concat(j),memoized=memo2[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(a,b){return a.cost-b.cost})[0];memoized=best}memo2[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,b){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d2,b2){d2.__proto__=b2}||function(d2,b2){for(var p in b2)Object.prototype.hasOwnProperty.call(b2,p)&&(d2[p]=b2[p])},extendStatics(d,b)};return function(d,b){if(typeof b!="function"&&b!==null)throw new TypeError("Class extends value "+String(b)+" is not a constructor or null");extendStatics(d,b);function __(){this.constructor=d}d.prototype=b===null?Object.create(b):(__.prototype=b.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}});export*from"@medplum/react-hooks";import{formatAddress}from"@medplum/core";import{Fragment,jsx}from"react/jsx-runtime";function AddressDisplay(props){let address=props.value;return address?jsx(Fragment,{children:formatAddress(address)}):null}import{Group,NativeSelect,TextInput}from"@mantine/core";import{useContext,useMemo,useRef,useState}from"react";import{isPopulated}from"@medplum/core";import{createContext}from"react";var DEFAULT_IGNORED_PROPERTIES=["meta","implicitRules","contained","extension","modifierExtension"],DEFAULT_IGNORED_NON_NESTED_PROPERTIES=["language","text"];var ElementsContext=createContext({path:"",profileUrl:void 0,elements:Object.create(null),elementsByPath:Object.create(null),getExtendedProps:()=>({readonly:!1,hidden:!1}),accessPolicyResource:void 0,debugMode:!1,isDefaultContext:!0});ElementsContext.displayName="ElementsContext";var EXTENSION_KEYS=["extension","modifierExtension"],IGNORED_PROPERTIES=["id",...DEFAULT_IGNORED_PROPERTIES].filter(prop=>!EXTENSION_KEYS.includes(prop));function getElementsToRender(inputElements){return Object.entries(inputElements).filter(([key,element])=>!isPopulated(element.type)||element.max===0||element.path.toLowerCase().endsWith("extension.url")&&element.fixed||EXTENSION_KEYS.includes(key)&&!isPopulated(element.slicing?.slices)||IGNORED_PROPERTIES.includes(key)?!1:!(DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key)&&element.path.split(".").length===2||key.includes(".")))}import{jsx as jsx2,jsxs}from"react/jsx-runtime";function getLine(address,index){return address.line&&address.line.length>index?address.line[index]:""}function setLine(address,index,str){let line=address.line||[];for(;line.length<=index;)line.push("");return line[index]=str,{...address,line}}function AddressInput(props){let[value,setValue]=useState(props.defaultValue||{}),valueRef=useRef(value);valueRef.current=value;let{getExtendedProps}=useContext(ElementsContext),[useProps,typeProps,line1Props,line2Props,cityProps,stateProps,postalCodeProps]=useMemo(()=>["use","type","line1","line2","city","state","postalCode"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(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,{disabled:props.disabled||useProps?.readonly,"data-testid":"address-use",defaultValue:value.use,onChange:e=>setUse(e.currentTarget.value),data:["","home","work","temp","old","billing"]}),jsx2(NativeSelect,{disabled:props.disabled||typeProps?.readonly,"data-testid":"address-type",defaultValue:value.type,onChange:e=>setType(e.currentTarget.value),data:["","postal","physical","both"]}),jsx2(TextInput,{disabled:props.disabled||line1Props?.readonly,placeholder:"Line 1",defaultValue:getLine(value,0),onChange:e=>setLine1(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||line2Props?.readonly,placeholder:"Line 2",defaultValue:getLine(value,1),onChange:e=>setLine2(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||cityProps?.readonly,placeholder:"City",defaultValue:value.city,onChange:e=>setCity(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||stateProps?.readonly,placeholder:"State",defaultValue:value.state,onChange:e=>setState(e.currentTarget.value)}),jsx2(TextInput,{disabled:props.disabled||postalCodeProps?.readonly,placeholder:"Postal Code",defaultValue:value.postalCode,onChange:e=>setPostalCode(e.currentTarget.value)})]})}import{TextInput as TextInput2}from"@mantine/core";import{createReference}from"@medplum/core";import{useMedplumProfile}from"@medplum/react-hooks";import{useState as useState2}from"react";import{jsx as jsx3}from"react/jsx-runtime";function AnnotationInput(props){let author=useMedplumProfile(),[value,setValue]=useState2(props.defaultValue||{});function setText(text){let newValue=text?{text,authorReference:author&&createReference(author),time:new Date().toISOString()}:{};setValue(newValue),props.onChange&&props.onChange(newValue)}return jsx3(TextInput2,{disabled:props.disabled,name:props.name,placeholder:"Annotation text",defaultValue:value.text,onChange:e=>setText(e.currentTarget.value)})}import{AppShell as MantineAppShell3}from"@mantine/core";import{showNotification as showNotification3}from"@mantine/notifications";import{useMedplum as useMedplum4,useMedplumProfile as useMedplumProfile3}from"@medplum/react-hooks";import{Suspense,useEffect as useEffect2,useState as useState9}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,title,className,children,...rest},ref)=>createElement("svg",{ref,...defaultAttributes[type],width:size,height:size,className:["tabler-icon",`tabler-icon-${iconName}`,className].join(" "),...type==="filled"?{fill:color}:{strokeWidth:stroke,stroke:color},...rest},[title&&createElement("title",{key:"svg-title"},title),...iconNode.map(([tag,attrs])=>createElement(tag,attrs)),...Array.isArray(children)?children:[children]]));return Component2.displayName=`${iconNamePascal}`,Component2};var 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 IconBinaryTree=createReactComponent("outline","binary-tree","IconBinaryTree",[["path",{d:"M6 20a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-0"}],["path",{d:"M16 4a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-1"}],["path",{d:"M16 20a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-2"}],["path",{d:"M11 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-3"}],["path",{d:"M21 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-4"}],["path",{d:"M5.058 18.306l2.88 -4.606",key:"svg-5"}],["path",{d:"M10.061 10.303l2.877 -4.604",key:"svg-6"}],["path",{d:"M10.065 13.705l2.876 4.6",key:"svg-7"}],["path",{d:"M15.063 5.7l2.881 4.61",key:"svg-8"}]]);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 IconCake=createReactComponent("outline","cake","IconCake",[["path",{d:"M3 20h18v-8a3 3 0 0 0 -3 -3h-12a3 3 0 0 0 -3 3v8z",key:"svg-0"}],["path",{d:"M3 14.803c.312 .135 .654 .204 1 .197a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1c.35 .007 .692 -.062 1 -.197",key:"svg-1"}],["path",{d:"M12 4l1.465 1.638a2 2 0 1 1 -3.015 .099l1.55 -1.737z",key:"svg-2"}]]);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 IconChevronRight=createReactComponent("outline","chevron-right","IconChevronRight",[["path",{d:"M9 6l6 6l-6 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 IconEmpathize=createReactComponent("outline","empathize","IconEmpathize",[["path",{d:"M12 5.5m-2.5 0a2.5 2.5 0 1 0 5 0a2.5 2.5 0 1 0 -5 0",key:"svg-0"}],["path",{d:"M12 21.368l5.095 -5.096a3.088 3.088 0 1 0 -4.367 -4.367l-.728 .727l-.728 -.727a3.088 3.088 0 1 0 -4.367 4.367l5.095 5.096z",key:"svg-1"}]]);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 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 IconMapPin=createReactComponent("outline","map-pin","IconMapPin",[["path",{d:"M9 11a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-0"}],["path",{d:"M17.657 16.657l-4.243 4.243a2 2 0 0 1 -2.827 0l-4.244 -4.243a8 8 0 1 1 11.314 0z",key:"svg-1"}]]);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 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 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";import{useMedplumProfile as useMedplumProfile2}from"@medplum/react-hooks";function r(e){var t,f,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f)}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}var clsx_default=clsx;import{useState as useState4}from"react";import{Avatar}from"@mantine/core";import{getDisplayString,getImageSrc}from"@medplum/core";import{useCachedBinaryUrl,useResource}from"@medplum/react-hooks";import{Anchor}from"@mantine/core";import{isReference,isResource}from"@medplum/core";import{useMedplumNavigate}from"@medplum/react-hooks";import{ContentType}from"@medplum/core";function killEvent(e){e.preventDefault(),e.stopPropagation()}function isAuxClick(e){return e.button===1||e.ctrlKey||e.metaKey}function isCheckboxCell(el){if(isCheckboxElement(el))return!0;if(el instanceof HTMLTableCellElement){let children=el.children;if(children.length===1&&isCheckboxElement(children[0]))return!0}return!1}function isCheckboxElement(el){return el instanceof HTMLInputElement&&el.type==="checkbox"}async function sendCommand(frame,command){return new Promise((resolve,reject)=>{let channel=new MessageChannel;channel.port1.onmessage=({data:data2})=>{channel.port1.close(),data2.error?reject(data2.error):resolve(data2.result)},frame.contentWindow?.postMessage(command,new URL(frame.src).origin,[channel.port2])})}function exportJsonFile(jsonString,fileName){let blobForExport=new Blob([jsonString],{type:ContentType.JSON}),url=URL.createObjectURL(blobForExport),link=document.createElement("a");link.href=url;let linkName=fileName??new Date().toISOString().replace(/\D/g,"");link.download=`${linkName}.json`,document.body.appendChild(link),link.click(),URL.revokeObjectURL(url)}import{jsx as jsx6}from"react/jsx-runtime";function MedplumLink(props){let navigate=useMedplumNavigate(),{to,suffix,label,onClick,children,...rest}=props,href=getHref(to);return suffix&&(href+="/"+suffix),jsx6(Anchor,{href,"aria-label":label,onAuxClick:e=>{e.stopPropagation()},onClick:e=>{e.stopPropagation(),onClick?(e.preventDefault(),onClick(e)):to&&(isAuxClick(e)||(e.preventDefault(),navigate(href)))},...rest,children})}function getHref(to){if(to){if(typeof to=="string")return getStringHref(to);if(isResource(to))return getResourceHref(to);if(isReference(to))return getReferenceHref(to)}return"#"}function getStringHref(to){return to.startsWith("http://")||to.startsWith("https://")||to.startsWith("/")?to:"/"+to}function getResourceHref(to){return`/${to.resourceType}/${to.id}`}function getReferenceHref(to){return`/${to.reference}`}function getInitials(input){let words=input.split(" ").filter(Boolean);return words.length>1?words[0][0]+words[words.length-1][0]:words.length===1?words[0][0]:""}import{jsx as jsx7}from"react/jsx-runtime";function ResourceAvatar(props){let resource=useResource(props.value),text=resource?getDisplayString(resource):props.alt??"",initials=getInitials(text),uncachedImageUrl=(resource&&getImageSrc(resource))??props.src,imageUrl=useCachedBinaryUrl(uncachedImageUrl??void 0),radius=props.radius??"xl",avatarProps={...props,value:void 0,link:void 0};return props.link?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{useMedplumContext}from"@medplum/react-hooks";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=useMedplumContext(),{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{Group as Group4,Text as Text2}from"@mantine/core";import{formatHumanName as formatHumanName2,getDisplayString as getDisplayString2,getReferenceString as getReferenceString2,isUUID}from"@medplum/core";import{useMedplum,useMedplumNavigate as useMedplumNavigate2}from"@medplum/react-hooks";import{forwardRef as forwardRef2,useCallback as useCallback2}from"react";import{Combobox,Group as Group3,Loader as Loader2,Pill,PillsInput,ScrollAreaAutosize,useCombobox}from"@mantine/core";import{showNotification}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString2}from"@medplum/core";import{useCallback,useEffect,useMemo as useMemo2,useRef as useRef2,useState as useState3}from"react";var AsyncAutocompleteTestIds={selectedItems:"selected-items",options:"options"};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,pillComponent,emptyComponent,onChange,onCreate,creatable,clearable,required,placeholder,leftSection,maxValues,optionsDropdownMaxHeight=320,minInputLength=0,...rest}=props,disabled=rest.disabled,defaultItems=toDefaultItems(defaultValue2),[search,setSearch]=useState3(""),[timer,setTimer]=useState3(),[abortController,setAbortController]=useState3(),[autoSubmit,setAutoSubmit]=useState3(),[selected,setSelected]=useState3(defaultItems.map(toOption4)),[options,setOptions]=useState3([]),ItemComponent3=itemComponent??DefaultItemComponent,PillComponent=pillComponent??DefaultPillComponent,EmptyComponent=emptyComponent??DefaultEmptyComponent,searchRef=useRef2(search);searchRef.current=search;let lastLoadOptionsRef=useRef2(void 0),lastValueRef=useRef2(void 0),timerRef=useRef2(timer);timerRef.current=timer;let abortControllerRef=useRef2(abortController);abortControllerRef.current=abortController;let autoSubmitRef=useRef2(autoSubmit);autoSubmitRef.current=autoSubmit;let optionsRef=useRef2(options);optionsRef.current=options;let handleTimer=useCallback(()=>{if(setTimer(void 0),searchRef.current===lastValueRef.current&&loadOptions===lastLoadOptionsRef.current||(searchRef.current?.length??0)<minInputLength)return;lastValueRef.current=searchRef.current,lastLoadOptionsRef.current=loadOptions;let newAbortController=new AbortController;setAbortController(newAbortController),loadOptions(searchRef.current??"",newAbortController.signal).then(newValues=>{newAbortController.signal.aborted||(setOptions(newValues.map(toOption4)),autoSubmitRef.current?(newValues.length>0&&onChange(newValues.slice(0,1)),setAutoSubmit(!1)):newValues.length>0&&combobox.openDropdown())}).catch(err=>{newAbortController.signal.aborted||err.message.includes("aborted")||showNotification({color:"red",message:normalizeErrorString2(err)})}).finally(()=>{newAbortController.signal.aborted||setAbortController(void 0)})},[combobox,loadOptions,onChange,toOption4,minInputLength]),handleSearchChange=useCallback(e=>{(options&&options.length>0||creatable)&&combobox.openDropdown(),combobox.updateSelectedOptionIndex(),setSearch(e.currentTarget.value),abortControllerRef.current&&(abortControllerRef.current.abort(),setAbortController(void 0)),timerRef.current!==void 0&&window.clearTimeout(timerRef.current);let newTimer=window.setTimeout(()=>handleTimer(),100);setTimer(newTimer)},[combobox,options,creatable,handleTimer]),addSelected=useCallback(newValue=>{let alreadySelected=selected.some(v=>v.value===newValue),newSelected=alreadySelected?selected.filter(v=>v.value!==newValue):[...selected],option=options?.find(option2=>option2.value===newValue);if(!option&&creatable!==!1&&onCreate){let createdResource=onCreate(newValue);option=toOption4(createdResource)}if(option){if(maxValues===0){onChange([option.resource]),selected.length>0&&setSelected([]);return}alreadySelected||newSelected.push(option)}if(maxValues!==void 0)for(;newSelected.length>maxValues;)newSelected.shift();onChange(newSelected.map(v=>v.resource)),setSelected(newSelected)},[creatable,options,selected,maxValues,onChange,onCreate,toOption4]),handleValueSelect=useMemo2(()=>{if(!disabled)return val=>{disabled||(maxValues===1&&(setSearch(""),setOptions([]),combobox.closeDropdown()),lastValueRef.current=void 0,val==="$create"?(setSearch(""),addSelected(search)):addSelected(val))}},[addSelected,combobox,disabled,maxValues,search]),handleValueRemove=useCallback(item=>{let newSelected=selected.filter(v=>v.value!==item.value);onChange(newSelected.map(v=>v.resource)),setSelected(newSelected)},[selected,onChange]),handleKeyDown=useCallback(e=>{e.key==="Enter"?(timer||abortController)&&setAutoSubmit(!0):e.key==="Backspace"&&search.length===0&&(killEvent(e),handleValueRemove(selected[selected.length-1]))},[abortController,handleValueRemove,search.length,selected,timer]);useEffect(()=>()=>{abortControllerRef.current&&abortControllerRef.current.abort()},[]);let clearButton=!disabled&&clearable&&selected.length>0&&jsx10(Combobox.ClearButton,{title:"Clear all",size:"sm",onClear:()=>{setSearch(""),setSelected([]),onChange([]),combobox.closeDropdown()}}),createVisible=creatable&&search.trim().length>0,comboboxVisible=options.length>0||createVisible;return 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,disabled,children:jsxs3(Pill.Group,{"data-testid":AsyncAutocompleteTestIds.selectedItems,children:[selected.map(item=>jsx10(PillComponent,{item,disabled,onRemove:()=>handleValueRemove(item)},item.value)),!disabled&&(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(),setSearch("")},onKeyDown:handleKeyDown,onChange:handleSearchChange})})]})})}),jsx10(Combobox.Dropdown,{hidden:!comboboxVisible,"data-testid":AsyncAutocompleteTestIds.options,children:jsx10(Combobox.Options,{children:jsxs3(ScrollAreaAutosize,{type:"scroll",mah:optionsDropdownMaxHeight,children:[options.map(item=>{let active=selected.some(v=>v.value===item.value);return jsx10(Combobox.Option,{value:item.value,active,children:jsx10(ItemComponent3,{...item,active})},item.value)}),createVisible&&jsxs3(Combobox.Option,{value:"$create",children:["+ Create ",search]}),!creatable&&search.trim().length>0&&options.length===0&&jsx10(EmptyComponent,{search})]})})})]})}function toDefaultItems(defaultValue2){return defaultValue2?Array.isArray(defaultValue2)?defaultValue2:[defaultValue2]:[]}function DefaultItemComponent(props){return jsxs3(Group3,{gap:"xs",children:[props.active&&jsx10(IconCheck,{size:12}),jsx10("span",{children:props.label})]})}function DefaultPillComponent({item,disabled,onRemove}){return jsx10(Pill,{withRemoveButton:!disabled,onRemove,children:item.label})}function DefaultEmptyComponent(){return jsx10(Combobox.Empty,{children:"Nothing found"})}var HeaderSearchInput_default={searchInput:"HeaderSearchInput_searchInput"};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=useMedplumNavigate2(),medplum=useMedplum(),loadData=useCallback2(async(input,signal)=>{let query=buildGraphQLQuery(input),options={signal},response=await medplum.graphql(query,void 0,void 0,options);return getResourcesFromResponse(response,input)},[medplum]),handleSelect=useCallback2(item=>{item.length>0&&navigate(`/${getReferenceString2(item[0])}`)},[navigate]);return 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,active:_active,...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
|
|
@@ -68,9 +68,9 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
|
|
|
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 Group26,Stack as Stack10,Text as Text11}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useMedplum as useMedplum19}from"@medplum/react-hooks";import{useContext as useContext19,useEffect as useEffect12,useState as useState38}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group25,Stack as Stack9,Text as Text10}from"@mantine/core";import{buildElementsContext as buildElementsContext3,getPropertyDisplayName,isEmpty as isEmpty5,isPopulated as isPopulated10}from"@medplum/core";import{useContext as useContext18,useMemo as useMemo18,useState as useState37}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon3,Button as Button5}from"@mantine/core";import{jsx as jsx75}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx75(Button5,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx75(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx75(ActionIcon3,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx75(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon4}from"@mantine/core";import{jsx as jsx76}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx76(ActionIcon4,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx76(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx77,jsxs as jsxs41}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState37(props.defaultValue),sliceElements=slice.typeSchema?.elements??slice.elements,parentElementsContextValue=useContext18(ElementsContext),contextValue=useMemo18(()=>{if(isPopulated10(sliceElements))return buildElementsContext3({parentContext:parentElementsContextValue,elements:sliceElements,path:props.path,profileUrl:slice.typeSchema?.url})},[parentElementsContextValue,props.path,slice.typeSchema?.url,sliceElements]);function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}let required=slice.min>0,indentedStack=isEmpty5(slice.elements),propertyDisplayName=getPropertyDisplayName(slice.name),showEmptyMessage=props.property.readonly&&values.length===0;return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx77(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx77(Text10,{c:"dimmed",children:"(empty)"}):jsxs41(Stack9,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs41(Group25,{wrap:"nowrap",children:[jsx77("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx77(ElementDefinitionTypeInput,{elementDefinitionType:slice.type[0],name:slice.name,defaultValue:value,onChange:newValue=>{let newValues=[...values];newValues[valueIndex]=newValue,setValuesWrapper(newValues)},outcome:props.outcome,min:slice.min,max:slice.max,binding:slice.binding,path:props.path,valuePath:void 0,readOnly:props.property.readonly})}),!props.property.readonly&&values.length>slice.min&&jsx77(ArrayRemoveButton,{propertyDisplayName,testId:props.testId&&`${props.testId}-remove-${valueIndex}`,onClick:e=>{killEvent(e);let newValues=[...values];newValues.splice(valueIndex,1),setValuesWrapper(newValues)}})]},`${valueIndex}-${values.length}`)),!props.property.readonly&&values.length<slice.max&&jsx77(Group25,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx77(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx78,jsxs as jsxs42}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum19(),[loading,setLoading]=useState38(!0),[slices,setSlices]=useState38([]),[defaultValue2]=useState38(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState38(()=>[defaultValue2]),ctx=useContext19(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect12(()=>{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 jsx78("div",{children:"Loading..."});let nonSliceIndex=slices.length,nonSliceValues=slicedValues[nonSliceIndex],showNonSliceValues=!(props.hideNonSliceValues??(propertyTypeCode==="Extension"&&slices.length>0)),propertyDisplayName=getPathDisplayName4(property.path),showEmptyMessage=props.property.readonly&&slices.length===0&&defaultValue2.length===0;return jsxs42(Stack10,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx78(Text11,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx78(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)=>jsxs42(Group26,{wrap:"nowrap",style:{flexGrow:1},children:[jsx78("div",{style:{flexGrow:1},children:jsx78(ResourcePropertyInput,{arrayElement:!0,property:props.property,name:props.name+"."+valueIndex,path:props.path,valuePath:getValuePath(props.path,props.valuePath,valueIndex),defaultValue:value,onChange:newValue=>{let newNonSliceValues=[...nonSliceValues];newNonSliceValues[valueIndex]=newValue,setValuesWrapper(newNonSliceValues,nonSliceIndex)},defaultPropertyType:void 0,outcome:props.outcome})}),!props.property.readonly&&jsx78(ArrayRemoveButton,{propertyDisplayName,testId:`nonsliced-remove-${valueIndex}`,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.splice(valueIndex,1),setValuesWrapper(newNonSliceValues,nonSliceIndex)}})]},`${valueIndex}-${nonSliceValues.length}`)),!props.property.readonly&&showNonSliceValues&&slicedValues.flat().length<property.max&&jsx78(Group26,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx78(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 as Flex2,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification5}from"@mantine/notifications";import{useRef as useRef11,useState as useState39}from"react";import{jsx as jsx79,jsxs as jsxs43}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState39(!1),clipboard=useClipboard(),ref=useRef11(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs43(Flex2,{gap:"xs",children:[jsx79(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx79(ActionIcon5,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification5({color:"green",message:"Copied"})},children:jsx79(IconCopy,{})})]})}import{Button as Button6,Chip,Group as Group27,Modal as Modal2,NativeSelect as NativeSelect8,Stack as Stack11,Switch,TextInput as TextInput16}from"@mantine/core";import{formatTiming as formatTiming2}from"@medplum/core";import{useContext as useContext20,useMemo as useMemo19,useRef as useRef12,useState as useState40}from"react";import{Fragment as Fragment27,jsx as jsx80,jsxs as jsxs44}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState40(props.defaultValue),[open,setOpen]=useState40(!props.disabled&&(props.defaultModalOpen??!1)),valueRef=useRef12(value);return valueRef.current=value,jsxs44(Fragment27,{children:[jsxs44(Group27,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx80("span",{children:formatTiming2(valueRef.current)||"No repeat"}),jsx80(Button6,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx80(TimingEditorDialog,{path:props.path,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]=useState40(props.defaultValue||defaultValue),{getExtendedProps}=useContext20(ElementsContext),[eventProps,repeatProps,repeatPeriodProps,repeatPeriodUnitProps,repeatDayOfWeekProps]=useMemo19(()=>["event","repeat","repeat.period","repeat.periodUnit","repeat.dayOfWeek"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]),valueRef=useRef12(value);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 jsx80(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs44(Stack11,{children:[jsx80(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx80(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx80(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs44(Fragment27,{children:[jsx80(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs44(Group27,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx80(TextInput16,{disabled:repeatPeriodProps?.readonly,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)}),jsx80(NativeSelect8,{disabled:repeatPeriodUnitProps?.readonly,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"&&jsx80(FormSection,{title:"Repeat on",children:jsx80(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,children:jsx80(Group27,{justify:"space-between",mt:"md",gap:"xs",children:daysOfWeek.map(day=>jsx80(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,children:day.charAt(0).toUpperCase()},day))})})})]}),jsx80(Group27,{justify:"flex-end",children:jsx80(Button6,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx81,jsxs as jsxs45}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 jsx81(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx81(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx81(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx81(ElementDefinitionTypeInput,{name,defaultValue:defaultValue2,onChange:newValue=>{if(props.onChange){let newPropName=props.name.replace("[x]",capitalize2(propertyTypes[0].code));props.onChange(newValue,newPropName)}},outcome:props.outcome,elementDefinitionType:propertyTypes[0],min:property.min,max:property.min,binding:property.binding,path:props.path,valuePath:props.valuePath,readOnly:property.readonly})}function ElementDefinitionInputSelector(props){let propertyTypes=props.elementDefinitionTypes,initialPropertyType;props.defaultPropertyType&&(initialPropertyType=propertyTypes.find(t=>t.code===props.defaultPropertyType)),initialPropertyType||(initialPropertyType=propertyTypes[0]);let[selectedType,setSelectedType]=useState41(initialPropertyType);return jsxs45(Group28,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx81(NativeSelect9,{disabled:props.property.readonly,style:{width:"200px"},defaultValue:selectedType.code,"data-testid":props.name&&props.name+"-selector",onChange:e=>{setSelectedType(propertyTypes.find(type=>type.code===e.currentTarget.value))},data:propertyTypes.map(type=>({value:type.code,label:type.code}))}),jsx81(ElementDefinitionTypeInput,{name:props.name,defaultValue:props.defaultValue,outcome:props.outcome,elementDefinitionType:selectedType,onChange:newValue=>{props.onChange&&props.onChange(newValue,props.name.replace("[x]",capitalize2(selectedType.code)))},min:props.property.min,max:props.property.max,binding:props.property.binding,path:props.property.path,valuePath:props.valuePath,readOnly:props.property.readonly})]})}function ElementDefinitionTypeInput(props){let{name,onChange,outcome,binding,path,valuePath,readOnly}=props,required=props.min!==void 0&&props.min>0,propertyType=props.elementDefinitionType.code,elementsContext=useContext21(ElementsContext),defaultValue2=useMemo20(()=>{if(!isComplexTypeCode(propertyType)||!isEmpty6(props.defaultValue))return props.defaultValue;let withDefaults=Object.create(null);if(elementsContext.path===props.path)applyDefaultValuesToElement(withDefaults,elementsContext.elements);else{let key=getPathDifference(elementsContext.path,props.path);if(key===void 0)return props.defaultValue;applyDefaultValuesToElement(withDefaults,elementsContext.elements,key)}return isPopulated11(withDefaults)?withDefaults:props.defaultValue},[propertyType,elementsContext.path,elementsContext.elements,props.path,props.defaultValue]);if(!propertyType)return jsx81("div",{children:"Property type not specified "});function getComplexInputProps(){return{name,defaultValue:defaultValue2,onChange,outcome,path,valuePath,disabled:readOnly}}function getPrimitiveInputProps(){let error=getErrorsForInput(props.outcome,valuePath??path);return{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,error,disabled:readOnly}}switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.string:case PropertyType2.time:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"?jsx81(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx81(TextInput17,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx81(TextInput17,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx81(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx81(TextInput17,{...getPrimitiveInputProps(),type:"number",step:propertyType===PropertyType2.decimal?"any":"1",onChange:e=>{if(onChange){let num=e.currentTarget.valueAsNumber;onChange(Number.isNaN(num)?void 0:num)}}});case PropertyType2.code:return jsx81(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx81(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:return jsx81(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx81(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx81(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx81(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx81(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx81(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx81(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx81(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx81(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx81(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx81(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx81(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx81(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx81(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx81(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx81(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx81(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx81(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx81(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 jsx82}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState42(props.defaultValue??{}),elementsContext=useContext22(ElementsContext),elementsToRender=useMemo21(()=>getElementsToRender(elementsContext.elements),[elementsContext.elements]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let typedValue={type:props.type,value};return jsx82(Stack12,{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=jsx82(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"?jsx82(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx82(FormSection,{title:getPathDisplayName5(key),description:element.description,withAsterisk:required,htmlFor:key,outcome:props.outcome,fhirPath:element.path,errorExpression:valuePath,readonly:element.readonly,children:resourcePropertyInput},key)})})}import{jsx as jsx83,jsxs as jsxs46}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState43(()=>props.defaultValue??{}),parentElementsContext=useContext23(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo22(()=>tryGetDataType2(props.typeName,profileUrl),[props.typeName,profileUrl]),type=typeSchema?.type??props.typeName,contextValue=useMemo22(()=>{if(typeSchema)return buildElementsContext4({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);return typeSchema?maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx83(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})):jsxs46("div",{children:[type,"\xA0not implemented"]})}import{Button as Button7,Group as Group29}from"@mantine/core";import{useMemo as useMemo23,useState as useState44}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 jsx84,jsxs as jsxs47}from"react/jsx-runtime";function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState44(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth.getTime());return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=useMemo23(()=>buildGrid(month,props.slots),[month,props.slots]);return jsxs47("div",{children:[jsxs47(Group29,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx84("p",{style:{flex:1},children:getMonthString(month)}),jsxs47(Group29,{justify:"flex-end",gap:"xs",children:[jsx84(Button7,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx84(Button7,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs47("table",{className:CalendarInput_default.table,children:[jsx84("thead",{children:jsxs47("tr",{children:[jsx84("th",{children:"SUN"}),jsx84("th",{children:"MON"}),jsx84("th",{children:"TUE"}),jsx84("th",{children:"WED"}),jsx84("th",{children:"THU"}),jsx84("th",{children:"FRI"}),jsx84("th",{children:"SAT"})]})}),jsx84("tbody",{children:grid.map((week,weekIndex)=>jsx84("tr",{children:week.map((day,dayIndex)=>jsx84("td",{children:day&&jsx84(Button7,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,slots){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d.getTime()),available:isDayAvailable(d,slots)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,slots){for(let slot of slots){let slotStart=new Date(slot.start);if(slotStart.getFullYear()===day.getFullYear()&&slotStart.getMonth()===day.getMonth()&&slotStart.getDate()===day.getDate())return!0}return!1}import{ActionIcon as ActionIcon6,Group as Group30,LoadingOverlay,Paper as Paper2,ScrollArea as ScrollArea2,Skeleton,Stack as Stack13,TextInput as TextInput18,Title as Title5}from"@mantine/core";import{useResizeObserver}from"@mantine/hooks";import{showNotification as showNotification6}from"@mantine/notifications";import{getDisplayString as getDisplayString4,getReferenceString as getReferenceString4,normalizeErrorString as normalizeErrorString6}from"@medplum/core";import{useMedplum as useMedplum20,useResource as useResource3,useSubscription}from"@medplum/react-hooks";import{useCallback as useCallback10,useEffect as useEffect13,useMemo as useMemo24,useRef as useRef13,useState as useState45}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 jsx85,jsxs as jsxs48}from"react/jsx-runtime";function showError(message){showNotification6({color:"red",title:"Error",message,autoClose:!1})}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((a,b)=>a.sent.localeCompare(b.sent)),setCommunications(newCommunications)}function BaseChat(props){let{title,communications,setCommunications,query,sendMessage,onMessageReceived,onMessageUpdated,inputDisabled,onError,...paperProps}=props,medplum=useMedplum20(),inputRef=useRef13(null),scrollAreaRef=useRef13(null),firstScrollRef=useRef13(!0),initialLoadRef=useRef13(!0),[profile,setProfile]=useState45(medplum.getProfile()),[reconnecting,setReconnecting]=useState45(!1),[loading,setLoading]=useState45(!0);loading||(initialLoadRef.current=!1);let profileRefStr=useMemo24(()=>profile?getReferenceString4(medplum.getProfile()):"",[profile,medplum]),searchMessages=useCallback10(async()=>{setLoading(!0);let searchParams=new URLSearchParams(query);searchParams.append("_sort","-sent"),searchParams.append("sent:missing","false");let searchResult=await medplum.searchResources("Communication",searchParams,{cache:"no-cache"});upsertCommunications(communicationsRef.current,searchResult,setCommunications),setLoading(!1)},[medplum,setCommunications,query]);useEffect13(()=>{searchMessages().catch(err=>showNotification6({color:"red",message:normalizeErrorString6(err)}))},[searchMessages]),useSubscription(`Communication?${query}`,bundle=>{let communication=bundle.entry?.[1]?.resource;upsertCommunications(communicationsRef.current,[communication],setCommunications),getReferenceString4(communication.sender)!==profileRefStr&&(communicationsRef.current.find(c=>c.id===communication.id)?onMessageUpdated?.(communication):onMessageReceived?.(communication))},{onWebSocketClose:useCallback10(()=>{reconnecting||setReconnecting(!0),showNotification6({color:"red",message:"Live chat disconnected. Attempting to reconnect..."})},[reconnecting]),onWebSocketOpen:useCallback10(()=>{reconnecting&&showNotification6({color:"green",message:"Live chat reconnected."})},[reconnecting]),onSubscriptionConnect:useCallback10(()=>{reconnecting&&(searchMessages().catch(err=>showNotification6({color:"red",message:normalizeErrorString6(err)})),setReconnecting(!1))},[reconnecting,searchMessages]),onError:useCallback10(err=>{onError?onError(err):showError(normalizeErrorString6(err))},[onError])});let sendMessageInternal=useCallback10(formData=>{inputDisabled||(inputRef.current&&(inputRef.current.value=""),sendMessage(formData.message),scrollToBottomRef.current=!0)},[inputDisabled,sendMessage]);useEffect13(()=>{let latestProfile=medplum.getProfile();profile?.id!==latestProfile?.id&&(setProfile(latestProfile),setCommunications([]))});let[parentRef,parentRect]=useResizeObserver(),communicationsRef=useRef13(communications);communicationsRef.current=communications;let prevCommunicationsRef=useRef13(communications),scrollToBottomRef=useRef13(!0);useEffect13(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),useEffect13(()=>{scrollToBottomRef.current&&scrollAreaRef.current?.scrollTo&&(scrollAreaRef.current.scrollTo({top:scrollAreaRef.current.scrollHeight,...firstScrollRef.current?{duration:0}:{behavior:"smooth"}}),firstScrollRef.current=!1,scrollToBottomRef.current=!1)});let myLastDeliveredId=useMemo24(()=>{let i=communications.length;for(;i--;){let comm=communications[i];if(comm.sender?.reference===profileRefStr&&comm.received)return comm.id}return""},[communications,profileRefStr]);return profile?jsxs48(Paper2,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[jsx85(Title5,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx85("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs48(Stack13,{align:"stretch",mt:"lg",children:[jsxs48(Group30,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx85(Skeleton,{height:38,circle:!0,ml:"md"}),jsx85(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs48(Group30,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx85(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx85(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs48(Group30,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx85(Skeleton,{height:38,circle:!0,ml:"md"}),jsx85(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs48(ScrollArea2,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx85(LoadingOverlay,{visible:loading||reconnecting,style:{width:parentRect.width,height:parentRect.height,position:"absolute",zIndex:1}}),communications.map((c,i)=>{let prevCommunication=i>0?communications[i-1]:void 0,prevCommTime=prevCommunication?parseSentTime(prevCommunication):void 0,currCommTime=parseSentTime(c);return jsxs48(Stack13,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx85("div",{style:{textAlign:"center"},children:currCommTime}),c.sender?.reference===profileRefStr?jsxs48(Group30,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx85(ChatBubble,{alignment:"right",communication:c,showDelivered:!!c.received&&c.id===myLastDeliveredId}),jsx85(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender})]}):jsxs48(Group30,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx85(ResourceAvatar,{radius:"xl",value:c.sender}),jsx85(ChatBubble,{alignment:"left",communication:c})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsx85("div",{className:BaseChat_default.chatInputContainer,children:jsx85(Form,{onSubmit:sendMessageInternal,children:jsx85(TextInput18,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",rightSectionWidth:42,disabled:inputDisabled,rightSection:inputDisabled?void 0:jsx85(ActionIcon6,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx85(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=useResource3(communication.sender);return jsxs48("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx85("div",{className:clsx_default(BaseChat_default.chatBubbleName,alignment==="right"&&BaseChat_default.chatBubbleNameRight),"aria-label":"Sender name",children:senderResource?getDisplayString4(senderResource):"[Unknown sender]"}),jsx85("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx85("div",{className:BaseChat_default.chatBubble,children:content})}),showDelivered&&jsxs48("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs48("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx85("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx85("div",{style:{position:"relative"},children:jsx85(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx85("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx85("div",{className:BaseChat_default.chatBubble,children:jsx85(Skeleton,{height:14,width:parentWidth*.5,radius:"l"})})})]})}import{ActionIcon as ActionIcon7}from"@mantine/core";import{useMedplumProfile as useMedplumProfile4}from"@medplum/react-hooks";import{useEffect as useEffect14,useState as useState46}from"react";var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};import{Fragment as Fragment28,jsx as jsx86,jsxs as jsxs49}from"react/jsx-runtime";function ChatModal(props){let{open,children}=props,profile=useMedplumProfile4(),[opened,setOpened]=useState46(open??!1);return useEffect14(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?jsxs49(Fragment28,{children:[opened&&jsx86("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx86("div",{className:ChatModal_default.iconContainer,children:jsx86(ActionIcon7,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx86(IconChevronDown,{size:"1.625rem"})})}):jsx86("div",{className:ChatModal_default.iconContainer,children:jsx86(ActionIcon7,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx86(IconChevronUp,{size:"1.625rem"})})})]}):null}import{createReference as createReference3,formatCodeableConcept as formatCodeableConcept2,getReferenceString as getReferenceString5}from"@medplum/core";import{useMedplum as useMedplum21,useMedplumProfile as useMedplumProfile5,usePrevious}from"@medplum/react-hooks";import{useCallback as useCallback11,useEffect as useEffect15,useMemo as useMemo25,useState as useState47}from"react";import{jsx as jsx87}from"react/jsx-runtime";function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,onError}=props,medplum=useMedplum21(),profile=useMedplumProfile5(),prevThreadId=usePrevious(thread?.id),[communications,setCommunications]=useState47([]),profileRef=useMemo25(()=>profile?createReference3(profile):void 0,[profile]),threadRef=useMemo25(()=>createReference3(thread),[thread]);useEffect15(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=useCallback11(message=>{let profileRefStr=profileRef?getReferenceString5(profileRef):void 0;profileRefStr&&medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>getReferenceString5(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload:[{contentString:message}],partOf:[threadRef]}).then(communication=>{setCommunications([...communications,communication]),onMessageSent?.(communication)}).catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent]),onMessageReceived=useMemo25(()=>thread.recipient?.length===2?message=>{message.received&&message.status==="completed"||medplum.updateResource({...message,received:message.received??new Date().toISOString(),status:"completed"}).catch(console.error)}:void 0,[medplum,thread.recipient?.length]);return profile?jsx87(BaseChat,{title:title??(thread?.topic?formatCodeableConcept2(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled,onError}):null}import{ActionIcon as ActionIcon9,Center as Center7,Group as Group34,Loader as Loader3,ScrollArea as ScrollArea3,TextInput as TextInput19}from"@mantine/core";import{showNotification as showNotification7,updateNotification}from"@mantine/notifications";import{createReference as createReference4,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useMedplum as useMedplum25,useResource as useResource7}from"@medplum/react-hooks";import{useCallback as useCallback12,useEffect as useEffect19,useRef as useRef14,useState as useState53}from"react";import{Group as Group32,List,Stack as Stack15,Text as Text13,Title as Title6}from"@mantine/core";import{capitalize as capitalize3,formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime2,formatObservationValue,isReference as isReference2}from"@medplum/core";import{useMedplum as useMedplum22,useResource as useResource5}from"@medplum/react-hooks";import{useEffect as useEffect16,useState as useState49}from"react";import{Blockquote,Stack as Stack14}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx88}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx88(Stack14,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx88(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 Group31}from"@mantine/core";import{Text as Text12}from"@mantine/core";import{getDisplayString as getDisplayString5,isOk,normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useResource as useResource4}from"@medplum/react-hooks";import{useState as useState48}from"react";import{jsx as jsx89}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState48(),resource=useResource4(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString7(outcome)}]`;else if(resource)text=getDisplayString5(resource);else return null;return link?jsx89(MedplumLink,{to:value,...rest,children:text}):jsx89(Text12,{component:"span",...rest,children:text})}import{jsx as jsx90,jsxs as jsxs50}from"react/jsx-runtime";function ResourceBadge(props){return jsxs50(Group31,{gap:"xs",children:[jsx90(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx90(ResourceName,{value:props.value,link:props.link})]})}import{Badge}from"@mantine/core";import{jsx as jsx91}from"react/jsx-runtime";var statusToColor={draft:"blue",active:"blue","on-hold":"yellow",revoked:"red",completed:"green","entered-in-error":"red",unknown:"gray",retired:"gray",registered:"blue",preliminary:"blue",final:"green",amended:"yellow",corrected:"yellow",cancelled:"red",requested:"blue",received:"blue",accepted:"blue",rejected:"red",ready:"blue","in-progress":"blue",failed:"red",proposed:"blue",pending:"blue",booked:"blue",arrived:"blue",fulfilled:"green",noshow:"red","checked-in":"blue",waitlist:"gray",routine:"gray",urgent:"red",asap:"red",stat:"red","not-done":"red",connected:"green",disconnected:"red",finished:"green",planned:"gray"};function StatusBadge(props){return jsx91(Badge,{color:statusToColor[props.status],children:props.status.replace(/-/g," ")})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment29,jsx as jsx92,jsxs as jsxs51}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum22(),diagnosticReport=useResource5(props.value),[specimens,setSpecimens]=useState49();if(useEffect16(()=>{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 jsxs51(Stack15,{children:[jsx92(Title6,{children:"Diagnostic Report"}),jsx92(DiagnosticReportHeader,{value:diagnosticReport}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx92(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx92(NoteDisplay,{value:specimenNotes})]})}function DiagnosticReportHeader({value}){return jsxs51(Group32,{mt:"md",gap:30,children:[value.subject&&jsxs51("div",{children:[jsx92(Text13,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx92(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs51("div",{children:[jsx92(Text13,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx92(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs51("div",{children:[jsx92(Text13,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx92(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs51("div",{children:[jsx92(Text13,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx92(Text13,{children:formatDateTime2(value.issued)})]}),value.status&&jsxs51("div",{children:[jsx92(Text13,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx92(Text13,{children:capitalize3(value.status)})]})]})}function SpecimenInfo(specimens){return jsxs51(Stack15,{gap:"xs",children:[jsx92(Title6,{order:2,size:"h6",children:"Specimens"}),jsx92(List,{type:"ordered",children:specimens?.map(specimen=>jsx92(List.Item,{ml:"sm",children:jsxs51(Group32,{gap:20,children:[jsxs51(Group32,{gap:5,children:[jsx92(Text13,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs51(Group32,{gap:5,children:[jsx92(Text13,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs51("table",{className:DiagnosticReportDisplay_default.table,children:[jsx92("thead",{children:jsxs51("tr",{children:[jsx92("th",{children:"Test"}),jsx92("th",{children:"Value"}),jsx92("th",{children:"Reference Range"}),jsx92("th",{children:"Interpretation"}),jsx92("th",{children:"Category"}),jsx92("th",{children:"Performer"}),jsx92("th",{children:"Status"})]})}),jsx92("tbody",{children:jsx92(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx92(Fragment29,{children:props.value?.map(observation=>jsx92(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference2(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource5(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs51(Fragment29,{children:[jsxs51("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx92("td",{rowSpan:displayNotes?2:1,children:jsx92(MedplumLink,{to:observation,children:jsx92(CodeableConceptDisplay,{value:observation.code})})}),jsx92("td",{children:jsx92(ObservationValueDisplay,{value:observation})}),jsx92("td",{children:jsx92(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx92("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx92(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx92("td",{children:observation.category&&observation.category.length>0&&jsx92(Fragment29,{children:observation.category.map(concept=>jsx92("div",{children:jsx92(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx92("td",{children:observation.performer?.map(performer=>jsx92(ReferenceDisplay,{value:performer},performer.reference))}),jsx92("td",{children:observation.status&&jsx92(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx92(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx92("tr",{children:jsx92("td",{colSpan:6,children:jsx92(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx92(Fragment29,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx92(Fragment29,{children:range.text}):jsx92(RangeDisplay,{value:range}):null}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;return code==="AA"||code==="LL"||code==="HH"||code==="A"}var import_rfc6902=__toESM(require_rfc6902(),1);import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize4,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum23}from"@medplum/react-hooks";import{useEffect as useEffect17,useMemo as useMemo26,useState as useState51}from"react";import{Button as Button8,Table}from"@mantine/core";import{useState as useState50}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment30,jsx as jsx93,jsxs as jsxs52}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState50(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx93(Fragment30,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx93(Fragment30,{children:jsxs52(Table.Tr,{children:[jsx93(Table.Td,{children:name}),jsx93(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx93(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx93(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx93(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs52(Table.Tr,{children:[jsx93(Table.Td,{children:name}),jsx93(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx93(Button8,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx94,jsxs as jsxs53}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum23(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState51(!1);useEffect17(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo26(()=>{if(!schemaLoaded)return null;let typedOriginal=[toTypedValue(original)],typedRevised=[toTypedValue(revised)],result=[],patch=mergePatchOperations((0,import_rfc6902.createPatch)(original,revised));for(let op of patch){let path=op.path,fhirPath=jsonPathToFhirPath(path),property=tryGetElementDefinition(original.resourceType,fhirPath),originalValue=op.op==="add"?void 0:evalFhirPathTyped(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:evalFhirPathTyped(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${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?jsxs53(Table2,{className:ResourceDiffTable_default.root,children:[jsx94(Table2.Thead,{children:jsxs53(Table2.Tr,{children:[jsx94(Table2.Th,{}),jsx94(Table2.Th,{children:"Before"}),jsx94(Table2.Th,{children:"After"})]})}),jsx94(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx94(ResourceDiffRow,{...rest},key)})})]}):null}function mergePatchOperations(patch){let result=[];for(let patchOperation of patch){let{op,path}=patchOperation;if(path.startsWith("/meta/author")||path.startsWith("/meta/compartment")||path.startsWith("/meta/lastUpdated")||path.startsWith("/meta/versionId"))continue;let count=patch.filter(el=>el.op===op&&el.path===path).length,resultOperation={op,path};count>1&&(op==="add"||op==="remove")&&/\/[0-9-]+$/.test(path)&&(resultOperation.op="replace",resultOperation.path=path.replace(/\/[^/]+$/,"")),result.some(el=>el.op===resultOperation.op&&el.path===resultOperation.path)||result.push(resultOperation)}return result}function jsonPathToFhirPath(path){let parts=path.split("/").filter(Boolean),result="";for(let i=0;i<parts.length;i++){let part=parts[i];part==="-"?result+=".last()":/^\d+$/.test(part)?result+=`[${part}]`:(i>0&&(result+="."),result+=part)}return result.endsWith(".url")&&(result=result.replace(/\.url$/,"")),result}function tryGetElementDefinition(resourceType,fhirPath){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(v=>v.value);return isArray?inputValue:inputValue[0]}import{AccessPolicyInteraction,satisfiedAccessPolicy,tryGetProfile as tryGetProfile4}from"@medplum/core";import{useMedplum as useMedplum24,useResource as useResource6}from"@medplum/react-hooks";import{useEffect as useEffect18,useMemo as useMemo27,useState as useState52}from"react";import{jsx as jsx95}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum24(),accessPolicy=medplum.getAccessPolicy(),value=useResource6(props.value),[schemaLoaded,setSchemaLoaded]=useState52(!1);useEffect18(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{tryGetProfile4(profileUrl)?setSchemaLoaded(!0):console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)});else{let schemaName=value.resourceType;medplum.requestSchema(schemaName).then(()=>{setSchemaLoaded(!0)}).catch(console.error)}},[medplum,profileUrl,value]);let accessPolicyResource=useMemo27(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx95(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon8,Group as Group33,Menu as Menu3,Text as Text14}from"@mantine/core";import{formatDateTime as formatDateTime3,getReferenceString as getReferenceString6}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx96,jsxs as jsxs54}from"react/jsx-runtime";function Timeline(props){return jsx96(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 jsxs54(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs54(Group33,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx96(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs54("div",{style:{flex:1},children:[jsx96(Text14,{size:"sm",children:jsx96(ResourceName,{c:"dark",fw:500,value:author,link:!0})}),jsxs54(Text14,{size:"xs",children:[jsx96(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime3(dateTime)}),jsx96(Text14,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx96(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs54(Menu3,{position:"bottom-end",shadow:"md",width:200,children:[jsx96(Menu3.Target,{children:jsx96(ActionIcon8,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString6(props.resource)}`,children:jsx96(IconDots,{})})}),popupMenuItems]})]}),jsx96(ErrorBoundary,{children:jsx96("div",{className:clsx_default(Timeline_default.item,{[Timeline_default.itemPadding]:padding}),children:props.children})})]})}function sortByDateAndPriority(resources,timelineResource){resources.sort((a,b)=>{let priority1=getPriorityScore(a,timelineResource),priority2=getPriorityScore(b,timelineResource);return priority1>priority2?1:priority1<priority2?-1:getTime(a,timelineResource)-getTime(b,timelineResource)})}function getPriorityScore(resource,timelineResource){if(!isSameResourceType(resource,timelineResource)){let priority=resource.priority;if(typeof priority=="string")return{stat:4,asap:3,urgent:2}[priority]??0}return 0}function getTime(resource,timelineResource){if(!isSameResourceType(resource,timelineResource)){if(resource.resourceType==="Communication"&&resource.sent)return new Date(resource.sent).getTime();if((resource.resourceType==="DiagnosticReport"||resource.resourceType==="Media"||resource.resourceType==="Observation")&&resource.issued)return new Date(resource.issued).getTime();if(resource.resourceType==="DocumentReference"&&resource.date)return new Date(resource.date).getTime()}let dateTime=resource.meta?.lastUpdated;return dateTime?new Date(dateTime).getTime():0}function isSameResourceType(a,b){return!!b&&a.resourceType===b.resourceType&&a.id===b.id}var ResourceTimeline_default={pinnedComment:"ResourceTimeline_pinnedComment"};import{jsx as jsx97,jsxs as jsxs55}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum25(),sender=medplum.getProfile(),inputRef=useRef14(null),resource=useResource7(props.value),[history,setHistory]=useState53(),[items,setItems]=useState53([]),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef14(items);itemsRef.current=items;let sortAndSetItems=useCallback12(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback12(batchResponse=>{let newItems=[];for(let settledResult of batchResponse){if(settledResult.status!=="fulfilled")continue;let bundle=settledResult.value;if(bundle.type==="history"&&setHistory(bundle),bundle.entry)for(let entry of bundle.entry)newItems.push(entry.resource)}sortAndSetItems(newItems)},[sortAndSetItems]),addResource=useCallback12(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback12(()=>{let resourceType,id;"resourceType"in props.value?(resourceType=props.value.resourceType,id=props.value.id):[resourceType,id]=props.value.reference?.split("/"),loadTimelineResources(medplum,resourceType,id).then(handleBatchResponse).catch(console.error)},[medplum,props.value,loadTimelineResources,handleBatchResponse]);useEffect19(()=>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:jsx97(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString8(reason),icon:jsx97(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification7({id:"upload-notification",loading:!0,title:"Initializing upload...",message:"Please wait...",autoClose:!1,withCloseButton:!1})}function onUploadProgress(e){updateNotification({id:"upload-notification",loading:!0,title:"Uploading...",message:getProgressMessage(e),autoClose:!1,withCloseButton:!1})}function onUploadError(outcome){updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString8(outcome),icon:jsx97(IconFileAlert,{size:16}),autoClose:2e3})}return resource?jsxs55(Timeline,{children:[props.createCommunication&&jsx97(Panel,{children:jsx97(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs55(Group34,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx97(ResourceAvatar,{value:sender}),jsx97(TextInput19,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx97(ActionIcon9,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx97(IconMessage,{size:16})}),jsx97(AttachmentButton,{securityContext:createReference4(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx97(ActionIcon9,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx97(IconCloudUpload,{size:16})})})]})})}),items.map(item=>{if(!item)return null;let key=`${item.resourceType}/${item.id}/${item.meta?.versionId}`,menu=props.getMenu?props.getMenu({primaryResource:resource,currentResource:item,reloadTimeline:loadTimeline}):void 0;if(item.resourceType===resource.resourceType&&item.id===resource.id)return jsx97(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx97(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx97(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx97(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx97(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx97(TimelineItem,{resource:item,padding:!0,children:jsx97(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}})]}):jsx97(Center7,{style:{width:"100%",height:"100%"},children:jsx97(Loader3,{})})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx97(TimelineItem,{resource,padding:!0,...rest,children:jsx97(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs55(TimelineItem,{resource,padding:!0,...rest,children:[jsx97("h3",{children:"Created"}),jsx97(ResourceTable,{value:resource,ignoreMissingValues:!0,forceUseInput:!0})]})}function getPrevious(history,version){let entries=history.entry??[],index=entries.findIndex(entry=>entry.resource?.meta?.versionId===version.meta?.versionId);if(!(index>=entries.length-1))return entries[index+1].resource}function CommunicationTimelineItem(props){let className=!props.resource.priority||props.resource.priority==="routine"?void 0:ResourceTimeline_default.pinnedComment;return jsx97(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx97("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 jsx97(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx97(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx97(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx97(ScrollArea3,{children:jsx97("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx97(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx97(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 jsx98}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx98(ResourceTimeline,{value:resource,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`;return Promise.allSettled([medplum.readHistory(resourceType,id),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count:100})])},...rest})}import{createReference as createReference5}from"@medplum/core";import{jsx as jsx99}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx99(ResourceTimeline,{value:encounter,loadTimelineResources:async(medplum,_resourceType,id)=>Promise.allSettled([medplum.readHistory("Encounter",id),medplum.search("Communication","encounter=Encounter/"+id),medplum.search("Media","encounter=Encounter/"+id)]),createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",encounter:createReference5(resource),subject:resource.subject,sender:createReference5(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference5(resource),subject:resource.subject,operator:createReference5(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button13,Loader as Loader5,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome8}from"@medplum/core";import{useMedplum as useMedplum27}from"@medplum/react-hooks";import{memo,useEffect as useEffect23,useRef as useRef18,useState as useState58}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx100}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 jsx100(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon11,Button as Button12,Center as Center8,Group as Group37,Loader as Loader4,Menu as Menu5,Pagination,Table as Table3,Text as Text16,UnstyledButton as UnstyledButton2}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome7}from"@medplum/core";import{useMedplum as useMedplum26}from"@medplum/react-hooks";import{useCallback as useCallback13,useEffect as useEffect22,useRef as useRef17,useState as useState57}from"react";import{Box as Box2,Button as Button9,Modal as Modal3,Text as Text15}from"@mantine/core";import{jsx as jsx101,jsxs as jsxs56}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs56(Modal3,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs56(Box2,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx101(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx101(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx101(Text15,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx101(Button9,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button10,Group as Group35,Modal as Modal4,MultiSelect,Stack as Stack16}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify2}from"@medplum/core";import{useEffect as useEffect20,useMemo as useMemo28,useRef as useRef15,useState as useState54}from"react";import{capitalize as capitalize5,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime4,Operator}from"@medplum/core";import{Fragment as Fragment31,jsx as jsx102}from"react/jsx-runtime";var searchParamToOperators={string:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],fulltext:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],token:[Operator.EQUALS,Operator.NOT],reference:[Operator.EQUALS,Operator.NOT],numeric:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],quantity:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],date:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],datetime:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],uri:[Operator.EQUALS,Operator.NOT,Operator.ABOVE,Operator.BELOW]},operatorNames={eq:"equals",ne:"not equals",gt:"greater than",lt:"less than",ge:"greater than or equals",le:"less than or equals",sa:"starts after",eb:"ends before",ap:"approximately",sw:"starts with",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",present:"present",identifier:"identifier",iterate:"iterate"};function setFilters(definition,filters){return{...definition,filters,offset:0,name:void 0}}function clearFilters(definition){return setFilters(definition,[])}function clearFiltersOnField(definition,code){return setFilters(definition,(definition.filters??[]).filter(f=>f.code!==code))}function addFilter(definition,field,op,value,opt_clear){opt_clear&&(definition=clearFiltersOnField(definition,field));let nextFilters=[];return definition.filters&&nextFilters.push(...definition.filters),nextFilters.push({code:field,operator:op,value:value??""}),setFilters(definition,nextFilters)}function addField(definition,field){if(definition.fields?.includes(field))return definition;let newFields=[];return definition.fields&&newFields.push(...definition.fields),newFields.push(field),{...definition,fields:newFields,name:void 0}}function deleteFilter(definition,index){if(!definition.filters)return definition;let newFilters=[...definition.filters];return newFilters.splice(index,1),{...definition,filters:newFilters,name:void 0}}function addYesterdayFilter(definition,field){return addDayFilter(definition,field,-1)}function addTodayFilter(definition,field){return addDayFilter(definition,field,0)}function addTomorrowFilter(definition,field){return addDayFilter(definition,field,1)}function addDayFilter(definition,field,delta){let startTime=new Date;startTime.setDate(startTime.getDate()+delta),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setDate(endTime.getDate()+1),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addNext24HoursFilter(definition,field){let now=new Date,endTime=new Date(now.getTime()+24*60*60*1e3);return addDateFilterBetween(definition,field,now,endTime)}function addLastMonthFilter(definition,field){return addMonthFilter(definition,field,-1)}function addThisMonthFilter(definition,field){return addMonthFilter(definition,field,0)}function addNextMonthFilter(definition,field){return addMonthFilter(definition,field,1)}function addMonthFilter(definition,field,delta){let startTime=new Date;startTime.setMonth(startTime.getMonth()+delta),startTime.setDate(1),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setMonth(endTime.getMonth()+1),endTime.setDate(1),endTime.setHours(0,0,0,0),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addYearToDateFilter(definition,field){let startTime=new Date;return startTime.setMonth(0),startTime.setDate(1),startTime.setHours(0,0,0,0),addDateFilterBetween(definition,field,startTime,new Date)}function addDateFilterBetween(definition,field,d1,d2){return definition=clearFiltersOnField(definition,field),definition=addDateFilterImpl(definition,field,Operator.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.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"?jsx102(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children: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?jsx102(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:jsx102(Fragment31,{children:value.map((v,index)=>jsx102(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx103,jsxs as jsxs57}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef15(!1),[state,setState]=useState54({search:JSON.parse(stringify2(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState54(!1);useEffect20(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo28(()=>{if(!props.visible)return[];let resourceType=props.search.resourceType,typeSchema=getDataType2(resourceType),searchParams=getSearchParameters(resourceType);return sortStringArray(getFieldsList(typeSchema,searchParams)).map(field=>({value:field,label:buildFieldNameString(field)}))},[props.visible,props.search.resourceType]);function handleChange(newFields){setState({search:{...state.search,fields:newFields}})}return jsx103(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:jsx103("div",{"data-testid":"overlay-child"})},children:jsxs57(Stack16,{children:[jsx103(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}),jsx103(Group35,{justify:"flex-end",children:jsx103(Button10,{onClick:()=>props.onOk(state.search),children:"OK"})})]})})}function getFieldsList(typeSchema,searchParams){let result=[],keys=new Set,names=new Set;for(let key of Object.keys(typeSchema.elements))result.push(key),keys.add(key.toLowerCase()),names.add(buildFieldNameString(key));if(searchParams)for(let code of Object.keys(searchParams)){let name=buildFieldNameString(code);!keys.has(code)&&!names.has(name)&&(result.push(code),keys.add(code),names.add(name))}return result}import{ActionIcon as ActionIcon10,Group as Group36,Modal as Modal5,NativeSelect as NativeSelect10}from"@mantine/core";import{Operator as Operator2,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect21,useRef as useRef16,useState as useState55}from"react";import{Checkbox as Checkbox5,TextInput as TextInput20}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx104}from"react/jsx-runtime";function SearchFilterValueInput(props){let details=getSearchParameterDetails2(props.resourceType,props.searchParam),name=props.name??"filter-value";switch(details.type){case SearchParameterType.REFERENCE:return jsx104(ReferenceInput,{name,defaultValue:props.defaultValue?{reference:props.defaultValue}:void 0,targetTypes:props.searchParam.target,autoFocus:props.autoFocus,onChange:newReference=>{newReference?props.onChange(newReference.reference):props.onChange("")}});case SearchParameterType.BOOLEAN:return jsx104(Checkbox5,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType.DATE:return jsx104(TextInput20,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.DATETIME:return jsx104(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx104(TextInput20,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.QUANTITY:return jsx104(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx104(TextInput20,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value),placeholder:"Search value"})}}function tryParseQuantity(value){if(value){let[valueString,systemString,unitString]=value.split("|");if(valueString)return{value:parseFloat(valueString),system:systemString,unit:unitString}}}import{jsx as jsx105,jsxs as jsxs58}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState55(deepClone2(props.search)),searchRef=useRef16(search);searchRef.current=search,useEffect21(()=>{setSearch(deepClone2(props.search))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}let resourceType=props.search.resourceType,searchParams=getSearchParameters2(resourceType)??{},filters=search.filters||[];return jsx105(Modal5,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs58(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs58("div",{children:[jsxs58("table",{children:[jsxs58("colgroup",{children:[jsx105("col",{style:{width:200}}),jsx105("col",{style:{width:200}}),jsx105("col",{style:{width:380}}),jsx105("col",{style:{width:40}})]}),jsx105("thead",{children:jsxs58("tr",{children:[jsx105("th",{children:"Field"}),jsx105("th",{children:"Operation"}),jsx105("th",{children:"Value"}),jsx105("th",{})]})}),jsx105("tbody",{children:filters.map((filter,index)=>jsx105(FilterRowInput,{id:`filter-${index}-row`,resourceType,searchParams,value:filter,onChange:newFilter=>{let newFilters=[...filters];newFilters[index]=newFilter,setSearch(setFilters(searchRef.current,newFilters))},onDelete:()=>setSearch(deleteFilter(searchRef.current,index))},`filter-${index}-row`))})]}),jsx105(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx105(Group36,{justify:"flex-end",mt:"xl",children:jsx105(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value,valueRef=useRef16(value);valueRef.current=value;function setFilterCode(newCode){valueRef.current.code=newCode,valueRef.current.operator=Operator2.EQUALS,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterOperator(newOperator){valueRef.current.operator=newOperator,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterValue(newFilterValue){valueRef.current.value=newFilterValue,props.onChange(valueRef.current)}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return jsxs58("tr",{children:[jsx105("td",{children:jsx105(NativeSelect10,{"data-testid":`${props.id}-filter-field`,defaultValue:props.value.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...Object.keys(props.searchParams).map(param=>({value:param,label:buildFieldNameString(param)}))]})}),jsx105("td",{children:operators&&jsx105(NativeSelect10,{"data-testid":`${props.id}-filter-operation`,defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]},`${props.id}-filter-value-${props.value.code}`)}),jsx105("td",{children:searchParam&&value.operator&&jsx105(SearchFilterValueInput,{name:`${props.id}-filter-value`,resourceType:props.resourceType,searchParam,defaultValue:value.value,onChange:setFilterValue},`${props.id}-filter-value-${props.value.code}-${props.value.operator}`)}),jsx105("td",{children:props.onDelete&&jsx105(ActionIcon10,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx105(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button11,Grid,Modal as Modal6}from"@mantine/core";import{useState as useState56}from"react";import{jsx as jsx106,jsxs as jsxs59}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState56(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx106(Modal6,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx106(Form,{onSubmit:onOk,children:jsxs59(Grid,{children:[jsx106(Grid.Col,{span:10,children:jsx106(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx106(Grid.Col,{span:2,children:jsx106(Button11,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime5,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator3,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment32,jsx as jsx107}from"react/jsx-runtime";function SearchFilterValueDisplay(props){let{resourceType,filter}=props,searchParam=globalSchema.types[resourceType].searchParams?.[filter.code];if(searchParam){if(searchParam.type==="reference"&&(filter.operator===Operator3.EQUALS||filter.operator===Operator3.NOT_EQUALS))return jsx107(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx107(Fragment32,{children:formatDateTime5(filter.value)})}return jsx107(Fragment32,{children:filter.value})}import{Menu as Menu4}from"@mantine/core";import{Operator as Operator4}from"@medplum/core";import{Fragment as Fragment33,jsx as jsx108,jsxs as jsxs60}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?jsx108(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx108(Menu4.Dropdown,{children:props.searchParams.map(searchParam=>jsx108(Menu4.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx108(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx108(NumericFilterSubMenu,{...props});case"reference":return jsx108(ReferenceFilterSubMenu,{...props});case"string":return jsx108(TextFilterSubMenu,{...props});case"token":case"uri":return jsx108(TokenFilterSubMenu,{...props});default:return jsxs60(Fragment33,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs60(Menu4.Dropdown,{children:[jsx108(Menu4.Item,{leftSection:jsx108(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx108(Menu4.Item,{leftSection:jsx108(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.ENDS_BEFORE),children:"Before..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.STARTS_AFTER),children:"After..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Between..."}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx108(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs60(Menu4.Dropdown,{children:[jsx108(Menu4.Item,{leftSection:jsx108(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx108(Menu4.Item,{leftSection:jsx108(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN),children:"Greater than..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN),children:"Less than..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx108(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs60(Menu4.Dropdown,{children:[jsx108(Menu4.Item,{leftSection:jsx108(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx108(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs60(Menu4.Dropdown,{children:[jsx108(Menu4.Item,{leftSection:jsx108(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx108(Menu4.Item,{leftSection:jsx108(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.CONTAINS),children:"Contains..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Does not contain..."}),jsx108(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs60(Menu4.Dropdown,{children:[jsx108(Menu4.Item,{leftSection:jsx108(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx108(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs60(Fragment33,{children:[jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx108(Menu4.Item,{leftSection:jsx108(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(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 Fragment34,jsx as jsx109,jsxs as jsxs61}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=useMedplum26(),[outcome,setOutcome]=useState57(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState57(search);deepEquals(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState57({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef17(state);stateRef.current=state;let total=memoizedSearch.total??"accurate",loadResults=useCallback13(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,formatSearchQuery({...memoizedSearch,total,fields:void 0}),options)).then(response=>{setState({...stateRef.current,searchResponse:response}),onLoad&&onLoad(new SearchLoadEvent(response))}).catch(reason=>{setState({...stateRef.current,searchResponse:void 0}),setOutcome(normalizeOperationOutcome7(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback13(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect22(()=>{loadResults()},[loadResults]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...stateRef.current.selected};checked?newSelected[id]=!0:delete newSelected[id],setState({...stateRef.current,selected:newSelected})}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},searchResponse=stateRef.current.searchResponse;checked&&searchResponse?.entry&&searchResponse.entry.forEach(entry=>{entry.resource?.id&&(newSelected[entry.resource.id]=!0)}),setState({...stateRef.current,selected:newSelected})}function isAllSelected(){let state2=stateRef.current;if(!state2.searchResponse?.entry||state2.searchResponse.entry.length===0)return!1;for(let e of state2.searchResponse.entry)if(e.resource?.id&&!state2.selected[e.resource.id])return!1;return!0}function emitSearchChange(newSearch){props.onChange&&props.onChange(new SearchChangeEvent(newSearch))}function handleRowClick(e,resource){if(isCheckboxCell(e.target)||e.button===2)return;killEvent(e);let isAux=isAuxClick(e);!isAux&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),isAux&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e))}function isExportPassed(){return!!(props.onExport??props.onExportCsv??props.onExportTransactionBundle)}if(outcome)return jsx109(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx109(Center8,{style:{width:"100%",height:"100%"},children:jsx109(Loader4,{})});let checkboxColumn=props.checkboxesEnabled,fields=getFieldDefinitions(memoizedSearch),resourceType=memoizedSearch.resourceType,lastResult=state.searchResponse,resources=lastResult?.entry?.map(e=>e.resource),buttonVariant="subtle",buttonColor="gray",iconSize=16,isMobile=window.innerWidth<768;return jsxs61("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs61(Group37,{justify:"space-between",mb:"xl",children:[jsxs61(Group37,{gap:2,children:[jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs61(Group37,{gap:2,children:[lastResult&&jsxs61(Text16,{size:"xs",c:"dimmed","data-testid":"count-display",children:[getStart(memoizedSearch,lastResult).toLocaleString(),"-",getEnd(memoizedSearch,lastResult).toLocaleString(),lastResult.total!==void 0&&` of ${memoizedSearch.total==="estimate"?"~":""}${lastResult.total?.toLocaleString()}`]}),jsx109(ActionIcon11,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx109(IconRefresh,{size:iconSize})})]})]}),jsxs61(Table3,{className:SearchControl_default.table,children:[jsxs61(Table3.Thead,{children:[jsxs61(Table3.Tr,{children:[checkboxColumn&&jsx109(Table3.Th,{children:jsx109("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx109(Table3.Th,{children:jsxs61(Menu5,{shadow:"md",width:240,position:"bottom-end",children:[jsx109(Menu5.Target,{children:jsx109(UnstyledButton2,{className:SearchControl_default.control,p:2,children:jsxs61(Group37,{justify:"space-between",wrap:"nowrap",children:[jsx109(Text16,{fw:500,children:buildFieldNameString(field.name)}),jsx109(Center8,{className:SearchControl_default.icon,children:jsx109(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx109(SearchPopupMenu,{search:memoizedSearch,searchParams:field.searchParams,onPrompt:(searchParam,filter)=>{setState({...stateRef.current,filterDialogVisible:!0,filterDialogSearchParam:searchParam,filterDialogFilter:filter,dialogOpenTime:Date.now()})},onChange:result=>{emitSearchChange(result)}})]})},field.name))]}),!props.hideFilters&&jsxs61(Table3.Tr,{children:[checkboxColumn&&jsx109(Table3.Th,{}),fields.map(field=>jsx109(Table3.Th,{children:field.searchParams&&jsx109(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),jsx109(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs61(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx109(Table3.Td,{children:jsx109("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=>jsx109(Table3.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&jsx109(Container,{children:jsx109(Center8,{style:{height:150},children:jsx109(Text16,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx109(Center8,{m:"md",p:"md",children:jsx109(Pagination,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:control=>{switch(control){case"previous":return{"aria-label":"Previous page"};case"next":return{"aria-label":"Next page"};default:return{}}}})}),jsx109(SearchFieldEditor,{search:memoizedSearch,visible:stateRef.current.fieldEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,fieldEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,fieldEditorVisible:!1})}},`search-field-editor-${state.dialogOpenTime}`),jsx109(SearchFilterEditor,{search:memoizedSearch,visible:stateRef.current.filterEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,filterEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterEditorVisible:!1})}},`search-filter-editor-${state.dialogOpenTime}`),jsx109(SearchExportDialog,{visible:stateRef.current.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx109(SearchFilterValueDialog,{visible:stateRef.current.filterDialogVisible,title:state.filterDialogSearchParam?.code?buildFieldNameString(state.filterDialogSearchParam.code):"",resourceType,searchParam:state.filterDialogSearchParam,filter:state.filterDialogFilter,defaultValue:"",onOk:filter=>{emitSearchChange(addFilter(memoizedSearch,filter.code,filter.operator,filter.value)),setState({...stateRef.current,filterDialogVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterDialogVisible:!1})}},`search-filter-dialog-${state.dialogOpenTime}`)]})}var MemoizedSearchControl=SearchControl;function FilterDescription(props){let filters=(props.filters??[]).filter(f=>props.searchParams.find(p=>p.code===f.code));return filters.length===0?jsx109("span",{children:"no filters"}):jsx109(Fragment34,{children:filters.map(filter=>jsxs61("div",{children:[getOpString(filter.operator),"\xA0",jsx109(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 jsx110,jsxs as jsxs62}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum27(),[schemaLoaded,setSchemaLoaded]=useState58(!1),[outcome,setOutcome]=useState58(),{query,fields}=props,[response,setResponse]=useState58(),[selected,setSelected]=useState58({}),responseRef=useRef18(response);responseRef.current=response;let selectedRef=useRef18({});selectedRef.current=selected,useEffect23(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome8(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selectedRef.current};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=responseRef.current?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=responseRef.current?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selectedRef.current[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if(useEffect23(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx110(Loader5,{});let checkboxColumn=props.checkboxesEnabled;return jsxs62("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs62(Table4,{children:[jsx110(Table4.Thead,{children:jsxs62(Table4.Tr,{children:[checkboxColumn&&jsx110(Table4.Th,{children:jsx110("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx110(Table4.Th,{children:field.name},field.name))]})}),jsx110(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs62(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx110(Table4.Td,{children:jsx110("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=>jsx110(Table4.Td,{children:jsx110(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx110("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx110("div",{"data-testid":"search-error",children:jsx110("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx110(Button13,{onClick:()=>props.onBulk(Object.keys(selectedRef.current)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo(FhirPathTable);import{ScrollArea as ScrollArea4}from"@mantine/core";var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};import{jsx as jsx111}from"react/jsx-runtime";function InfoBar(props){return jsx111(ScrollArea4,{children:jsx111("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx111("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx111("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx111("div",{className:InfoBar_default.value,children:props.children})};import{Box as Box4,SimpleGrid}from"@mantine/core";import{useResource as useResource8,useSearchOne}from"@medplum/react-hooks";import{Box as Box3,Flex as Flex3,Group as Group38,Paper as Paper3,RingProgress,Text as Text17,Title as Title7}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept4}from"@medplum/core";import{Fragment as Fragment35,jsx as jsx112,jsxs as jsxs63}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx112(Paper3,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs63(Group38,{children:[group.measureScore&&jsx112(MeasureScore,{group}),!group.measureScore&&jsx112(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs63(Fragment35,{children:[jsx112(Text17,{fz:"md",fw:500,mb:8,children:measure.title}),jsx112(Text17,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept4(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept4(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs63(Box3,{children:[jsx112(Title7,{order:3,children:"Not Applicable"}),jsx112(Text17,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs63(Box3,{children:[jsx112(Title7,{order:3,children:"Insufficient Data"}),jsx112(Text17,{children:`Numerator: ${numeratorCount}`}),jsx112(Text17,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx112(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx112(Flex3,{justify:"center",children:jsxs63(Text17,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx112(Fragment35,{children:unit==="%"?jsx112(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx112(Flex3,{justify:"center",children:jsx112(Text17,{fw:700,fz:18,children:jsx112(QuantityDisplay,{value:group.measureScore})})})}):jsx112(Flex3,{h:120,align:"center",children:jsx112(Title7,{order:3,children:jsx112(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 jsx113,jsxs as jsxs64}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource8(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs64(Box4,{children:[measure&&jsx113(MeasureTitle,{measure}),jsx113(SimpleGrid,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx113(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon12,Indicator,Tooltip as Tooltip3}from"@mantine/core";import{useMedplum as useMedplum28,useSubscription as useSubscription2}from"@medplum/react-hooks";import{useCallback as useCallback14,useEffect as useEffect24,useState as useState59}from"react";import{jsx as jsx114}from"react/jsx-runtime";function NotificationIcon(props){let medplum=useMedplum28(),{label,resourceType,countCriteria,subscriptionCriteria,onClick}=props,[unreadCount,setUnreadCount]=useState59(0),updateCount=useCallback14(cache=>{medplum.search(resourceType,countCriteria,{cache}).then(result=>setUnreadCount(result.total)).catch(console.error)},[medplum,resourceType,countCriteria]);useEffect24(()=>{updateCount("default")},[updateCount]),useSubscription2(subscriptionCriteria,()=>{updateCount("reload")});let icon=jsx114(Tooltip3,{label,children:jsx114(ActionIcon12,{variant:"subtle",color:"gray",size:"lg","aria-label":label,onClick,children:props.iconComponent})});return unreadCount>0?jsx114(Indicator,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:icon}):icon}import{Group as Group39,SegmentedControl as SegmentedControl2,Stack as Stack17}from"@mantine/core";import{notifications}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString9,resolveId}from"@medplum/core";import{useMedplum as useMedplum29}from"@medplum/react-hooks";import{useCallback as useCallback15}from"react";import{jsx as jsx115,jsxs as jsxs65}from"react/jsx-runtime";var NOTIFICATION_ID="patient-export",NOTIFICATION_TITLE="Patient Export",formats={everything:{operation:"$everything",extension:"json",contentType:ContentType3.FHIR_JSON},summary:{operation:"$summary",extension:"json",contentType:ContentType3.FHIR_JSON},ccda:{operation:"$ccda-export",extension:"xml",contentType:ContentType3.CDA_XML},ccdaReferral:{operation:"$ccda-export",type:"referral",extension:"xml",contentType:ContentType3.CDA_XML}};function PatientExportForm(props){let medplum=useMedplum29(),{patient}=props,handleSubmit=useCallback15(async data2=>{let patientId=resolveId(patient),format=data2.format,{operation,type,contentType,extension}=formats[format],url=medplum.fhirUrl("Patient",patientId,operation),params={};type&&(params.type=type),data2.author&&(params.author={reference:data2.author}),data2.authoredOn&&(params.authoredOn=convertLocalToIso(data2.authoredOn)),data2.startDate&&(params.start=data2.startDate),data2.endDate&&(params.end=data2.endDate),notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,loading:!0,message:"Exporting...",autoClose:!1,withCloseButton:!1});try{let response=await medplum.post(url,params,void 0,{cache:"no-cache",headers:{Accept:contentType}}),fileName=`Patient-export-${patientId}-${new Date().toISOString().replaceAll(":","-")}.${extension}`;saveData(response,fileName,contentType),notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"green",message:"Done",icon:jsx115(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString9(err),icon:jsx115(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient]);return jsx115(Form,{onSubmit:handleSubmit,children:jsxs65(Stack17,{children:[jsx115(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx115(SegmentedControl2,{name:"format",data:[{label:"FHIR Everything",value:"everything"},{label:"Patient Summary",value:"summary"},{label:"C-CDA",value:"ccda"},{label:"C-CDA Referral",value:"ccdaReferral"}],fullWidth:!0})}),jsx115(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx115(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx115(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx115(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx115(FormSection,{title:"Start Date",description:"The start date of care. If no start date is provided, all records prior to the end date are in scope.",children:jsx115(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx115(FormSection,{title:"End Date",description:"The end date of care. If no end date is provided, all records subsequent to the start date are in scope.",children:jsx115(DateTimeInput,{name:"endDate",placeholder:"End date"})}),jsx115(Group39,{justify:"right",children:jsx115(SubmitButton,{children:"Request Export"})})]})})}function saveData(data2,fileName,contentType){let content=typeof data2=="string"?data2:JSON.stringify(data2,null,2),blob=new Blob([content],{type:contentType}),url=window.URL.createObjectURL(blob),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=url,a.download=fileName,a.click(),window.URL.revokeObjectURL(url)}import{calculateAgeString}from"@medplum/core";import{useResource as useResource9}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment36,jsx as jsx116,jsxs as jsxs66}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource9(props.patient);return patient?jsxs66(InfoBar,{children:[jsx116(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:"Name"}),jsx116(InfoBar.Value,{children:jsx116(MedplumLink,{to:patient,fw:500,children:patient.name?jsx116(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs66(Fragment36,{children:[jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:"DoB"}),jsx116(InfoBar.Value,{children:patient.birthDate})]}),jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:"Age"}),jsx116(InfoBar.Value,{children:calculateAgeString(patient.birthDate)})]})]}),patient.gender&&jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:"Gender"}),jsx116(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:"State"}),jsx116(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:identifier?.system}),jsx116(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Card,Divider as Divider3,Flex as Flex4,Group as Group49,Paper as Paper4,Stack as Stack23,Text as Text24}from"@mantine/core";import{calculateAgeString as calculateAgeString2,formatHumanName as formatHumanName4,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum36,useResource as useResource10}from"@medplum/react-hooks";import{useEffect as useEffect25,useMemo as useMemo29,useState as useState69}from"react";import{Anchor as Anchor6,Box as Box5,Group as Group41,Modal as Modal7,Text as Text18}from"@mantine/core";import{useDisclosure}from"@mantine/hooks";import{useMedplum as useMedplum30}from"@medplum/react-hooks";import{useCallback as useCallback17,useState as useState61}from"react";import{Group as Group40,Stack as Stack18,TextInput as TextInput21}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG2,addProfileToResource,createReference as createReference6}from"@medplum/core";import{useCallback as useCallback16,useState as useState60}from"react";import{jsx as jsx117,jsxs as jsxs67}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG2+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState60(allergy?.code),[clinicalStatus,setClinicalStatus]=useState60(allergy?.clinicalStatus),handleSubmit=useCallback16(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference6(patient),encounter:encounter?createReference6(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0},PATIENT_ALLERGY_PROFILE))},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx117(Form,{onSubmit:handleSubmit,children:jsxs67(Stack18,{children:[jsx117(CodeableConceptInput,{name:"allergy",label:"Code",path:"AllergyIntolerance.code","data-autofocus":!0,binding:HTTP+"cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1186.8",maxValues:1,defaultValue:allergy?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx117(TextInput21,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx117(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG2+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx117(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx117(Group40,{justify:"flex-end",gap:4,mt:"md",children:jsx117(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon13,Badge as Badge2}from"@mantine/core";import{getDisplayString as getDisplayString6}from"@medplum/core";import{jsx as jsx118}from"react/jsx-runtime";function ConceptBadge(props){let{resource,display,onClick,onEdit}=props,rightSection;return onEdit&&(rightSection=jsx118(ActionIcon13,{variant:"subtle",size:12,radius:"xl",children:jsx118(IconPencil,{"aria-label":`Edit ${getDisplayString6(resource)}`,size:12,onClick:e=>{killEvent(e),onEdit(resource)}})})),jsx118(MedplumLink,{to:onClick?void 0:resource,onClick:onClick?()=>onClick(resource):void 0,size:"xs",children:jsx118(Badge2,{variant:"light",maw:"100%",rightSection,style:{cursor:"pointer"},children:display??getDisplayString6(resource)})},resource.id)}import{Fragment as Fragment37,jsx as jsx119,jsxs as jsxs68}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum30(),{patient,encounter}=props,[allergies,setAllergies]=useState61(props.allergies),[opened,{open,close}]=useDisclosure(!1),[editAllergy,setEditAllergy]=useState61(),handleSubmit=useCallback17(async allergy=>{if(allergy.id){let updatedAllergy=await medplum.updateResource(allergy);setAllergies(allergies.map(a=>a.id===updatedAllergy.id?updatedAllergy:a))}else{let newAllergy=await medplum.createResource(allergy);setAllergies([...allergies,newAllergy])}setEditAllergy(void 0),close()},[medplum,allergies,close]);return jsxs68(Fragment37,{children:[jsxs68(Group41,{justify:"space-between",children:[jsx119(Text18,{fz:"md",fw:700,children:"Allergies"}),jsx119(Anchor6,{component:"button",onClick:e=>{killEvent(e),setEditAllergy(void 0),open()},children:"+ Add"})]}),allergies.length>0?jsx119(Box5,{children:allergies.map(allergy=>jsx119(ConceptBadge,{resource:allergy,onClick:props.onClickResource,onEdit:a=>{setEditAllergy(a),open()}},allergy.id))}):jsx119(Text18,{children:"(none)"}),jsx119(Modal7,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx119(AllergyDialog,{patient,encounter,allergy:editAllergy,onSubmit:handleSubmit})})]})}import{Anchor as Anchor7,Box as Box6,Group as Group43,Modal as Modal8,Text as Text19}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{useMedplum as useMedplum31}from"@medplum/react-hooks";import{useCallback as useCallback19,useState as useState63}from"react";import{Alert as Alert4,Group as Group42,Radio,Stack as Stack19}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG3,addProfileToResource as addProfileToResource2,createReference as createReference7}from"@medplum/core";import{useMedplumProfile as useMedplumProfile6}from"@medplum/react-hooks";import{useCallback as useCallback18,useState as useState62}from"react";import{jsx as jsx120,jsxs as jsxs69}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile6(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState62(medication?.medicationCodeableConcept),handleSubmit=useCallback18(formData=>{if(!me)throw new Error("Not signed in");onSubmit(addProfileToResource2({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&createReference7(encounter)),requester:medication?.requester??createReference7(me),medicationCodeableConcept:code,subject:createReference7(patient)},HTTP_HL7_ORG3+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx120(Form,{onSubmit:handleSubmit,children:jsxs69(Stack19,{children:[jsx120(CodeableConceptInput,{name:"request",path:"MedicationRequest.medication[x]","data-autofocus":!0,binding:HTTP2+"cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1010.4",maxValues:1,defaultValue:medication?.medicationCodeableConcept,onChange:request=>setCode(request),outcome:void 0}),jsx120(Radio.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx120(Radio,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx120(Group42,{justify:"flex-end",gap:4,children:jsx120(SubmitButton,{children:"Save"})})]})}):jsx120(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment38,jsx as jsx121,jsxs as jsxs70}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum31(),[medicationRequests,setMedicationRequests]=useState63(props.medicationRequests),[editMedication,setEditMedication]=useState63(),[opened,{open,close}]=useDisclosure2(!1),handleSubmit=useCallback19(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m=>m.id===updatedMedication.id?updatedMedication:m))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs70(Fragment38,{children:[jsxs70(Group43,{justify:"space-between",children:[jsx121(Text19,{fz:"md",fw:700,children:"Medications"}),jsx121(Anchor7,{component:"button",onClick:e=>{killEvent(e),setEditMedication(void 0),open()},children:"+ Add"})]}),medicationRequests.length>0?jsx121(Box6,{children:medicationRequests.map(request=>jsx121(ConceptBadge,{resource:request,onClick:props.onClickResource,onEdit:mr=>{setEditMedication(mr),open()}},request.id))}):jsx121(Text19,{children:"(none)"}),jsx121(Modal8,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx121(MedicationDialog,{patient:props.patient,encounter:props.encounter,medication:editMedication,onSubmit:handleSubmit})})]})}import{Anchor as Anchor8,Grid as Grid2,Group as Group45,Modal as Modal9,Text as Text20}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{useMedplum as useMedplum32}from"@medplum/react-hooks";import{Fragment as Fragment39,useCallback as useCallback21,useState as useState65}from"react";import{Group as Group44,Stack as Stack20}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG4,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback20,useState as useState64}from"react";import{jsx as jsx122,jsxs as jsxs71}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState64(condition?.code),[clinicalStatus,setClinicalStatus]=useState64(condition?.clinicalStatus),handleSubmit=useCallback20(formData=>{let updatedCondition=addProfileToResource3({...condition,resourceType:"Condition",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:createReference8(patient),encounter:encounter&&createReference8(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG4+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx122(Form,{onSubmit:handleSubmit,children:jsxs71(Stack20,{children:[jsx122(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG4+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx122(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG4+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx122(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx122(Group44,{justify:"flex-end",gap:4,mt:"md",children:jsx122(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment40,jsx as jsx123,jsxs as jsxs72}from"react/jsx-runtime";function ProblemList(props){let medplum=useMedplum32(),{patient,encounter}=props,[problems,setProblems]=useState65(props.problems),[editCondition,setEditCondition]=useState65(),[opened,{open,close}]=useDisclosure3(!1),handleSubmit=useCallback21(async condition=>{if(condition.id){let updatedCondition=await medplum.updateResource(condition);setProblems(problems.map(p=>p.id===updatedCondition.id?updatedCondition:p))}else{let newCondition=await medplum.createResource(condition);setProblems([...problems,newCondition])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs72(Fragment40,{children:[jsxs72(Group45,{justify:"space-between",children:[jsx123(Text20,{fz:"md",fw:700,children:"Problem List"}),jsx123(Anchor8,{component:"button",onClick:e=>{killEvent(e),setEditCondition(void 0),open()},children:"+ Add"})]}),problems.length>0?jsx123(Grid2,{gutter:"xs",children:problems.map(problem=>jsxs72(Fragment39,{children:[jsx123(Grid2.Col,{span:2,children:problem.onsetDateTime?.substring(0,4)}),jsx123(Grid2.Col,{span:10,children:jsx123(ConceptBadge,{resource:problem,onClick:props.onClickResource,onEdit:c=>{setEditCondition(c),open()}},problem.id)})]},problem.id))}):jsx123(Text20,{children:"(none)"}),jsx123(Modal9,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx123(ConditionDialog,{patient,encounter,condition:editCondition,onSubmit:handleSubmit})})]})}import{Anchor as Anchor9,Group as Group46,Modal as Modal10,Radio as Radio2,Stack as Stack21,Text as Text21}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED,createReference as createReference9,formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState66}from"react";import{Fragment as Fragment41,jsx as jsx124,jsxs as jsxs73}from"react/jsx-runtime";var NULLFLAVOR=HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/v3-NullFlavor",CodesToText={38628009:"Homosexual",20430005:"Heterosexual",42035005:"Bisexual",OTH:"Other",UNK:"Unknown",ASKU:"Asked but no answer"},CodesToSystem={38628009:SNOMED,20430005:SNOMED,42035005:SNOMED,OTH:NULLFLAVOR,UNK:NULLFLAVOR,ASKU:NULLFLAVOR};function SexualOrientation(props){let medplum=useMedplum33(),{patient,encounter}=props,[sexualOrientation,setSexualOrientation]=useState66(props.sexualOrientation),[opened,{open,close}]=useDisclosure4(!1),handleSubmit=useCallback22(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG5+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:createReference9(patient),encounter:encounter?createReference9(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:CodesToSystem[code],code:formData.sexualOrientation}],text:CodesToText[code]}}).then(newSexualOrientation=>{setSexualOrientation(newSexualOrientation),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs73(Fragment41,{children:[jsxs73(Group46,{justify:"space-between",children:[jsx124(Text21,{fz:"md",fw:700,children:"Sexual Orientation"}),jsx124(Anchor9,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Edit"})]}),sexualOrientation?.valueCodeableConcept?jsx124(ConceptBadge,{resource:sexualOrientation,display:formatCodeableConcept5(sexualOrientation.valueCodeableConcept),onClick:props.onClickResource,onEdit:()=>open()},sexualOrientation.id):jsx124(Text21,{children:"(none)"}),jsx124(Modal10,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx124(Form,{onSubmit:handleSubmit,children:jsxs73(Stack21,{children:[jsx124(Radio2.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx124(Radio2,{value:code,label:text,my:"xs"},code))}),jsx124(Group46,{justify:"flex-end",gap:4,mt:"md",children:jsx124(SubmitButton,{children:"Save"})})]})})})]})}import{Anchor as Anchor10,Group as Group47,Modal as Modal11,Radio as Radio3,Stack as Stack22,Text as Text22}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG6,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference10,formatCodeableConcept as formatCodeableConcept6}from"@medplum/core";import{useMedplum as useMedplum34}from"@medplum/react-hooks";import{useCallback as useCallback23,useState as useState67}from"react";import{Fragment as Fragment42,jsx as jsx125,jsxs as jsxs74}from"react/jsx-runtime";var smokingStatusOptions={266919005:"Never smoked tobacco",266927001:"Tobacco smoking consumption unknown","428041000124106":"Occasional tobacco smoker","428061000124105":"Light tobacco smoker","428071000124103":"Heavy tobacco smoker",449868002:"Smokes tobacco daily",77176002:"Smoker",8517006:"Ex-smoker"};function SmokingStatus(props){let medplum=useMedplum34(),{patient,encounter}=props,[smokingStatus,setSmokingStatus]=useState67(props.smokingStatus),[opened,{open,close}]=useDisclosure5(!1),handleSubmit=useCallback23(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG6+"/fhir/us/core/StructureDefinition/us-core-smokingstatus"]},status:"final",category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC2,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference10(patient),encounter:encounter?createReference10(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED2,version:SNOMED2+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs74(Fragment42,{children:[jsxs74(Group47,{justify:"space-between",children:[jsx125(Text22,{fz:"md",fw:700,children:"Smoking Status"}),jsx125(Anchor10,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Edit"})]}),smokingStatus?.valueCodeableConcept?jsx125(ConceptBadge,{resource:smokingStatus,display:formatCodeableConcept6(smokingStatus.valueCodeableConcept),onClick:props.onClickResource,onEdit:()=>open()},smokingStatus.id):jsx125(Text22,{children:"(none)"}),jsx125(Modal11,{opened,onClose:close,title:"Set Smoking Status",children:jsx125(Form,{onSubmit:handleSubmit,children:jsxs74(Stack22,{children:[jsx125(Radio3.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx125(Radio3,{value:code,label:text,my:"xs"},code))}),jsx125(Group47,{justify:"flex-end",gap:4,mt:"md",children:jsx125(SubmitButton,{children:"Save"})})]})})})]})}import{Anchor as Anchor11,Grid as Grid3,Group as Group48,Modal as Modal12,SimpleGrid as SimpleGrid2,Text as Text23,Textarea as Textarea3,TextInput as TextInput22,Tooltip as Tooltip4}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{Fragment as Fragment43,useCallback as useCallback24,useState as useState68}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference11}from"@medplum/core";function getObservationValue(obs,component){return component?obs.component?.find(c=>c.code?.coding?.[0].code===component)?.valueQuantity:obs.valueQuantity}function createObservation(patient,encounter,code,title,valueQuantity){if(isValidNumber(valueQuantity.value))return{...createBaseObservation(patient,encounter,code,title),valueQuantity}}function createCompoundObservation(patient,encounter,code,title,components){let component=components.filter(c=>isValidNumber(c.valueQuantity?.value));if(component.length!==0)return{...createBaseObservation(patient,encounter,code,title),component}}function createBaseObservation(patient,encounter,code,title){return{resourceType:"Observation",status:"preliminary",subject:createReference11(patient),encounter:encounter?createReference11(encounter):void 0,effectiveDateTime:new Date().toISOString(),category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"vital-signs",display:"Vital Signs"}]}],code:createLoincCode(code,title)}}function createLoincCode(code,display){return{coding:[{code,display,system:LOINC3}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!isNaN(value)&&isFinite(value)}import{Fragment as Fragment44,jsx as jsx126,jsxs as jsxs75}from"react/jsx-runtime";var BP="85354-9",SYSTOLIC="8480-6",DIASTOLIC="8462-4",LOINC_CODES=[{name:"systolic",short:"BP Sys",code:BP,component:SYSTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"diastolic",short:"BP Dias",code:BP,component:DIASTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"heartRate",short:"HR",code:"8867-4",title:"Heart Rate",unit:"/min"},{name:"bodyTemperature",short:"Temp",code:"8310-5",title:"Body Temperature",unit:"Cel"},{name:"respiratoryRate",short:"RR",code:"9279-1",title:"Respiratory Rate",unit:"/min"},{name:"height",short:"Ht",code:"8302-2",title:"Height",unit:"cm"},{name:"weight",short:"Wt",code:"29463-7",title:"Weight",unit:"kg"},{name:"bmi",short:"BMI",code:"39156-5",title:"BMI",unit:"kg/m2"},{name:"oxygen",short:"O2",code:"2708-6",title:"Oxygen",unit:"%"},{name:"headCircumference",short:"HC",code:"9843-4",title:"Head Circumference",unit:"cm"}];function Vitals(props){let medplum=useMedplum35(),{patient,encounter}=props,[vitals,setVitals]=useState68(props.vitals),[opened,{open,close}]=useDisclosure6(!1),handleSubmit=useCallback24(formData=>{let newObservations=[];newObservations.push(createCompoundObservation(patient,encounter,BP,"Blood pressure",[{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]")}]));for(let meta of LOINC_CODES)meta.component||newObservations.push(createObservation(patient,encounter,meta.code,meta.title,createQuantity(parseFloat(formData[meta.name]),meta.unit)));Promise.all(newObservations.filter(Boolean).map(obs=>medplum.createResource(obs))).then(newVitals=>setVitals([...newVitals,...vitals])).catch(console.error),close()},[medplum,patient,encounter,vitals,close]);return jsxs75(Fragment44,{children:[jsxs75(Group48,{justify:"space-between",children:[jsx126(Text23,{fz:"md",fw:700,children:"Vitals"}),jsx126(Anchor11,{href:"#",onClick:e=>{killEvent(e),open()},children:"+ Add"})]}),jsx126(Grid3,{align:"center",children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs75(Fragment43,{children:[jsx126(Grid3.Col,{span:2,ta:"right",children:jsx126(Tooltip4,{label:meta.title,children:jsx126(Text23,{c:"dimmed",size:"xs",children:meta.short})})}),jsx126(Grid3.Col,{span:4,p:1,children:obs&&jsx126(ConceptBadge,{resource:obs,display:formatQuantity2(getObservationValue(obs,meta.component)),onClick:props.onClickResource},meta.name)})]},meta.name)})}),jsx126(Modal12,{opened,onClose:close,title:"Add Vitals",children:jsxs75(Form,{onSubmit:handleSubmit,children:[jsx126(SimpleGrid2,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx126(TextInput22,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx126(Textarea3,{name:"notes",label:"Notes"}),jsx126(Group48,{justify:"flex-end",gap:4,mt:"md",children:jsx126(SubmitButton,{children:"Save"})})]})})]})}import{Fragment as Fragment45,jsx as jsx127,jsxs as jsxs76}from"react/jsx-runtime";function getGenderIcon(patient){switch(patient?.gender){case"female":return IconGenderFemale;case"male":return IconGenderMale;default:return}}function pluralize(count,singular,plural){return count===0?`No ${plural}`:count===1?`1 ${singular}`:`${count} ${plural}`}function PatientSummary(props){let medplum=useMedplum36(),{patient:propsPatient,background,appointmentsUrl:propsAppointmentsUrl,encountersUrl:propsEncountersUrl,onClickResource,...cardProps}=props,patient=useResource10(propsPatient),[medicalData,setMedicalData]=useState69(),appointmentsUrl="appointmentsUrl"in props?propsAppointmentsUrl:"#",encountersUrl="encountersUrl"in props?propsEncountersUrl:"#";useEffect25(()=>{let ref=`Patient/${resolveId2(propsPatient)}`,searchMeta={_count:100,_sort:"-_lastUpdated"},today=new Date().toISOString().substring(0,10);Promise.all([medplum.searchResources("AllergyIntolerance",{patient:ref,...searchMeta}),medplum.searchResources("Condition",{patient:ref,...searchMeta}),medplum.searchResources("MedicationRequest",{subject:ref,...searchMeta}),medplum.searchResources("Observation",{subject:ref,...searchMeta}),medplum.searchResources("Appointment",{patient:ref,date:`ge${today}`,status:"proposed,pending,booked",...searchMeta}),medplum.searchResources("Encounter",{subject:ref,date:`le${today}`,status:"finished",...searchMeta})]).then(results=>{let observations=results[3];setMedicalData({allergies:results[0],problems:results[1],medicationRequests:results[2],sexualOrientation:observations.find(obs=>obs.code?.coding?.[0].code==="76690-7"),smokingStatus:observations.find(obs=>obs.code?.coding?.[0].code==="72166-2"),vitals:observations.filter(obs=>obs.category?.[0]?.coding?.[0].code==="vital-signs"),appointments:results[4],encounters:results[5]})}).catch(console.error)},[medplum,propsPatient]);let links=useMemo29(()=>{let appointmentsLink=appointmentsUrl===void 0?void 0:jsx127(MedplumLink,{to:appointmentsUrl,children:pluralize(medicalData?.appointments?.length,"upcoming appointment","upcoming appointments")},"appt"),encountersLink=encountersUrl===void 0?void 0:jsx127(MedplumLink,{to:encountersUrl,children:pluralize(medicalData?.encounters?.length,"documented visit","documented visits")},"enc");return[appointmentsLink,encountersLink].filter(Boolean)},[appointmentsUrl,medicalData?.appointments?.length,medicalData?.encounters?.length,encountersUrl]);if(!patient)return null;let GenderIconComponent=getGenderIcon(patient);return jsxs76(Card,{...cardProps,children:[jsx127(Card.Section,{h:100,style:{background}}),jsx127(ResourceAvatar,{value:patient,size:80,radius:80,mx:"auto",mt:-50,style:{border:"2px solid white"}}),jsx127(Text24,{ta:"center",fz:"lg",fw:500,children:formatHumanName4(patient.name?.[0])}),patient.birthDate&&jsxs76(Text24,{ta:"center",fz:"xs",c:"dimmed",children:[patient.birthDate," (",calculateAgeString2(patient.birthDate),")"]}),jsx127(Paper4,{withBorder:!0,p:"md",my:"md",children:jsxs76(Group49,{wrap:"nowrap",justify:"space-evenly",children:[jsxs76(Flex4,{justify:"center",align:"center",direction:"column",gap:0,children:[jsx127(IconUserSquare,{size:24,color:"gray"}),jsx127(Text24,{fz:"xs",ta:"center",style:{whiteSpace:"nowrap"},children:"Self"})]}),jsxs76(Flex4,{justify:"center",align:"center",direction:"column",gap:0,children:[jsx127(IconStethoscope,{size:24,color:"gray"}),jsx127(Text24,{fz:"xs",style:{whiteSpace:"nowrap"},children:patient?.generalPractitioner?.[0]?.display??"No provider"})]}),GenderIconComponent&&jsxs76(Flex4,{justify:"center",align:"center",direction:"column",gap:0,children:[jsx127(GenderIconComponent,{size:24,color:"gray"}),jsx127(Text24,{fz:"xs",style:{whiteSpace:"nowrap"},children:patient.gender})]})]})}),jsx127(Stack23,{gap:"xs",children:medicalData&&jsxs76(Fragment45,{children:[links.length>0&&jsxs76(Fragment45,{children:[links,jsx127(Divider3,{})]}),jsx127(Allergies,{patient,allergies:medicalData.allergies,onClickResource}),jsx127(Divider3,{}),jsx127(ProblemList,{patient,problems:medicalData.problems,onClickResource}),jsx127(Divider3,{}),jsx127(Medications,{patient,medicationRequests:medicalData.medicationRequests,onClickResource}),jsx127(Divider3,{}),jsx127(SexualOrientation,{patient,sexualOrientation:medicalData.sexualOrientation,onClickResource}),jsx127(Divider3,{}),jsx127(SmokingStatus,{patient,smokingStatus:medicalData.smokingStatus,onClickResource}),jsx127(Divider3,{}),jsx127(Vitals,{patient,vitals:medicalData.vitals,onClickResource})]})})]})}import{createReference as createReference12}from"@medplum/core";import{useCallback as useCallback25}from"react";import{jsx as jsx128}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback25((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),medplum.search("Communication",{subject:ref,_count}),medplum.search("Device",{patient:ref,_count}),medplum.search("DeviceRequest",{patient:ref,_count}),medplum.search("DiagnosticReport",{subject:ref,_count}),medplum.search("Media",{subject:ref,_count}),medplum.search("ServiceRequest",{subject:ref,_count}),medplum.search("Task",{subject:ref,_count})])},[]);return jsx128(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference12(resource),sender:createReference12(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference12(resource),operator:createReference12(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor12,Box as Box7,Button as Button14,CloseButton,Flex as Flex5,Group as Group50,NativeSelect as NativeSelect11,Paper as Paper5,Stack as Stack24,Text as Text25,TextInput as TextInput23}from"@mantine/core";import{getReferenceString as getReferenceString7}from"@medplum/core";import{useMedplum as useMedplum37,useResource as useResource11}from"@medplum/react-hooks";import{useEffect as useEffect26,useRef as useRef19,useState as useState70}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx129,jsxs as jsxs77}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum37(),defaultValue2=useResource11(props.value),[schemaLoaded,setSchemaLoaded]=useState70(!1),[selectedKey,setSelectedKey]=useState70(),[hoverKey,setHoverKey]=useState70(),[value,setValue]=useState70();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}let valueRef=useRef19(value);if(valueRef.current=value,useEffect26(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect26(()=>(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 jsx129("div",{children:jsxs77(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx129(TextInput23,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx129(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx129(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){let actionsRef=useRef19(props.actions);actionsRef.current=props.actions;function changeAction(changedAction){props.onChange(actionsRef.current.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...actionsRef.current,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(actionsRef.current.filter(i=>i!==removedAction))}return jsxs77(Stack24,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx129(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx129("div",{children:jsx129(Button14,{variant:"outline",onClick:e=>{killEvent(e),addAction({id:generateId()})},children:"Add action"})})]})}function ActionBuilder(props){let{action}=props,actionType=getInitialActionType(action);function onClick(e){e.stopPropagation(),props.setSelectedKey(props.action.id)}function onHover(e){killEvent(e),props.setHoverKey(props.action.id)}return jsx129("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx129(ActionEditor,{action,actionType,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState70(props.actionType),editing=props.selectedKey===props.action.id,hovering=props.hoverKey===props.action.id;function changeProperty(property,value){props.onChange({...action,[property]:value})}let className=clsx_default(PlanDefinitionBuilder_default.section,{[PlanDefinitionBuilder_default.hovering]:hovering&&!editing});return jsxs77(Paper5,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs77(Flex5,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx129(TextInput23,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx129(CloseButton,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs77(Stack24,{gap:"xl",p:"md",children:[jsx129(Box7,{children:jsx129(TextInput23,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx129(Box7,{children:jsx129(NativeSelect11,{label:"Type of Action",value:actionType,onChange:e=>{let value=e.currentTarget.value==="standard"?void 0:e.currentTarget.value;setActionType(value),props.onChange({...props.action,definitionCanonical:value==="standard"?void 0:props.action.definitionCanonical})},data:[{value:"standard",label:"Standard task"},{value:"questionnaire",label:"Task with Questionnaire"},{value:"activitydefinition",label:"Task with Activity Definition"}]})}),actionType==="questionnaire"&&jsxs77(Stack24,{gap:0,children:[jsxs77(Group50,{gap:0,mb:"xs",children:[jsx129(Text25,{fw:600,children:"Select questionnaire"}),jsx129(Text25,{c:"red",children:"*"})]}),jsxs77(Text25,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx129(Anchor12,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx129(ActionResourceTypeBuilder,{resourceType:"Questionnaire",action,onChange:props.onChange})]}),actionType==="activitydefinition"&&jsxs77(Stack24,{gap:0,children:[jsxs77(Group50,{gap:0,mb:"xs",children:[jsx129(Text25,{fw:600,children:"Select activity definition"}),jsx129(Text25,{c:"red",children:"*"})]}),jsxs77(Text25,{size:"sm",c:"dimmed",mb:"sm",children:["ActivityDefinition.kind resource to be shown in the task in Encounter view. You can create new one from"," ",jsx129(Anchor12,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx129(ActionResourceTypeBuilder,{resourceType:"ActivityDefinition",action,onChange:props.onChange})]})]})]})}function ActionResourceTypeBuilder(props){let{id,definitionCanonical}=props.action,reference=definitionCanonical?.startsWith(props.resourceType+"/")?{reference:definitionCanonical}:void 0;return jsx129(ResourceInput,{name:id,resourceType:props.resourceType,defaultValue:reference,onChange:newValue=>{newValue?props.onChange({...props.action,definitionCanonical:getReferenceString7(newValue)}):props.onChange({...props.action,definitionCanonical:void 0})}})}function getInitialActionType(action){return action.definitionCanonical?.startsWith("Questionnaire")?"questionnaire":action.definitionCanonical?.startsWith("ActivityDefinition")?"activitydefinition":"standard"}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 Anchor13,Box as Box8,Group as Group52,NativeSelect as NativeSelect13,Space as Space2,Textarea as Textarea5,TextInput as TextInput25,Title as Title8}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{useMedplum as useMedplum38,useResource as useResource12}from"@medplum/react-hooks";import{useEffect as useEffect27,useRef as useRef20,useState as useState71}from"react";import{Checkbox as Checkbox6,Group as Group51,MultiSelect as MultiSelect2,NativeSelect as NativeSelect12,Radio as Radio4,Text as Text26,Textarea as Textarea4,TextInput as TextInput24}from"@mantine/core";import{capitalize as capitalize6,deepEquals as deepEquals2,formatCoding as formatCoding2,getElementDefinition as getElementDefinition2,getExtension as getExtension2,HTTP_HL7_ORG as HTTP_HL7_ORG8,stringify as stringify3,typedValueToString as typedValueToString2}from"@medplum/core";import{useContext as useContext24}from"react";import{HTTP_HL7_ORG as HTTP_HL7_ORG7,PropertyType as PropertyType3,deepClone as deepClone3,evalFhirPathTyped as evalFhirPathTyped3,getExtension,getReferenceString as getReferenceString8,getTypedPropertyValueWithoutSchema,normalizeErrorString as normalizeErrorString10,splitN,toJsBoolean,toTypedValue as toTypedValue2,typedValueToString}from"@medplum/core";var QuestionnaireItemType={group:"group",display:"display",question:"question",boolean:"boolean",decimal:"decimal",integer:"integer",date:"date",dateTime:"dateTime",time:"time",string:"string",text:"text",url:"url",choice:"choice",openChoice:"open-choice",attachment:"attachment",reference:"reference",quantity:"quantity"};function isChoiceQuestion(item){return item.type==="choice"||item.type==="open-choice"}function isQuestionEnabled(item,questionnaireResponse){let extension=getExtension(item,HTTP_HL7_ORG7+"/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression");if(questionnaireResponse&&extension){let expression=extension.valueExpression?.expression;if(expression){let value=toTypedValue2(questionnaireResponse),result=evalFhirPathTyped3(expression,[value],{"%resource":value});return toJsBoolean(result)}}if(!item.enableWhen)return!0;let enableBehavior=item.enableBehavior??"any";for(let enableWhen of item.enableWhen){let actualAnswers=getByLinkId(questionnaireResponse?.item,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 evaluateCalculatedExpressionsInQuestionnaire(items,response){return items.map(item=>{if(item.item)return{...item,item:evaluateCalculatedExpressionsInQuestionnaire(item.item,response)};try{let calculatedValue=evaluateCalculatedExpression(item,response);if(!calculatedValue)return null;let answer=typedValueToResponseItem(item,calculatedValue);return answer?{id:item?.id,linkId:item?.linkId,text:item.text,answer:[answer]}:null}catch(error){return{id:item?.id,linkId:item?.linkId,text:item.text,answer:[],extension:[{url:`${HTTP_HL7_ORG7}/fhir/StructureDefinition/questionnaire-validationError`,valueString:`Expression evaluation failed: ${normalizeErrorString10(error)}`}]}}}).filter(item=>item!==null)}function typedValueToResponseItem(item,value){if(item.type)switch(item.type){case QuestionnaireItemType.boolean:return value.type===PropertyType3.boolean?{valueBoolean:value.value}:void 0;case QuestionnaireItemType.date:return value.type===PropertyType3.date?{valueDate:value.value}:void 0;case QuestionnaireItemType.dateTime:return value.type===PropertyType3.dateTime?{valueDateTime:value.value}:void 0;case QuestionnaireItemType.time:return value.type===PropertyType3.time?{valueTime:value.value}:void 0;case QuestionnaireItemType.url:return value.type===PropertyType3.url?{valueString:value.value}:void 0;case QuestionnaireItemType.text:return value.type===PropertyType3.string?{valueString:value.value}:void 0;case QuestionnaireItemType.attachment:return value.type===PropertyType3.Attachment?{valueAttachment:value.value}:void 0;case QuestionnaireItemType.reference:return value.type===PropertyType3.Reference?{valueReference:value.value}:void 0;case QuestionnaireItemType.quantity:return{valueQuantity:value.value};case QuestionnaireItemType.decimal:return{valueDecimal:value.value};case QuestionnaireItemType.integer:return{valueInteger:value.value};case QuestionnaireItemType.string:return{valueString:value.value};default:return}}function evaluateCalculatedExpression(item,response){if(!response)return;let extension=getExtension(item,HTTP_HL7_ORG7+"/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression");if(extension){let expression=extension.valueExpression?.expression;if(expression){let value=toTypedValue2(response),result=evalFhirPathTyped3(expression,[value],{"%resource":value});return result.length!==0?result[0]:void 0}}}function mergeUpdatedItems(mergedItems,updatedItems){return mergedItems.map(mergedItem=>{let updatedItem=updatedItems.find(updated=>updated.linkId===mergedItem.linkId);return updatedItem?{...mergedItem,item:updatedItem.item?mergeUpdatedItems(mergedItem.item||[],updatedItem.item):mergedItem.item,answer:updatedItem.answer||mergedItem.answer,extension:updatedItem.extension||mergedItem.extension}:mergedItem})}function getNewMultiSelectValues(selected,propertyName,item){let result=[];for(let selectedStr of selected){let option=item.answerOption?.find(candidate=>typedValueToString(getItemAnswerOptionValue(candidate))===selectedStr);if(option){let optionValue=getItemAnswerOptionValue(option);optionValue&&result.push({[propertyName]:optionValue.value})}}return result}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=getItemEnableWhenValueAnswer(enableWhen),anyMatch=!1,allMatch=!0;for(let actualAnswerValue of actualAnswers){let actualAnswer=getResponseItemAnswerValue(actualAnswerValue),{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=deepClone3(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,questionnaireResponse){return{resourceType:"QuestionnaireResponse",questionnaire:questionnaire.url??getReferenceString8(questionnaire),item:buildInitialResponseItems(questionnaire.item,questionnaireResponse?.item),status:"in-progress"}}function buildInitialResponseItems(items,questionnaireResponseItems){return items?.map(item=>buildInitialResponseItem(item,questionnaireResponseItems))??[]}function buildInitialResponseItem(item,questionnaireResponseItem){let existingResponseItem=questionnaireResponseItem?.find(responseItem=>responseItem.linkId===item.linkId);return{id:existingResponseItem?existingResponseItem.id:generateId2(),linkId:item.linkId,text:item.text,item:buildInitialResponseItems(item.item,existingResponseItem?.item),answer:existingResponseItem?existingResponseItem.answer:item.initial?.map(buildInitialResponseAnswer)??[]}}var nextId2=1;function generateId2(){return"id-"+nextId2++}function buildInitialResponseAnswer(answer){return{...answer}}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}function getItemInitialValue(initial){return getTypedPropertyValueWithoutSchema({type:"QuestionnaireItemInitial",value:initial},"value")}function getItemAnswerOptionValue(option){return getTypedPropertyValueWithoutSchema({type:"QuestionnaireItemAnswerOption",value:option},"value")}function getItemEnableWhenValueAnswer(enableWhen){return getTypedPropertyValueWithoutSchema({type:"QuestionnaireItemEnableWhen",value:enableWhen},"answer")}function getResponseItemAnswerValue(answer){return getTypedPropertyValueWithoutSchema({type:"QuestionnaireResponseItemAnswer",value:answer},"value")}import{createContext as createContext3}from"react";var QuestionnaireFormContext=createContext3({});import{Fragment as Fragment46,jsx as jsx130,jsxs as jsxs78}from"react/jsx-runtime";function QuestionnaireFormItem(props){let context=useContext24(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((a,idx)=>idx===props.index?newResponseAnswer:a)??[],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)??getItemInitialValue(initial),validationError=getExtension2(response,`${HTTP_HL7_ORG8}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx130("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx130(CheckboxFormSection,{title:props.item.text,htmlFor:props.item.linkId,children:jsx130(Checkbox6,{id:props.item.linkId,name:props.item.linkId,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer({valueBoolean:e.currentTarget.checked})})},props.item.linkId);break;case QuestionnaireItemType.decimal:formComponent=jsx130(TextInput24,{type:"number",step:"any",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueDecimal:e.currentTarget.value===""?void 0:e.currentTarget.valueAsNumber})});break;case QuestionnaireItemType.integer:formComponent=jsx130(TextInput24,{type:"number",step:1,id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueInteger:e.currentTarget.value===""?void 0:e.currentTarget.valueAsNumber})});break;case QuestionnaireItemType.date:formComponent=jsx130(TextInput24,{type:"date",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueDate:e.currentTarget.value})});break;case QuestionnaireItemType.dateTime:formComponent=jsx130(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueDateTime:newValue})});break;case QuestionnaireItemType.time:formComponent=jsx130(TextInput24,{type:"time",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueTime:e.currentTarget.value})});break;case QuestionnaireItemType.string:case QuestionnaireItemType.url:formComponent=jsx130(TextInput24,{id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer({valueString:value===""?void 0:value})}});break;case QuestionnaireItemType.text:formComponent=jsx130(Textarea4,{id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer({valueString:value===""?void 0:value})}});break;case QuestionnaireItemType.attachment:formComponent=jsx130(Group51,{py:4,children:jsx130(AttachmentInput,{path:"",name,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueAttachment:newValue})})});break;case QuestionnaireItemType.reference:formComponent=jsx130(ReferenceInput,{name,required:props.required??item.required,targetTypes:getQuestionnaireItemReferenceTargetTypes(item),searchCriteria:getQuestionnaireItemReferenceFilter(item,context.subject,context.encounter),defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueReference:newValue})});break;case QuestionnaireItemType.quantity:formComponent=jsx130(QuantityInput,{path:"",name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueQuantity:newValue}),disableWheel:!0});break;case QuestionnaireItemType.choice:case QuestionnaireItemType.openChoice:isDropDownChoice(item)&&!item.answerValueSet?formComponent=jsx130(QuestionnaireChoiceDropDownInput,{name,item,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):isMultiSelectChoice(item)&&!item.answerValueSet?formComponent=jsx130(QuestionnaireMultiSelectInput,{name,item,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):formComponent=jsx130(QuestionnaireChoiceSetInput,{name,item,initial,response,onChangeAnswer:e=>onChangeAnswer(e)});break;default:return null}return jsxs78(Fragment46,{children:[formComponent,validationError?.valueString&&jsx130(Text26,{c:"red",size:"lg",mt:4,children:validationError.valueString})]})}function QuestionnaireChoiceDropDownInput(props){let{name,item,initial,response}=props;if(!item.answerOption?.length)return jsx130(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),data2=[""];for(let option of item.answerOption){let optionValue=getItemAnswerOptionValue(option);data2.push(typedValueToString2(optionValue))}let defaultValue2=getCurrentAnswer(response)??initialValue;if(item.repeats){let{propertyName,data:data3}=formatSelectData(props.item),currentAnswer=getCurrentMultiSelectAnswer(response);return jsx130(MultiSelect2,{data:data3,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[typedValueToString2(initialValue)],onChange:selected=>{let values=getNewMultiSelectValues(selected,propertyName,item);props.onChangeAnswer(values)}})}return jsx130(NativeSelect12,{id:name,name,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){props.onChangeAnswer({});return}let option=item.answerOption[index-1],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize6(optionValue.type);props.onChangeAnswer({[propertyName]:optionValue.value})},defaultValue:formatCoding2(defaultValue2?.value)||defaultValue2?.value,data:data2})}function QuestionnaireMultiSelectInput(props){let{item,initial,response}=props;if(!item.answerOption?.length)return jsx130(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),{propertyName,data:data2}=formatSelectData(props.item),currentAnswer=getCurrentMultiSelectAnswer(response);return jsx130(MultiSelect2,{data:data2,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[typedValueToString2(initialValue)],onChange:selected=>{let values=getNewMultiSelectValues(selected,propertyName,item);props.onChangeAnswer(values)}})}function QuestionnaireChoiceSetInput(props){let{name,item,initial,onChangeAnswer,response}=props;return!item.answerOption?.length&&!item.answerValueSet?jsx130(NoAnswerDisplay,{}):item.answerValueSet?jsx130(CodingInput,{path:"",name,binding:item.answerValueSet,response,onChange:code=>onChangeAnswer({valueCoding:code}),creatable:item.type===QuestionnaireItemType.openChoice}):jsx130(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=getItemInitialValue(initial),options=[],defaultValue2;if(item.answerOption)for(let i=0;i<item.answerOption.length;i++){let option=item.answerOption[i],optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);optionValue?.value&&(initialValue&&stringify3(optionValue)===stringify3(initialValue)&&(defaultValue2=optionName),options.push([optionName,optionValue]))}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);return jsx130(Radio4.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])=>jsx130(Radio4,{id:optionName,value:optionName,py:4,label:jsx130(ResourcePropertyDisplay,{property:valueElementDefinition,propertyType:optionValue.type,value:optionValue.value})},optionName))})}function NoAnswerDisplay(){return jsx130(TextInput24,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){let results=response.answer;return getItemAnswerOptionValue(results?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response.answer;return results?results.map(a=>getItemAnswerOptionValue(a)).map(type=>formatCoding2(type?.value)||type?.value):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals2(option[1].value,defaultAnswer?.value))?.[0]}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 isMultiSelectChoice(item){return!!item.extension?.some(e=>e.url===HTTP_HL7_ORG8+"/fhir/StructureDefinition/questionnaire-itemControl"&&e.valueCodeableConcept?.coding?.[0]?.code==="multi-select")}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize6(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString2(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};import{Fragment as Fragment47,jsx as jsx131,jsxs as jsxs79}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum38(),defaultValue2=useResource12(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState71(!1),[value,setValue]=useState71(),[selectedKey,setSelectedKey]=useState71(),[hoverKey,setHoverKey]=useState71();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect27(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect27(()=>(setValue(ensureQuestionnaireKeys(defaultValue2??{resourceType:"Questionnaire",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]);let handleChange=(questionnaire,disableSubmit)=>{setValue(questionnaire),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire)};return!schemaLoaded||!value?null:jsx131("div",{children:jsxs79(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx131(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx131(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource2=isResourceType(props.item),isContainer=isResource2||item.type===QuestionnaireItemType.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef20(props.item);itemRef.current=props.item;function onClick(e){killEvent(e),props.setSelectedKey(props.item.id)}function onHover(e){killEvent(e),props.setHoverKey(props.item.id)}function changeItem(changedItem){let curr=itemRef.current;props.onChange({...curr,item:curr.item?.map(i=>i.id===changedItem.id?changedItem:i)})}function addItem(addedItem,disableSubmit){props.onChange({...props.item,item:[...props.item.item??[],addedItem]},disableSubmit)}function removeItem(removedItem){props.onChange({...props.item,item:props.item.item?.filter(i=>i!==removedItem)})}function changeProperty(property,value){props.onChange({...itemRef.current,[property]:value})}function updateItem(updatedItem){props.onChange({...props.item,...updatedItem})}function toggleRepeatable(item2){props.onChange({...props.item,item:props.item.item?.map(i=>i===item2?{...i,repeats:!i.repeats}:i)})}function moveItem(itemIndex,delta){let updatedItems=reorderItems(props.item.item,itemIndex,delta);props.onChange({...props.item,item:updatedItems})}let className=clsx_default(QuestionnaireBuilder_default.section,{[QuestionnaireBuilder_default.editing]:editing,[QuestionnaireBuilder_default.hovering]:hovering&&!editing});return jsxs79("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx131("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs79(Fragment47,{children:[isResource2&&jsx131(TextInput25,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource2&&jsx131(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx131(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx131(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs79(Fragment47,{children:[resource.title&&jsx131(Title8,{children:resource.title}),item.text&&jsx131("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx131(QuestionnaireFormItem,{item,index:0,required:!1,onChange:()=>{},response:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx131("div",{children:jsx131(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&&jsx131("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs79(Fragment47,{children:[jsx131(TextInput25,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx131(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"}]})]}):jsx131("div",{children:linkId})}),!isResource2&&jsx131(Box8,{className:QuestionnaireBuilder_default.movementActions,children:jsxs79(Box8,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx131(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx131(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx131(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx131(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs79("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs79(Fragment47,{children:[jsx131(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId3(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx131(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId3(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource2&&jsx131(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource2&&jsxs79(Fragment47,{children:[jsx131(Anchor13,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx131(Anchor13,{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 jsxs79("div",{children:[props.item.answerValueSet!==void 0?jsx131(TextInput25,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx131(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs79(Box8,{display:"flex",children:[jsx131(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId3()}]})},children:"Add choice"}),jsx131(Space2,{w:"lg"}),jsx131(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx131("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs79("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx131("div",{children:jsx131(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)}),jsx131("div",{children:jsx131(Anchor13,{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 jsxs79(Fragment47,{children:[targetTypes.map((targetType,index)=>jsxs79(Group52,{children:[jsx131(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx131(Anchor13,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx131(Anchor13,{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 Title10}from"@mantine/core";import{createReference as createReference13,getReferenceString as getReferenceString9}from"@medplum/core";import{useMedplum as useMedplum39,usePrevious as usePrevious2,useResource as useResource13}from"@medplum/react-hooks";import{useCallback as useCallback26,useEffect as useEffect29,useRef as useRef21,useState as useState74}from"react";import{Button as Button15,Group as Group53,Stack as Stack26,Stepper}from"@mantine/core";import{Anchor as Anchor14}from"@mantine/core";import{useState as useState72}from"react";import{jsx as jsx132,jsxs as jsxs80}from"react/jsx-runtime";function QuestionnaireRepeatableItem(props){let{item,response,onChange}=props,[number,setNumber]=useState72(getNumberOfRepeats(item,response??{linkId:item.linkId}));if(!props.checkForQuestionEnabled(item)||!response)return null;if(item.type===QuestionnaireItemType.display)return jsx132("p",{children:item.text},item.linkId);let showAddButton=item?.repeats&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice;return item.type===QuestionnaireItemType.boolean?jsx132(QuestionnaireFormItem,{item,response,onChange:r2=>onChange([r2]),index:0},item.linkId):jsxs80(FormSection,{htmlFor:props.item.linkId,title:props.item.text,withAsterisk:props.item.required,children:[[...Array(number)].map((_,index)=>jsx132(QuestionnaireFormItem,{item,response,onChange:r2=>onChange([r2]),index},`${item.linkId}-${index}`)),showAddButton&&jsx132(Anchor14,{onClick:()=>setNumber(n=>n+1),children:"Add Item"})]},props.item.linkId)}function getNumberOfRepeats(item,response){if(item.type===QuestionnaireItemType.choice||item.type===QuestionnaireItemType.openChoice)return 1;let answers=response.answer;return answers?.length?answers.length:1}import{Anchor as Anchor15,Stack as Stack25,Title as Title9}from"@mantine/core";import{useEffect as useEffect28,useState as useState73}from"react";import{Fragment as Fragment48,jsx as jsx133,jsxs as jsxs81}from"react/jsx-runtime";function QuestionnaireRepeatedGroup(props){let[responses,setResponses]=useState73(props.response);if(useEffect28(()=>{setResponses(props.response)},[props.response]),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,void 0);setResponses([...responses,newResponse])}return jsxs81(Fragment48,{children:[responses.map((response,idx)=>jsx133(QuestionnaireGroup,{item:props.item,response,checkForQuestionEnabled:props.checkForQuestionEnabled,onChange:r2=>handleRepeatableGroup(r2,idx)},response.id)),props.item.repeats&&jsx133(Anchor15,{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)?jsxs81("div",{children:[props.item.text&&jsx133(Title9,{order:3,mb:"md",children:props.item.text}),jsx133(Stack25,{children:props.item.item?.map(item=>item.type===QuestionnaireItemType.group?item.repeats?jsx133(QuestionnaireRepeatedGroup,{item,response:response.item?.filter(i=>i.linkId===item.linkId)??[],checkForQuestionEnabled,onChange:onSetGroup},item.linkId):jsx133(QuestionnaireGroup,{item,checkForQuestionEnabled,response:response.item?.find(i=>i.linkId===item.linkId)??{linkId:item.linkId},onChange:onSetGroup},item.linkId):jsx133(QuestionnaireRepeatableItem,{item,response:response.item?.find(i=>i.linkId===item.linkId),onChange:onSetGroup,checkForQuestionEnabled},item.linkId))})]},props.item.linkId):null}import{Fragment as Fragment49,jsx as jsx134,jsxs as jsxs82}from"react/jsx-runtime";function QuestionnairePageSequence(props){let{items,response,activePage,onChange,nextStep,prevStep,numberOfPages,renderPages,submitButtonText,excludeButtons,checkForQuestionEnabled}=props,form=items.map(item=>{let itemResponse=response?.item?.filter(i=>i.linkId===item.linkId)??[],repeatedItem=item.type===QuestionnaireItemType.group?jsx134(QuestionnaireRepeatedGroup,{item,response:itemResponse,onChange,checkForQuestionEnabled},item.linkId):jsx134(QuestionnaireRepeatableItem,{item,response:itemResponse?.[0],onChange,checkForQuestionEnabled},item.linkId);return renderPages?jsx134(Stepper.Step,{label:item.text,children:repeatedItem},item.linkId):repeatedItem});return jsxs82(Fragment49,{children:[renderPages&&jsx134(Stepper,{active:activePage??0,allowNextStepsSelect:!1,p:6,children:form}),!renderPages&&jsx134(Stack26,{children:form}),!excludeButtons&&jsx134(ButtonGroup,{activePage:activePage??0,numberOfPages,nextStep:renderPages?nextStep:void 0,prevStep:renderPages?prevStep:void 0,renderPages,submitButtonText})]})}function ButtonGroup(props){let showBackButton=props.renderPages&&props.activePage>0,showNextButton=props.renderPages&&props.activePage<props.numberOfPages-1,showSubmitButton=!props.renderPages||props.activePage===props.numberOfPages-1;return jsxs82(Group53,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx134(Button15,{onClick:props.prevStep,children:"Back"}),showNextButton&&jsx134(Button15,{onClick:e=>{let form=e.currentTarget.closest("form");props.nextStep&&form.reportValidity()&&props.nextStep()},children:"Next"}),showSubmitButton&&jsx134(SubmitButton,{children:props.submitButtonText??"Submit"})]})}import{jsx as jsx135,jsxs as jsxs83}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum39(),{subject,source:sourceFromProps}=props,questionnaire=useResource13(props.questionnaire),prevQuestionnaire=usePrevious2(questionnaire),questionnaireResponse=useResource13(props.questionnaireResponse),[response,setResponse]=useState74(questionnaireResponse),[activePage,setActivePage]=useState74(0),onChangeRef=useRef21(props.onChange);onChangeRef.current=props.onChange;let onSubmitRef=useRef21(props.onSubmit);onSubmitRef.current=props.onSubmit,useEffect29(()=>{if(questionnaireResponse?.item&&questionnaire){let response2=buildInitialResponse(questionnaire,questionnaireResponse),evaluatedResponse=evaluateAndMergeResponseItems(response2,questionnaire);setResponse(evaluatedResponse)}else{if(questionnaire&&getQuestionnaireIdentity(prevQuestionnaire)===getQuestionnaireIdentity(questionnaire))return;setResponse(questionnaire?buildInitialResponse(questionnaire):void 0)}},[questionnaireResponse,questionnaire,prevQuestionnaire]),useEffect29(()=>{if(response&&onChangeRef.current)try{onChangeRef.current(response)}catch(e){console.error("Error invoking QuestionnaireForm.onChange callback",e)}},[response]);let setItems=useCallback26(newResponseItems=>{setResponse(prevResponse=>updateResponseItems(prevResponse,newResponseItems,questionnaire))},[questionnaire]),handleSubmit=useCallback26(()=>{let onSubmit=onSubmitRef.current;if(onSubmit&&questionnaire&&response){let source=sourceFromProps;if(!source){let profile=medplum.getProfile();profile&&(source=createReference13(profile))}onSubmit({...response,questionnaire:questionnaire.url??getReferenceString9(questionnaire),subject,source,authored:new Date().toISOString(),status:"completed"})}},[medplum,questionnaire,response,subject,sourceFromProps]);function checkForQuestionEnabled(item){return isQuestionEnabled(item,response)}if(!questionnaire||!response)return null;let numberOfPages=getNumberOfPages(questionnaire),nextStep=()=>setActivePage(current=>current+1),prevStep=()=>setActivePage(current=>current-1);return jsx135(QuestionnaireFormContext.Provider,{value:{subject:props.subject,encounter:props.encounter},children:jsxs83(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[questionnaire.title&&jsx135(Title10,{children:questionnaire.title}),jsx135(QuestionnairePageSequence,{items:questionnaire.item??[],response,onChange:setItems,renderPages:!props.disablePagination&&numberOfPages>1,activePage,numberOfPages,excludeButtons:props.excludeButtons,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}function getQuestionnaireIdentity(questionnaire){return questionnaire?.id||questionnaire}function updateResponseItems(prevResponse,newResponseItems,questionnaire){if(!newResponseItems)return{resourceType:"QuestionnaireResponse",status:"in-progress"};let currentItems=prevResponse?.item??[],mergedItems=mergeItems(currentItems,Array.isArray(newResponseItems)?newResponseItems:[newResponseItems]),tempResponse={resourceType:"QuestionnaireResponse",status:"in-progress",item:mergedItems},updatedItems=evaluateCalculatedExpressionsInQuestionnaire(questionnaire?.item??[],tempResponse);return tempResponse.item=mergeUpdatedItems(mergedItems,updatedItems),evaluateAndMergeResponseItems(tempResponse,questionnaire)}function evaluateAndMergeResponseItems(tempResponse,questionnaire){let updatedItems=evaluateCalculatedExpressionsInQuestionnaire(questionnaire?.item??[],tempResponse);return{resourceType:"QuestionnaireResponse",status:"in-progress",item:mergeUpdatedItems(tempResponse.item??[],updatedItems)}}import{ActionIcon as ActionIcon14,Divider as Divider4,Group as Group54,NativeSelect as NativeSelect14,Stack as Stack27,Text as Text27,TextInput as TextInput26}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect30,useState as useState75}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx136,jsxs as jsxs84}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]=useState75([]),[groupId,setGroupId]=useState75(1),[intervalId,setIntervalId]=useState75(1);return useEffect30(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs84(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx136(Stack27,{children:intervalGroups.map(intervalGroup=>jsx136(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx136(ActionIcon14,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx136(IconCirclePlus,{})}),jsx136(Group54,{justify:"flex-end",children:jsx136(SubmitButton,{children:"Save"})})]});function submitDefinition(){let qualifiedInterval=intervalGroups.flatMap(group=>group.intervals).filter(interval=>!isEmptyInterval(interval));props.onSubmit({...defaultDefinition,qualifiedInterval})}function addGroup(addedGroup){setIntervalGroups(currentGroups=>[...currentGroups,addedGroup])}function removeGroup(removedGroup){setIntervalGroups(currentGroups=>currentGroups.filter(group=>group.id!==removedGroup.id))}function changeInterval(groupId2,changedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2),index=currentGroup?.intervals.findIndex(interval=>interval.id===changedInterval.id);return index!==void 0&¤tGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g=>g.id===groupId2);if(currentGroupIndex!==-1){let currentGroup={...groups[currentGroupIndex]};addedInterval={...addedInterval,...currentGroup.filters},currentGroup.intervals=[...currentGroup.intervals,addedInterval],groups[currentGroupIndex]=currentGroup}return groups})}function removeInterval(groupId2,removedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx136(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs84(Stack27,{gap:"lg",children:[jsx136(Group54,{justify:"flex-end",children:jsx136(ActionIcon14,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx136(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx136(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx136(Divider4,{}),intervalGroup.intervals.map(interval=>jsxs84(Stack27,{gap:"xs",children:[jsxs84(Group54,{children:[jsx136(TextInput26,{"data-testid":`condition-${interval.id}`,defaultValue:interval.condition,label:"Condition: ",size:"sm",onChange:e=>{killEvent(e),props.onChange(intervalGroup.id,{...interval,condition:e.currentTarget.value.trim()})}},`condition-${interval.id}`),jsx136(ActionIcon14,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx136(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx136(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx136(ActionIcon14,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx136(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 jsxs84(Stack27,{style:{maxWidth:"50%"},children:[jsx136(Group54,{children:jsx136(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})}}})}),jsxs84(Group54,{gap:"xs",children:[jsx136(Text27,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx136("div",{id:`div-age-${intervalGroup.id}`,children:jsx136(RangeInput,{path:"",name:`age-${intervalGroup.id}`,defaultValue:intervalGroup.filters.age,onChange:ageRange=>{for(let interval of intervalGroup.intervals)onChange(intervalGroup.id,{...interval,age:ageRange})}},`age-${intervalGroup.id}`)})]}),jsx136(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"}]}})}}}),jsx136(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(f=>[f,interval[f]])),intervals:[]}),groups[groupKey].intervals.push(interval)}return setGroupId(groupId),Object.values(groups)}function generateGroupKey(interval){return[`gender=${interval.gender}`,`age=${formatRange2(interval.age)}`,`gestationalAge=${formatRange2(interval.gestationalAge)}`,`context=${interval.context?.text}`,`appliesTo=${interval.appliesTo?.map(c=>c.text).join("+")}`,`category=${interval.category}`].join(":")}function getUnitString(unit){return unit&&(getCodeBySystem(unit,"http://unitsofmeasure.org")||unit.text)}function isEmptyInterval(interval){return interval.range?.low?.value===void 0&&interval.range?.high?.value===void 0}import{Button as Button16,Grid as Grid4,Text as Text28}from"@mantine/core";import{formatDateTime as formatDateTime6,getReferenceString as getReferenceString10}from"@medplum/core";import{useMedplum as useMedplum40,useResource as useResource14}from"@medplum/react-hooks";import{Fragment as Fragment50,useEffect as useEffect31,useState as useState76}from"react";import{jsx as jsx137,jsxs as jsxs85}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum40(),requestGroup=useResource14(props.value),[startedLoading,setStartedLoading]=useState76(!1),[responseBundle,setResponseBundle]=useState76();if(useEffect31(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx137(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 jsxs85(Fragment50,{children:[jsx137(Grid4.Col,{span:1,p:"md",children:task?.status==="completed"?jsx137(IconCheckbox,{}):jsx137(IconSquare,{color:"gray"})}),jsxs85(Grid4.Col,{span:9,p:"xs",children:[jsx137(Text28,{fw:500,children:action.title}),action.description&&jsx137("div",{children:action.description}),jsxs85("div",{children:["Last edited by\xA0",jsx137(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime6(task?.meta?.lastUpdated)]}),jsxs85("div",{children:["Status: ",jsx137(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs85(Grid4.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx137(Button16,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx137(Button16,{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{useMedplum as useMedplum41}from"@medplum/react-hooks";import{useEffect as useEffect32,useState as useState77}from"react";import{stringify as stringify4}from"@medplum/core";function diff(original,revised){let path=buildPath(original,revised);return buildRevisions(path,original,revised)}function buildPath(orig,rev){let N=orig.length,M=rev.length,MAX=N+M+1,size=1+2*MAX,middle=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 k=-d;k<=d;k+=2){let kmiddle=middle+k,kplus=kmiddle+1,kminus=kmiddle-1,kplusNode=diagonal[kplus],kminusNode=diagonal[kminus],prev,i=0;k===-d||k!==d&&kminusNode.i<kplusNode.i?(i=kplusNode.i,prev=kplusNode):(i=kminusNode.i+1,prev=kminusNode),diagonal[kminus]=void 0;let j=i-k,node={i,j,prev:previousSnake(prev),snake:!1};for(;i<N&&j<M&&orig[i]===rev[j];)i++,j++;if(i>node.i&&(node={i,j,prev:node,snake:!0}),diagonal[kmiddle]=node,i>=N&&j>=M)return diagonal[kmiddle]}diagonal[middle+d-1]=void 0}}function buildRevisions(startNode,orig,rev){let deltas=[],path=startNode;for(path.snake&&(path=path.prev);path?.prev&&path.prev.j>=0;){let i=path.i,j=path.j;path=path.prev;let ianchor=path.i,janchor=path.j,original={position:ianchor,lines:orig.slice(ianchor,i)},revised={position:janchor,lines:rev.slice(janchor,j)},type;original.lines.length===0&&revised.lines.length>0?type="insert":original.lines.length>0&&revised.lines.length===0?type="delete":type="change",deltas.push({original,revised,type}),path.snake&&(path=path.prev)}return deltas}function previousSnake(node){return node&&!node.snake&&node.prev?node.prev:node}function blame(history){let versions=(history.entry??[]).filter(entry=>!!entry.resource).map(entry=>({meta:entry.resource?.meta,lines:stringify4(entry.resource,!0).match(/[^\r\n]+/g)})).sort((a,b)=>a.meta.lastUpdated.localeCompare(b.meta.lastUpdated));if(!versions.length)return[];let table=versions[0].lines.map(line=>({id:versions[0].meta.versionId,meta:versions[0].meta,value:line,span:1}));return compareVersions(table,versions),combineSpans(table),table}function compareVersions(table,versions){for(let i=1;i<versions.length;i++){let revisions=diff(versions[i-1].lines,versions[i].lines);for(let revision of revisions){let position=revision.original.position,oldLines=revision.original.lines,newLines=revision.revised.lines;if((revision.type==="delete"||revision.type==="change")&&table.splice(position,oldLines.length),revision.type==="insert"||revision.type==="change")for(let k=0;k<revision.revised.lines.length;k++)table.splice(position+k,0,{id:versions[i].meta.versionId,meta:versions[i].meta,value:newLines[k],span:1})}}}function combineSpans(table){let start=0;for(;start<table.length;){let curr=start;for(;curr<table.length&&table[curr].id===table[start].id;)table[curr].span=-1,curr++;table[start].span=curr-start,start=curr}}var ResourceBlame_default={container:"ResourceBlame_container",root:"ResourceBlame_root",startRow:"ResourceBlame_startRow",normalRow:"ResourceBlame_normalRow",author:"ResourceBlame_author",dateTime:"ResourceBlame_dateTime",lineNumber:"ResourceBlame_lineNumber",line:"ResourceBlame_line",pre:"ResourceBlame_pre"};function getVersionUrl(resource,versionId){return`/${resource.resourceType}/${resource.id}/_history/${versionId}`}function getTimeString(lastUpdated){let seconds=Math.floor((Date.now()-Date.parse(lastUpdated))/1e3),years=Math.floor(seconds/31536e3);if(years>0)return pluralizeTime(years,"year");let months=Math.floor(seconds/2592e3);if(months>0)return pluralizeTime(months,"month");let days=Math.floor(seconds/86400);if(days>0)return pluralizeTime(days,"day");let hours=Math.floor(seconds/3600);if(hours>0)return pluralizeTime(hours,"hour");let minutes=Math.floor(seconds/60);return minutes>0?pluralizeTime(minutes,"minute"):pluralizeTime(seconds,"second")}function pluralizeTime(count,noun){return`${count} ${count===1?noun:noun+"s"} ago`}import{Fragment as Fragment51,jsx as jsx138,jsxs as jsxs86}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum41(),[value,setValue]=useState77(props.history);if(useEffect32(()=>{!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 jsx138("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx138("div",{className:ResourceBlame_default.container,children:jsx138("table",{className:ResourceBlame_default.root,children:jsx138("tbody",{children:table.map((row,index)=>jsxs86("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs86(Fragment51,{children:[jsx138("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:jsx138(ResourceBadge,{value:row.meta.author,link:!0})}),jsx138("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx138(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),children:getTimeString(row.meta.lastUpdated)})})]}),jsx138("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx138("td",{className:ResourceBlame_default.line,children:jsx138("pre",{className:ResourceBlame_default.pre,children:row.value})})]},"row-"+index))})})})}import{stringify as stringify5}from"@medplum/core";var ResourceDiff_default={removed:"ResourceDiff_removed",added:"ResourceDiff_added"};import{Fragment as Fragment52,jsx as jsx139,jsxs as jsxs87}from"react/jsx-runtime";function ResourceDiff(props){let originalResource=props.original,revisedResource=props.revised;props.ignoreMeta&&(originalResource={...originalResource,meta:void 0},revisedResource={...revisedResource,meta:void 0});let original=stringify5(originalResource,!0).match(/[^\r\n]+/g),revised=stringify5(revisedResource,!0).match(/[^\r\n]+/g),deltas=diff(original,revised);return jsx139("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx139(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs87(Fragment52,{children:["...",jsx139("br",{}),props.delta.original.lines.length>0&&jsx139("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
|
|
72
|
-
`)}),props.delta.revised.lines.length>0&&
|
|
73
|
-
`)}),"...",jsx139("br",{})]})}import{ActionIcon as ActionIcon15,Alert as Alert5,Button as Button17,Group as Group55,Menu as Menu6,Stack as Stack28,TextInput as TextInput27,useMantineTheme}from"@mantine/core";import{AccessPolicyInteraction as AccessPolicyInteraction2,applyDefaultValuesToResource,canWriteResourceType,isPopulated as isPopulated12,satisfiedAccessPolicy as satisfiedAccessPolicy2,tryGetProfile as tryGetProfile5}from"@medplum/core";import{useMedplum as useMedplum42,useResource as useResource15}from"@medplum/react-hooks";import{useEffect as useEffect33,useMemo as useMemo30,useState as useState78}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx140,jsxs as jsxs88}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum42(),defaultValue2=useResource15(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState78(!1),[value,setValue]=useState78(),accessPolicy=medplum.getAccessPolicy(),theme=useMantineTheme();useEffect33(()=>{if(defaultValue2)if(props.profileUrl){let profileUrl=props.profileUrl;medplum.requestProfileSchema(props.profileUrl,{expandProfile:!0}).then(()=>{let profile=tryGetProfile5(profileUrl);if(profile){setSchemaLoaded(!0);let modifiedDefaultValue=applyDefaultValuesToResource(defaultValue2,profile);setValue(modifiedDefaultValue)}else console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)})}else medplum.requestSchema(resourceType).then(()=>{setValue(defaultValue2),setSchemaLoaded(!0)}).catch(console.log)},[medplum,defaultValue2,resourceType,props.profileUrl]);let accessPolicyResource=useMemo30(()=>defaultValue2&&satisfiedAccessPolicy2(defaultValue2,AccessPolicyInteraction2.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=useMemo30(()=>medplum.isSuperAdmin()||!accessPolicy||!isPopulated12(value?.resourceType)?!0:canWriteResourceType(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?jsx140("div",{children:"Loading..."}):canWrite?jsxs88("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs88(Stack28,{mb:"xl",children:[jsx140(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx140(TextInput27,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx140(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx140(TextInput27,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx140(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:resourceType,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl,accessPolicyResource}),jsxs88(Group55,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx140(Button17,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs88(Menu6,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx140(Menu6.Target,{children:jsx140(ActionIcon15,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx140(IconChevronDown,{size:14,stroke:1.5})})}),jsxs88(Menu6.Dropdown,{children:[props.onPatch&&jsx140(Menu6.Item,{leftSection:jsx140(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx140(Menu6.Item,{color:"red",leftSection:jsx140(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs88(Alert5,{color:"red",title:"Permission denied",icon:jsx140(IconAlertCircle,{}),children:["Your access level prevents you from editing and creating ",value.resourceType," resources."]})}import{Table as Table5}from"@mantine/core";import{formatDateTime as formatDateTime7,normalizeErrorString as normalizeErrorString11}from"@medplum/core";import{useMedplum as useMedplum43}from"@medplum/react-hooks";import{useEffect as useEffect34,useState as useState79}from"react";import{jsx as jsx141,jsxs as jsxs89}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum43(),[value,setValue]=useState79(props.history);return useEffect34(()=>{!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?jsxs89(Table5,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx141(Table5.Thead,{children:jsxs89(Table5.Tr,{children:[jsx141(Table5.Th,{children:"Author"}),jsx141(Table5.Th,{children:"Date"}),jsx141(Table5.Th,{children:"Version"})]})}),jsx141(Table5.Tbody,{children:value.entry?.map((entry,index)=>jsx141(HistoryRow,{entry},"entry-"+index))})]}):jsx141("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs89(Table5.Tr,{children:[jsx141(Table5.Td,{children:jsx141(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx141(Table5.Td,{children:formatDateTime7(resource.meta?.lastUpdated)}),jsx141(Table5.Td,{children:jsx141(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx141(Table5.Tr,{children:jsx141(Table5.Td,{colSpan:3,children:normalizeErrorString11(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button18,Stack as Stack29,Text as Text29}from"@mantine/core";import{getReferenceString as getReferenceString11,isReference as isReference3}from"@medplum/core";import{useResource as useResource16,useSearchResources}from"@medplum/react-hooks";import{useState as useState80}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx142,jsxs as jsxs90}from"react/jsx-runtime";function Scheduler(props){let schedule=useResource16(props.schedule),questionnaire=useResource16(props.questionnaire),[month,setMonth]=useState80(getStartMonth()),[date,setDate]=useState80(),[slot,setSlot]=useState80(),[response,setResponse]=useState80(),[slots]=useSearchResources("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 jsxs90("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs90("div",{className:Scheduler_default.info,children:[actor&&jsx142(ResourceAvatar,{value:actor,size:"xl"}),actor&&jsx142(Text29,{size:"xl",fw:500,children:jsx142(ResourceName,{value:actor})}),jsx142("p",{children:"1 hour"}),date&&jsx142("p",{children:date.toLocaleDateString()}),slot&&jsx142("p",{children:formatTime(new Date(slot.start))})]}),jsxs90("div",{className:Scheduler_default.selection,children:[!date&&jsxs90("div",{children:[jsx142("h3",{children:"Select date"}),jsx142(CalendarInput,{slots,onChangeMonth:setMonth,onClick:setDate})]}),date&&!slot&&jsxs90("div",{children:[jsx142("h3",{children:"Select time"}),jsx142(Stack29,{children:slots.map(s=>{let slotStart=new Date(s.start);return slotStart.getTime()>date.getTime()&&slotStart.getTime()<date.getTime()+24*3600*1e3&&jsx142("div",{children:jsx142(Button18,{variant:"outline",style:{width:150},onClick:()=>setSlot(s),children:formatTime(slotStart)})},s.id)})})]}),date&&slot&&!response&&jsx142(QuestionnaireForm,{questionnaire,submitButtonText:"Next",onSubmit:setResponse}),date&&slot&&response&&jsxs90("div",{children:[jsx142("h3",{children:"You're all set!"}),jsx142("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 createReference14}from"@medplum/core";import{jsx as jsx143}from"react/jsx-runtime";function ServiceRequestTimeline(props){let{serviceRequest,...rest}=props;return jsx143(ResourceTimeline,{value:serviceRequest,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("ServiceRequest",id),medplum.search("Communication",{"based-on":ref,_count}),medplum.search("DiagnosticReport",{"based-on":ref,_count}),medplum.search("Media",{"based-on":ref,_count}),medplum.search("DocumentReference",{related:ref,_count}),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count})])},createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",basedOn:[createReference14(resource)],subject:resource.subject,sender:createReference14(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference14(resource)],subject:resource.subject,operator:createReference14(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor16}from"@mantine/core";import{showNotification as showNotification8}from"@mantine/notifications";import{ensureTrailingSlash,normalizeErrorString as normalizeErrorString12}from"@medplum/core";import{useMedplum as useMedplum44}from"@medplum/react-hooks";import{jsx as jsx144}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum44(),{client,patient,encounter,children,...rest}=props;function launchApp(){medplum.createResource({resourceType:"SmartAppLaunch",patient,encounter}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",ensureTrailingSlash(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),window.location.assign(url.toString())}).catch(err=>showNotification8({color:"red",message:normalizeErrorString12(err),autoClose:!1}))}return jsx144(Anchor16,{onClick:()=>launchApp(),...rest,children})}export{AddressDisplay,AddressInput,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,CalendarInput,ChatModal,CheckboxFormSection,CodeInput,CodeableConceptDisplay,CodeableConceptInput,CodingDisplay,CodingInput,ContactDetailDisplay,ContactDetailInput,ContactPointDisplay,ContactPointInput,Container,DateTimeInput,DefaultResourceTimeline,DescriptionList,DescriptionListEntry,DiagnosticReportDisplay,Document,ElementDefinitionInputSelector,ElementDefinitionTypeInput,EncounterTimeline,ErrorBoundary,FhirPathTable,Form,FormSection,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,InfoBar,Loading,Logo,MeasureReportDisplay,MedplumLink,MemoizedFhirPathTable,MemoizedSearchControl,MoneyDisplay,MoneyInput,Navbar,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,Panel,PatientExportForm,PatientHeader,PatientSummary,PatientTimeline,PlanDefinitionBuilder,QuantityDisplay,QuantityInput,QuestionnaireBuilder,QuestionnaireForm,QuestionnaireFormContext,QuestionnaireItemType,RangeDisplay,RangeInput,RatioInput,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,SubmitButton,ThreadChat,Timeline,TimelineItem,TimingInput,ValueSetAutocomplete,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNext24HoursFilter,addNextMonthFilter,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,buildInitialResponse,buildInitialResponseItem,clearFilters,clearFiltersOnField,convertIsoToLocal,convertLocalToIso,createScriptTag,deleteFilter,evaluateCalculatedExpressionsInQuestionnaire,exportJsonFile,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getItemAnswerOptionValue,getItemEnableWhenValueAnswer,getItemInitialValue,getNewMultiSelectValues,getNumberOfPages,getOpString,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,getRecaptcha,getResponseItemAnswerValue,getSearchOperators,getSortField,getValuePath,initRecaptcha,isAuxClick,isCheckboxCell,isChoiceQuestion,isQuestionEnabled,isSortDescending,isSupportedProfileStructureDefinition,killEvent,mergeUpdatedItems,parseForm,renderValue,sendCommand,setFilters,setOffset,setPage,setPropertyValue,setQuestionnaireItemReferenceTargetTypes,setSort,sortByDateAndPriority,toggleSort,typedValueToResponseItem};
|
|
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 Group26,Stack as Stack10,Text as Text11}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useMedplum as useMedplum19}from"@medplum/react-hooks";import{useContext as useContext19,useEffect as useEffect12,useState as useState38}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group25,Stack as Stack9,Text as Text10}from"@mantine/core";import{buildElementsContext as buildElementsContext3,getPropertyDisplayName,isEmpty as isEmpty5,isPopulated as isPopulated10}from"@medplum/core";import{useContext as useContext18,useMemo as useMemo18,useState as useState37}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon3,Button as Button5}from"@mantine/core";import{jsx as jsx75}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx75(Button5,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx75(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx75(ActionIcon3,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx75(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon4}from"@mantine/core";import{jsx as jsx76}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx76(ActionIcon4,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx76(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx77,jsxs as jsxs41}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState37(props.defaultValue),sliceElements=slice.typeSchema?.elements??slice.elements,parentElementsContextValue=useContext18(ElementsContext),contextValue=useMemo18(()=>{if(isPopulated10(sliceElements))return buildElementsContext3({parentContext:parentElementsContextValue,elements:sliceElements,path:props.path,profileUrl:slice.typeSchema?.url})},[parentElementsContextValue,props.path,slice.typeSchema?.url,sliceElements]);function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}let required=slice.min>0,indentedStack=isEmpty5(slice.elements),propertyDisplayName=getPropertyDisplayName(slice.name),showEmptyMessage=props.property.readonly&&values.length===0;return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx77(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx77(Text10,{c:"dimmed",children:"(empty)"}):jsxs41(Stack9,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs41(Group25,{wrap:"nowrap",children:[jsx77("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx77(ElementDefinitionTypeInput,{elementDefinitionType:slice.type[0],name:slice.name,defaultValue:value,onChange:newValue=>{let newValues=[...values];newValues[valueIndex]=newValue,setValuesWrapper(newValues)},outcome:props.outcome,min:slice.min,max:slice.max,binding:slice.binding,path:props.path,valuePath:void 0,readOnly:props.property.readonly})}),!props.property.readonly&&values.length>slice.min&&jsx77(ArrayRemoveButton,{propertyDisplayName,testId:props.testId&&`${props.testId}-remove-${valueIndex}`,onClick:e=>{killEvent(e);let newValues=[...values];newValues.splice(valueIndex,1),setValuesWrapper(newValues)}})]},`${valueIndex}-${values.length}`)),!props.property.readonly&&values.length<slice.max&&jsx77(Group25,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx77(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx78,jsxs as jsxs42}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum19(),[loading,setLoading]=useState38(!0),[slices,setSlices]=useState38([]),[defaultValue2]=useState38(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState38(()=>[defaultValue2]),ctx=useContext19(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect12(()=>{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 jsx78("div",{children:"Loading..."});let nonSliceIndex=slices.length,nonSliceValues=slicedValues[nonSliceIndex],showNonSliceValues=!(props.hideNonSliceValues??(propertyTypeCode==="Extension"&&slices.length>0)),propertyDisplayName=getPathDisplayName4(property.path),showEmptyMessage=props.property.readonly&&slices.length===0&&defaultValue2.length===0;return jsxs42(Stack10,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx78(Text11,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx78(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)=>jsxs42(Group26,{wrap:"nowrap",style:{flexGrow:1},children:[jsx78("div",{style:{flexGrow:1},children:jsx78(ResourcePropertyInput,{arrayElement:!0,property:props.property,name:props.name+"."+valueIndex,path:props.path,valuePath:getValuePath(props.path,props.valuePath,valueIndex),defaultValue:value,onChange:newValue=>{let newNonSliceValues=[...nonSliceValues];newNonSliceValues[valueIndex]=newValue,setValuesWrapper(newNonSliceValues,nonSliceIndex)},defaultPropertyType:void 0,outcome:props.outcome})}),!props.property.readonly&&jsx78(ArrayRemoveButton,{propertyDisplayName,testId:`nonsliced-remove-${valueIndex}`,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.splice(valueIndex,1),setValuesWrapper(newNonSliceValues,nonSliceIndex)}})]},`${valueIndex}-${nonSliceValues.length}`)),!props.property.readonly&&showNonSliceValues&&slicedValues.flat().length<property.max&&jsx78(Group26,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx78(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 as Flex2,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification5}from"@mantine/notifications";import{useRef as useRef11,useState as useState39}from"react";import{jsx as jsx79,jsxs as jsxs43}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState39(!1),clipboard=useClipboard(),ref=useRef11(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs43(Flex2,{gap:"xs",children:[jsx79(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx79(ActionIcon5,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification5({color:"green",message:"Copied"})},children:jsx79(IconCopy,{})})]})}import{Button as Button6,Chip,Group as Group27,Modal as Modal2,NativeSelect as NativeSelect8,Stack as Stack11,Switch,TextInput as TextInput16}from"@mantine/core";import{formatTiming as formatTiming2}from"@medplum/core";import{useContext as useContext20,useMemo as useMemo19,useRef as useRef12,useState as useState40}from"react";import{Fragment as Fragment27,jsx as jsx80,jsxs as jsxs44}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState40(props.defaultValue),[open,setOpen]=useState40(!props.disabled&&(props.defaultModalOpen??!1)),valueRef=useRef12(value);return valueRef.current=value,jsxs44(Fragment27,{children:[jsxs44(Group27,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx80("span",{children:formatTiming2(valueRef.current)||"No repeat"}),jsx80(Button6,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx80(TimingEditorDialog,{path:props.path,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]=useState40(props.defaultValue||defaultValue),{getExtendedProps}=useContext20(ElementsContext),[eventProps,repeatProps,repeatPeriodProps,repeatPeriodUnitProps,repeatDayOfWeekProps]=useMemo19(()=>["event","repeat","repeat.period","repeat.periodUnit","repeat.dayOfWeek"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]),valueRef=useRef12(value);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 jsx80(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs44(Stack11,{children:[jsx80(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx80(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx80(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs44(Fragment27,{children:[jsx80(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs44(Group27,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx80(TextInput16,{disabled:repeatPeriodProps?.readonly,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)}),jsx80(NativeSelect8,{disabled:repeatPeriodUnitProps?.readonly,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"&&jsx80(FormSection,{title:"Repeat on",children:jsx80(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,children:jsx80(Group27,{justify:"space-between",mt:"md",gap:"xs",children:daysOfWeek.map(day=>jsx80(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,children:day.charAt(0).toUpperCase()},day))})})})]}),jsx80(Group27,{justify:"flex-end",children:jsx80(Button6,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx81,jsxs as jsxs45}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 jsx81(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx81(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx81(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx81(ElementDefinitionTypeInput,{name,defaultValue:defaultValue2,onChange:newValue=>{if(props.onChange){let newPropName=props.name.replace("[x]",capitalize2(propertyTypes[0].code));props.onChange(newValue,newPropName)}},outcome:props.outcome,elementDefinitionType:propertyTypes[0],min:property.min,max:property.min,binding:property.binding,path:props.path,valuePath:props.valuePath,readOnly:property.readonly})}function ElementDefinitionInputSelector(props){let propertyTypes=props.elementDefinitionTypes,initialPropertyType;props.defaultPropertyType&&(initialPropertyType=propertyTypes.find(t=>t.code===props.defaultPropertyType)),initialPropertyType||(initialPropertyType=propertyTypes[0]);let[selectedType,setSelectedType]=useState41(initialPropertyType);return jsxs45(Group28,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx81(NativeSelect9,{disabled:props.property.readonly,style:{width:"200px"},defaultValue:selectedType.code,"data-testid":props.name&&props.name+"-selector",onChange:e=>{setSelectedType(propertyTypes.find(type=>type.code===e.currentTarget.value))},data:propertyTypes.map(type=>({value:type.code,label:type.code}))}),jsx81(ElementDefinitionTypeInput,{name:props.name,defaultValue:props.defaultValue,outcome:props.outcome,elementDefinitionType:selectedType,onChange:newValue=>{props.onChange&&props.onChange(newValue,props.name.replace("[x]",capitalize2(selectedType.code)))},min:props.property.min,max:props.property.max,binding:props.property.binding,path:props.property.path,valuePath:props.valuePath,readOnly:props.property.readonly})]})}function ElementDefinitionTypeInput(props){let{name,onChange,outcome,binding,path,valuePath,readOnly}=props,required=props.min!==void 0&&props.min>0,propertyType=props.elementDefinitionType.code,elementsContext=useContext21(ElementsContext),defaultValue2=useMemo20(()=>{if(!isComplexTypeCode(propertyType)||!isEmpty6(props.defaultValue))return props.defaultValue;let withDefaults=Object.create(null);if(elementsContext.path===props.path)applyDefaultValuesToElement(withDefaults,elementsContext.elements);else{let key=getPathDifference(elementsContext.path,props.path);if(key===void 0)return props.defaultValue;applyDefaultValuesToElement(withDefaults,elementsContext.elements,key)}return isPopulated11(withDefaults)?withDefaults:props.defaultValue},[propertyType,elementsContext.path,elementsContext.elements,props.path,props.defaultValue]);if(!propertyType)return jsx81("div",{children:"Property type not specified "});function getComplexInputProps(){return{name,defaultValue:defaultValue2,onChange,outcome,path,valuePath,disabled:readOnly}}function getPrimitiveInputProps(){let error=getErrorsForInput(props.outcome,valuePath??path);return{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,error,disabled:readOnly}}switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.string:case PropertyType2.time:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"?jsx81(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx81(TextInput17,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx81(TextInput17,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx81(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx81(TextInput17,{...getPrimitiveInputProps(),type:"number",step:propertyType===PropertyType2.decimal?"any":"1",onChange:e=>{if(onChange){let num=e.currentTarget.valueAsNumber;onChange(Number.isNaN(num)?void 0:num)}}});case PropertyType2.code:return jsx81(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx81(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:return jsx81(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx81(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx81(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx81(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx81(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx81(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx81(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx81(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx81(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx81(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx81(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx81(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx81(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx81(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx81(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx81(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx81(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx81(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx81(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 jsx82}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState42(props.defaultValue??{}),elementsContext=useContext22(ElementsContext),elementsToRender=useMemo21(()=>getElementsToRender(elementsContext.elements),[elementsContext.elements]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let typedValue={type:props.type,value};return jsx82(Stack12,{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=jsx82(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"?jsx82(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx82(FormSection,{title:getPathDisplayName5(key),description:element.description,withAsterisk:required,htmlFor:key,outcome:props.outcome,fhirPath:element.path,errorExpression:valuePath,readonly:element.readonly,children:resourcePropertyInput},key)})})}import{jsx as jsx83,jsxs as jsxs46}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState43(()=>props.defaultValue??{}),parentElementsContext=useContext23(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo22(()=>tryGetDataType2(props.typeName,profileUrl),[props.typeName,profileUrl]),type=typeSchema?.type??props.typeName,contextValue=useMemo22(()=>{if(typeSchema)return buildElementsContext4({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);return typeSchema?maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx83(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})):jsxs46("div",{children:[type,"\xA0not implemented"]})}import{Button as Button7,Group as Group29}from"@mantine/core";import{useMemo as useMemo23,useState as useState44}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 jsx84,jsxs as jsxs47}from"react/jsx-runtime";function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState44(getStartMonth);function moveMonth(delta){setMonth(currMonth=>{let newMonth=new Date(currMonth.getTime());return newMonth.setMonth(currMonth.getMonth()+delta),onChangeMonth(newMonth),newMonth})}let grid=useMemo23(()=>buildGrid(month,props.slots),[month,props.slots]);return jsxs47("div",{children:[jsxs47(Group29,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx84("p",{style:{flex:1},children:getMonthString(month)}),jsxs47(Group29,{justify:"flex-end",gap:"xs",children:[jsx84(Button7,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx84(Button7,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs47("table",{className:CalendarInput_default.table,children:[jsx84("thead",{children:jsxs47("tr",{children:[jsx84("th",{children:"SUN"}),jsx84("th",{children:"MON"}),jsx84("th",{children:"TUE"}),jsx84("th",{children:"WED"}),jsx84("th",{children:"THU"}),jsx84("th",{children:"FRI"}),jsx84("th",{children:"SAT"})]})}),jsx84("tbody",{children:grid.map((week,weekIndex)=>jsx84("tr",{children:week.map((day,dayIndex)=>jsx84("td",{children:day&&jsx84(Button7,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,slots){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d.getTime()),available:isDayAvailable(d,slots)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,slots){for(let slot of slots){let slotStart=new Date(slot.start);if(slotStart.getFullYear()===day.getFullYear()&&slotStart.getMonth()===day.getMonth()&&slotStart.getDate()===day.getDate())return!0}return!1}import{ActionIcon as ActionIcon6,Group as Group30,LoadingOverlay,Paper as Paper2,ScrollArea as ScrollArea2,Skeleton,Stack as Stack13,TextInput as TextInput18,Title as Title5}from"@mantine/core";import{useResizeObserver}from"@mantine/hooks";import{showNotification as showNotification6}from"@mantine/notifications";import{getDisplayString as getDisplayString4,getReferenceString as getReferenceString4,normalizeErrorString as normalizeErrorString6}from"@medplum/core";import{useMedplum as useMedplum20,useResource as useResource3,useSubscription}from"@medplum/react-hooks";import{useCallback as useCallback10,useEffect as useEffect13,useMemo as useMemo24,useRef as useRef13,useState as useState45}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 jsx85,jsxs as jsxs48}from"react/jsx-runtime";function showError(message){showNotification6({color:"red",title:"Error",message,autoClose:!1})}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((a,b)=>a.sent.localeCompare(b.sent)),setCommunications(newCommunications)}function BaseChat(props){let{title,communications,setCommunications,query,sendMessage,onMessageReceived,onMessageUpdated,inputDisabled,onError,...paperProps}=props,medplum=useMedplum20(),inputRef=useRef13(null),scrollAreaRef=useRef13(null),firstScrollRef=useRef13(!0),initialLoadRef=useRef13(!0),[profile,setProfile]=useState45(medplum.getProfile()),[reconnecting,setReconnecting]=useState45(!1),[loading,setLoading]=useState45(!0);loading||(initialLoadRef.current=!1);let profileRefStr=useMemo24(()=>profile?getReferenceString4(medplum.getProfile()):"",[profile,medplum]),searchMessages=useCallback10(async()=>{setLoading(!0);let searchParams=new URLSearchParams(query);searchParams.append("_sort","-sent"),searchParams.append("sent:missing","false");let searchResult=await medplum.searchResources("Communication",searchParams,{cache:"no-cache"});upsertCommunications(communicationsRef.current,searchResult,setCommunications),setLoading(!1)},[medplum,setCommunications,query]);useEffect13(()=>{searchMessages().catch(err=>showNotification6({color:"red",message:normalizeErrorString6(err)}))},[searchMessages]),useSubscription(`Communication?${query}`,bundle=>{let communication=bundle.entry?.[1]?.resource;upsertCommunications(communicationsRef.current,[communication],setCommunications),getReferenceString4(communication.sender)!==profileRefStr&&(communicationsRef.current.find(c=>c.id===communication.id)?onMessageUpdated?.(communication):onMessageReceived?.(communication))},{onWebSocketClose:useCallback10(()=>{reconnecting||setReconnecting(!0),showNotification6({color:"red",message:"Live chat disconnected. Attempting to reconnect..."})},[reconnecting]),onWebSocketOpen:useCallback10(()=>{reconnecting&&showNotification6({color:"green",message:"Live chat reconnected."})},[reconnecting]),onSubscriptionConnect:useCallback10(()=>{reconnecting&&(searchMessages().catch(err=>showNotification6({color:"red",message:normalizeErrorString6(err)})),setReconnecting(!1))},[reconnecting,searchMessages]),onError:useCallback10(err=>{onError?onError(err):showError(normalizeErrorString6(err))},[onError])});let sendMessageInternal=useCallback10(formData=>{inputDisabled||(inputRef.current&&(inputRef.current.value=""),sendMessage(formData.message),scrollToBottomRef.current=!0)},[inputDisabled,sendMessage]);useEffect13(()=>{let latestProfile=medplum.getProfile();profile?.id!==latestProfile?.id&&(setProfile(latestProfile),setCommunications([]))});let[parentRef,parentRect]=useResizeObserver(),communicationsRef=useRef13(communications);communicationsRef.current=communications;let prevCommunicationsRef=useRef13(communications),scrollToBottomRef=useRef13(!0);useEffect13(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),useEffect13(()=>{scrollToBottomRef.current&&scrollAreaRef.current?.scrollTo&&(scrollAreaRef.current.scrollTo({top:scrollAreaRef.current.scrollHeight,...firstScrollRef.current?{duration:0}:{behavior:"smooth"}}),firstScrollRef.current=!1,scrollToBottomRef.current=!1)});let myLastDeliveredId=useMemo24(()=>{let i=communications.length;for(;i--;){let comm=communications[i];if(comm.sender?.reference===profileRefStr&&comm.received)return comm.id}return""},[communications,profileRefStr]);return profile?jsxs48(Paper2,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[jsx85(Title5,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx85("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs48(Stack13,{align:"stretch",mt:"lg",children:[jsxs48(Group30,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx85(Skeleton,{height:38,circle:!0,ml:"md"}),jsx85(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs48(Group30,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx85(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx85(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs48(Group30,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx85(Skeleton,{height:38,circle:!0,ml:"md"}),jsx85(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs48(ScrollArea2,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx85(LoadingOverlay,{visible:loading||reconnecting,style:{width:parentRect.width,height:parentRect.height,position:"absolute",zIndex:1}}),communications.map((c,i)=>{let prevCommunication=i>0?communications[i-1]:void 0,prevCommTime=prevCommunication?parseSentTime(prevCommunication):void 0,currCommTime=parseSentTime(c);return jsxs48(Stack13,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx85("div",{style:{textAlign:"center"},children:currCommTime}),c.sender?.reference===profileRefStr?jsxs48(Group30,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx85(ChatBubble,{alignment:"right",communication:c,showDelivered:!!c.received&&c.id===myLastDeliveredId}),jsx85(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender})]}):jsxs48(Group30,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx85(ResourceAvatar,{radius:"xl",value:c.sender}),jsx85(ChatBubble,{alignment:"left",communication:c})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsx85("div",{className:BaseChat_default.chatInputContainer,children:jsx85(Form,{onSubmit:sendMessageInternal,children:jsx85(TextInput18,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",rightSectionWidth:42,disabled:inputDisabled,rightSection:inputDisabled?void 0:jsx85(ActionIcon6,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx85(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=useResource3(communication.sender);return jsxs48("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx85("div",{className:clsx_default(BaseChat_default.chatBubbleName,alignment==="right"&&BaseChat_default.chatBubbleNameRight),"aria-label":"Sender name",children:senderResource?getDisplayString4(senderResource):"[Unknown sender]"}),jsx85("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx85("div",{className:BaseChat_default.chatBubble,children:content})}),showDelivered&&jsxs48("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs48("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx85("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx85("div",{style:{position:"relative"},children:jsx85(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx85("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx85("div",{className:BaseChat_default.chatBubble,children:jsx85(Skeleton,{height:14,width:parentWidth*.5,radius:"l"})})})]})}import{ActionIcon as ActionIcon7}from"@mantine/core";import{useMedplumProfile as useMedplumProfile4}from"@medplum/react-hooks";import{useEffect as useEffect14,useState as useState46}from"react";var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};import{Fragment as Fragment28,jsx as jsx86,jsxs as jsxs49}from"react/jsx-runtime";function ChatModal(props){let{open,children}=props,profile=useMedplumProfile4(),[opened,setOpened]=useState46(open??!1);return useEffect14(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?jsxs49(Fragment28,{children:[opened&&jsx86("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx86("div",{className:ChatModal_default.iconContainer,children:jsx86(ActionIcon7,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx86(IconChevronDown,{size:"1.625rem"})})}):jsx86("div",{className:ChatModal_default.iconContainer,children:jsx86(ActionIcon7,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx86(IconChevronUp,{size:"1.625rem"})})})]}):null}import{createReference as createReference3,formatCodeableConcept as formatCodeableConcept2,getReferenceString as getReferenceString5}from"@medplum/core";import{useMedplum as useMedplum21,useMedplumProfile as useMedplumProfile5,usePrevious}from"@medplum/react-hooks";import{useCallback as useCallback11,useEffect as useEffect15,useMemo as useMemo25,useState as useState47}from"react";import{jsx as jsx87}from"react/jsx-runtime";function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,onError}=props,medplum=useMedplum21(),profile=useMedplumProfile5(),prevThreadId=usePrevious(thread?.id),[communications,setCommunications]=useState47([]),profileRef=useMemo25(()=>profile?createReference3(profile):void 0,[profile]),threadRef=useMemo25(()=>createReference3(thread),[thread]);useEffect15(()=>{thread?.id!==prevThreadId&&setCommunications([])},[thread?.id,prevThreadId]);let sendMessage=useCallback11(message=>{let profileRefStr=profileRef?getReferenceString5(profileRef):void 0;profileRefStr&&medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>getReferenceString5(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload:[{contentString:message}],partOf:[threadRef]}).then(communication=>{setCommunications([...communications,communication]),onMessageSent?.(communication)}).catch(console.error)},[medplum,profileRef,thread,threadRef,communications,onMessageSent]),onMessageReceived=useMemo25(()=>thread.recipient?.length===2?message=>{message.received&&message.status==="completed"||medplum.updateResource({...message,received:message.received??new Date().toISOString(),status:"completed"}).catch(console.error)}:void 0,[medplum,thread.recipient?.length]);return profile?jsx87(BaseChat,{title:title??(thread?.topic?formatCodeableConcept2(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled,onError}):null}import{ActionIcon as ActionIcon9,Center as Center7,Group as Group34,Loader as Loader3,ScrollArea as ScrollArea3,TextInput as TextInput19}from"@mantine/core";import{showNotification as showNotification7,updateNotification}from"@mantine/notifications";import{createReference as createReference4,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useMedplum as useMedplum25,useResource as useResource7}from"@medplum/react-hooks";import{useCallback as useCallback12,useEffect as useEffect19,useRef as useRef14,useState as useState53}from"react";import{Group as Group32,List,Stack as Stack15,Text as Text13,Title as Title6}from"@mantine/core";import{capitalize as capitalize3,formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime2,formatObservationValue,isReference as isReference2}from"@medplum/core";import{useMedplum as useMedplum22,useResource as useResource5}from"@medplum/react-hooks";import{useEffect as useEffect16,useState as useState49}from"react";import{Blockquote,Stack as Stack14}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx88}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx88(Stack14,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx88(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 Group31}from"@mantine/core";import{Text as Text12}from"@mantine/core";import{getDisplayString as getDisplayString5,isOk,normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useResource as useResource4}from"@medplum/react-hooks";import{useState as useState48}from"react";import{jsx as jsx89}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState48(),resource=useResource4(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString7(outcome)}]`;else if(resource)text=getDisplayString5(resource);else return null;return link?jsx89(MedplumLink,{to:value,...rest,children:text}):jsx89(Text12,{component:"span",...rest,children:text})}import{jsx as jsx90,jsxs as jsxs50}from"react/jsx-runtime";function ResourceBadge(props){return jsxs50(Group31,{gap:"xs",children:[jsx90(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx90(ResourceName,{value:props.value,link:props.link})]})}import{Badge}from"@mantine/core";import{jsx as jsx91}from"react/jsx-runtime";var statusToColor={draft:"blue",active:"blue","on-hold":"yellow",revoked:"red",completed:"green","entered-in-error":"red",unknown:"gray",retired:"gray",registered:"blue",preliminary:"blue",final:"green",amended:"yellow",corrected:"yellow",cancelled:"red",requested:"blue",received:"blue",accepted:"blue",rejected:"red",ready:"blue","in-progress":"blue",failed:"red",proposed:"blue",pending:"blue",booked:"blue",arrived:"blue",fulfilled:"green",noshow:"red","checked-in":"blue",waitlist:"gray",routine:"gray",urgent:"red",asap:"red",stat:"red","not-done":"red",connected:"green",disconnected:"red",finished:"green",planned:"gray"};function StatusBadge(props){return jsx91(Badge,{color:props.color||statusToColor[props.status],variant:props.variant,children:props.status.replace(/-/g," ")})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment29,jsx as jsx92,jsxs as jsxs51}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum22(),diagnosticReport=useResource5(props.value),[specimens,setSpecimens]=useState49();if(useEffect16(()=>{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 jsxs51(Stack15,{children:[jsx92(Title6,{children:"Diagnostic Report"}),jsx92(DiagnosticReportHeader,{value:diagnosticReport}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx92(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx92(NoteDisplay,{value:specimenNotes})]})}function DiagnosticReportHeader({value}){return jsxs51(Group32,{mt:"md",gap:30,children:[value.subject&&jsxs51("div",{children:[jsx92(Text13,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx92(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs51("div",{children:[jsx92(Text13,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx92(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs51("div",{children:[jsx92(Text13,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx92(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs51("div",{children:[jsx92(Text13,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx92(Text13,{children:formatDateTime2(value.issued)})]}),value.status&&jsxs51("div",{children:[jsx92(Text13,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx92(Text13,{children:capitalize3(value.status)})]})]})}function SpecimenInfo(specimens){return jsxs51(Stack15,{gap:"xs",children:[jsx92(Title6,{order:2,size:"h6",children:"Specimens"}),jsx92(List,{type:"ordered",children:specimens?.map(specimen=>jsx92(List.Item,{ml:"sm",children:jsxs51(Group32,{gap:20,children:[jsxs51(Group32,{gap:5,children:[jsx92(Text13,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs51(Group32,{gap:5,children:[jsx92(Text13,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs51("table",{className:DiagnosticReportDisplay_default.table,children:[jsx92("thead",{children:jsxs51("tr",{children:[jsx92("th",{children:"Test"}),jsx92("th",{children:"Value"}),jsx92("th",{children:"Reference Range"}),jsx92("th",{children:"Interpretation"}),jsx92("th",{children:"Category"}),jsx92("th",{children:"Performer"}),jsx92("th",{children:"Status"})]})}),jsx92("tbody",{children:jsx92(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx92(Fragment29,{children:props.value?.map(observation=>jsx92(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference2(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource5(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs51(Fragment29,{children:[jsxs51("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx92("td",{rowSpan:displayNotes?2:1,children:jsx92(MedplumLink,{to:observation,children:jsx92(CodeableConceptDisplay,{value:observation.code})})}),jsx92("td",{children:jsx92(ObservationValueDisplay,{value:observation})}),jsx92("td",{children:jsx92(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx92("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx92(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx92("td",{children:observation.category&&observation.category.length>0&&jsx92(Fragment29,{children:observation.category.map(concept=>jsx92("div",{children:jsx92(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx92("td",{children:observation.performer?.map(performer=>jsx92(ReferenceDisplay,{value:performer},performer.reference))}),jsx92("td",{children:observation.status&&jsx92(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx92(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx92("tr",{children:jsx92("td",{colSpan:6,children:jsx92(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx92(Fragment29,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx92(Fragment29,{children:range.text}):jsx92(RangeDisplay,{value:range}):null}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;return code==="AA"||code==="LL"||code==="HH"||code==="A"}var import_rfc6902=__toESM(require_rfc6902(),1);import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize4,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum23}from"@medplum/react-hooks";import{useEffect as useEffect17,useMemo as useMemo26,useState as useState51}from"react";import{Button as Button8,Table}from"@mantine/core";import{useState as useState50}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment30,jsx as jsx93,jsxs as jsxs52}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState50(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx93(Fragment30,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx93(Fragment30,{children:jsxs52(Table.Tr,{children:[jsx93(Table.Td,{children:name}),jsx93(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx93(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx93(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx93(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs52(Table.Tr,{children:[jsx93(Table.Td,{children:name}),jsx93(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx93(Button8,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx94,jsxs as jsxs53}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum23(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState51(!1);useEffect17(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo26(()=>{if(!schemaLoaded)return null;let typedOriginal=[toTypedValue(original)],typedRevised=[toTypedValue(revised)],result=[],patch=mergePatchOperations((0,import_rfc6902.createPatch)(original,revised));for(let op of patch){let path=op.path,fhirPath=jsonPathToFhirPath(path),property=tryGetElementDefinition(original.resourceType,fhirPath),originalValue=op.op==="add"?void 0:evalFhirPathTyped(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:evalFhirPathTyped(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${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?jsxs53(Table2,{className:ResourceDiffTable_default.root,children:[jsx94(Table2.Thead,{children:jsxs53(Table2.Tr,{children:[jsx94(Table2.Th,{}),jsx94(Table2.Th,{children:"Before"}),jsx94(Table2.Th,{children:"After"})]})}),jsx94(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx94(ResourceDiffRow,{...rest},key)})})]}):null}function mergePatchOperations(patch){let result=[];for(let patchOperation of patch){let{op,path}=patchOperation;if(path.startsWith("/meta/author")||path.startsWith("/meta/compartment")||path.startsWith("/meta/lastUpdated")||path.startsWith("/meta/versionId"))continue;let count=patch.filter(el=>el.op===op&&el.path===path).length,resultOperation={op,path};count>1&&(op==="add"||op==="remove")&&/\/[0-9-]+$/.test(path)&&(resultOperation.op="replace",resultOperation.path=path.replace(/\/[^/]+$/,"")),result.some(el=>el.op===resultOperation.op&&el.path===resultOperation.path)||result.push(resultOperation)}return result}function jsonPathToFhirPath(path){let parts=path.split("/").filter(Boolean),result="";for(let i=0;i<parts.length;i++){let part=parts[i];part==="-"?result+=".last()":/^\d+$/.test(part)?result+=`[${part}]`:(i>0&&(result+="."),result+=part)}return result.endsWith(".url")&&(result=result.replace(/\.url$/,"")),result}function tryGetElementDefinition(resourceType,fhirPath){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(v=>v.value);return isArray?inputValue:inputValue[0]}import{AccessPolicyInteraction,satisfiedAccessPolicy,tryGetProfile as tryGetProfile4}from"@medplum/core";import{useMedplum as useMedplum24,useResource as useResource6}from"@medplum/react-hooks";import{useEffect as useEffect18,useMemo as useMemo27,useState as useState52}from"react";import{jsx as jsx95}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum24(),accessPolicy=medplum.getAccessPolicy(),value=useResource6(props.value),[schemaLoaded,setSchemaLoaded]=useState52(!1);useEffect18(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{tryGetProfile4(profileUrl)?setSchemaLoaded(!0):console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)});else{let schemaName=value.resourceType;medplum.requestSchema(schemaName).then(()=>{setSchemaLoaded(!0)}).catch(console.error)}},[medplum,profileUrl,value]);let accessPolicyResource=useMemo27(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx95(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon8,Group as Group33,Menu as Menu3,Text as Text14}from"@mantine/core";import{formatDateTime as formatDateTime3,getReferenceString as getReferenceString6}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx96,jsxs as jsxs54}from"react/jsx-runtime";function Timeline(props){return jsx96(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 jsxs54(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs54(Group33,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx96(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs54("div",{style:{flex:1},children:[jsx96(Text14,{size:"sm",children:jsx96(ResourceName,{c:"dark",fw:500,value:author,link:!0})}),jsxs54(Text14,{size:"xs",children:[jsx96(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime3(dateTime)}),jsx96(Text14,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx96(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs54(Menu3,{position:"bottom-end",shadow:"md",width:200,children:[jsx96(Menu3.Target,{children:jsx96(ActionIcon8,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString6(props.resource)}`,children:jsx96(IconDots,{})})}),popupMenuItems]})]}),jsx96(ErrorBoundary,{children:jsx96("div",{className:clsx_default(Timeline_default.item,{[Timeline_default.itemPadding]:padding}),children:props.children})})]})}function sortByDateAndPriority(resources,timelineResource){resources.sort((a,b)=>{let priority1=getPriorityScore(a,timelineResource),priority2=getPriorityScore(b,timelineResource);return priority1>priority2?1:priority1<priority2?-1:getTime(a,timelineResource)-getTime(b,timelineResource)})}function getPriorityScore(resource,timelineResource){if(!isSameResourceType(resource,timelineResource)){let priority=resource.priority;if(typeof priority=="string")return{stat:4,asap:3,urgent:2}[priority]??0}return 0}function getTime(resource,timelineResource){if(!isSameResourceType(resource,timelineResource)){if(resource.resourceType==="Communication"&&resource.sent)return new Date(resource.sent).getTime();if((resource.resourceType==="DiagnosticReport"||resource.resourceType==="Media"||resource.resourceType==="Observation")&&resource.issued)return new Date(resource.issued).getTime();if(resource.resourceType==="DocumentReference"&&resource.date)return new Date(resource.date).getTime()}let dateTime=resource.meta?.lastUpdated;return dateTime?new Date(dateTime).getTime():0}function isSameResourceType(a,b){return!!b&&a.resourceType===b.resourceType&&a.id===b.id}var ResourceTimeline_default={pinnedComment:"ResourceTimeline_pinnedComment"};import{jsx as jsx97,jsxs as jsxs55}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum25(),sender=medplum.getProfile(),inputRef=useRef14(null),resource=useResource7(props.value),[history,setHistory]=useState53(),[items,setItems]=useState53([]),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef14(items);itemsRef.current=items;let sortAndSetItems=useCallback12(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback12(batchResponse=>{let newItems=[];for(let settledResult of batchResponse){if(settledResult.status!=="fulfilled")continue;let bundle=settledResult.value;if(bundle.type==="history"&&setHistory(bundle),bundle.entry)for(let entry of bundle.entry)newItems.push(entry.resource)}sortAndSetItems(newItems)},[sortAndSetItems]),addResource=useCallback12(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback12(()=>{let resourceType,id;"resourceType"in props.value?(resourceType=props.value.resourceType,id=props.value.id):[resourceType,id]=props.value.reference?.split("/"),loadTimelineResources(medplum,resourceType,id).then(handleBatchResponse).catch(console.error)},[medplum,props.value,loadTimelineResources,handleBatchResponse]);useEffect19(()=>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:jsx97(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString8(reason),icon:jsx97(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification7({id:"upload-notification",loading:!0,title:"Initializing upload...",message:"Please wait...",autoClose:!1,withCloseButton:!1})}function onUploadProgress(e){updateNotification({id:"upload-notification",loading:!0,title:"Uploading...",message:getProgressMessage(e),autoClose:!1,withCloseButton:!1})}function onUploadError(outcome){updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString8(outcome),icon:jsx97(IconFileAlert,{size:16}),autoClose:2e3})}return resource?jsxs55(Timeline,{children:[props.createCommunication&&jsx97(Panel,{children:jsx97(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs55(Group34,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx97(ResourceAvatar,{value:sender}),jsx97(TextInput19,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx97(ActionIcon9,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx97(IconMessage,{size:16})}),jsx97(AttachmentButton,{securityContext:createReference4(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx97(ActionIcon9,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx97(IconCloudUpload,{size:16})})})]})})}),items.map(item=>{if(!item)return null;let key=`${item.resourceType}/${item.id}/${item.meta?.versionId}`,menu=props.getMenu?props.getMenu({primaryResource:resource,currentResource:item,reloadTimeline:loadTimeline}):void 0;if(item.resourceType===resource.resourceType&&item.id===resource.id)return jsx97(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx97(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx97(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx97(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx97(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx97(TimelineItem,{resource:item,padding:!0,children:jsx97(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}})]}):jsx97(Center7,{style:{width:"100%",height:"100%"},children:jsx97(Loader3,{})})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx97(TimelineItem,{resource,padding:!0,...rest,children:jsx97(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs55(TimelineItem,{resource,padding:!0,...rest,children:[jsx97("h3",{children:"Created"}),jsx97(ResourceTable,{value:resource,ignoreMissingValues:!0,forceUseInput:!0})]})}function getPrevious(history,version){let entries=history.entry??[],index=entries.findIndex(entry=>entry.resource?.meta?.versionId===version.meta?.versionId);if(!(index>=entries.length-1))return entries[index+1].resource}function CommunicationTimelineItem(props){let className=!props.resource.priority||props.resource.priority==="routine"?void 0:ResourceTimeline_default.pinnedComment;return jsx97(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx97("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 jsx97(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx97(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx97(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx97(ScrollArea3,{children:jsx97("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx97(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx97(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 jsx98}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx98(ResourceTimeline,{value:resource,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`;return Promise.allSettled([medplum.readHistory(resourceType,id),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count:100})])},...rest})}import{createReference as createReference5}from"@medplum/core";import{jsx as jsx99}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx99(ResourceTimeline,{value:encounter,loadTimelineResources:async(medplum,_resourceType,id)=>Promise.allSettled([medplum.readHistory("Encounter",id),medplum.search("Communication","encounter=Encounter/"+id),medplum.search("Media","encounter=Encounter/"+id)]),createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",encounter:createReference5(resource),subject:resource.subject,sender:createReference5(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference5(resource),subject:resource.subject,operator:createReference5(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button13,Loader as Loader5,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome8}from"@medplum/core";import{useMedplum as useMedplum27}from"@medplum/react-hooks";import{memo,useEffect as useEffect23,useRef as useRef18,useState as useState58}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx100}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 jsx100(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon11,Button as Button12,Center as Center8,Group as Group37,Loader as Loader4,Menu as Menu5,Pagination,Table as Table3,Text as Text16,UnstyledButton as UnstyledButton2}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome7}from"@medplum/core";import{useMedplum as useMedplum26}from"@medplum/react-hooks";import{useCallback as useCallback13,useEffect as useEffect22,useRef as useRef17,useState as useState57}from"react";import{Box as Box2,Button as Button9,Modal as Modal3,Text as Text15}from"@mantine/core";import{jsx as jsx101,jsxs as jsxs56}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs56(Modal3,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs56(Box2,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx101(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx101(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx101(Text15,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx101(Button9,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button10,Group as Group35,Modal as Modal4,MultiSelect,Stack as Stack16}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify2}from"@medplum/core";import{useEffect as useEffect20,useMemo as useMemo28,useRef as useRef15,useState as useState54}from"react";import{capitalize as capitalize5,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime4,Operator}from"@medplum/core";import{Fragment as Fragment31,jsx as jsx102}from"react/jsx-runtime";var searchParamToOperators={string:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],fulltext:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],token:[Operator.EQUALS,Operator.NOT],reference:[Operator.EQUALS,Operator.NOT],numeric:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],quantity:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],date:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],datetime:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],uri:[Operator.EQUALS,Operator.NOT,Operator.ABOVE,Operator.BELOW]},operatorNames={eq:"equals",ne:"not equals",gt:"greater than",lt:"less than",ge:"greater than or equals",le:"less than or equals",sa:"starts after",eb:"ends before",ap:"approximately",sw:"starts with",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",present:"present",identifier:"identifier",iterate:"iterate"};function setFilters(definition,filters){return{...definition,filters,offset:0,name:void 0}}function clearFilters(definition){return setFilters(definition,[])}function clearFiltersOnField(definition,code){return setFilters(definition,(definition.filters??[]).filter(f=>f.code!==code))}function addFilter(definition,field,op,value,opt_clear){opt_clear&&(definition=clearFiltersOnField(definition,field));let nextFilters=[];return definition.filters&&nextFilters.push(...definition.filters),nextFilters.push({code:field,operator:op,value:value??""}),setFilters(definition,nextFilters)}function addField(definition,field){if(definition.fields?.includes(field))return definition;let newFields=[];return definition.fields&&newFields.push(...definition.fields),newFields.push(field),{...definition,fields:newFields,name:void 0}}function deleteFilter(definition,index){if(!definition.filters)return definition;let newFilters=[...definition.filters];return newFilters.splice(index,1),{...definition,filters:newFilters,name:void 0}}function addYesterdayFilter(definition,field){return addDayFilter(definition,field,-1)}function addTodayFilter(definition,field){return addDayFilter(definition,field,0)}function addTomorrowFilter(definition,field){return addDayFilter(definition,field,1)}function addDayFilter(definition,field,delta){let startTime=new Date;startTime.setDate(startTime.getDate()+delta),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setDate(endTime.getDate()+1),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addNext24HoursFilter(definition,field){let now=new Date,endTime=new Date(now.getTime()+24*60*60*1e3);return addDateFilterBetween(definition,field,now,endTime)}function addLastMonthFilter(definition,field){return addMonthFilter(definition,field,-1)}function addThisMonthFilter(definition,field){return addMonthFilter(definition,field,0)}function addNextMonthFilter(definition,field){return addMonthFilter(definition,field,1)}function addMonthFilter(definition,field,delta){let startTime=new Date;startTime.setMonth(startTime.getMonth()+delta),startTime.setDate(1),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setMonth(endTime.getMonth()+1),endTime.setDate(1),endTime.setHours(0,0,0,0),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addYearToDateFilter(definition,field){let startTime=new Date;return startTime.setMonth(0),startTime.setDate(1),startTime.setHours(0,0,0,0),addDateFilterBetween(definition,field,startTime,new Date)}function addDateFilterBetween(definition,field,d1,d2){return definition=clearFiltersOnField(definition,field),definition=addDateFilterImpl(definition,field,Operator.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.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"?jsx102(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children: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?jsx102(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:jsx102(Fragment31,{children:value.map((v,index)=>jsx102(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx103,jsxs as jsxs57}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef15(!1),[state,setState]=useState54({search:JSON.parse(stringify2(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState54(!1);useEffect20(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo28(()=>{if(!props.visible)return[];let resourceType=props.search.resourceType,typeSchema=getDataType2(resourceType),searchParams=getSearchParameters(resourceType);return sortStringArray(getFieldsList(typeSchema,searchParams)).map(field=>({value:field,label:buildFieldNameString(field)}))},[props.visible,props.search.resourceType]);function handleChange(newFields){setState({search:{...state.search,fields:newFields}})}return jsx103(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:jsx103("div",{"data-testid":"overlay-child"})},children:jsxs57(Stack16,{children:[jsx103(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}),jsx103(Group35,{justify:"flex-end",children:jsx103(Button10,{onClick:()=>props.onOk(state.search),children:"OK"})})]})})}function getFieldsList(typeSchema,searchParams){let result=[],keys=new Set,names=new Set;for(let key of Object.keys(typeSchema.elements))result.push(key),keys.add(key.toLowerCase()),names.add(buildFieldNameString(key));if(searchParams)for(let code of Object.keys(searchParams)){let name=buildFieldNameString(code);!keys.has(code)&&!names.has(name)&&(result.push(code),keys.add(code),names.add(name))}return result}import{ActionIcon as ActionIcon10,Group as Group36,Modal as Modal5,NativeSelect as NativeSelect10}from"@mantine/core";import{Operator as Operator2,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect21,useRef as useRef16,useState as useState55}from"react";import{Checkbox as Checkbox5,TextInput as TextInput20}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx104}from"react/jsx-runtime";function SearchFilterValueInput(props){let details=getSearchParameterDetails2(props.resourceType,props.searchParam),name=props.name??"filter-value";switch(details.type){case SearchParameterType.REFERENCE:return jsx104(ReferenceInput,{name,defaultValue:props.defaultValue?{reference:props.defaultValue}:void 0,targetTypes:props.searchParam.target,autoFocus:props.autoFocus,onChange:newReference=>{newReference?props.onChange(newReference.reference):props.onChange("")}});case SearchParameterType.BOOLEAN:return jsx104(Checkbox5,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType.DATE:return jsx104(TextInput20,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.DATETIME:return jsx104(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx104(TextInput20,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.QUANTITY:return jsx104(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx104(TextInput20,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value),placeholder:"Search value"})}}function tryParseQuantity(value){if(value){let[valueString,systemString,unitString]=value.split("|");if(valueString)return{value:parseFloat(valueString),system:systemString,unit:unitString}}}import{jsx as jsx105,jsxs as jsxs58}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState55(deepClone2(props.search)),searchRef=useRef16(search);searchRef.current=search,useEffect21(()=>{setSearch(deepClone2(props.search))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}let resourceType=props.search.resourceType,searchParams=getSearchParameters2(resourceType)??{},filters=search.filters||[];return jsx105(Modal5,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs58(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs58("div",{children:[jsxs58("table",{children:[jsxs58("colgroup",{children:[jsx105("col",{style:{width:200}}),jsx105("col",{style:{width:200}}),jsx105("col",{style:{width:380}}),jsx105("col",{style:{width:40}})]}),jsx105("thead",{children:jsxs58("tr",{children:[jsx105("th",{children:"Field"}),jsx105("th",{children:"Operation"}),jsx105("th",{children:"Value"}),jsx105("th",{})]})}),jsx105("tbody",{children:filters.map((filter,index)=>jsx105(FilterRowInput,{id:`filter-${index}-row`,resourceType,searchParams,value:filter,onChange:newFilter=>{let newFilters=[...filters];newFilters[index]=newFilter,setSearch(setFilters(searchRef.current,newFilters))},onDelete:()=>setSearch(deleteFilter(searchRef.current,index))},`filter-${index}-row`))})]}),jsx105(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx105(Group36,{justify:"flex-end",mt:"xl",children:jsx105(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value,valueRef=useRef16(value);valueRef.current=value;function setFilterCode(newCode){valueRef.current.code=newCode,valueRef.current.operator=Operator2.EQUALS,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterOperator(newOperator){valueRef.current.operator=newOperator,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterValue(newFilterValue){valueRef.current.value=newFilterValue,props.onChange(valueRef.current)}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return jsxs58("tr",{children:[jsx105("td",{children:jsx105(NativeSelect10,{"data-testid":`${props.id}-filter-field`,defaultValue:props.value.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...Object.keys(props.searchParams).map(param=>({value:param,label:buildFieldNameString(param)}))]})}),jsx105("td",{children:operators&&jsx105(NativeSelect10,{"data-testid":`${props.id}-filter-operation`,defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]},`${props.id}-filter-value-${props.value.code}`)}),jsx105("td",{children:searchParam&&value.operator&&jsx105(SearchFilterValueInput,{name:`${props.id}-filter-value`,resourceType:props.resourceType,searchParam,defaultValue:value.value,onChange:setFilterValue},`${props.id}-filter-value-${props.value.code}-${props.value.operator}`)}),jsx105("td",{children:props.onDelete&&jsx105(ActionIcon10,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx105(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button11,Grid,Modal as Modal6}from"@mantine/core";import{useState as useState56}from"react";import{jsx as jsx106,jsxs as jsxs59}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState56(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx106(Modal6,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx106(Form,{onSubmit:onOk,children:jsxs59(Grid,{children:[jsx106(Grid.Col,{span:10,children:jsx106(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx106(Grid.Col,{span:2,children:jsx106(Button11,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime5,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator3,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment32,jsx as jsx107}from"react/jsx-runtime";function SearchFilterValueDisplay(props){let{resourceType,filter}=props,searchParam=globalSchema.types[resourceType].searchParams?.[filter.code];if(searchParam){if(searchParam.type==="reference"&&(filter.operator===Operator3.EQUALS||filter.operator===Operator3.NOT_EQUALS))return jsx107(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx107(Fragment32,{children:formatDateTime5(filter.value)})}return jsx107(Fragment32,{children:filter.value})}import{Menu as Menu4}from"@mantine/core";import{Operator as Operator4}from"@medplum/core";import{Fragment as Fragment33,jsx as jsx108,jsxs as jsxs60}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?jsx108(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx108(Menu4.Dropdown,{children:props.searchParams.map(searchParam=>jsx108(Menu4.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx108(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx108(NumericFilterSubMenu,{...props});case"reference":return jsx108(ReferenceFilterSubMenu,{...props});case"string":return jsx108(TextFilterSubMenu,{...props});case"token":case"uri":return jsx108(TokenFilterSubMenu,{...props});default:return jsxs60(Fragment33,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs60(Menu4.Dropdown,{children:[jsx108(Menu4.Item,{leftSection:jsx108(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx108(Menu4.Item,{leftSection:jsx108(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.ENDS_BEFORE),children:"Before..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.STARTS_AFTER),children:"After..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Between..."}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx108(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs60(Menu4.Dropdown,{children:[jsx108(Menu4.Item,{leftSection:jsx108(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx108(Menu4.Item,{leftSection:jsx108(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN),children:"Greater than..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN),children:"Less than..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx108(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs60(Menu4.Dropdown,{children:[jsx108(Menu4.Item,{leftSection:jsx108(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx108(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs60(Menu4.Dropdown,{children:[jsx108(Menu4.Item,{leftSection:jsx108(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx108(Menu4.Item,{leftSection:jsx108(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.CONTAINS),children:"Contains..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Does not contain..."}),jsx108(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs60(Menu4.Dropdown,{children:[jsx108(Menu4.Item,{leftSection:jsx108(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx108(Menu4.Item,{leftSection:jsx108(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx108(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs60(Fragment33,{children:[jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx108(Menu4.Item,{leftSection:jsx108(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx108(Menu4.Divider,{}),jsx108(Menu4.Item,{leftSection:jsx108(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 Fragment34,jsx as jsx109,jsxs as jsxs61}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=useMedplum26(),[outcome,setOutcome]=useState57(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState57(search);deepEquals(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState57({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef17(state);stateRef.current=state;let total=memoizedSearch.total??"accurate",loadResults=useCallback13(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,formatSearchQuery({...memoizedSearch,total,fields:void 0}),options)).then(response=>{setState({...stateRef.current,searchResponse:response}),onLoad&&onLoad(new SearchLoadEvent(response))}).catch(reason=>{setState({...stateRef.current,searchResponse:void 0}),setOutcome(normalizeOperationOutcome7(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback13(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect22(()=>{loadResults()},[loadResults]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...stateRef.current.selected};checked?newSelected[id]=!0:delete newSelected[id],setState({...stateRef.current,selected:newSelected})}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},searchResponse=stateRef.current.searchResponse;checked&&searchResponse?.entry&&searchResponse.entry.forEach(entry=>{entry.resource?.id&&(newSelected[entry.resource.id]=!0)}),setState({...stateRef.current,selected:newSelected})}function isAllSelected(){let state2=stateRef.current;if(!state2.searchResponse?.entry||state2.searchResponse.entry.length===0)return!1;for(let e of state2.searchResponse.entry)if(e.resource?.id&&!state2.selected[e.resource.id])return!1;return!0}function emitSearchChange(newSearch){props.onChange&&props.onChange(new SearchChangeEvent(newSearch))}function handleRowClick(e,resource){if(isCheckboxCell(e.target)||e.button===2)return;killEvent(e);let isAux=isAuxClick(e);!isAux&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),isAux&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e))}function isExportPassed(){return!!(props.onExport??props.onExportCsv??props.onExportTransactionBundle)}if(outcome)return jsx109(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx109(Center8,{style:{width:"100%",height:"100%"},children:jsx109(Loader4,{})});let checkboxColumn=props.checkboxesEnabled,fields=getFieldDefinitions(memoizedSearch),resourceType=memoizedSearch.resourceType,lastResult=state.searchResponse,resources=lastResult?.entry?.map(e=>e.resource),buttonVariant="subtle",buttonColor="gray",iconSize=16,isMobile=window.innerWidth<768;return jsxs61("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs61(Group37,{justify:"space-between",mb:"xl",children:[jsxs61(Group37,{gap:2,children:[jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx109(Button12,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx109(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs61(Group37,{gap:2,children:[lastResult&&jsxs61(Text16,{size:"xs",c:"dimmed","data-testid":"count-display",children:[getStart(memoizedSearch,lastResult).toLocaleString(),"-",getEnd(memoizedSearch,lastResult).toLocaleString(),lastResult.total!==void 0&&` of ${memoizedSearch.total==="estimate"?"~":""}${lastResult.total?.toLocaleString()}`]}),jsx109(ActionIcon11,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx109(IconRefresh,{size:iconSize})})]})]}),jsxs61(Table3,{className:SearchControl_default.table,children:[jsxs61(Table3.Thead,{children:[jsxs61(Table3.Tr,{children:[checkboxColumn&&jsx109(Table3.Th,{children:jsx109("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx109(Table3.Th,{children:jsxs61(Menu5,{shadow:"md",width:240,position:"bottom-end",children:[jsx109(Menu5.Target,{children:jsx109(UnstyledButton2,{className:SearchControl_default.control,p:2,children:jsxs61(Group37,{justify:"space-between",wrap:"nowrap",children:[jsx109(Text16,{fw:500,children:buildFieldNameString(field.name)}),jsx109(Center8,{className:SearchControl_default.icon,children:jsx109(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx109(SearchPopupMenu,{search:memoizedSearch,searchParams:field.searchParams,onPrompt:(searchParam,filter)=>{setState({...stateRef.current,filterDialogVisible:!0,filterDialogSearchParam:searchParam,filterDialogFilter:filter,dialogOpenTime:Date.now()})},onChange:result=>{emitSearchChange(result)}})]})},field.name))]}),!props.hideFilters&&jsxs61(Table3.Tr,{children:[checkboxColumn&&jsx109(Table3.Th,{}),fields.map(field=>jsx109(Table3.Th,{children:field.searchParams&&jsx109(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),jsx109(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs61(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx109(Table3.Td,{children:jsx109("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=>jsx109(Table3.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&jsx109(Container,{children:jsx109(Center8,{style:{height:150},children:jsx109(Text16,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx109(Center8,{m:"md",p:"md",children:jsx109(Pagination,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:control=>{switch(control){case"previous":return{"aria-label":"Previous page"};case"next":return{"aria-label":"Next page"};default:return{}}}})}),jsx109(SearchFieldEditor,{search:memoizedSearch,visible:stateRef.current.fieldEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,fieldEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,fieldEditorVisible:!1})}},`search-field-editor-${state.dialogOpenTime}`),jsx109(SearchFilterEditor,{search:memoizedSearch,visible:stateRef.current.filterEditorVisible,onOk:result=>{emitSearchChange(result),setState({...stateRef.current,filterEditorVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterEditorVisible:!1})}},`search-filter-editor-${state.dialogOpenTime}`),jsx109(SearchExportDialog,{visible:stateRef.current.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx109(SearchFilterValueDialog,{visible:stateRef.current.filterDialogVisible,title:state.filterDialogSearchParam?.code?buildFieldNameString(state.filterDialogSearchParam.code):"",resourceType,searchParam:state.filterDialogSearchParam,filter:state.filterDialogFilter,defaultValue:"",onOk:filter=>{emitSearchChange(addFilter(memoizedSearch,filter.code,filter.operator,filter.value)),setState({...stateRef.current,filterDialogVisible:!1})},onCancel:()=>{setState({...stateRef.current,filterDialogVisible:!1})}},`search-filter-dialog-${state.dialogOpenTime}`)]})}var MemoizedSearchControl=SearchControl;function FilterDescription(props){let filters=(props.filters??[]).filter(f=>props.searchParams.find(p=>p.code===f.code));return filters.length===0?jsx109("span",{children:"no filters"}):jsx109(Fragment34,{children:filters.map(filter=>jsxs61("div",{children:[getOpString(filter.operator),"\xA0",jsx109(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 jsx110,jsxs as jsxs62}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum27(),[schemaLoaded,setSchemaLoaded]=useState58(!1),[outcome,setOutcome]=useState58(),{query,fields}=props,[response,setResponse]=useState58(),[selected,setSelected]=useState58({}),responseRef=useRef18(response);responseRef.current=response;let selectedRef=useRef18({});selectedRef.current=selected,useEffect23(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome8(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selectedRef.current};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=responseRef.current?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=responseRef.current?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selectedRef.current[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if(useEffect23(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx110(Loader5,{});let checkboxColumn=props.checkboxesEnabled;return jsxs62("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs62(Table4,{children:[jsx110(Table4.Thead,{children:jsxs62(Table4.Tr,{children:[checkboxColumn&&jsx110(Table4.Th,{children:jsx110("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx110(Table4.Th,{children:field.name},field.name))]})}),jsx110(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs62(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx110(Table4.Td,{children:jsx110("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=>jsx110(Table4.Td,{children:jsx110(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx110("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx110("div",{"data-testid":"search-error",children:jsx110("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx110(Button13,{onClick:()=>props.onBulk(Object.keys(selectedRef.current)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo(FhirPathTable);import{ScrollArea as ScrollArea4}from"@mantine/core";var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};import{jsx as jsx111}from"react/jsx-runtime";function InfoBar(props){return jsx111(ScrollArea4,{children:jsx111("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx111("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx111("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx111("div",{className:InfoBar_default.value,children:props.children})};import{Box as Box4,SimpleGrid}from"@mantine/core";import{useResource as useResource8,useSearchOne}from"@medplum/react-hooks";import{Box as Box3,Flex as Flex3,Group as Group38,Paper as Paper3,RingProgress,Text as Text17,Title as Title7}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept4}from"@medplum/core";import{Fragment as Fragment35,jsx as jsx112,jsxs as jsxs63}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx112(Paper3,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs63(Group38,{children:[group.measureScore&&jsx112(MeasureScore,{group}),!group.measureScore&&jsx112(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs63(Fragment35,{children:[jsx112(Text17,{fz:"md",fw:500,mb:8,children:measure.title}),jsx112(Text17,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept4(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept4(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs63(Box3,{children:[jsx112(Title7,{order:3,children:"Not Applicable"}),jsx112(Text17,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs63(Box3,{children:[jsx112(Title7,{order:3,children:"Insufficient Data"}),jsx112(Text17,{children:`Numerator: ${numeratorCount}`}),jsx112(Text17,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx112(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx112(Flex3,{justify:"center",children:jsxs63(Text17,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx112(Fragment35,{children:unit==="%"?jsx112(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx112(Flex3,{justify:"center",children:jsx112(Text17,{fw:700,fz:18,children:jsx112(QuantityDisplay,{value:group.measureScore})})})}):jsx112(Flex3,{h:120,align:"center",children:jsx112(Title7,{order:3,children:jsx112(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 jsx113,jsxs as jsxs64}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource8(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs64(Box4,{children:[measure&&jsx113(MeasureTitle,{measure}),jsx113(SimpleGrid,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx113(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon12,Indicator,Tooltip as Tooltip3}from"@mantine/core";import{useMedplum as useMedplum28,useSubscription as useSubscription2}from"@medplum/react-hooks";import{useCallback as useCallback14,useEffect as useEffect24,useState as useState59}from"react";import{jsx as jsx114}from"react/jsx-runtime";function NotificationIcon(props){let medplum=useMedplum28(),{label,resourceType,countCriteria,subscriptionCriteria,onClick}=props,[unreadCount,setUnreadCount]=useState59(0),updateCount=useCallback14(cache=>{medplum.search(resourceType,countCriteria,{cache}).then(result=>setUnreadCount(result.total)).catch(console.error)},[medplum,resourceType,countCriteria]);useEffect24(()=>{updateCount("default")},[updateCount]),useSubscription2(subscriptionCriteria,()=>{updateCount("reload")});let icon=jsx114(Tooltip3,{label,children:jsx114(ActionIcon12,{variant:"subtle",color:"gray",size:"lg","aria-label":label,onClick,children:props.iconComponent})});return unreadCount>0?jsx114(Indicator,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:icon}):icon}import{Group as Group39,SegmentedControl as SegmentedControl2,Stack as Stack17}from"@mantine/core";import{notifications}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString9,resolveId}from"@medplum/core";import{useMedplum as useMedplum29}from"@medplum/react-hooks";import{useCallback as useCallback15}from"react";import{jsx as jsx115,jsxs as jsxs65}from"react/jsx-runtime";var NOTIFICATION_ID="patient-export",NOTIFICATION_TITLE="Patient Export",formats={everything:{operation:"$everything",extension:"json",contentType:ContentType3.FHIR_JSON},summary:{operation:"$summary",extension:"json",contentType:ContentType3.FHIR_JSON},ccda:{operation:"$ccda-export",extension:"xml",contentType:ContentType3.CDA_XML},ccdaReferral:{operation:"$ccda-export",type:"referral",extension:"xml",contentType:ContentType3.CDA_XML}};function PatientExportForm(props){let medplum=useMedplum29(),{patient}=props,handleSubmit=useCallback15(async data2=>{let patientId=resolveId(patient),format=data2.format,{operation,type,contentType,extension}=formats[format],url=medplum.fhirUrl("Patient",patientId,operation),params={};type&&(params.type=type),data2.author&&(params.author={reference:data2.author}),data2.authoredOn&&(params.authoredOn=convertLocalToIso(data2.authoredOn)),data2.startDate&&(params.start=data2.startDate),data2.endDate&&(params.end=data2.endDate),notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,loading:!0,message:"Exporting...",autoClose:!1,withCloseButton:!1});try{let response=await medplum.post(url,params,void 0,{cache:"no-cache",headers:{Accept:contentType}}),fileName=`Patient-export-${patientId}-${new Date().toISOString().replaceAll(":","-")}.${extension}`;saveData(response,fileName,contentType),notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"green",message:"Done",icon:jsx115(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString9(err),icon:jsx115(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient]);return jsx115(Form,{onSubmit:handleSubmit,children:jsxs65(Stack17,{children:[jsx115(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx115(SegmentedControl2,{name:"format",data:[{label:"FHIR Everything",value:"everything"},{label:"Patient Summary",value:"summary"},{label:"C-CDA",value:"ccda"},{label:"C-CDA Referral",value:"ccdaReferral"}],fullWidth:!0})}),jsx115(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx115(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx115(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx115(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx115(FormSection,{title:"Start Date",description:"The start date of care. If no start date is provided, all records prior to the end date are in scope.",children:jsx115(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx115(FormSection,{title:"End Date",description:"The end date of care. If no end date is provided, all records subsequent to the start date are in scope.",children:jsx115(DateTimeInput,{name:"endDate",placeholder:"End date"})}),jsx115(Group39,{justify:"right",children:jsx115(SubmitButton,{children:"Request Export"})})]})})}function saveData(data2,fileName,contentType){let content=typeof data2=="string"?data2:JSON.stringify(data2,null,2),blob=new Blob([content],{type:contentType}),url=window.URL.createObjectURL(blob),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=url,a.download=fileName,a.click(),window.URL.revokeObjectURL(url)}import{calculateAgeString}from"@medplum/core";import{useResource as useResource9}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment36,jsx as jsx116,jsxs as jsxs66}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource9(props.patient);return patient?jsxs66(InfoBar,{children:[jsx116(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:"Name"}),jsx116(InfoBar.Value,{children:jsx116(MedplumLink,{to:patient,fw:500,children:patient.name?jsx116(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs66(Fragment36,{children:[jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:"DoB"}),jsx116(InfoBar.Value,{children:patient.birthDate})]}),jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:"Age"}),jsx116(InfoBar.Value,{children:calculateAgeString(patient.birthDate)})]})]}),patient.gender&&jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:"Gender"}),jsx116(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:"State"}),jsx116(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs66(InfoBar.Entry,{children:[jsx116(InfoBar.Key,{children:identifier?.system}),jsx116(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Box as Box12,Divider as Divider3,Flex as Flex9,Group as Group51,Stack as Stack24,Text as Text26,Tooltip as Tooltip4}from"@mantine/core";import{calculateAgeString as calculateAgeString2,formatAddress as formatAddress2,formatHumanName as formatHumanName4,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum36,useResource as useResource11}from"@medplum/react-hooks";import{useEffect as useEffect25,useState as useState70}from"react";import{Box as Box7,Flex as Flex4,Group as Group42,Modal as Modal7,Text as Text19}from"@mantine/core";import{useDisclosure}from"@mantine/hooks";import{getDisplayString as getDisplayString6}from"@medplum/core";import{useMedplum as useMedplum30}from"@medplum/react-hooks";import{useCallback as useCallback17,useMemo as useMemo29,useState as useState62}from"react";import{Group as Group40,Stack as Stack18,TextInput as TextInput21}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG2,addProfileToResource,createReference as createReference6}from"@medplum/core";import{useCallback as useCallback16,useState as useState60}from"react";import{jsx as jsx117,jsxs as jsxs67}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG2+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState60(allergy?.code),[clinicalStatus,setClinicalStatus]=useState60(allergy?.clinicalStatus),handleSubmit=useCallback16(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference6(patient),encounter:encounter?createReference6(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0},PATIENT_ALLERGY_PROFILE))},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx117(Form,{onSubmit:handleSubmit,children:jsxs67(Stack18,{children:[jsx117(CodeableConceptInput,{name:"allergy",label:"Code",path:"AllergyIntolerance.code","data-autofocus":!0,binding:HTTP+"cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1186.8",maxValues:1,defaultValue:allergy?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx117(TextInput21,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx117(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG2+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx117(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx117(Group40,{justify:"flex-end",gap:4,mt:"md",children:jsx117(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon13,Box as Box5,Collapse,Group as Group41,Text as Text18}from"@mantine/core";import{useState as useState61}from"react";var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",addButton:"CollapsibleSection_addButton",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title"};import{jsx as jsx118,jsxs as jsxs68}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState61(!1);return jsxs68(Box5,{className:CollapsibleSection_default.root,children:[jsxs68(Group41,{justify:"space-between",className:CollapsibleSection_default.header,children:[jsxs68(Group41,{gap:8,children:[jsx118(ActionIcon13,{variant:"subtle",onClick:()=>setCollapsed(c=>!c),"aria-label":collapsed?`Show ${title.toLowerCase()}`:`Hide ${title.toLowerCase()}`,className:CollapsibleSection_default.chevron,"data-collapsed":collapsed||void 0,size:"md",children:jsx118(IconChevronDown,{size:20})}),jsx118(Text18,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx118(ActionIcon13,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx118(IconPlus,{size:18})})]}),jsx118(Collapse,{in:!collapsed,children:jsx118(Box5,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",children})})]})}import{ActionIcon as ActionIcon14,Box as Box6}from"@mantine/core";var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};import{jsx as jsx119,jsxs as jsxs69}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs69(Box6,{className:SummaryItem_default.item,onClick,children:[children,jsx119("div",{className:SummaryItem_default.gradient}),jsx119("div",{className:SummaryItem_default.container,children:jsx119(ActionIcon14,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx119(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment37,jsx as jsx120,jsxs as jsxs70}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum30(),{patient,encounter}=props,[allergies,setAllergies]=useState62(props.allergies),[opened,{open,close}]=useDisclosure(!1),[editAllergy,setEditAllergy]=useState62(),sortedAllergies=useMemo29(()=>[...allergies].sort((a,b)=>{let aStatus=a.clinicalStatus?.coding?.[0]?.code,bStatus=b.clinicalStatus?.coding?.[0]?.code;return aStatus==="active"&&bStatus!=="active"?-1:aStatus!=="active"&&bStatus==="active"?1:getDisplayString6(a).localeCompare(getDisplayString6(b))}),[allergies]),handleSubmit=useCallback17(async allergy=>{if(allergy.id){let updatedAllergy=await medplum.updateResource(allergy);setAllergies(allergies.map(a=>a.id===updatedAllergy.id?updatedAllergy:a))}else{let newAllergy=await medplum.createResource(allergy);setAllergies([...allergies,newAllergy])}setEditAllergy(void 0),close()},[medplum,allergies,close]);return jsxs70(Fragment37,{children:[jsx120(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx120(Box7,{children:jsx120(Flex4,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx120(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs70(Box7,{children:[jsx120(Text19,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString6(allergy)}),jsx120(Group42,{mt:2,gap:4,children:status&&jsx120(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx120(Text19,{children:"(none)"})}),jsx120(Modal7,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx120(AllergyDialog,{patient,encounter,allergy:editAllergy,onSubmit:handleSubmit})})]})}function getClinicalStatusColor(status){if(!status)return"gray";switch(status){case"active":return"red";case"inactive":return"orange";case"resolved":return"blue";default:return"gray"}}import{Box as Box8,Flex as Flex5,Group as Group43,Text as Text20}from"@mantine/core";import{formatDate}from"@medplum/core";import{useResource as useResource10}from"@medplum/react-hooks";var PatientSummary_default={panel:"PatientSummary_panel",patientSummaryBadge:"PatientSummary_patientSummaryBadge",patientSummaryAddButton:"PatientSummary_patientSummaryAddButton",patientSummaryHeader:"PatientSummary_patientSummaryHeader",patientSummaryCollapseIcon:"PatientSummary_patientSummaryCollapseIcon",collapsed:"PatientSummary_collapsed"};import{jsx as jsx121,jsxs as jsxs71}from"react/jsx-runtime";function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=useResource10(coverage),organizationResource=useResource10(organization),payorName="Unknown Payor";organizationResource&&"name"in organizationResource&&typeof organizationResource.name=="string"&&(payorName=organizationResource.name);let detailsText=`ID: ${coverageResource?.subscriberId??"N/A"}${formatClassInfo(coverageResource)?` \xB7 ${formatClassInfo(coverageResource)}`:""}`;return jsx121(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs71(Box8,{children:[jsx121(Text20,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx121(Text20,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs71(Group43,{mt:2,gap:4,children:[jsx121(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs71(Text20,{size:"xs",fw:500,color:"gray.6",children:["Ends ",formatDate(coverageResource?.period?.end)]})]})]})})}function Insurance(props){let{coverages,onClickResource}=props,activeCoverages=coverages.filter(coverage=>coverage.status==="active");return jsx121(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx121(Flex5,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx121(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx121(Text20,{children:"(none)"})})}function capitalizeWords(str){return str.split(" ").map(word=>word.charAt(0).toUpperCase()+word.slice(1).toLowerCase()).join(" ")}function formatClassInfo(coverage){return coverage?coverage.class?.filter(cls=>cls.type?.coding?.[0]?.code!=="plan").map(cls=>{let type=cls.type?.coding?.[0]?.code??"";return`${capitalizeWords(type)}: ${cls.value}`}).join(" \xB7 ")??"":""}import{Box as Box9,Flex as Flex6,Group as Group45,Modal as Modal8,Text as Text21}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{getDisplayString as getDisplayString7}from"@medplum/core";import{useMedplum as useMedplum31}from"@medplum/react-hooks";import{useCallback as useCallback19,useState as useState64}from"react";import{Alert as Alert4,Group as Group44,Radio,Stack as Stack19}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG3,addProfileToResource as addProfileToResource2,createReference as createReference7}from"@medplum/core";import{useMedplumProfile as useMedplumProfile6}from"@medplum/react-hooks";import{useCallback as useCallback18,useState as useState63}from"react";import{jsx as jsx122,jsxs as jsxs72}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile6(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState63(medication?.medicationCodeableConcept),handleSubmit=useCallback18(formData=>{if(!me)throw new Error("Not signed in");onSubmit(addProfileToResource2({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&createReference7(encounter)),requester:medication?.requester??createReference7(me),medicationCodeableConcept:code,subject:createReference7(patient)},HTTP_HL7_ORG3+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx122(Form,{onSubmit:handleSubmit,children:jsxs72(Stack19,{children:[jsx122(CodeableConceptInput,{name:"request",path:"MedicationRequest.medication[x]","data-autofocus":!0,binding:HTTP2+"cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1010.4",maxValues:1,defaultValue:medication?.medicationCodeableConcept,onChange:request=>setCode(request),outcome:void 0}),jsx122(Radio.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx122(Radio,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx122(Group44,{justify:"flex-end",gap:4,children:jsx122(SubmitButton,{children:"Save"})})]})}):jsx122(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment38,jsx as jsx123,jsxs as jsxs73}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum31(),[medicationRequests,setMedicationRequests]=useState64(props.medicationRequests),[editMedication,setEditMedication]=useState64(),[opened,{open,close}]=useDisclosure2(!1),handleSubmit=useCallback19(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m=>m.id===updatedMedication.id?updatedMedication:m))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs73(Fragment38,{children:[jsx123(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medicationRequests.length>0?jsx123(Flex6,{direction:"column",gap:8,children:medicationRequests.map(medication=>jsx123(SummaryItem,{onClick:()=>{setEditMedication(medication),open()},children:jsxs73(Box9,{children:[jsx123(Text21,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(medication)}),jsx123(Group45,{mt:2,gap:4,children:medication.status&&jsx123(StatusBadge,{color:getStatusColor(medication.status),variant:"light",status:medication.status})})]})},medication.id))}):jsx123(Text21,{children:"(none)"})}),jsx123(Modal8,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx123(MedicationDialog,{patient:props.patient,encounter:props.encounter,medication:editMedication,onSubmit:handleSubmit})})]})}function getStatusColor(status){if(!status)return"gray";switch(status){case"active":return"green";case"stopped":return"red";case"on-hold":return"yellow";case"cancelled":return"red";case"completed":return"blue";case"entered-in-error":return"red";case"draft":return"gray";default:return"gray"}}import{capitalize as capitalize6,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG4}from"@medplum/core";function getGenderIdentity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-ethnicity`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getGeneralPractitioner(patient){return patient.generalPractitioner?.[0]?.display}function formatPatientGenderDisplay(patient){let capitalizedGender=patient.gender?capitalize6(patient.gender):"",genderIdentity=getGenderIdentity(patient),birthSex=getBirthSex(patient),parts=[];return capitalizedGender&&parts.push(capitalizedGender),genderIdentity&&parts.push(genderIdentity),birthSex&&parts.push(`Born as ${birthSex}`),parts.join(" \xB7 ")}function formatPatientRaceEthnicityDisplay(patient){let race=getRace(patient),ethnicity=getEthnicity(patient),parts=[];return race&&parts.push(race),ethnicity&&parts.push(ethnicity),parts.join(" \xB7 ")}import{Box as Box10,Flex as Flex7,Group as Group47,Modal as Modal9,Text as Text22}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{formatDate as formatDate2,getDisplayString as getDisplayString8}from"@medplum/core";import{useMedplum as useMedplum32}from"@medplum/react-hooks";import{useCallback as useCallback21,useState as useState66}from"react";import{Group as Group46,Stack as Stack20}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback20,useState as useState65}from"react";import{jsx as jsx124,jsxs as jsxs74}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState65(condition?.code),[clinicalStatus,setClinicalStatus]=useState65(condition?.clinicalStatus),handleSubmit=useCallback20(formData=>{let updatedCondition=addProfileToResource3({...condition,resourceType:"Condition",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:createReference8(patient),encounter:encounter&&createReference8(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG5+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx124(Form,{onSubmit:handleSubmit,children:jsxs74(Stack20,{children:[jsx124(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG5+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx124(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG5+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx124(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx124(Group46,{justify:"flex-end",gap:4,mt:"md",children:jsx124(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment39,jsx as jsx125,jsxs as jsxs75}from"react/jsx-runtime";function ProblemList(props){let medplum=useMedplum32(),{patient,encounter}=props,[problems,setProblems]=useState66(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=useState66(),[opened,{open,close}]=useDisclosure3(!1),handleSubmit=useCallback21(async condition=>{if(condition.id){let updatedCondition=await medplum.updateResource(condition);setProblems(problems.map(p=>p.id===updatedCondition.id?updatedCondition:p))}else{let newCondition=await medplum.createResource(condition);setProblems([newCondition,...problems])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs75(Fragment39,{children:[jsx125(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx125(Flex7,{direction:"column",gap:8,children:problems.map(problem=>jsx125(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs75(Box10,{children:[jsx125(Text22,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(problem)}),jsxs75(Group47,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx125(StatusBadge,{"data-testid":"status-badge",color:getStatusColor2(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx125(Text22,{size:"xs",fw:500,c:"dimmed",children:formatDate2(problem.onsetDateTime)})]})]})},problem.id))}):jsx125(Text22,{children:"(none)"})}),jsx125(Modal9,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx125(ConditionDialog,{patient,encounter,condition:editCondition,onSubmit:handleSubmit})})]})}var getStatusColor2=status=>{if(!status)return"gray";switch(status){case"active":case"recurrence":case"relapse":return"green";case"inactive":return"orange";case"remission":return"blue";case"resolved":return"teal";default:return"gray"}};import{Box as Box11,Flex as Flex8,Group as Group48,Modal as Modal10,Radio as Radio2,Stack as Stack21,Text as Text23,UnstyledButton as UnstyledButton3}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{createReference as createReference9,HTTP_HL7_ORG as HTTP_HL7_ORG6,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState67}from"react";import{Fragment as Fragment40,jsx as jsx126,jsxs as jsxs76}from"react/jsx-runtime";var NULLFLAVOR=HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/v3-NullFlavor",CodesToText={38628009:"Homosexual",20430005:"Heterosexual",42035005:"Bisexual",OTH:"Other",UNK:"Unknown",ASKU:"Asked but no answer"},CodesToSystem={38628009:SNOMED,20430005:SNOMED,42035005:SNOMED,OTH:NULLFLAVOR,UNK:NULLFLAVOR,ASKU:NULLFLAVOR};function SexualOrientation(props){let{patient,encounter}=props,medplum=useMedplum33(),[sexualOrientation,setSexualOrientation]=useState67(props.sexualOrientation),[opened,{open,close}]=useDisclosure4(!1),[hoverIndex,setHoverIndex]=useState67(null),handleSubmit=useCallback22(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG6+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:createReference9(patient),encounter:encounter?createReference9(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:CodesToSystem[code],code:formData.sexualOrientation}],text:CodesToText[code]}}).then(newSexualOrientation=>{setSexualOrientation(newSexualOrientation),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs76(Fragment40,{children:[jsx126(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx126(Flex8,{direction:"column",gap:8,children:jsx126(Box11,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx126(UnstyledButton3,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx126(Box11,{pr:hoverIndex===0?24:0,children:jsx126(Text23,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx126(Text23,{children:"(none)"})}),jsx126(Modal10,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx126(Form,{onSubmit:handleSubmit,children:jsxs76(Stack21,{children:[jsx126(Radio2.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx126(Radio2,{value:code,label:text,my:"xs"},code))}),jsx126(Group48,{justify:"flex-end",gap:4,mt:"md",children:jsx126(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group49,Modal as Modal11,Radio as Radio3,Stack as Stack22,Text as Text24,UnstyledButton as UnstyledButton4}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG7,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference10,formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{useMedplum as useMedplum34}from"@medplum/react-hooks";import{useCallback as useCallback23,useState as useState68}from"react";import{Fragment as Fragment41,jsx as jsx127,jsxs as jsxs77}from"react/jsx-runtime";var smokingStatusOptions={266919005:"Never smoked tobacco",266927001:"Tobacco smoking consumption unknown","428041000124106":"Occasional tobacco smoker","428061000124105":"Light tobacco smoker","428071000124103":"Heavy tobacco smoker",449868002:"Smokes tobacco daily",77176002:"Smoker",8517006:"Ex-smoker"};function SmokingStatus(props){let medplum=useMedplum34(),[smokingStatus,setSmokingStatus]=useState68(props.smokingStatus),[opened,{open,close}]=useDisclosure5(!1),handleSubmit=useCallback23(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG7+"/fhir/us/core/StructureDefinition/us-core-smokingstatus"]},status:"final",category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC2,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference10(props.patient),encounter:props.encounter?createReference10(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED2,version:SNOMED2+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return jsxs77(Fragment41,{children:[jsx127(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx127(UnstyledButton4,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx127(Text24,{children:formatCodeableConcept5(smokingStatus.valueCodeableConcept)})}):jsx127(Text24,{children:"(none)"})}),jsx127(Modal11,{opened,onClose:close,title:"Set Smoking Status",children:jsx127(Form,{onSubmit:handleSubmit,children:jsxs77(Stack22,{children:[jsx127(Radio3.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx127(Radio3,{value:code,label:text,my:"xs"},code))}),jsx127(Group49,{justify:"flex-end",gap:4,mt:"md",children:jsx127(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group50,Modal as Modal12,SimpleGrid as SimpleGrid2,Stack as Stack23,Text as Text25,Textarea as Textarea3,TextInput as TextInput22}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{useCallback as useCallback24,useState as useState69}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference11}from"@medplum/core";function getObservationValue(obs,component){return component?obs.component?.find(c=>c.code?.coding?.[0].code===component)?.valueQuantity:obs.valueQuantity}function createObservation(patient,encounter,code,title,valueQuantity){if(isValidNumber(valueQuantity.value))return{...createBaseObservation(patient,encounter,code,title),valueQuantity}}function createCompoundObservation(patient,encounter,code,title,components){let component=components.filter(c=>isValidNumber(c.valueQuantity?.value));if(component.length!==0)return{...createBaseObservation(patient,encounter,code,title),component}}function createBaseObservation(patient,encounter,code,title){return{resourceType:"Observation",status:"preliminary",subject:createReference11(patient),encounter:encounter?createReference11(encounter):void 0,effectiveDateTime:new Date().toISOString(),category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"vital-signs",display:"Vital Signs"}]}],code:createLoincCode(code,title)}}function createLoincCode(code,display){return{coding:[{code,display,system:LOINC3}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!isNaN(value)&&isFinite(value)}import{Fragment as Fragment42,jsx as jsx128,jsxs as jsxs78}from"react/jsx-runtime";var BP="85354-9",SYSTOLIC="8480-6",DIASTOLIC="8462-4",LOINC_CODES=[{name:"systolic",short:"BP Sys",code:BP,component:SYSTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"diastolic",short:"BP Dias",code:BP,component:DIASTOLIC,title:"Blood Pressure",unit:"mm[Hg]"},{name:"heartRate",short:"HR",code:"8867-4",title:"Heart Rate",unit:"/min"},{name:"bodyTemperature",short:"Temp",code:"8310-5",title:"Body Temperature",unit:"Cel"},{name:"respiratoryRate",short:"RR",code:"9279-1",title:"Respiratory Rate",unit:"/min"},{name:"height",short:"Ht",code:"8302-2",title:"Height",unit:"cm"},{name:"weight",short:"Wt",code:"29463-7",title:"Weight",unit:"kg"},{name:"bmi",short:"BMI",code:"39156-5",title:"BMI",unit:"kg/m2"},{name:"oxygen",short:"O2",code:"2708-6",title:"Oxygen",unit:"%"},{name:"headCircumference",short:"HC",code:"9843-4",title:"Head Circumference",unit:"cm"}];function Vitals(props){let medplum=useMedplum35(),{patient,encounter}=props,[vitals,setVitals]=useState69(props.vitals),[opened,{open,close}]=useDisclosure6(!1),handleSubmit=useCallback24(formData=>{let newObservations=[];newObservations.push(createCompoundObservation(patient,encounter,BP,"Blood pressure",[{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]")}]));for(let meta of LOINC_CODES)meta.component||newObservations.push(createObservation(patient,encounter,meta.code,meta.title,createQuantity(parseFloat(formData[meta.name]),meta.unit)));Promise.all(newObservations.filter(Boolean).map(obs=>medplum.createResource(obs))).then(newVitals=>setVitals([...newVitals,...vitals])).catch(console.error),close()},[medplum,patient,encounter,vitals,close]);return jsxs78(Fragment42,{children:[jsx128(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx128(Stack23,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs78(Group50,{align:"center",children:[jsx128(Text25,{c:"dimmed",children:meta.short}),obs&&jsx128(Text25,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx128(Modal12,{opened,onClose:close,title:"Add Vitals",children:jsxs78(Form,{onSubmit:handleSubmit,children:[jsx128(SimpleGrid2,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx128(TextInput22,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx128(Textarea3,{name:"notes",label:"Notes"}),jsx128(Group50,{justify:"flex-end",gap:4,mt:"md",children:jsx128(SubmitButton,{children:"Save"})})]})})]})}import{Fragment as Fragment43,jsx as jsx129,jsxs as jsxs79}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum36(),{patient:propsPatient,onClickResource}=props,patient=useResource11(propsPatient),[medicalData,setMedicalData]=useState70(),[createdDate,setCreatedDate]=useState70();useEffect25(()=>{let ref=`Patient/${resolveId2(propsPatient)}`,searchMeta={_count:100,_sort:"-_lastUpdated"};Promise.all([medplum.searchResources("AllergyIntolerance",{patient:ref,...searchMeta}),medplum.searchResources("Condition",{patient:ref,...searchMeta}),medplum.searchResources("MedicationRequest",{subject:ref,...searchMeta}),medplum.searchResources("Observation",{subject:ref,...searchMeta}),medplum.searchResources("Appointment",{patient:ref,...searchMeta}),medplum.searchResources("Encounter",{subject:ref,...searchMeta}),medplum.searchResources("Coverage",{beneficiary:ref,...searchMeta}),medplum.searchResources("Immunization",{patient:ref,...searchMeta}),medplum.searchResources("Procedure",{subject:ref,...searchMeta}),medplum.searchResources("Device",{patient:ref,...searchMeta}),medplum.searchResources("Goal",{subject:ref,...searchMeta})]).then(results=>{let observations=results[3];setMedicalData({allergies:results[0],problems:results[1],medicationRequests:results[2],sexualOrientation:observations.find(obs=>obs.code?.coding?.[0].code==="76690-7"),smokingStatus:observations.find(obs=>obs.code?.coding?.[0].code==="72166-2"),vitals:observations.filter(obs=>obs.category?.[0]?.coding?.[0].code==="vital-signs"),appointments:results[4],encounters:results[5],coverages:results[6],immunizations:results[7],procedures:results[8],devices:results[9],goals:results[10]})}).catch(console.error)},[medplum,propsPatient]),useEffect25(()=>{patient?.id&&medplum.readHistory("Patient",patient.id).then(history=>{let lastUpdated=history.entry?.[history.entry.length-1]?.resource?.meta?.lastUpdated;setCreatedDate(typeof lastUpdated=="string"?lastUpdated:"")}).catch(()=>{})},[patient?.id,medplum]);function getItemColor(value){return value?"inherit":"var(--mantine-color-gray-6)"}return patient?jsxs79(Flex9,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs79(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs79(Group51,{align:"center",gap:"sm",p:16,children:[jsx129(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs79(Stack24,{gap:0,style:{flex:1,minWidth:0},children:[jsx129(Tooltip4,{label:formatHumanName4(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx129(Text26,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:formatHumanName4(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return jsxs79(Text26,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx129(Divider3,{})]}),jsx129(Stack24,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:medicalData&&jsxs79(Fragment43,{children:[jsxs79(Stack24,{gap:"xs",py:8,children:[jsx129(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx129(Box12,{className:PatientSummary_default.patientSummaryListItem,children:jsx129(Tooltip4,{label:"Birthdate & Age",position:"top-start",openDelay:650,children:jsxs79(Group51,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[jsx129(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),jsx129(Text26,{fz:"sm",fw:400,truncate:!0,c:getItemColor(patient.birthDate),children:patient.birthDate?calculateAgeString2(patient.birthDate):"Add Birthdate"})]})})})}),jsx129(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx129(Box12,{className:PatientSummary_default.patientSummaryListItem,children:jsx129(Tooltip4,{label:"Gender & Identity",position:"top-start",openDelay:650,children:jsxs79(Group51,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[jsx129(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),jsx129(Text26,{fz:"sm",fw:400,truncate:!0,c:getItemColor(patient.gender||getGenderIdentity(patient)),children:patient.gender||getGenderIdentity(patient)?formatPatientGenderDisplay(patient):"Add Gender & Identity"})]})})})}),jsx129(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx129(Box12,{className:PatientSummary_default.patientSummaryListItem,children:jsx129(Tooltip4,{label:"Race & Ethnicity",position:"top-start",openDelay:650,children:jsxs79(Group51,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[jsx129(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),jsx129(Text26,{fz:"sm",fw:400,truncate:!0,c:getItemColor(getRace(patient)||getEthnicity(patient)),children:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):"Add Race & Ethnicity"})]})})})}),jsx129(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx129(Box12,{className:PatientSummary_default.patientSummaryListItem,children:jsx129(Tooltip4,{label:"Location",position:"top-start",openDelay:650,children:jsxs79(Group51,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[jsx129(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),jsx129(Text26,{fz:"sm",fw:400,truncate:!0,c:getItemColor(patient.address?.[0]?.city||patient.address?.[0]?.state),children:patient.address?.[0]?formatAddress2(patient.address[0]):"Add Location"})]})})})}),jsx129(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx129(Box12,{className:PatientSummary_default.patientSummaryListItem,children:jsx129(Tooltip4,{label:"General Practitioner",position:"top-start",openDelay:650,children:jsxs79(Group51,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[jsx129(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),jsx129(Text26,{fz:"sm",fw:400,truncate:!0,c:getItemColor(getGeneralPractitioner(patient)),children:getGeneralPractitioner(patient)??"Add a General Practitioner"})]})})})})]}),jsx129(Divider3,{}),jsx129(Insurance,{coverages:medicalData.coverages||[],onClickResource}),jsx129(Divider3,{}),jsx129(Allergies,{patient,allergies:medicalData.allergies,onClickResource}),jsx129(Divider3,{}),jsx129(ProblemList,{patient,problems:medicalData.problems,onClickResource}),jsx129(Divider3,{}),jsx129(Medications,{patient,medicationRequests:medicalData.medicationRequests,onClickResource}),jsx129(Divider3,{}),jsx129(SexualOrientation,{patient,sexualOrientation:medicalData.sexualOrientation,onClickResource}),jsx129(Divider3,{}),jsx129(SmokingStatus,{patient,smokingStatus:medicalData.smokingStatus,onClickResource}),jsx129(Divider3,{}),jsx129(Vitals,{patient,vitals:medicalData.vitals,onClickResource}),jsx129(Divider3,{})]})})]}):null}import{createReference as createReference12}from"@medplum/core";import{useCallback as useCallback25}from"react";import{jsx as jsx130}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback25((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),medplum.search("Communication",{subject:ref,_count}),medplum.search("Device",{patient:ref,_count}),medplum.search("DeviceRequest",{patient:ref,_count}),medplum.search("DiagnosticReport",{subject:ref,_count}),medplum.search("Media",{subject:ref,_count}),medplum.search("ServiceRequest",{subject:ref,_count}),medplum.search("Task",{subject:ref,_count})])},[]);return jsx130(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference12(resource),sender:createReference12(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference12(resource),operator:createReference12(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor6,Box as Box13,Button as Button14,CloseButton,Flex as Flex10,Group as Group52,NativeSelect as NativeSelect11,Paper as Paper4,Stack as Stack25,Text as Text27,TextInput as TextInput23}from"@mantine/core";import{getReferenceString as getReferenceString7}from"@medplum/core";import{useMedplum as useMedplum37,useResource as useResource12}from"@medplum/react-hooks";import{useEffect as useEffect26,useRef as useRef19,useState as useState71}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx131,jsxs as jsxs80}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum37(),defaultValue2=useResource12(props.value),[schemaLoaded,setSchemaLoaded]=useState71(!1),[selectedKey,setSelectedKey]=useState71(),[hoverKey,setHoverKey]=useState71(),[value,setValue]=useState71();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}let valueRef=useRef19(value);if(valueRef.current=value,useEffect26(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect26(()=>(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 jsx131("div",{children:jsxs80(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx131(TextInput23,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx131(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx131(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){let actionsRef=useRef19(props.actions);actionsRef.current=props.actions;function changeAction(changedAction){props.onChange(actionsRef.current.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...actionsRef.current,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(actionsRef.current.filter(i=>i!==removedAction))}return jsxs80(Stack25,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx131(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx131("div",{children:jsx131(Button14,{variant:"outline",onClick:e=>{killEvent(e),addAction({id:generateId()})},children:"Add action"})})]})}function ActionBuilder(props){let{action}=props,actionType=getInitialActionType(action);function onClick(e){e.stopPropagation(),props.setSelectedKey(props.action.id)}function onHover(e){killEvent(e),props.setHoverKey(props.action.id)}return jsx131("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx131(ActionEditor,{action,actionType,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState71(props.actionType),editing=props.selectedKey===props.action.id,hovering=props.hoverKey===props.action.id;function changeProperty(property,value){props.onChange({...action,[property]:value})}let className=clsx_default(PlanDefinitionBuilder_default.section,{[PlanDefinitionBuilder_default.hovering]:hovering&&!editing});return jsxs80(Paper4,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs80(Flex10,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx131(TextInput23,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx131(CloseButton,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs80(Stack25,{gap:"xl",p:"md",children:[jsx131(Box13,{children:jsx131(TextInput23,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx131(Box13,{children:jsx131(NativeSelect11,{label:"Type of Action",value:actionType,onChange:e=>{let value=e.currentTarget.value==="standard"?void 0:e.currentTarget.value;setActionType(value),props.onChange({...props.action,definitionCanonical:value==="standard"?void 0:props.action.definitionCanonical})},data:[{value:"standard",label:"Standard task"},{value:"questionnaire",label:"Task with Questionnaire"},{value:"activitydefinition",label:"Task with Activity Definition"}]})}),actionType==="questionnaire"&&jsxs80(Stack25,{gap:0,children:[jsxs80(Group52,{gap:0,mb:"xs",children:[jsx131(Text27,{fw:600,children:"Select questionnaire"}),jsx131(Text27,{c:"red",children:"*"})]}),jsxs80(Text27,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx131(Anchor6,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx131(ActionResourceTypeBuilder,{resourceType:"Questionnaire",action,onChange:props.onChange})]}),actionType==="activitydefinition"&&jsxs80(Stack25,{gap:0,children:[jsxs80(Group52,{gap:0,mb:"xs",children:[jsx131(Text27,{fw:600,children:"Select activity definition"}),jsx131(Text27,{c:"red",children:"*"})]}),jsxs80(Text27,{size:"sm",c:"dimmed",mb:"sm",children:["ActivityDefinition.kind resource to be shown in the task in Encounter view. You can create new one from"," ",jsx131(Anchor6,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx131(ActionResourceTypeBuilder,{resourceType:"ActivityDefinition",action,onChange:props.onChange})]})]})]})}function ActionResourceTypeBuilder(props){let{id,definitionCanonical}=props.action,reference=definitionCanonical?.startsWith(props.resourceType+"/")?{reference:definitionCanonical}:void 0;return jsx131(ResourceInput,{name:id,resourceType:props.resourceType,defaultValue:reference,onChange:newValue=>{newValue?props.onChange({...props.action,definitionCanonical:getReferenceString7(newValue)}):props.onChange({...props.action,definitionCanonical:void 0})}})}function getInitialActionType(action){return action.definitionCanonical?.startsWith("Questionnaire")?"questionnaire":action.definitionCanonical?.startsWith("ActivityDefinition")?"activitydefinition":"standard"}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 Anchor7,Box as Box14,Group as Group54,NativeSelect as NativeSelect13,Space as Space2,Textarea as Textarea5,TextInput as TextInput25,Title as Title8}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{useMedplum as useMedplum39,useResource as useResource13}from"@medplum/react-hooks";import{useEffect as useEffect28,useRef as useRef20,useState as useState73}from"react";import{Checkbox as Checkbox6,Group as Group53,MultiSelect as MultiSelect2,NativeSelect as NativeSelect12,Radio as Radio4,Text as Text28,Textarea as Textarea4,TextInput as TextInput24}from"@mantine/core";import{capitalize as capitalize7,deepEquals as deepEquals2,formatCoding as formatCoding2,getElementDefinition as getElementDefinition2,getExtension as getExtension3,HTTP_HL7_ORG as HTTP_HL7_ORG9,stringify as stringify3,typedValueToString as typedValueToString2}from"@medplum/core";import{useMedplum as useMedplum38}from"@medplum/react-hooks";import{useContext as useContext24,useEffect as useEffect27,useState as useState72}from"react";import{HTTP_HL7_ORG as HTTP_HL7_ORG8,PropertyType as PropertyType3,deepClone as deepClone3,evalFhirPathTyped as evalFhirPathTyped3,getExtension as getExtension2,getReferenceString as getReferenceString8,getTypedPropertyValueWithoutSchema,normalizeErrorString as normalizeErrorString10,splitN,toJsBoolean,toTypedValue as toTypedValue2,typedValueToString}from"@medplum/core";var QuestionnaireItemType={group:"group",display:"display",question:"question",boolean:"boolean",decimal:"decimal",integer:"integer",date:"date",dateTime:"dateTime",time:"time",string:"string",text:"text",url:"url",choice:"choice",openChoice:"open-choice",attachment:"attachment",reference:"reference",quantity:"quantity"};function isChoiceQuestion(item){return item.type==="choice"||item.type==="open-choice"}function isQuestionEnabled(item,questionnaireResponse){let extension=getExtension2(item,HTTP_HL7_ORG8+"/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-enableWhenExpression");if(questionnaireResponse&&extension){let expression=extension.valueExpression?.expression;if(expression){let value=toTypedValue2(questionnaireResponse),result=evalFhirPathTyped3(expression,[value],{"%resource":value});return toJsBoolean(result)}}if(!item.enableWhen)return!0;let enableBehavior=item.enableBehavior??"any";for(let enableWhen of item.enableWhen){let actualAnswers=getByLinkId(questionnaireResponse?.item,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 evaluateCalculatedExpressionsInQuestionnaire(items,response){return items.map(item=>{if(item.item)return{...item,item:evaluateCalculatedExpressionsInQuestionnaire(item.item,response)};try{let calculatedValue=evaluateCalculatedExpression(item,response);if(!calculatedValue)return null;let answer=typedValueToResponseItem(item,calculatedValue);return answer?{id:item?.id,linkId:item?.linkId,text:item.text,answer:[answer]}:null}catch(error){return{id:item?.id,linkId:item?.linkId,text:item.text,answer:[],extension:[{url:`${HTTP_HL7_ORG8}/fhir/StructureDefinition/questionnaire-validationError`,valueString:`Expression evaluation failed: ${normalizeErrorString10(error)}`}]}}}).filter(item=>item!==null)}function typedValueToResponseItem(item,value){if(item.type)switch(item.type){case QuestionnaireItemType.boolean:return value.type===PropertyType3.boolean?{valueBoolean:value.value}:void 0;case QuestionnaireItemType.date:return value.type===PropertyType3.date?{valueDate:value.value}:void 0;case QuestionnaireItemType.dateTime:return value.type===PropertyType3.dateTime?{valueDateTime:value.value}:void 0;case QuestionnaireItemType.time:return value.type===PropertyType3.time?{valueTime:value.value}:void 0;case QuestionnaireItemType.url:return value.type===PropertyType3.url?{valueString:value.value}:void 0;case QuestionnaireItemType.text:return value.type===PropertyType3.string?{valueString:value.value}:void 0;case QuestionnaireItemType.attachment:return value.type===PropertyType3.Attachment?{valueAttachment:value.value}:void 0;case QuestionnaireItemType.reference:return value.type===PropertyType3.Reference?{valueReference:value.value}:void 0;case QuestionnaireItemType.quantity:return{valueQuantity:value.value};case QuestionnaireItemType.decimal:return{valueDecimal:value.value};case QuestionnaireItemType.integer:return{valueInteger:value.value};case QuestionnaireItemType.string:return{valueString:value.value};default:return}}function evaluateCalculatedExpression(item,response){if(!response)return;let extension=getExtension2(item,HTTP_HL7_ORG8+"/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression");if(extension){let expression=extension.valueExpression?.expression;if(expression){let value=toTypedValue2(response),result=evalFhirPathTyped3(expression,[value],{"%resource":value});return result.length!==0?result[0]:void 0}}}function mergeUpdatedItems(mergedItems,updatedItems){return mergedItems.map(mergedItem=>{let updatedItem=updatedItems.find(updated=>updated.linkId===mergedItem.linkId);return updatedItem?{...mergedItem,item:updatedItem.item?mergeUpdatedItems(mergedItem.item||[],updatedItem.item):mergedItem.item,answer:updatedItem.answer||mergedItem.answer,extension:updatedItem.extension||mergedItem.extension}:mergedItem})}function getNewMultiSelectValues(selected,propertyName,item){let result=[];for(let selectedStr of selected){let option=item.answerOption?.find(candidate=>typedValueToString(getItemAnswerOptionValue(candidate))===selectedStr);if(option){let optionValue=getItemAnswerOptionValue(option);optionValue&&result.push({[propertyName]:optionValue.value})}}return result}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=getItemEnableWhenValueAnswer(enableWhen),anyMatch=!1,allMatch=!0;for(let actualAnswerValue of actualAnswers){let actualAnswer=getResponseItemAnswerValue(actualAnswerValue),{operator}=enableWhen;if(evaluateMatch(actualAnswer,expectedAnswer,operator)?anyMatch=!0:allMatch=!1,enableBehavior==="any"&&anyMatch)break}return{anyMatch,allMatch}}function getQuestionnaireItemReferenceTargetTypes(item){let extension=getExtension2(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=deepClone3(item),extension=getExtension2(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=getExtension2(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,questionnaireResponse){return{resourceType:"QuestionnaireResponse",questionnaire:questionnaire.url??getReferenceString8(questionnaire),item:buildInitialResponseItems(questionnaire.item,questionnaireResponse?.item),status:"in-progress"}}function buildInitialResponseItems(items,questionnaireResponseItems){return items?.map(item=>buildInitialResponseItem(item,questionnaireResponseItems))??[]}function buildInitialResponseItem(item,questionnaireResponseItem){let existingResponseItem=questionnaireResponseItem?.find(responseItem=>responseItem.linkId===item.linkId);return{id:existingResponseItem?existingResponseItem.id:generateId2(),linkId:item.linkId,text:item.text,item:buildInitialResponseItems(item.item,existingResponseItem?.item),answer:existingResponseItem?existingResponseItem.answer:item.initial?.map(buildInitialResponseAnswer)??[]}}var nextId2=1;function generateId2(){return"id-"+nextId2++}function buildInitialResponseAnswer(answer){return{...answer}}function getNumberOfPages(questionnaire){let firstItem=questionnaire?.item?.[0];return firstItem&&getExtension2(firstItem,"http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl")?.valueCodeableConcept?.coding?.[0]?.code==="page"?questionnaire.item.length:1}function getItemInitialValue(initial){return getTypedPropertyValueWithoutSchema({type:"QuestionnaireItemInitial",value:initial},"value")}function getItemAnswerOptionValue(option){return getTypedPropertyValueWithoutSchema({type:"QuestionnaireItemAnswerOption",value:option},"value")}function getItemEnableWhenValueAnswer(enableWhen){return getTypedPropertyValueWithoutSchema({type:"QuestionnaireItemEnableWhen",value:enableWhen},"answer")}function getResponseItemAnswerValue(answer){return getTypedPropertyValueWithoutSchema({type:"QuestionnaireResponseItemAnswer",value:answer},"value")}import{createContext as createContext3}from"react";var QuestionnaireFormContext=createContext3({});import{Fragment as Fragment44,jsx as jsx132,jsxs as jsxs81}from"react/jsx-runtime";var MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS=30,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS=50;function QuestionnaireFormItem(props){let context=useContext24(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((a,idx)=>idx===props.index?newResponseAnswer:a)??[],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)??getItemInitialValue(initial),validationError=getExtension3(response,`${HTTP_HL7_ORG9}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx132("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx132(CheckboxFormSection,{title:props.item.text,htmlFor:props.item.linkId,children:jsx132(Checkbox6,{id:props.item.linkId,name:props.item.linkId,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer({valueBoolean:e.currentTarget.checked})})},props.item.linkId);break;case QuestionnaireItemType.decimal:formComponent=jsx132(TextInput24,{type:"number",step:"any",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueDecimal:e.currentTarget.value===""?void 0:e.currentTarget.valueAsNumber})});break;case QuestionnaireItemType.integer:formComponent=jsx132(TextInput24,{type:"number",step:1,id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueInteger:e.currentTarget.value===""?void 0:e.currentTarget.valueAsNumber})});break;case QuestionnaireItemType.date:formComponent=jsx132(TextInput24,{type:"date",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueDate:e.currentTarget.value})});break;case QuestionnaireItemType.dateTime:formComponent=jsx132(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueDateTime:newValue})});break;case QuestionnaireItemType.time:formComponent=jsx132(TextInput24,{type:"time",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer({valueTime:e.currentTarget.value})});break;case QuestionnaireItemType.string:case QuestionnaireItemType.url:formComponent=jsx132(TextInput24,{id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer({valueString:value===""?void 0:value})}});break;case QuestionnaireItemType.text:formComponent=jsx132(Textarea4,{id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer({valueString:value===""?void 0:value})}});break;case QuestionnaireItemType.attachment:formComponent=jsx132(Group53,{py:4,children:jsx132(AttachmentInput,{path:"",name,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueAttachment:newValue})})});break;case QuestionnaireItemType.reference:formComponent=jsx132(ReferenceInput,{name,required:props.required??item.required,targetTypes:getQuestionnaireItemReferenceTargetTypes(item),searchCriteria:getQuestionnaireItemReferenceFilter(item,context.subject,context.encounter),defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueReference:newValue})});break;case QuestionnaireItemType.quantity:formComponent=jsx132(QuantityInput,{path:"",name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer({valueQuantity:newValue}),disableWheel:!0});break;case QuestionnaireItemType.choice:case QuestionnaireItemType.openChoice:isCheckboxChoice(item)?formComponent=jsx132(QuestionnaireCheckboxInput,{name,item,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):isDropdownChoice(item)||item.answerValueSet&&!isRadiobuttonChoice(item)?formComponent=jsx132(QuestionnaireDropdownInput,{name,item,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):formComponent=jsx132(QuestionnaireRadiobuttonInput,{name,item,initial,response,onChangeAnswer:e=>onChangeAnswer(e)});break;default:return null}return jsxs81(Fragment44,{children:[formComponent,validationError?.valueString&&jsx132(Text28,{c:"red",size:"lg",mt:4,children:validationError.valueString})]})}function QuestionnaireDropdownInput(props){let{name,item,initial,onChangeAnswer,response}=props;if(!item.answerOption?.length&&!item.answerValueSet)return jsx132(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||isMultiSelectChoice(item);if(item.answerValueSet)return jsx132(ValueSetAutocomplete,{name,placeholder:"Select items",binding:item.answerValueSet,maxValues:isMultiSelect?void 0:1,onChange:values=>{isMultiSelect?values.length===0?onChangeAnswer({}):onChangeAnswer(values.map(coding=>({valueCoding:coding}))):onChangeAnswer({valueCoding:values[0]})},defaultValue:defaultValue2?.value});if(isMultiSelect){let{propertyName,data:data2}=formatSelectData(item);return jsx132(MultiSelect2,{data:data2,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[typedValueToString2(initialValue)],onChange:selected=>{if(selected.length===0)onChangeAnswer({});else{let values=getNewMultiSelectValues(selected,propertyName,item);onChangeAnswer(values)}}})}else{let data2=[""];if(item.answerOption)for(let option of item.answerOption){let optionValue=getItemAnswerOptionValue(option);data2.push(typedValueToString2(optionValue))}return jsx132(NativeSelect12,{id:name,name,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){onChangeAnswer({});return}let option=item.answerOption[index-1],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize7(optionValue.type);onChangeAnswer({[propertyName]:optionValue.value})},defaultValue:formatCoding2(defaultValue2?.value)||defaultValue2?.value,data:data2})}}function getValueSetOptions(valueSetUrl,medplum){return valueSetUrl?medplum.valueSetExpand({url:valueSetUrl,count:MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS+1}).then(valueSet=>valueSet.expansion?.contains??[]):Promise.resolve([])}function useValueSetOptions(valueSetUrl){let medplum=useMedplum38(),[valueSetOptions,setValueSetOptions]=useState72([]),[isLoading,setIsLoading]=useState72(!1);return useEffect27(()=>{async function loadValueSet(){if(valueSetUrl){setIsLoading(!0);try{let options=await getValueSetOptions(valueSetUrl,medplum);setValueSetOptions(options)}catch(err){console.error("Error loading value set:",err)}finally{setIsLoading(!1)}}}loadValueSet().catch(console.error)},[valueSetUrl,medplum]),[valueSetOptions,isLoading]}function getOptionsFromValueSet(valueSetOptions,name){return valueSetOptions.map((option,i)=>{let optionName=`${name}-valueset-${i}`,optionValue={type:"Coding",value:{system:option.system,code:option.code,display:option.display}};return[optionName,optionValue]})}function QuestionnaireRadiobuttonInput(props){let{name,item,initial,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition2("QuestionnaireItemAnswerOption","value[x]"),initialValue=getItemInitialValue(initial),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),options=[],defaultValue2;if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?(initialValue&&stringify3(optionValue)===stringify3(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return jsx132(Text28,{children:"Loading options..."});if(options.length===0)return jsx132(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs81(Fragment44,{children:[jsx132(Radio4.Group,{name,value:answerLinkId??defaultValue2,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+capitalize7(optionValue.type);onChangeAnswer({[propertyName]:optionValue.value})}},children:limitedOptions.map(([optionName,optionValue])=>jsx132(Radio4,{id:optionName,value:optionName,py:4,label:jsx132(ResourcePropertyDisplay,{property:valueElementDefinition,propertyType:optionValue.type,value:optionValue.value})},optionName))}),(item.answerValueSet&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS||item.answerOption&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS)&&jsxs81(Text28,{size:"sm",c:"dimmed",mt:"xs",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function QuestionnaireCheckboxInput(props){let{name,item,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition2("QuestionnaireItemAnswerOption","value[x]"),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),initialSelectedValues=item.answerValueSet?(response.answer?.map(a=>a.valueCoding)||[]).filter(c=>c!==void 0):getCurrentMultiSelectAnswer(response),[selectedValues,setSelectedValues]=useState72(initialSelectedValues),options=[];if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?[optionName,optionValue]:null}).filter(option=>option!==null);options.push(...mappedOptions)}if(isLoading)return jsx132(Text28,{children:"Loading options..."});if(options.length===0)return jsx132(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS),handleCheckboxChange=(optionValue,selected)=>{if(item.answerValueSet){let currentCodings=selectedValues,newCodings;selected?newCodings=[...currentCodings,optionValue.value]:newCodings=currentCodings.filter(c=>!deepEquals2(c,optionValue.value)),setSelectedValues(newCodings),newCodings.length===0?onChangeAnswer({}):onChangeAnswer(newCodings.map(coding=>({valueCoding:coding})))}else{let currentValues=selectedValues,optionValueStr=typedValueToString2(optionValue),newValues;if(selected?newValues=[...currentValues,optionValueStr]:newValues=currentValues.filter(v=>v!==optionValueStr),setSelectedValues(newValues),newValues.length===0)onChangeAnswer({});else{let values=getNewMultiSelectValues(newValues,"value"+capitalize7(optionValue.type),item);onChangeAnswer(values)}}};return jsxs81(Group53,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=typedValueToString2(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>deepEquals2(coding,optionValue.value)):selectedValues.includes(optionValueStr);return jsx132(Checkbox6,{id:optionName,label:jsx132(ResourcePropertyDisplay,{property:valueElementDefinition,propertyType:optionValue.type,value:optionValue.value}),checked:isChecked,onChange:event=>handleCheckboxChange(optionValue,event.currentTarget.checked)},optionName)}),(item.answerValueSet&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS||item.answerOption&&options.length>MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS)&&jsxs81(Text28,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx132(TextInput24,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){let results=response.answer;return getItemAnswerOptionValue(results?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response.answer;return results?results.map(a=>getItemAnswerOptionValue(a)).map(type=>formatCoding2(type?.value)||type?.value):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals2(option[1].value,defaultAnswer?.value))?.[0]}function hasChoiceType(item,type){return!!item.extension?.some(e=>e.url==="http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl"&&e.valueCodeableConcept?.coding?.[0]?.code===type)}function isDropdownChoice(item){return hasChoiceType(item,"drop-down")}function isCheckboxChoice(item){return hasChoiceType(item,"check-box")}function isRadiobuttonChoice(item){return hasChoiceType(item,"radio-button")}function isMultiSelectChoice(item){return hasChoiceType(item,"multi-select")}function formatSelectData(item){if(item.answerOption?.length===0)return{propertyName:"",data:[]};let option=item.answerOption[0],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize7(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString2(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};import{Fragment as Fragment45,jsx as jsx133,jsxs as jsxs82}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum39(),defaultValue2=useResource13(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState73(!1),[value,setValue]=useState73(),[selectedKey,setSelectedKey]=useState73(),[hoverKey,setHoverKey]=useState73();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect28(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect28(()=>(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:jsx133("div",{children:jsxs82(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx133(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx133(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource2=isResourceType(props.item),isContainer=isResource2||item.type===QuestionnaireItemType.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef20(props.item);itemRef.current=props.item;function onClick(e){killEvent(e),props.setSelectedKey(props.item.id)}function onHover(e){killEvent(e),props.setHoverKey(props.item.id)}function changeItem(changedItem){let curr=itemRef.current;props.onChange({...curr,item:curr.item?.map(i=>i.id===changedItem.id?changedItem:i)})}function addItem(addedItem,disableSubmit){props.onChange({...props.item,item:[...props.item.item??[],addedItem]},disableSubmit)}function removeItem(removedItem){props.onChange({...props.item,item:props.item.item?.filter(i=>i!==removedItem)})}function changeProperty(property,value){props.onChange({...itemRef.current,[property]:value})}function updateItem(updatedItem){props.onChange({...props.item,...updatedItem})}function toggleRepeatable(item2){props.onChange({...props.item,item:props.item.item?.map(i=>i===item2?{...i,repeats:!i.repeats}:i)})}function moveItem(itemIndex,delta){let updatedItems=reorderItems(props.item.item,itemIndex,delta);props.onChange({...props.item,item:updatedItems})}let className=clsx_default(QuestionnaireBuilder_default.section,{[QuestionnaireBuilder_default.editing]:editing,[QuestionnaireBuilder_default.hovering]:hovering&&!editing});return jsxs82("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx133("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs82(Fragment45,{children:[isResource2&&jsx133(TextInput25,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource2&&jsx133(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx133(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx133(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs82(Fragment45,{children:[resource.title&&jsx133(Title8,{children:resource.title}),item.text&&jsx133("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx133(QuestionnaireFormItem,{item,index:0,required:!1,onChange:()=>{},response:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx133("div",{children:jsx133(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&&jsx133("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs82(Fragment45,{children:[jsx133(TextInput25,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx133(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"}]})]}):jsx133("div",{children:linkId})}),!isResource2&&jsx133(Box14,{className:QuestionnaireBuilder_default.movementActions,children:jsxs82(Box14,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx133(Anchor7,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx133(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx133(Anchor7,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx133(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs82("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs82(Fragment45,{children:[jsx133(Anchor7,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId3(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx133(Anchor7,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId3(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource2&&jsx133(Anchor7,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource2&&jsxs82(Fragment45,{children:[jsx133(Anchor7,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx133(Anchor7,{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 jsxs82("div",{children:[props.item.answerValueSet!==void 0?jsx133(TextInput25,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx133(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs82(Box14,{display:"flex",children:[jsx133(Anchor7,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId3()}]})},children:"Add choice"}),jsx133(Space2,{w:"lg"}),jsx133(Anchor7,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx133("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs82("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx133("div",{children:jsx133(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)}),jsx133("div",{children:jsx133(Anchor7,{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 jsxs82(Fragment45,{children:[targetTypes.map((targetType,index)=>jsxs82(Group54,{children:[jsx133(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx133(Anchor7,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx133(Anchor7,{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 Title10}from"@mantine/core";import{createReference as createReference13,getReferenceString as getReferenceString9}from"@medplum/core";import{useMedplum as useMedplum40,usePrevious as usePrevious2,useResource as useResource14}from"@medplum/react-hooks";import{useCallback as useCallback26,useEffect as useEffect30,useRef as useRef21,useState as useState76}from"react";import{Button as Button15,Group as Group55,Stack as Stack27,Stepper}from"@mantine/core";import{Anchor as Anchor8}from"@mantine/core";import{useState as useState74}from"react";import{jsx as jsx134,jsxs as jsxs83}from"react/jsx-runtime";function QuestionnaireRepeatableItem(props){let{item,response,onChange}=props,[number,setNumber]=useState74(getNumberOfRepeats(item,response??{linkId:item.linkId}));if(!props.checkForQuestionEnabled(item)||!response)return null;if(item.type===QuestionnaireItemType.display)return jsx134("p",{children:item.text},item.linkId);let showAddButton=item?.repeats&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice;return item.type===QuestionnaireItemType.boolean?jsx134(QuestionnaireFormItem,{item,response,onChange:r2=>onChange([r2]),index:0},item.linkId):jsxs83(FormSection,{htmlFor:props.item.linkId,title:props.item.text,withAsterisk:props.item.required,children:[[...Array(number)].map((_,index)=>jsx134(QuestionnaireFormItem,{item,response,onChange:r2=>onChange([r2]),index},`${item.linkId}-${index}`)),showAddButton&&jsx134(Anchor8,{onClick:()=>setNumber(n=>n+1),children:"Add Item"})]},props.item.linkId)}function getNumberOfRepeats(item,response){if(item.type===QuestionnaireItemType.choice||item.type===QuestionnaireItemType.openChoice)return 1;let answers=response.answer;return answers?.length?answers.length:1}import{Anchor as Anchor9,Stack as Stack26,Title as Title9}from"@mantine/core";import{useEffect as useEffect29,useState as useState75}from"react";import{Fragment as Fragment46,jsx as jsx135,jsxs as jsxs84}from"react/jsx-runtime";function QuestionnaireRepeatedGroup(props){let[responses,setResponses]=useState75(props.response);if(useEffect29(()=>{setResponses(props.response)},[props.response]),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,void 0);setResponses([...responses,newResponse])}return jsxs84(Fragment46,{children:[responses.map((response,idx)=>jsx135(QuestionnaireGroup,{item:props.item,response,checkForQuestionEnabled:props.checkForQuestionEnabled,onChange:r2=>handleRepeatableGroup(r2,idx)},response.id)),props.item.repeats&&jsx135(Anchor9,{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)?jsxs84("div",{children:[props.item.text&&jsx135(Title9,{order:3,mb:"md",children:props.item.text}),jsx135(Stack26,{children:props.item.item?.map(item=>item.type===QuestionnaireItemType.group?item.repeats?jsx135(QuestionnaireRepeatedGroup,{item,response:response.item?.filter(i=>i.linkId===item.linkId)??[],checkForQuestionEnabled,onChange:onSetGroup},item.linkId):jsx135(QuestionnaireGroup,{item,checkForQuestionEnabled,response:response.item?.find(i=>i.linkId===item.linkId)??{linkId:item.linkId},onChange:onSetGroup},item.linkId):jsx135(QuestionnaireRepeatableItem,{item,response:response.item?.find(i=>i.linkId===item.linkId),onChange:onSetGroup,checkForQuestionEnabled},item.linkId))})]},props.item.linkId):null}import{Fragment as Fragment47,jsx as jsx136,jsxs as jsxs85}from"react/jsx-runtime";function QuestionnairePageSequence(props){let{items,response,activePage,onChange,nextStep,prevStep,numberOfPages,renderPages,submitButtonText,excludeButtons,checkForQuestionEnabled}=props,form=items.map(item=>{let itemResponse=response?.item?.filter(i=>i.linkId===item.linkId)??[],repeatedItem=item.type===QuestionnaireItemType.group?jsx136(QuestionnaireRepeatedGroup,{item,response:itemResponse,onChange,checkForQuestionEnabled},item.linkId):jsx136(QuestionnaireRepeatableItem,{item,response:itemResponse?.[0],onChange,checkForQuestionEnabled},item.linkId);return renderPages?jsx136(Stepper.Step,{label:item.text,children:repeatedItem},item.linkId):repeatedItem});return jsxs85(Fragment47,{children:[renderPages&&jsx136(Stepper,{active:activePage??0,allowNextStepsSelect:!1,p:6,children:form}),!renderPages&&jsx136(Stack27,{children:form}),!excludeButtons&&jsx136(ButtonGroup,{activePage:activePage??0,numberOfPages,nextStep:renderPages?nextStep:void 0,prevStep:renderPages?prevStep:void 0,renderPages,submitButtonText})]})}function ButtonGroup(props){let showBackButton=props.renderPages&&props.activePage>0,showNextButton=props.renderPages&&props.activePage<props.numberOfPages-1,showSubmitButton=!props.renderPages||props.activePage===props.numberOfPages-1;return jsxs85(Group55,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx136(Button15,{onClick:props.prevStep,children:"Back"}),showNextButton&&jsx136(Button15,{onClick:e=>{let form=e.currentTarget.closest("form");props.nextStep&&form.reportValidity()&&props.nextStep()},children:"Next"}),showSubmitButton&&jsx136(SubmitButton,{children:props.submitButtonText??"Submit"})]})}import{jsx as jsx137,jsxs as jsxs86}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum40(),{subject,source:sourceFromProps}=props,questionnaire=useResource14(props.questionnaire),prevQuestionnaire=usePrevious2(questionnaire),questionnaireResponse=useResource14(props.questionnaireResponse),[response,setResponse]=useState76(questionnaireResponse),[activePage,setActivePage]=useState76(0),onChangeRef=useRef21(props.onChange);onChangeRef.current=props.onChange;let onSubmitRef=useRef21(props.onSubmit);onSubmitRef.current=props.onSubmit,useEffect30(()=>{if(questionnaireResponse?.item&&questionnaire){let response2=buildInitialResponse(questionnaire,questionnaireResponse),evaluatedResponse=evaluateAndMergeResponseItems(response2,questionnaire);setResponse(evaluatedResponse)}else{if(questionnaire&&getQuestionnaireIdentity(prevQuestionnaire)===getQuestionnaireIdentity(questionnaire))return;setResponse(questionnaire?buildInitialResponse(questionnaire):void 0)}},[questionnaireResponse,questionnaire,prevQuestionnaire]),useEffect30(()=>{if(response&&onChangeRef.current)try{onChangeRef.current(response)}catch(e){console.error("Error invoking QuestionnaireForm.onChange callback",e)}},[response]);let setItems=useCallback26(newResponseItems=>{setResponse(prevResponse=>updateResponseItems(prevResponse,newResponseItems,questionnaire))},[questionnaire]),handleSubmit=useCallback26(()=>{let onSubmit=onSubmitRef.current;if(onSubmit&&questionnaire&&response){let source=sourceFromProps;if(!source){let profile=medplum.getProfile();profile&&(source=createReference13(profile))}onSubmit({...response,questionnaire:questionnaire.url??getReferenceString9(questionnaire),subject,source,authored:new Date().toISOString(),status:"completed"})}},[medplum,questionnaire,response,subject,sourceFromProps]);function checkForQuestionEnabled(item){return isQuestionEnabled(item,response)}if(!questionnaire||!response)return null;let numberOfPages=getNumberOfPages(questionnaire),nextStep=()=>setActivePage(current=>current+1),prevStep=()=>setActivePage(current=>current-1);return jsx137(QuestionnaireFormContext.Provider,{value:{subject:props.subject,encounter:props.encounter},children:jsxs86(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[questionnaire.title&&jsx137(Title10,{children:questionnaire.title}),jsx137(QuestionnairePageSequence,{items:questionnaire.item??[],response,onChange:setItems,renderPages:!props.disablePagination&&numberOfPages>1,activePage,numberOfPages,excludeButtons:props.excludeButtons,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}function getQuestionnaireIdentity(questionnaire){return questionnaire?.id||questionnaire}function updateResponseItems(prevResponse,newResponseItems,questionnaire){if(!newResponseItems)return{resourceType:"QuestionnaireResponse",status:"in-progress"};let currentItems=prevResponse?.item??[],mergedItems=mergeItems(currentItems,Array.isArray(newResponseItems)?newResponseItems:[newResponseItems]),tempResponse={resourceType:"QuestionnaireResponse",status:"in-progress",item:mergedItems},updatedItems=evaluateCalculatedExpressionsInQuestionnaire(questionnaire?.item??[],tempResponse);return tempResponse.item=mergeUpdatedItems(mergedItems,updatedItems),evaluateAndMergeResponseItems(tempResponse,questionnaire)}function evaluateAndMergeResponseItems(tempResponse,questionnaire){let updatedItems=evaluateCalculatedExpressionsInQuestionnaire(questionnaire?.item??[],tempResponse);return{resourceType:"QuestionnaireResponse",status:"in-progress",item:mergeUpdatedItems(tempResponse.item??[],updatedItems)}}import{ActionIcon as ActionIcon15,Divider as Divider4,Group as Group56,NativeSelect as NativeSelect14,Stack as Stack28,Text as Text29,TextInput as TextInput26}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect31,useState as useState77}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx138,jsxs as jsxs87}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]=useState77([]),[groupId,setGroupId]=useState77(1),[intervalId,setIntervalId]=useState77(1);return useEffect31(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs87(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx138(Stack28,{children:intervalGroups.map(intervalGroup=>jsx138(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx138(ActionIcon15,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx138(IconCirclePlus,{})}),jsx138(Group56,{justify:"flex-end",children:jsx138(SubmitButton,{children:"Save"})})]});function submitDefinition(){let qualifiedInterval=intervalGroups.flatMap(group=>group.intervals).filter(interval=>!isEmptyInterval(interval));props.onSubmit({...defaultDefinition,qualifiedInterval})}function addGroup(addedGroup){setIntervalGroups(currentGroups=>[...currentGroups,addedGroup])}function removeGroup(removedGroup){setIntervalGroups(currentGroups=>currentGroups.filter(group=>group.id!==removedGroup.id))}function changeInterval(groupId2,changedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2),index=currentGroup?.intervals.findIndex(interval=>interval.id===changedInterval.id);return index!==void 0&¤tGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g=>g.id===groupId2);if(currentGroupIndex!==-1){let currentGroup={...groups[currentGroupIndex]};addedInterval={...addedInterval,...currentGroup.filters},currentGroup.intervals=[...currentGroup.intervals,addedInterval],groups[currentGroupIndex]=currentGroup}return groups})}function removeInterval(groupId2,removedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx138(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs87(Stack28,{gap:"lg",children:[jsx138(Group56,{justify:"flex-end",children:jsx138(ActionIcon15,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx138(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx138(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx138(Divider4,{}),intervalGroup.intervals.map(interval=>jsxs87(Stack28,{gap:"xs",children:[jsxs87(Group56,{children:[jsx138(TextInput26,{"data-testid":`condition-${interval.id}`,defaultValue:interval.condition,label:"Condition: ",size:"sm",onChange:e=>{killEvent(e),props.onChange(intervalGroup.id,{...interval,condition:e.currentTarget.value.trim()})}},`condition-${interval.id}`),jsx138(ActionIcon15,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx138(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx138(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx138(ActionIcon15,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx138(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 jsxs87(Stack28,{style:{maxWidth:"50%"},children:[jsx138(Group56,{children:jsx138(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})}}})}),jsxs87(Group56,{gap:"xs",children:[jsx138(Text29,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx138("div",{id:`div-age-${intervalGroup.id}`,children:jsx138(RangeInput,{path:"",name:`age-${intervalGroup.id}`,defaultValue:intervalGroup.filters.age,onChange:ageRange=>{for(let interval of intervalGroup.intervals)onChange(intervalGroup.id,{...interval,age:ageRange})}},`age-${intervalGroup.id}`)})]}),jsx138(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"}]}})}}}),jsx138(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(f=>[f,interval[f]])),intervals:[]}),groups[groupKey].intervals.push(interval)}return setGroupId(groupId),Object.values(groups)}function generateGroupKey(interval){return[`gender=${interval.gender}`,`age=${formatRange2(interval.age)}`,`gestationalAge=${formatRange2(interval.gestationalAge)}`,`context=${interval.context?.text}`,`appliesTo=${interval.appliesTo?.map(c=>c.text).join("+")}`,`category=${interval.category}`].join(":")}function getUnitString(unit){return unit&&(getCodeBySystem(unit,"http://unitsofmeasure.org")||unit.text)}function isEmptyInterval(interval){return interval.range?.low?.value===void 0&&interval.range?.high?.value===void 0}import{Button as Button16,Grid as Grid2,Text as Text30}from"@mantine/core";import{formatDateTime as formatDateTime6,getReferenceString as getReferenceString10}from"@medplum/core";import{useMedplum as useMedplum41,useResource as useResource15}from"@medplum/react-hooks";import{Fragment as Fragment48,useEffect as useEffect32,useState as useState78}from"react";import{jsx as jsx139,jsxs as jsxs88}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum41(),requestGroup=useResource15(props.value),[startedLoading,setStartedLoading]=useState78(!1),[responseBundle,setResponseBundle]=useState78();if(useEffect32(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx139(Grid2,{children:requestGroup.action?.map((action,index)=>{let task=action.resource&&findBundleEntry(action.resource),taskInput=task?.input?.[0]?.valueReference,taskOutput=task?.output?.[0]?.valueReference;return jsxs88(Fragment48,{children:[jsx139(Grid2.Col,{span:1,p:"md",children:task?.status==="completed"?jsx139(IconCheckbox,{}):jsx139(IconSquare,{color:"gray"})}),jsxs88(Grid2.Col,{span:9,p:"xs",children:[jsx139(Text30,{fw:500,children:action.title}),action.description&&jsx139("div",{children:action.description}),jsxs88("div",{children:["Last edited by\xA0",jsx139(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime6(task?.meta?.lastUpdated)]}),jsxs88("div",{children:["Status: ",jsx139(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs88(Grid2.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx139(Button16,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx139(Button16,{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{useMedplum as useMedplum42}from"@medplum/react-hooks";import{useEffect as useEffect33,useState as useState79}from"react";import{stringify as stringify4}from"@medplum/core";function diff(original,revised){let path=buildPath(original,revised);return buildRevisions(path,original,revised)}function buildPath(orig,rev){let N=orig.length,M=rev.length,MAX=N+M+1,size=1+2*MAX,middle=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 k=-d;k<=d;k+=2){let kmiddle=middle+k,kplus=kmiddle+1,kminus=kmiddle-1,kplusNode=diagonal[kplus],kminusNode=diagonal[kminus],prev,i=0;k===-d||k!==d&&kminusNode.i<kplusNode.i?(i=kplusNode.i,prev=kplusNode):(i=kminusNode.i+1,prev=kminusNode),diagonal[kminus]=void 0;let j=i-k,node={i,j,prev:previousSnake(prev),snake:!1};for(;i<N&&j<M&&orig[i]===rev[j];)i++,j++;if(i>node.i&&(node={i,j,prev:node,snake:!0}),diagonal[kmiddle]=node,i>=N&&j>=M)return diagonal[kmiddle]}diagonal[middle+d-1]=void 0}}function buildRevisions(startNode,orig,rev){let deltas=[],path=startNode;for(path.snake&&(path=path.prev);path?.prev&&path.prev.j>=0;){let i=path.i,j=path.j;path=path.prev;let ianchor=path.i,janchor=path.j,original={position:ianchor,lines:orig.slice(ianchor,i)},revised={position:janchor,lines:rev.slice(janchor,j)},type;original.lines.length===0&&revised.lines.length>0?type="insert":original.lines.length>0&&revised.lines.length===0?type="delete":type="change",deltas.push({original,revised,type}),path.snake&&(path=path.prev)}return deltas}function previousSnake(node){return node&&!node.snake&&node.prev?node.prev:node}function blame(history){let versions=(history.entry??[]).filter(entry=>!!entry.resource).map(entry=>({meta:entry.resource?.meta,lines:stringify4(entry.resource,!0).match(/[^\r\n]+/g)})).sort((a,b)=>a.meta.lastUpdated.localeCompare(b.meta.lastUpdated));if(!versions.length)return[];let table=versions[0].lines.map(line=>({id:versions[0].meta.versionId,meta:versions[0].meta,value:line,span:1}));return compareVersions(table,versions),combineSpans(table),table}function compareVersions(table,versions){for(let i=1;i<versions.length;i++){let revisions=diff(versions[i-1].lines,versions[i].lines);for(let revision of revisions){let position=revision.original.position,oldLines=revision.original.lines,newLines=revision.revised.lines;if((revision.type==="delete"||revision.type==="change")&&table.splice(position,oldLines.length),revision.type==="insert"||revision.type==="change")for(let k=0;k<revision.revised.lines.length;k++)table.splice(position+k,0,{id:versions[i].meta.versionId,meta:versions[i].meta,value:newLines[k],span:1})}}}function combineSpans(table){let start=0;for(;start<table.length;){let curr=start;for(;curr<table.length&&table[curr].id===table[start].id;)table[curr].span=-1,curr++;table[start].span=curr-start,start=curr}}var ResourceBlame_default={container:"ResourceBlame_container",root:"ResourceBlame_root",startRow:"ResourceBlame_startRow",normalRow:"ResourceBlame_normalRow",author:"ResourceBlame_author",dateTime:"ResourceBlame_dateTime",lineNumber:"ResourceBlame_lineNumber",line:"ResourceBlame_line",pre:"ResourceBlame_pre"};function getVersionUrl(resource,versionId){return`/${resource.resourceType}/${resource.id}/_history/${versionId}`}function getTimeString(lastUpdated){let seconds=Math.floor((Date.now()-Date.parse(lastUpdated))/1e3),years=Math.floor(seconds/31536e3);if(years>0)return pluralizeTime(years,"year");let months=Math.floor(seconds/2592e3);if(months>0)return pluralizeTime(months,"month");let days=Math.floor(seconds/86400);if(days>0)return pluralizeTime(days,"day");let hours=Math.floor(seconds/3600);if(hours>0)return pluralizeTime(hours,"hour");let minutes=Math.floor(seconds/60);return minutes>0?pluralizeTime(minutes,"minute"):pluralizeTime(seconds,"second")}function pluralizeTime(count,noun){return`${count} ${count===1?noun:noun+"s"} ago`}import{Fragment as Fragment49,jsx as jsx140,jsxs as jsxs89}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum42(),[value,setValue]=useState79(props.history);if(useEffect33(()=>{!props.history&&props.resourceType&&props.id&&medplum.readHistory(props.resourceType,props.id).then(setValue).catch(console.log)},[medplum,props.history,props.resourceType,props.id]),!value)return jsx140("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx140("div",{className:ResourceBlame_default.container,children:jsx140("table",{className:ResourceBlame_default.root,children:jsx140("tbody",{children:table.map((row,index)=>jsxs89("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs89(Fragment49,{children:[jsx140("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:jsx140(ResourceBadge,{value:row.meta.author,link:!0})}),jsx140("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx140(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),children:getTimeString(row.meta.lastUpdated)})})]}),jsx140("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx140("td",{className:ResourceBlame_default.line,children:jsx140("pre",{className:ResourceBlame_default.pre,children:row.value})})]},"row-"+index))})})})}import{stringify as stringify5}from"@medplum/core";var ResourceDiff_default={removed:"ResourceDiff_removed",added:"ResourceDiff_added"};import{Fragment as Fragment50,jsx as jsx141,jsxs as jsxs90}from"react/jsx-runtime";function ResourceDiff(props){let originalResource=props.original,revisedResource=props.revised;props.ignoreMeta&&(originalResource={...originalResource,meta:void 0},revisedResource={...revisedResource,meta:void 0});let original=stringify5(originalResource,!0).match(/[^\r\n]+/g),revised=stringify5(revisedResource,!0).match(/[^\r\n]+/g),deltas=diff(original,revised);return jsx141("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx141(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs90(Fragment50,{children:["...",jsx141("br",{}),props.delta.original.lines.length>0&&jsx141("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
|
|
72
|
+
`)}),props.delta.revised.lines.length>0&&jsx141("div",{className:ResourceDiff_default.added,children:props.delta.revised.lines.join(`
|
|
73
|
+
`)}),"...",jsx141("br",{})]})}import{ActionIcon as ActionIcon16,Alert as Alert5,Button as Button17,Group as Group57,Menu as Menu6,Stack as Stack29,TextInput as TextInput27,useMantineTheme}from"@mantine/core";import{AccessPolicyInteraction as AccessPolicyInteraction2,applyDefaultValuesToResource,canWriteResourceType,isPopulated as isPopulated12,satisfiedAccessPolicy as satisfiedAccessPolicy2,tryGetProfile as tryGetProfile5}from"@medplum/core";import{useMedplum as useMedplum43,useResource as useResource16}from"@medplum/react-hooks";import{useEffect as useEffect34,useMemo as useMemo30,useState as useState80}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx142,jsxs as jsxs91}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum43(),defaultValue2=useResource16(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState80(!1),[value,setValue]=useState80(),accessPolicy=medplum.getAccessPolicy(),theme=useMantineTheme();useEffect34(()=>{if(defaultValue2)if(props.profileUrl){let profileUrl=props.profileUrl;medplum.requestProfileSchema(props.profileUrl,{expandProfile:!0}).then(()=>{let profile=tryGetProfile5(profileUrl);if(profile){setSchemaLoaded(!0);let modifiedDefaultValue=applyDefaultValuesToResource(defaultValue2,profile);setValue(modifiedDefaultValue)}else console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)})}else medplum.requestSchema(resourceType).then(()=>{setValue(defaultValue2),setSchemaLoaded(!0)}).catch(console.log)},[medplum,defaultValue2,resourceType,props.profileUrl]);let accessPolicyResource=useMemo30(()=>defaultValue2&&satisfiedAccessPolicy2(defaultValue2,AccessPolicyInteraction2.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=useMemo30(()=>medplum.isSuperAdmin()||!accessPolicy||!isPopulated12(value?.resourceType)?!0:canWriteResourceType(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?jsx142("div",{children:"Loading..."}):canWrite?jsxs91("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs91(Stack29,{mb:"xl",children:[jsx142(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx142(TextInput27,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx142(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx142(TextInput27,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx142(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:resourceType,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl,accessPolicyResource}),jsxs91(Group57,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx142(Button17,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs91(Menu6,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx142(Menu6.Target,{children:jsx142(ActionIcon16,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx142(IconChevronDown,{size:14,stroke:1.5})})}),jsxs91(Menu6.Dropdown,{children:[props.onPatch&&jsx142(Menu6.Item,{leftSection:jsx142(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx142(Menu6.Item,{color:"red",leftSection:jsx142(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs91(Alert5,{color:"red",title:"Permission denied",icon:jsx142(IconAlertCircle,{}),children:["Your access level prevents you from editing and creating ",value.resourceType," resources."]})}import{Table as Table5}from"@mantine/core";import{formatDateTime as formatDateTime7,normalizeErrorString as normalizeErrorString11}from"@medplum/core";import{useMedplum as useMedplum44}from"@medplum/react-hooks";import{useEffect as useEffect35,useState as useState81}from"react";import{jsx as jsx143,jsxs as jsxs92}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum44(),[value,setValue]=useState81(props.history);return useEffect35(()=>{!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?jsxs92(Table5,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx143(Table5.Thead,{children:jsxs92(Table5.Tr,{children:[jsx143(Table5.Th,{children:"Author"}),jsx143(Table5.Th,{children:"Date"}),jsx143(Table5.Th,{children:"Version"})]})}),jsx143(Table5.Tbody,{children:value.entry?.map((entry,index)=>jsx143(HistoryRow,{entry},"entry-"+index))})]}):jsx143("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs92(Table5.Tr,{children:[jsx143(Table5.Td,{children:jsx143(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx143(Table5.Td,{children:formatDateTime7(resource.meta?.lastUpdated)}),jsx143(Table5.Td,{children:jsx143(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx143(Table5.Tr,{children:jsx143(Table5.Td,{colSpan:3,children:normalizeErrorString11(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button18,Stack as Stack30,Text as Text31}from"@mantine/core";import{getReferenceString as getReferenceString11,isReference as isReference3}from"@medplum/core";import{useResource as useResource17,useSearchResources}from"@medplum/react-hooks";import{useState as useState82}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx144,jsxs as jsxs93}from"react/jsx-runtime";function Scheduler(props){let schedule=useResource17(props.schedule),questionnaire=useResource17(props.questionnaire),[month,setMonth]=useState82(getStartMonth()),[date,setDate]=useState82(),[slot,setSlot]=useState82(),[response,setResponse]=useState82(),[slots]=useSearchResources("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 jsxs93("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs93("div",{className:Scheduler_default.info,children:[actor&&jsx144(ResourceAvatar,{value:actor,size:"xl"}),actor&&jsx144(Text31,{size:"xl",fw:500,children:jsx144(ResourceName,{value:actor})}),jsx144("p",{children:"1 hour"}),date&&jsx144("p",{children:date.toLocaleDateString()}),slot&&jsx144("p",{children:formatTime(new Date(slot.start))})]}),jsxs93("div",{className:Scheduler_default.selection,children:[!date&&jsxs93("div",{children:[jsx144("h3",{children:"Select date"}),jsx144(CalendarInput,{slots,onChangeMonth:setMonth,onClick:setDate})]}),date&&!slot&&jsxs93("div",{children:[jsx144("h3",{children:"Select time"}),jsx144(Stack30,{children:slots.map(s=>{let slotStart=new Date(s.start);return slotStart.getTime()>date.getTime()&&slotStart.getTime()<date.getTime()+24*3600*1e3&&jsx144("div",{children:jsx144(Button18,{variant:"outline",style:{width:150},onClick:()=>setSlot(s),children:formatTime(slotStart)})},s.id)})})]}),date&&slot&&!response&&jsx144(QuestionnaireForm,{questionnaire,submitButtonText:"Next",onSubmit:setResponse}),date&&slot&&response&&jsxs93("div",{children:[jsx144("h3",{children:"You're all set!"}),jsx144("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 createReference14}from"@medplum/core";import{jsx as jsx145}from"react/jsx-runtime";function ServiceRequestTimeline(props){let{serviceRequest,...rest}=props;return jsx145(ResourceTimeline,{value:serviceRequest,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("ServiceRequest",id),medplum.search("Communication",{"based-on":ref,_count}),medplum.search("DiagnosticReport",{"based-on":ref,_count}),medplum.search("Media",{"based-on":ref,_count}),medplum.search("DocumentReference",{related:ref,_count}),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count})])},createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",basedOn:[createReference14(resource)],subject:resource.subject,sender:createReference14(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference14(resource)],subject:resource.subject,operator:createReference14(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor10}from"@mantine/core";import{showNotification as showNotification8}from"@mantine/notifications";import{ensureTrailingSlash,normalizeErrorString as normalizeErrorString12}from"@medplum/core";import{useMedplum as useMedplum45}from"@medplum/react-hooks";import{jsx as jsx146}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum45(),{client,patient,encounter,children,...rest}=props;function launchApp(){medplum.createResource({resourceType:"SmartAppLaunch",patient,encounter}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",ensureTrailingSlash(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),window.location.assign(url.toString())}).catch(err=>showNotification8({color:"red",message:normalizeErrorString12(err),autoClose:!1}))}return jsx146(Anchor10,{onClick:()=>launchApp(),...rest,children})}export{AddressDisplay,AddressInput,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,CalendarInput,ChatModal,CheckboxFormSection,CodeInput,CodeableConceptDisplay,CodeableConceptInput,CodingDisplay,CodingInput,ContactDetailDisplay,ContactDetailInput,ContactPointDisplay,ContactPointInput,Container,DateTimeInput,DefaultResourceTimeline,DescriptionList,DescriptionListEntry,DiagnosticReportDisplay,Document,ElementDefinitionInputSelector,ElementDefinitionTypeInput,EncounterTimeline,ErrorBoundary,FhirPathTable,Form,FormSection,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,InfoBar,Loading,Logo,MeasureReportDisplay,MedplumLink,MemoizedFhirPathTable,MemoizedSearchControl,MoneyDisplay,MoneyInput,Navbar,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,Panel,PatientExportForm,PatientHeader,PatientSummary,PatientTimeline,PlanDefinitionBuilder,QuantityDisplay,QuantityInput,QuestionnaireBuilder,QuestionnaireForm,QuestionnaireFormContext,QuestionnaireItemType,RangeDisplay,RangeInput,RatioInput,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,SubmitButton,ThreadChat,Timeline,TimelineItem,TimingInput,ValueSetAutocomplete,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNext24HoursFilter,addNextMonthFilter,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,buildInitialResponse,buildInitialResponseItem,clearFilters,clearFiltersOnField,convertIsoToLocal,convertLocalToIso,createScriptTag,deleteFilter,evaluateCalculatedExpressionsInQuestionnaire,exportJsonFile,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getItemAnswerOptionValue,getItemEnableWhenValueAnswer,getItemInitialValue,getNewMultiSelectValues,getNumberOfPages,getOpString,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,getRecaptcha,getResponseItemAnswerValue,getSearchOperators,getSortField,getValuePath,initRecaptcha,isAuxClick,isCheckboxCell,isChoiceQuestion,isQuestionEnabled,isSortDescending,isSupportedProfileStructureDefinition,killEvent,mergeUpdatedItems,parseForm,renderValue,sendCommand,setFilters,setOffset,setPage,setPropertyValue,setQuestionnaireItemReferenceTargetTypes,setSort,sortByDateAndPriority,toggleSort,typedValueToResponseItem};
|
|
74
74
|
/*! Bundled license information:
|
|
75
75
|
|
|
76
76
|
@tabler/icons-react/dist/esm/defaultAttributes.mjs:
|
|
@@ -80,16 +80,19 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
|
|
|
80
80
|
@tabler/icons-react/dist/esm/icons/IconArrowDown.mjs:
|
|
81
81
|
@tabler/icons-react/dist/esm/icons/IconArrowRight.mjs:
|
|
82
82
|
@tabler/icons-react/dist/esm/icons/IconArrowUp.mjs:
|
|
83
|
+
@tabler/icons-react/dist/esm/icons/IconBinaryTree.mjs:
|
|
83
84
|
@tabler/icons-react/dist/esm/icons/IconBleachOff.mjs:
|
|
84
85
|
@tabler/icons-react/dist/esm/icons/IconBleach.mjs:
|
|
85
86
|
@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs:
|
|
86
87
|
@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs:
|
|
87
88
|
@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs:
|
|
88
89
|
@tabler/icons-react/dist/esm/icons/IconBucket.mjs:
|
|
90
|
+
@tabler/icons-react/dist/esm/icons/IconCake.mjs:
|
|
89
91
|
@tabler/icons-react/dist/esm/icons/IconCalendar.mjs:
|
|
90
92
|
@tabler/icons-react/dist/esm/icons/IconCheck.mjs:
|
|
91
93
|
@tabler/icons-react/dist/esm/icons/IconCheckbox.mjs:
|
|
92
94
|
@tabler/icons-react/dist/esm/icons/IconChevronDown.mjs:
|
|
95
|
+
@tabler/icons-react/dist/esm/icons/IconChevronRight.mjs:
|
|
93
96
|
@tabler/icons-react/dist/esm/icons/IconChevronUp.mjs:
|
|
94
97
|
@tabler/icons-react/dist/esm/icons/IconCircleMinus.mjs:
|
|
95
98
|
@tabler/icons-react/dist/esm/icons/IconCirclePlus.mjs:
|
|
@@ -99,18 +102,17 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
|
|
|
99
102
|
@tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs:
|
|
100
103
|
@tabler/icons-react/dist/esm/icons/IconDots.mjs:
|
|
101
104
|
@tabler/icons-react/dist/esm/icons/IconEdit.mjs:
|
|
105
|
+
@tabler/icons-react/dist/esm/icons/IconEmpathize.mjs:
|
|
102
106
|
@tabler/icons-react/dist/esm/icons/IconEqualNot.mjs:
|
|
103
107
|
@tabler/icons-react/dist/esm/icons/IconEqual.mjs:
|
|
104
108
|
@tabler/icons-react/dist/esm/icons/IconFileAlert.mjs:
|
|
105
109
|
@tabler/icons-react/dist/esm/icons/IconFilePlus.mjs:
|
|
106
110
|
@tabler/icons-react/dist/esm/icons/IconFilter.mjs:
|
|
107
|
-
@tabler/icons-react/dist/esm/icons/IconGenderFemale.mjs:
|
|
108
|
-
@tabler/icons-react/dist/esm/icons/IconGenderMale.mjs:
|
|
109
111
|
@tabler/icons-react/dist/esm/icons/IconLogout.mjs:
|
|
112
|
+
@tabler/icons-react/dist/esm/icons/IconMapPin.mjs:
|
|
110
113
|
@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs:
|
|
111
114
|
@tabler/icons-react/dist/esm/icons/IconMathLower.mjs:
|
|
112
115
|
@tabler/icons-react/dist/esm/icons/IconMessage.mjs:
|
|
113
|
-
@tabler/icons-react/dist/esm/icons/IconPencil.mjs:
|
|
114
116
|
@tabler/icons-react/dist/esm/icons/IconPlus.mjs:
|
|
115
117
|
@tabler/icons-react/dist/esm/icons/IconRefresh.mjs:
|
|
116
118
|
@tabler/icons-react/dist/esm/icons/IconSearch.mjs:
|
|
@@ -122,7 +124,6 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
|
|
|
122
124
|
@tabler/icons-react/dist/esm/icons/IconSwitchHorizontal.mjs:
|
|
123
125
|
@tabler/icons-react/dist/esm/icons/IconTableExport.mjs:
|
|
124
126
|
@tabler/icons-react/dist/esm/icons/IconTrash.mjs:
|
|
125
|
-
@tabler/icons-react/dist/esm/icons/IconUserSquare.mjs:
|
|
126
127
|
@tabler/icons-react/dist/esm/icons/IconX.mjs:
|
|
127
128
|
@tabler/icons-react/dist/esm/tabler-icons-react.mjs:
|
|
128
129
|
(**
|