@medplum/react 5.1.0 → 5.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value;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 __publicField=(obj,key,value)=>__defNormalProp(obj,typeof key!="symbol"?key+"":key,value);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{trimTrailingEmptyElements}from"@medplum/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:trimTrailingEmptyElements(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{useMedplum as useMedplum5,useMedplumProfile as useMedplumProfile4}from"@medplum/react-hooks";import{Suspense,useState as useState11}from"react";import{Alert}from"@mantine/core";import{locationUtils,normalizeErrorString}from"@medplum/core";import{forwardRef,createElement}from"react";var defaultAttributes={outline:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},filled:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"currentColor",stroke:"none"}};var createReactComponent=(type,iconName,iconNamePascal,iconNode)=>{let Component2=forwardRef(({color="currentColor",size=24,stroke=2,title,className,children,...rest},ref)=>createElement("svg",{ref,...defaultAttributes[type],width:size,height:size,className:["tabler-icon",`tabler-icon-${iconName}`,className].join(" "),...type==="filled"?{fill:color}:{strokeWidth:stroke,stroke:color},...rest},[title&&createElement("title",{key:"svg-title"},title),...iconNode.map(([tag,attrs])=>createElement(tag,attrs)),...Array.isArray(children)?children:[children]]));return Component2.displayName=`${iconNamePascal}`,Component2};var __iconNode=[["path",{d:"M12 6a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-0"}],["path",{d:"M4 6l8 0",key:"svg-1"}],["path",{d:"M16 6l4 0",key:"svg-2"}],["path",{d:"M6 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-3"}],["path",{d:"M4 12l2 0",key:"svg-4"}],["path",{d:"M10 12l10 0",key:"svg-5"}],["path",{d:"M15 18a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-6"}],["path",{d:"M4 18l11 0",key:"svg-7"}],["path",{d:"M19 18l1 0",key:"svg-8"}]],IconAdjustmentsHorizontal=createReactComponent("outline","adjustments-horizontal","AdjustmentsHorizontal",__iconNode);var __iconNode2=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M12 8v4",key:"svg-1"}],["path",{d:"M12 16h.01",key:"svg-2"}]],IconAlertCircle=createReactComponent("outline","alert-circle","AlertCircle",__iconNode2);var __iconNode3=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M18 13l-6 6",key:"svg-1"}],["path",{d:"M6 13l6 6",key:"svg-2"}]],IconArrowDown=createReactComponent("outline","arrow-down","ArrowDown",__iconNode3);var __iconNode4=[["path",{d:"M5 12l14 0",key:"svg-0"}],["path",{d:"M13 18l6 -6",key:"svg-1"}],["path",{d:"M13 6l6 6",key:"svg-2"}]],IconArrowRight=createReactComponent("outline","arrow-right","ArrowRight",__iconNode4);var __iconNode5=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M18 11l-6 -6",key:"svg-1"}],["path",{d:"M6 11l6 -6",key:"svg-2"}]],IconArrowUp=createReactComponent("outline","arrow-up","ArrowUp",__iconNode5);var __iconNode6=[["path",{d:"M6 20a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-0"}],["path",{d:"M16 4a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-1"}],["path",{d:"M16 20a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-2"}],["path",{d:"M11 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-3"}],["path",{d:"M21 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-4"}],["path",{d:"M5.058 18.306l2.88 -4.606",key:"svg-5"}],["path",{d:"M10.061 10.303l2.877 -4.604",key:"svg-6"}],["path",{d:"M10.065 13.705l2.876 4.6",key:"svg-7"}],["path",{d:"M15.063 5.7l2.881 4.61",key:"svg-8"}]],IconBinaryTree=createReactComponent("outline","binary-tree","BinaryTree",__iconNode6);var __iconNode7=[["path",{d:"M5 19h14m1.986 -1.977a2 2 0 0 0 -.146 -.773l-7.1 -12.25a2 2 0 0 0 -3.5 0l-.815 1.405m-1.488 2.568l-4.797 8.277a2 2 0 0 0 1.75 2.75",key:"svg-0"}],["path",{d:"M3 3l18 18",key:"svg-1"}]],IconBleachOff=createReactComponent("outline","bleach-off","BleachOff",__iconNode7);var __iconNode8=[["path",{d:"M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75",key:"svg-0"}]],IconBleach=createReactComponent("outline","bleach","Bleach",__iconNode8);var __iconNode9=[["path",{d:"M18 7v14l-6 -4l-6 4v-14a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4",key:"svg-0"}]],IconBookmark=createReactComponent("outline","bookmark","Bookmark",__iconNode9);var __iconNode10=[["path",{d:"M7 5a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2l0 -10",key:"svg-0"}],["path",{d:"M17 17v2a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2",key:"svg-1"}]],IconBoxMultiple=createReactComponent("outline","box-multiple","BoxMultiple",__iconNode10);var __iconNode11=[["path",{d:"M7 4h-4v16h4",key:"svg-0"}],["path",{d:"M17 4h4v16h-4",key:"svg-1"}],["path",{d:"M8 16h.01",key:"svg-2"}],["path",{d:"M12 16h.01",key:"svg-3"}],["path",{d:"M16 16h.01",key:"svg-4"}]],IconBracketsContain=createReactComponent("outline","brackets-contain","BracketsContain",__iconNode11);var __iconNode12=[["path",{d:"M3 9a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v9a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2l0 -9",key:"svg-0"}],["path",{d:"M8 7v-2a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v2",key:"svg-1"}],["path",{d:"M12 12l0 .01",key:"svg-2"}],["path",{d:"M3 13a20 20 0 0 0 18 0",key:"svg-3"}]],IconBriefcase=createReactComponent("outline","briefcase","Briefcase",__iconNode12);var __iconNode13=[["path",{d:"M5.029 5.036c-.655 .58 -1.029 1.25 -1.029 1.964c0 2.033 3.033 3.712 6.96 3.967m3.788 -.21c3.064 -.559 5.252 -2.029 5.252 -3.757c0 -2.21 -3.582 -4 -8 -4c-1.605 0 -3.1 .236 -4.352 .643",key:"svg-0"}],["path",{d:"M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.1 -.3 .252 -.812 .457 -1.535m.862 -3.146c.262 -.975 .735 -2.76 1.418 -5.354a7.45 7.45 0 0 0 .263 -1.965",key:"svg-1"}],["path",{d:"M3 3l18 18",key:"svg-2"}]],IconBucketOff=createReactComponent("outline","bucket-off","BucketOff",__iconNode13);var __iconNode14=[["path",{d:"M4 7a8 4 0 1 0 16 0a8 4 0 1 0 -16 0",key:"svg-0"}],["path",{d:"M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.333 -1 1.246 -4.345 2.737 -10.035a7.45 7.45 0 0 0 .263 -1.965",key:"svg-1"}]],IconBucket=createReactComponent("outline","bucket","Bucket",__iconNode14);var __iconNode15=[["path",{d:"M3 20h18v-8a3 3 0 0 0 -3 -3h-12a3 3 0 0 0 -3 3v8",key:"svg-0"}],["path",{d:"M3 14.803c.312 .135 .654 .204 1 .197a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1c.35 .007 .692 -.062 1 -.197",key:"svg-1"}],["path",{d:"M12 4l1.465 1.638a2 2 0 1 1 -3.015 .099l1.55 -1.737",key:"svg-2"}]],IconCake=createReactComponent("outline","cake","Cake",__iconNode15);var __iconNode16=[["path",{d:"M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12",key:"svg-0"}],["path",{d:"M16 3v4",key:"svg-1"}],["path",{d:"M8 3v4",key:"svg-2"}],["path",{d:"M4 11h16",key:"svg-3"}],["path",{d:"M11 15h1",key:"svg-4"}],["path",{d:"M12 15v3",key:"svg-5"}]],IconCalendar=createReactComponent("outline","calendar","Calendar",__iconNode16);var __iconNode17=[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]],IconCheck=createReactComponent("outline","check","Check",__iconNode17);var __iconNode18=[["path",{d:"M9 11l3 3l8 -8",key:"svg-0"}],["path",{d:"M20 12v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h9",key:"svg-1"}]],IconCheckbox=createReactComponent("outline","checkbox","Checkbox",__iconNode18);var __iconNode19=[["path",{d:"M6 9l6 6l6 -6",key:"svg-0"}]],IconChevronDown=createReactComponent("outline","chevron-down","ChevronDown",__iconNode19);var __iconNode20=[["path",{d:"M9 6l6 6l-6 6",key:"svg-0"}]],IconChevronRight=createReactComponent("outline","chevron-right","ChevronRight",__iconNode20);var __iconNode21=[["path",{d:"M6 15l6 -6l6 6",key:"svg-0"}]],IconChevronUp=createReactComponent("outline","chevron-up","ChevronUp",__iconNode21);var __iconNode22=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M9 12l6 0",key:"svg-1"}]],IconCircleMinus=createReactComponent("outline","circle-minus","CircleMinus",__iconNode22);var __iconNode23=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M9 12h6",key:"svg-1"}],["path",{d:"M12 9v6",key:"svg-2"}]],IconCirclePlus=createReactComponent("outline","circle-plus","CirclePlus",__iconNode23);var __iconNode24=[["path",{d:"M7 18a4.6 4.4 0 0 1 0 -9a5 4.5 0 0 1 11 2h1a3.5 3.5 0 0 1 0 7h-1",key:"svg-0"}],["path",{d:"M9 15l3 -3l3 3",key:"svg-1"}],["path",{d:"M12 12l0 9",key:"svg-2"}]],IconCloudUpload=createReactComponent("outline","cloud-upload","CloudUpload",__iconNode24);var __iconNode25=[["path",{d:"M4 6l5.5 0",key:"svg-0"}],["path",{d:"M4 10l5.5 0",key:"svg-1"}],["path",{d:"M4 14l5.5 0",key:"svg-2"}],["path",{d:"M4 18l5.5 0",key:"svg-3"}],["path",{d:"M14.5 6l5.5 0",key:"svg-4"}],["path",{d:"M14.5 10l5.5 0",key:"svg-5"}],["path",{d:"M14.5 14l5.5 0",key:"svg-6"}],["path",{d:"M14.5 18l5.5 0",key:"svg-7"}]],IconColumns=createReactComponent("outline","columns","Columns",__iconNode25);var __iconNode26=[["path",{d:"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666",key:"svg-0"}],["path",{d:"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1",key:"svg-1"}]],IconCopy=createReactComponent("outline","copy","Copy",__iconNode26);var __iconNode27=[["path",{d:"M16.7 8a3 3 0 0 0 -2.7 -2h-4a3 3 0 0 0 0 6h4a3 3 0 0 1 0 6h-4a3 3 0 0 1 -2.7 -2",key:"svg-0"}],["path",{d:"M12 3v3m0 12v3",key:"svg-1"}]],IconCurrencyDollar=createReactComponent("outline","currency-dollar","CurrencyDollar",__iconNode27);var __iconNode28=[["path",{d:"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}]],IconDots=createReactComponent("outline","dots","Dots",__iconNode28);var __iconNode29=[["path",{d:"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1",key:"svg-0"}],["path",{d:"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]],IconEdit=createReactComponent("outline","edit","Edit",__iconNode29);var __iconNode30=[["path",{d:"M9.5 5.5a2.5 2.5 0 1 0 5 0a2.5 2.5 0 1 0 -5 0",key:"svg-0"}],["path",{d:"M12 21.368l5.095 -5.096a3.088 3.088 0 1 0 -4.367 -4.367l-.728 .727l-.728 -.727a3.088 3.088 0 1 0 -4.367 4.367l5.095 5.096",key:"svg-1"}]],IconEmpathize=createReactComponent("outline","empathize","Empathize",__iconNode30);var __iconNode31=[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}],["path",{d:"M5 19l14 -14",key:"svg-2"}]],IconEqualNot=createReactComponent("outline","equal-not","EqualNot",__iconNode31);var __iconNode32=[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}]],IconEqual=createReactComponent("outline","equal","Equal",__iconNode32);var __iconNode33=[["path",{d:"M10.585 10.587a2 2 0 0 0 2.829 2.828",key:"svg-0"}],["path",{d:"M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87",key:"svg-1"}],["path",{d:"M3 3l18 18",key:"svg-2"}]],IconEyeOff=createReactComponent("outline","eye-off","EyeOff",__iconNode33);var __iconNode34=[["path",{d:"M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-0"}],["path",{d:"M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6",key:"svg-1"}]],IconEye=createReactComponent("outline","eye","Eye",__iconNode34);var __iconNode35=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2",key:"svg-1"}],["path",{d:"M12 17l.01 0",key:"svg-2"}],["path",{d:"M12 11l0 3",key:"svg-3"}]],IconFileAlert=createReactComponent("outline","file-alert","FileAlert",__iconNode35);var __iconNode36=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2",key:"svg-1"}],["path",{d:"M12 11l0 6",key:"svg-2"}],["path",{d:"M9 14l6 0",key:"svg-3"}]],IconFilePlus=createReactComponent("outline","file-plus","FilePlus",__iconNode36);var __iconNode37=[["path",{d:"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227",key:"svg-0"}]],IconFilter=createReactComponent("outline","filter","Filter",__iconNode37);var __iconNode38=[["path",{d:"M9 6.371c0 4.418 -2.239 6.629 -5 6.629",key:"svg-0"}],["path",{d:"M4 6.371h7",key:"svg-1"}],["path",{d:"M5 9c0 2.144 2.252 3.908 6 4",key:"svg-2"}],["path",{d:"M12 20l4 -9l4 9",key:"svg-3"}],["path",{d:"M19.1 18h-6.2",key:"svg-4"}],["path",{d:"M6.694 3l.793 .582",key:"svg-5"}]],IconLanguage=createReactComponent("outline","language","Language",__iconNode38);var __iconNode39=[["path",{d:"M4 6a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12",key:"svg-0"}],["path",{d:"M9 4l0 16",key:"svg-1"}]],IconLayoutSidebar=createReactComponent("outline","layout-sidebar","LayoutSidebar",__iconNode39);var __iconNode40=[["path",{d:"M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2",key:"svg-0"}],["path",{d:"M9 12h12l-3 -3",key:"svg-1"}],["path",{d:"M18 15l3 -3",key:"svg-2"}]],IconLogout=createReactComponent("outline","logout","Logout",__iconNode40);var __iconNode41=[["path",{d:"M9 11a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-0"}],["path",{d:"M17.657 16.657l-4.243 4.243a2 2 0 0 1 -2.827 0l-4.244 -4.243a8 8 0 1 1 11.314 0",key:"svg-1"}]],IconMapPin=createReactComponent("outline","map-pin","MapPin",__iconNode41);var __iconNode42=[["path",{d:"M5 18l14 -6l-14 -6",key:"svg-0"}]],IconMathGreater=createReactComponent("outline","math-greater","MathGreater",__iconNode42);var __iconNode43=[["path",{d:"M19 18l-14 -6l14 -6",key:"svg-0"}]],IconMathLower=createReactComponent("outline","math-lower","MathLower",__iconNode43);var __iconNode44=[["path",{d:"M3 20l1.3 -3.9c-2.324 -3.437 -1.426 -7.872 2.1 -10.374c3.526 -2.501 8.59 -2.296 11.845 .48c3.255 2.777 3.695 7.266 1.029 10.501c-2.666 3.235 -7.615 4.215 -11.574 2.293l-4.7 1",key:"svg-0"}]],IconMessageCircle=createReactComponent("outline","message-circle","MessageCircle",__iconNode44);var __iconNode45=[["path",{d:"M8 9h8",key:"svg-0"}],["path",{d:"M8 13h6",key:"svg-1"}],["path",{d:"M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12",key:"svg-2"}]],IconMessage=createReactComponent("outline","message","Message",__iconNode45);var __iconNode46=[["path",{d:"M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4",key:"svg-0"}],["path",{d:"M13.5 6.5l4 4",key:"svg-1"}]],IconPencil=createReactComponent("outline","pencil","Pencil",__iconNode46);var __iconNode47=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]],IconPlus=createReactComponent("outline","plus","Plus",__iconNode47);var __iconNode48=[["path",{d:"M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4",key:"svg-0"}],["path",{d:"M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4",key:"svg-1"}]],IconRefresh=createReactComponent("outline","refresh","Refresh",__iconNode48);var __iconNode49=[["path",{d:"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]],IconSearch=createReactComponent("outline","search","Search",__iconNode49);var __iconNode50=[["path",{d:"M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065",key:"svg-0"}],["path",{d:"M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-1"}]],IconSettings=createReactComponent("outline","settings","Settings",__iconNode50);var __iconNode51=[["path",{d:"M4 6l7 0",key:"svg-0"}],["path",{d:"M4 12l7 0",key:"svg-1"}],["path",{d:"M4 18l9 0",key:"svg-2"}],["path",{d:"M15 9l3 -3l3 3",key:"svg-3"}],["path",{d:"M18 6l0 12",key:"svg-4"}]],IconSortAscending=createReactComponent("outline","sort-ascending","SortAscending",__iconNode51);var __iconNode52=[["path",{d:"M4 6l9 0",key:"svg-0"}],["path",{d:"M4 12l7 0",key:"svg-1"}],["path",{d:"M4 18l7 0",key:"svg-2"}],["path",{d:"M15 15l3 3l3 -3",key:"svg-3"}],["path",{d:"M18 6l0 12",key:"svg-4"}]],IconSortDescending=createReactComponent("outline","sort-descending","SortDescending",__iconNode52);var __iconNode53=[["path",{d:"M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14",key:"svg-0"}]],IconSquare=createReactComponent("outline","square","Square",__iconNode53);var __iconNode54=[["path",{d:"M6 4h-1a2 2 0 0 0 -2 2v3.5a5.5 5.5 0 0 0 11 0v-3.5a2 2 0 0 0 -2 -2h-1",key:"svg-0"}],["path",{d:"M8 15a6 6 0 1 0 12 0v-3",key:"svg-1"}],["path",{d:"M11 3v2",key:"svg-2"}],["path",{d:"M6 3v2",key:"svg-3"}],["path",{d:"M18 10a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-4"}]],IconStethoscope=createReactComponent("outline","stethoscope","Stethoscope",__iconNode54);var __iconNode55=[["path",{d:"M16 3l4 4l-4 4",key:"svg-0"}],["path",{d:"M10 7l10 0",key:"svg-1"}],["path",{d:"M8 13l-4 4l4 4",key:"svg-2"}],["path",{d:"M4 17l9 0",key:"svg-3"}]],IconSwitchHorizontal=createReactComponent("outline","switch-horizontal","SwitchHorizontal",__iconNode55);var __iconNode56=[["path",{d:"M12.5 21h-7.5a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v7.5",key:"svg-0"}],["path",{d:"M3 10h18",key:"svg-1"}],["path",{d:"M10 3v18",key:"svg-2"}],["path",{d:"M16 19h6",key:"svg-3"}],["path",{d:"M19 16l3 3l-3 3",key:"svg-4"}]],IconTableExport=createReactComponent("outline","table-export","TableExport",__iconNode56);var __iconNode57=[["path",{d:"M4 7l16 0",key:"svg-0"}],["path",{d:"M10 11l0 6",key:"svg-1"}],["path",{d:"M14 11l0 6",key:"svg-2"}],["path",{d:"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12",key:"svg-3"}],["path",{d:"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3",key:"svg-4"}]],IconTrash=createReactComponent("outline","trash","Trash",__iconNode57);var __iconNode58=[["path",{d:"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0",key:"svg-0"}],["path",{d:"M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2",key:"svg-1"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"svg-2"}],["path",{d:"M21 21v-2a4 4 0 0 0 -3 -3.85",key:"svg-3"}]],IconUsers=createReactComponent("outline","users","Users",__iconNode58);var __iconNode59=[["path",{d:"M18 6l-12 12",key:"svg-0"}],["path",{d:"M6 6l12 12",key:"svg-1"}]],IconX=createReactComponent("outline","x","X",__iconNode59);import{Component}from"react";import{jsx as jsx4}from"react/jsx-runtime";var ErrorBoundary=class extends Component{constructor(props){super(props);__publicField(this,"state");this.state={lastLocation:locationUtils.getLocation()}}static getDerivedStateFromError(error){return{error,lastLocation:locationUtils.getLocation()}}componentDidUpdate(_prevProps,_prevState){locationUtils.getLocation()!==this.state.lastLocation&&this.setState({lastLocation:locationUtils.getLocation(),error:void 0})}shouldComponentUpdate(nextProps,nextState){return!!(this.props.children!==nextProps.children||nextState.error&&!this.state.error||this.state.lastLocation!==locationUtils.getLocation())}componentDidCatch(error,errorInfo){console.error("Uncaught error:",error,errorInfo)}render(){return this.state.error?jsx4(Alert,{icon:jsx4(IconAlertCircle,{size:16}),title:"Something went wrong",color:"red",children:normalizeErrorString(this.state.error)}):this.props.children}};import{Center,Loader}from"@mantine/core";import{jsx as jsx5}from"react/jsx-runtime";function Loading(){return jsx5(Center,{style:{width:"100%",height:"100vh"},children:jsx5(Loader,{})})}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";import{useState as useState5}from"react";import{Avatar}from"@mantine/core";import{getDisplayString,getImageSrc}from"@medplum/core";import{useCachedBinaryUrl,useResource}from"@medplum/react-hooks";import{Anchor}from"@mantine/core";import{isReference,isResource}from"@medplum/core";import{useMedplumNavigate}from"@medplum/react-hooks";import{ContentType}from"@medplum/core";function killEvent(e){e.preventDefault(),e.stopPropagation()}function isAuxClick(e){return e.button===1||e.ctrlKey||e.metaKey}function isCheckboxCell(el){if(isCheckboxElement(el))return!0;if(el instanceof HTMLTableCellElement){let children=el.children;if(children.length===1&&isCheckboxElement(children[0]))return!0}return!1}function isCheckboxElement(el){return el instanceof HTMLInputElement&&el.type==="checkbox"}async function sendCommand(frame,command){return new Promise((resolve,reject)=>{let channel=new MessageChannel;channel.port1.onmessage=({data:data2})=>{channel.port1.close(),data2.error?reject(data2.error):resolve(data2.result)},frame.contentWindow?.postMessage(command,new URL(frame.src).origin,[channel.port2])})}function exportJsonFile(jsonString,fileName){let blobForExport=new Blob([jsonString],{type:ContentType.JSON}),url=URL.createObjectURL(blobForExport),link=document.createElement("a");link.href=url;let linkName=fileName??new Date().toISOString().replaceAll(/\D/g,"");link.download=`${linkName}.json`,document.body.appendChild(link),link.click(),URL.revokeObjectURL(url)}import{jsx as 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.at(-1)?.at(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"};import{Avatar as Avatar2,Group as Group2,Menu,SegmentedControl,Stack,Text,useMantineColorScheme}from"@mantine/core";import{getReferenceString,locationUtils as locationUtils2}from"@medplum/core";import{useMedplumContext}from"@medplum/react-hooks";import{useState as useState3}from"react";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}function getAppName(){return import.meta.env.MEDPLUM_APP_NAME||"Medplum"}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(),[layoutVersion]=useState3(localStorage.appShellLayoutVersion??"v1"),showLayoutToggle=props.showLayoutVersionToggle??!0;function setAppShellVersion(version){localStorage.appShellLayoutVersion=version,locationUtils2.reload()}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(()=>locationUtils2.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(Menu.Item,{leftSection:jsx9(IconSwitchHorizontal,{size:14,stroke:1.5}),onClick:()=>navigate("/signin"),children:"Switch to another project"}),jsx9(Menu.Divider,{}),jsxs2(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"}]}),showLayoutToggle&&jsx9(SegmentedControl,{size:"xs",value:layoutVersion,onChange:newValue=>setAppShellVersion(newValue),data:[{label:"v1",value:"v1"},{label:"v2",value:"v2"}]})]}),jsx9(Menu.Divider,{}),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"}),jsxs2(Text,{size:"xs",c:"dimmed",my:"sm",ta:"center",children:[getAppName()," ",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 useState4}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]=useState4(""),[timer,setTimer]=useState4(),[abortController,setAbortController]=useState4(),[autoSubmit,setAutoSubmit]=useState4(),[selected,setSelected]=useState4(defaultItems.map(toOption4)),[options,setOptions]=useState4([]),ItemComponent3=itemComponent??DefaultItemComponent,PillComponent=pillComponent??DefaultPillComponent,EmptyComponent=emptyComponent??DefaultEmptyComponent,searchRef=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 __defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value;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 __publicField=(obj,key,value)=>__defNormalProp(obj,typeof key!="symbol"?key+"":key,value);var require_pointer=__commonJS({"../../node_modules/rfc6902/pointer.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.Pointer=void 0;exports.unescapeToken=unescapeToken;exports.escapeToken=escapeToken;function unescapeToken(token){return token.replace(/~1/g,"/").replace(/~0/g,"~")}function escapeToken(token){return token.replace(/~/g,"~0").replace(/\//g,"~1")}var Pointer=(function(){function Pointer2(tokens){tokens===void 0&&(tokens=[""]),this.tokens=tokens}return Pointer2.fromJSON=function(path){var tokens=path.split("/").map(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.prototype.parent=function(){var tokens=this.tokens.length>1?this.tokens.slice(0,-1):[""];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.hasOwnProperty=void 0;exports.objectType=objectType;exports.clone=clone;exports.hasOwnProperty=Object.prototype.hasOwnProperty;function objectType(object){return object===void 0?"undefined":object===null?"null":Array.isArray(object)?"array":typeof object}function isNonPrimitive(value){return value!=null&&typeof value=="object"}function clone(source){if(!isNonPrimitive(source))return source;if(source.constructor==Array){for(var length=source.length,arrayTarget=new Array(length),i=0;i<length;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}}});var require_diff=__commonJS({"../../node_modules/rfc6902/diff.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.isDestructive=isDestructive;exports.subtract=subtract;exports.intersection=intersection;exports.diffArrays=diffArrays;exports.diffObjects=diffObjects;exports.diffAny=diffAny;var util_1=require_util();function isDestructive(_a){var op=_a.op;return op==="remove"||op==="replace"||op==="copy"||op==="move"}function subtract(minuend,subtrahend){var keys=[];for(var key in minuend)util_1.hasOwnProperty.call(minuend,key)&&minuend[key]!==void 0&&!(util_1.hasOwnProperty.call(subtrahend,key)&&subtrahend[key]!==void 0)&&keys.push(key);return keys}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)}function intersection2(a,b){var keys=[];for(var key in a)util_1.hasOwnProperty.call(a,key)&&a[key]!==void 0&&util_1.hasOwnProperty.call(b,key)&&b[key]!==void 0&&keys.push(key);return keys}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 max_length=Math.max(input.length,output.length),memo2=new Map([[0,{operations:[],cost:0}]]);function dist(i,j){var memo_key=i*max_length+j,memoized=memo2.get(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.set(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}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]})}),intersection2(input,output).forEach(function(key){operations.push.apply(operations,diff2(input[key],output[key],ptr.add(key)))}),operations}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}]}}});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.InvalidOperationError=exports.TestError=exports.MissingError=void 0;exports.add=add;exports.remove=remove;exports.replace=replace;exports.move=move;exports.copy=copy;exports.test=test;exports.apply=apply;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,options){var pointer=pointer_1.Pointer.fromJSON(operation.path);if(options?.implicitArrayCreation&&pointer.tokens[pointer.tokens.length-1]==="-"){var parentEndpoint=pointer.parent().evaluate(object);parentEndpoint.value===void 0&&(0,util_1.objectType)(parentEndpoint.parent)==="object"&&(parentEndpoint.parent[parentEndpoint.key]=[])}var endpoint=pointer.evaluate(object);return endpoint.parent===void 0?new MissingError(operation.path):options?.implicitArrayCreation&&endpoint.key==="-"&&!Array.isArray(endpoint.parent)?new MissingError(operation.path):(_add(endpoint.parent,endpoint.key,(0,util_1.clone)(operation.value)),null)}function remove(object,operation,options){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)}function replace(object,operation,options){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}function move(object,operation,options){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)}function copy(object,operation,options){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)}function test(object,operation,options){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}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,options){switch(operation.op){case"add":return add(object,operation,options);case"remove":return remove(object,operation,options);case"replace":return replace(object,operation,options);case"move":return move(object,operation,options);case"copy":return copy(object,operation,options);case"test":return test(object,operation,options)}return new InvalidOperationError(operation)}}});var require_rfc6902=__commonJS({"../../node_modules/rfc6902/index.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.Pointer=void 0;exports.applyPatch=applyPatch;exports.createPatch=createPatch2;exports.createTests=createTests;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,options){return patch.map(function(operation){return(0,patch_1.apply)(object,operation,options)})}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)}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}}});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{trimTrailingEmptyElements}from"@medplum/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:trimTrailingEmptyElements(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{useMedplum as useMedplum5,useMedplumProfile as useMedplumProfile4}from"@medplum/react-hooks";import{Suspense,useState as useState11}from"react";import{Alert}from"@mantine/core";import{locationUtils,normalizeErrorString}from"@medplum/core";import{forwardRef,createElement}from"react";var defaultAttributes={outline:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},filled:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"currentColor",stroke:"none"}};var createReactComponent=(type,iconName,iconNamePascal,iconNode)=>{let Component2=forwardRef(({color="currentColor",size=24,stroke=2,title,className,children,...rest},ref)=>createElement("svg",{ref,...defaultAttributes[type],width:size,height:size,className:["tabler-icon",`tabler-icon-${iconName}`,className].join(" "),...type==="filled"?{fill:color}:{strokeWidth:stroke,stroke:color},...rest},[title&&createElement("title",{key:"svg-title"},title),...iconNode.map(([tag,attrs])=>createElement(tag,attrs)),...Array.isArray(children)?children:[children]]));return Component2.displayName=`${iconNamePascal}`,Component2};var __iconNode=[["path",{d:"M12 6a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-0"}],["path",{d:"M4 6l8 0",key:"svg-1"}],["path",{d:"M16 6l4 0",key:"svg-2"}],["path",{d:"M6 12a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-3"}],["path",{d:"M4 12l2 0",key:"svg-4"}],["path",{d:"M10 12l10 0",key:"svg-5"}],["path",{d:"M15 18a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-6"}],["path",{d:"M4 18l11 0",key:"svg-7"}],["path",{d:"M19 18l1 0",key:"svg-8"}]],IconAdjustmentsHorizontal=createReactComponent("outline","adjustments-horizontal","AdjustmentsHorizontal",__iconNode);var __iconNode2=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M12 8v4",key:"svg-1"}],["path",{d:"M12 16h.01",key:"svg-2"}]],IconAlertCircle=createReactComponent("outline","alert-circle","AlertCircle",__iconNode2);var __iconNode3=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M18 13l-6 6",key:"svg-1"}],["path",{d:"M6 13l6 6",key:"svg-2"}]],IconArrowDown=createReactComponent("outline","arrow-down","ArrowDown",__iconNode3);var __iconNode4=[["path",{d:"M5 12l14 0",key:"svg-0"}],["path",{d:"M13 18l6 -6",key:"svg-1"}],["path",{d:"M13 6l6 6",key:"svg-2"}]],IconArrowRight=createReactComponent("outline","arrow-right","ArrowRight",__iconNode4);var __iconNode5=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M18 11l-6 -6",key:"svg-1"}],["path",{d:"M6 11l6 -6",key:"svg-2"}]],IconArrowUp=createReactComponent("outline","arrow-up","ArrowUp",__iconNode5);var __iconNode6=[["path",{d:"M6 20a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-0"}],["path",{d:"M16 4a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-1"}],["path",{d:"M16 20a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-2"}],["path",{d:"M11 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-3"}],["path",{d:"M21 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0",key:"svg-4"}],["path",{d:"M5.058 18.306l2.88 -4.606",key:"svg-5"}],["path",{d:"M10.061 10.303l2.877 -4.604",key:"svg-6"}],["path",{d:"M10.065 13.705l2.876 4.6",key:"svg-7"}],["path",{d:"M15.063 5.7l2.881 4.61",key:"svg-8"}]],IconBinaryTree=createReactComponent("outline","binary-tree","BinaryTree",__iconNode6);var __iconNode7=[["path",{d:"M5 19h14m1.986 -1.977a2 2 0 0 0 -.146 -.773l-7.1 -12.25a2 2 0 0 0 -3.5 0l-.815 1.405m-1.488 2.568l-4.797 8.277a2 2 0 0 0 1.75 2.75",key:"svg-0"}],["path",{d:"M3 3l18 18",key:"svg-1"}]],IconBleachOff=createReactComponent("outline","bleach-off","BleachOff",__iconNode7);var __iconNode8=[["path",{d:"M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75",key:"svg-0"}]],IconBleach=createReactComponent("outline","bleach","Bleach",__iconNode8);var __iconNode9=[["path",{d:"M18 7v14l-6 -4l-6 4v-14a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4",key:"svg-0"}]],IconBookmark=createReactComponent("outline","bookmark","Bookmark",__iconNode9);var __iconNode10=[["path",{d:"M7 5a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2l0 -10",key:"svg-0"}],["path",{d:"M17 17v2a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2",key:"svg-1"}]],IconBoxMultiple=createReactComponent("outline","box-multiple","BoxMultiple",__iconNode10);var __iconNode11=[["path",{d:"M7 4h-4v16h4",key:"svg-0"}],["path",{d:"M17 4h4v16h-4",key:"svg-1"}],["path",{d:"M8 16h.01",key:"svg-2"}],["path",{d:"M12 16h.01",key:"svg-3"}],["path",{d:"M16 16h.01",key:"svg-4"}]],IconBracketsContain=createReactComponent("outline","brackets-contain","BracketsContain",__iconNode11);var __iconNode12=[["path",{d:"M3 9a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v9a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2l0 -9",key:"svg-0"}],["path",{d:"M8 7v-2a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v2",key:"svg-1"}],["path",{d:"M12 12l0 .01",key:"svg-2"}],["path",{d:"M3 13a20 20 0 0 0 18 0",key:"svg-3"}]],IconBriefcase=createReactComponent("outline","briefcase","Briefcase",__iconNode12);var __iconNode13=[["path",{d:"M5.029 5.036c-.655 .58 -1.029 1.25 -1.029 1.964c0 2.033 3.033 3.712 6.96 3.967m3.788 -.21c3.064 -.559 5.252 -2.029 5.252 -3.757c0 -2.21 -3.582 -4 -8 -4c-1.605 0 -3.1 .236 -4.352 .643",key:"svg-0"}],["path",{d:"M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.1 -.3 .252 -.812 .457 -1.535m.862 -3.146c.262 -.975 .735 -2.76 1.418 -5.354a7.45 7.45 0 0 0 .263 -1.965",key:"svg-1"}],["path",{d:"M3 3l18 18",key:"svg-2"}]],IconBucketOff=createReactComponent("outline","bucket-off","BucketOff",__iconNode13);var __iconNode14=[["path",{d:"M4 7a8 4 0 1 0 16 0a8 4 0 1 0 -16 0",key:"svg-0"}],["path",{d:"M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.333 -1 1.246 -4.345 2.737 -10.035a7.45 7.45 0 0 0 .263 -1.965",key:"svg-1"}]],IconBucket=createReactComponent("outline","bucket","Bucket",__iconNode14);var __iconNode15=[["path",{d:"M3 20h18v-8a3 3 0 0 0 -3 -3h-12a3 3 0 0 0 -3 3v8",key:"svg-0"}],["path",{d:"M3 14.803c.312 .135 .654 .204 1 .197a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1c.35 .007 .692 -.062 1 -.197",key:"svg-1"}],["path",{d:"M12 4l1.465 1.638a2 2 0 1 1 -3.015 .099l1.55 -1.737",key:"svg-2"}]],IconCake=createReactComponent("outline","cake","Cake",__iconNode15);var __iconNode16=[["path",{d:"M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12",key:"svg-0"}],["path",{d:"M16 3v4",key:"svg-1"}],["path",{d:"M8 3v4",key:"svg-2"}],["path",{d:"M4 11h16",key:"svg-3"}],["path",{d:"M11 15h1",key:"svg-4"}],["path",{d:"M12 15v3",key:"svg-5"}]],IconCalendar=createReactComponent("outline","calendar","Calendar",__iconNode16);var __iconNode17=[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]],IconCheck=createReactComponent("outline","check","Check",__iconNode17);var __iconNode18=[["path",{d:"M9 11l3 3l8 -8",key:"svg-0"}],["path",{d:"M20 12v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h9",key:"svg-1"}]],IconCheckbox=createReactComponent("outline","checkbox","Checkbox",__iconNode18);var __iconNode19=[["path",{d:"M6 9l6 6l6 -6",key:"svg-0"}]],IconChevronDown=createReactComponent("outline","chevron-down","ChevronDown",__iconNode19);var __iconNode20=[["path",{d:"M9 6l6 6l-6 6",key:"svg-0"}]],IconChevronRight=createReactComponent("outline","chevron-right","ChevronRight",__iconNode20);var __iconNode21=[["path",{d:"M6 15l6 -6l6 6",key:"svg-0"}]],IconChevronUp=createReactComponent("outline","chevron-up","ChevronUp",__iconNode21);var __iconNode22=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M9 12l6 0",key:"svg-1"}]],IconCircleMinus=createReactComponent("outline","circle-minus","CircleMinus",__iconNode22);var __iconNode23=[["path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0",key:"svg-0"}],["path",{d:"M9 12h6",key:"svg-1"}],["path",{d:"M12 9v6",key:"svg-2"}]],IconCirclePlus=createReactComponent("outline","circle-plus","CirclePlus",__iconNode23);var __iconNode24=[["path",{d:"M7 18a4.6 4.4 0 0 1 0 -9a5 4.5 0 0 1 11 2h1a3.5 3.5 0 0 1 0 7h-1",key:"svg-0"}],["path",{d:"M9 15l3 -3l3 3",key:"svg-1"}],["path",{d:"M12 12l0 9",key:"svg-2"}]],IconCloudUpload=createReactComponent("outline","cloud-upload","CloudUpload",__iconNode24);var __iconNode25=[["path",{d:"M4 6l5.5 0",key:"svg-0"}],["path",{d:"M4 10l5.5 0",key:"svg-1"}],["path",{d:"M4 14l5.5 0",key:"svg-2"}],["path",{d:"M4 18l5.5 0",key:"svg-3"}],["path",{d:"M14.5 6l5.5 0",key:"svg-4"}],["path",{d:"M14.5 10l5.5 0",key:"svg-5"}],["path",{d:"M14.5 14l5.5 0",key:"svg-6"}],["path",{d:"M14.5 18l5.5 0",key:"svg-7"}]],IconColumns=createReactComponent("outline","columns","Columns",__iconNode25);var __iconNode26=[["path",{d:"M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666",key:"svg-0"}],["path",{d:"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1",key:"svg-1"}]],IconCopy=createReactComponent("outline","copy","Copy",__iconNode26);var __iconNode27=[["path",{d:"M16.7 8a3 3 0 0 0 -2.7 -2h-4a3 3 0 0 0 0 6h4a3 3 0 0 1 0 6h-4a3 3 0 0 1 -2.7 -2",key:"svg-0"}],["path",{d:"M12 3v3m0 12v3",key:"svg-1"}]],IconCurrencyDollar=createReactComponent("outline","currency-dollar","CurrencyDollar",__iconNode27);var __iconNode28=[["path",{d:"M4 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M18 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}]],IconDots=createReactComponent("outline","dots","Dots",__iconNode28);var __iconNode29=[["path",{d:"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2",key:"svg-0"}],["path",{d:"M7 11l5 5l5 -5",key:"svg-1"}],["path",{d:"M12 4l0 12",key:"svg-2"}]],IconDownload=createReactComponent("outline","download","Download",__iconNode29);var __iconNode30=[["path",{d:"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1",key:"svg-0"}],["path",{d:"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]],IconEdit=createReactComponent("outline","edit","Edit",__iconNode30);var __iconNode31=[["path",{d:"M9.5 5.5a2.5 2.5 0 1 0 5 0a2.5 2.5 0 1 0 -5 0",key:"svg-0"}],["path",{d:"M12 21.368l5.095 -5.096a3.088 3.088 0 1 0 -4.367 -4.367l-.728 .727l-.728 -.727a3.088 3.088 0 1 0 -4.367 4.367l5.095 5.096",key:"svg-1"}]],IconEmpathize=createReactComponent("outline","empathize","Empathize",__iconNode31);var __iconNode32=[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}],["path",{d:"M5 19l14 -14",key:"svg-2"}]],IconEqualNot=createReactComponent("outline","equal-not","EqualNot",__iconNode32);var __iconNode33=[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}]],IconEqual=createReactComponent("outline","equal","Equal",__iconNode33);var __iconNode34=[["path",{d:"M10.585 10.587a2 2 0 0 0 2.829 2.828",key:"svg-0"}],["path",{d:"M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87",key:"svg-1"}],["path",{d:"M3 3l18 18",key:"svg-2"}]],IconEyeOff=createReactComponent("outline","eye-off","EyeOff",__iconNode34);var __iconNode35=[["path",{d:"M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",key:"svg-0"}],["path",{d:"M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6",key:"svg-1"}]],IconEye=createReactComponent("outline","eye","Eye",__iconNode35);var __iconNode36=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2",key:"svg-1"}],["path",{d:"M12 17l.01 0",key:"svg-2"}],["path",{d:"M12 11l0 3",key:"svg-3"}]],IconFileAlert=createReactComponent("outline","file-alert","FileAlert",__iconNode36);var __iconNode37=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M11.5 21h-4.5a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v5m-5 6h7m-3 -3l3 3l-3 3",key:"svg-1"}]],IconFileExport=createReactComponent("outline","file-export","FileExport",__iconNode37);var __iconNode38=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2",key:"svg-1"}],["path",{d:"M12 11l0 6",key:"svg-2"}],["path",{d:"M9 14l6 0",key:"svg-3"}]],IconFilePlus=createReactComponent("outline","file-plus","FilePlus",__iconNode38);var __iconNode39=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2",key:"svg-1"}],["path",{d:"M9 9l1 0",key:"svg-2"}],["path",{d:"M9 13l6 0",key:"svg-3"}],["path",{d:"M9 17l6 0",key:"svg-4"}]],IconFileText=createReactComponent("outline","file-text","FileText",__iconNode39);var __iconNode40=[["path",{d:"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227",key:"svg-0"}]],IconFilter=createReactComponent("outline","filter","Filter",__iconNode40);var __iconNode41=[["path",{d:"M9 6.371c0 4.418 -2.239 6.629 -5 6.629",key:"svg-0"}],["path",{d:"M4 6.371h7",key:"svg-1"}],["path",{d:"M5 9c0 2.144 2.252 3.908 6 4",key:"svg-2"}],["path",{d:"M12 20l4 -9l4 9",key:"svg-3"}],["path",{d:"M19.1 18h-6.2",key:"svg-4"}],["path",{d:"M6.694 3l.793 .582",key:"svg-5"}]],IconLanguage=createReactComponent("outline","language","Language",__iconNode41);var __iconNode42=[["path",{d:"M4 6a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12",key:"svg-0"}],["path",{d:"M9 4l0 16",key:"svg-1"}]],IconLayoutSidebar=createReactComponent("outline","layout-sidebar","LayoutSidebar",__iconNode42);var __iconNode43=[["path",{d:"M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2",key:"svg-0"}],["path",{d:"M9 12h12l-3 -3",key:"svg-1"}],["path",{d:"M18 15l3 -3",key:"svg-2"}]],IconLogout=createReactComponent("outline","logout","Logout",__iconNode43);var __iconNode44=[["path",{d:"M9 11a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-0"}],["path",{d:"M17.657 16.657l-4.243 4.243a2 2 0 0 1 -2.827 0l-4.244 -4.243a8 8 0 1 1 11.314 0",key:"svg-1"}]],IconMapPin=createReactComponent("outline","map-pin","MapPin",__iconNode44);var __iconNode45=[["path",{d:"M5 18l14 -6l-14 -6",key:"svg-0"}]],IconMathGreater=createReactComponent("outline","math-greater","MathGreater",__iconNode45);var __iconNode46=[["path",{d:"M19 18l-14 -6l14 -6",key:"svg-0"}]],IconMathLower=createReactComponent("outline","math-lower","MathLower",__iconNode46);var __iconNode47=[["path",{d:"M3 20l1.3 -3.9c-2.324 -3.437 -1.426 -7.872 2.1 -10.374c3.526 -2.501 8.59 -2.296 11.845 .48c3.255 2.777 3.695 7.266 1.029 10.501c-2.666 3.235 -7.615 4.215 -11.574 2.293l-4.7 1",key:"svg-0"}]],IconMessageCircle=createReactComponent("outline","message-circle","MessageCircle",__iconNode47);var __iconNode48=[["path",{d:"M8 9h8",key:"svg-0"}],["path",{d:"M8 13h6",key:"svg-1"}],["path",{d:"M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12",key:"svg-2"}]],IconMessage=createReactComponent("outline","message","Message",__iconNode48);var __iconNode49=[["path",{d:"M15 7l-6.5 6.5a1.5 1.5 0 0 0 3 3l6.5 -6.5a3 3 0 0 0 -6 -6l-6.5 6.5a4.5 4.5 0 0 0 9 9l6.5 -6.5",key:"svg-0"}]],IconPaperclip=createReactComponent("outline","paperclip","Paperclip",__iconNode49);var __iconNode50=[["path",{d:"M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4",key:"svg-0"}],["path",{d:"M13.5 6.5l4 4",key:"svg-1"}]],IconPencil=createReactComponent("outline","pencil","Pencil",__iconNode50);var __iconNode51=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]],IconPlus=createReactComponent("outline","plus","Plus",__iconNode51);var __iconNode52=[["path",{d:"M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4",key:"svg-0"}],["path",{d:"M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4",key:"svg-1"}]],IconRefresh=createReactComponent("outline","refresh","Refresh",__iconNode52);var __iconNode53=[["path",{d:"M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]],IconSearch=createReactComponent("outline","search","Search",__iconNode53);var __iconNode54=[["path",{d:"M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065",key:"svg-0"}],["path",{d:"M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-1"}]],IconSettings=createReactComponent("outline","settings","Settings",__iconNode54);var __iconNode55=[["path",{d:"M4 6l7 0",key:"svg-0"}],["path",{d:"M4 12l7 0",key:"svg-1"}],["path",{d:"M4 18l9 0",key:"svg-2"}],["path",{d:"M15 9l3 -3l3 3",key:"svg-3"}],["path",{d:"M18 6l0 12",key:"svg-4"}]],IconSortAscending=createReactComponent("outline","sort-ascending","SortAscending",__iconNode55);var __iconNode56=[["path",{d:"M4 6l9 0",key:"svg-0"}],["path",{d:"M4 12l7 0",key:"svg-1"}],["path",{d:"M4 18l7 0",key:"svg-2"}],["path",{d:"M15 15l3 3l3 -3",key:"svg-3"}],["path",{d:"M18 6l0 12",key:"svg-4"}]],IconSortDescending=createReactComponent("outline","sort-descending","SortDescending",__iconNode56);var __iconNode57=[["path",{d:"M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14",key:"svg-0"}]],IconSquare=createReactComponent("outline","square","Square",__iconNode57);var __iconNode58=[["path",{d:"M6 4h-1a2 2 0 0 0 -2 2v3.5a5.5 5.5 0 0 0 11 0v-3.5a2 2 0 0 0 -2 -2h-1",key:"svg-0"}],["path",{d:"M8 15a6 6 0 1 0 12 0v-3",key:"svg-1"}],["path",{d:"M11 3v2",key:"svg-2"}],["path",{d:"M6 3v2",key:"svg-3"}],["path",{d:"M18 10a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-4"}]],IconStethoscope=createReactComponent("outline","stethoscope","Stethoscope",__iconNode58);var __iconNode59=[["path",{d:"M16 3l4 4l-4 4",key:"svg-0"}],["path",{d:"M10 7l10 0",key:"svg-1"}],["path",{d:"M8 13l-4 4l4 4",key:"svg-2"}],["path",{d:"M4 17l9 0",key:"svg-3"}]],IconSwitchHorizontal=createReactComponent("outline","switch-horizontal","SwitchHorizontal",__iconNode59);var __iconNode60=[["path",{d:"M12.5 21h-7.5a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v7.5",key:"svg-0"}],["path",{d:"M3 10h18",key:"svg-1"}],["path",{d:"M10 3v18",key:"svg-2"}],["path",{d:"M16 19h6",key:"svg-3"}],["path",{d:"M19 16l3 3l-3 3",key:"svg-4"}]],IconTableExport=createReactComponent("outline","table-export","TableExport",__iconNode60);var __iconNode61=[["path",{d:"M4 7l16 0",key:"svg-0"}],["path",{d:"M10 11l0 6",key:"svg-1"}],["path",{d:"M14 11l0 6",key:"svg-2"}],["path",{d:"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12",key:"svg-3"}],["path",{d:"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3",key:"svg-4"}]],IconTrash=createReactComponent("outline","trash","Trash",__iconNode61);var __iconNode62=[["path",{d:"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0",key:"svg-0"}],["path",{d:"M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2",key:"svg-1"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"svg-2"}],["path",{d:"M21 21v-2a4 4 0 0 0 -3 -3.85",key:"svg-3"}]],IconUsers=createReactComponent("outline","users","Users",__iconNode62);var __iconNode63=[["path",{d:"M18 6l-12 12",key:"svg-0"}],["path",{d:"M6 6l12 12",key:"svg-1"}]],IconX=createReactComponent("outline","x","X",__iconNode63);import{Component}from"react";import{jsx as jsx4}from"react/jsx-runtime";var ErrorBoundary=class extends Component{constructor(props){super(props);__publicField(this,"state");this.state={lastLocation:locationUtils.getLocation()}}static getDerivedStateFromError(error){return{error,lastLocation:locationUtils.getLocation()}}componentDidUpdate(_prevProps,_prevState){locationUtils.getLocation()!==this.state.lastLocation&&this.setState({lastLocation:locationUtils.getLocation(),error:void 0})}shouldComponentUpdate(nextProps,nextState){return!!(this.props.children!==nextProps.children||nextState.error&&!this.state.error||this.state.lastLocation!==locationUtils.getLocation())}componentDidCatch(error,errorInfo){console.error("Uncaught error:",error,errorInfo)}render(){return this.state.error?jsx4(Alert,{icon:jsx4(IconAlertCircle,{size:16}),title:"Something went wrong",color:"red",children:normalizeErrorString(this.state.error)}):this.props.children}};import{Center,Loader}from"@mantine/core";import{jsx as jsx5}from"react/jsx-runtime";function Loading(){return jsx5(Center,{style:{width:"100%",height:"100vh"},children:jsx5(Loader,{})})}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";import{useState as useState5}from"react";import{Avatar}from"@mantine/core";import{getDisplayString,getImageSrc}from"@medplum/core";import{useCachedBinaryUrl,useResource}from"@medplum/react-hooks";import{Anchor}from"@mantine/core";import{isReference,isResource}from"@medplum/core";import{useMedplumNavigate}from"@medplum/react-hooks";import{ContentType}from"@medplum/core";function killEvent(e){e.preventDefault(),e.stopPropagation()}function isAuxClick(e){return e.button===1||e.ctrlKey||e.metaKey}function isCheckboxCell(el){if(isCheckboxElement(el))return!0;if(el instanceof HTMLTableCellElement){let children=el.children;if(children.length===1&&isCheckboxElement(children[0]))return!0}return!1}function isCheckboxElement(el){return el instanceof HTMLInputElement&&el.type==="checkbox"}async function sendCommand(frame,command){return new Promise((resolve,reject)=>{let channel=new MessageChannel;channel.port1.onmessage=({data:data2})=>{channel.port1.close(),data2.error?reject(data2.error):resolve(data2.result)},frame.contentWindow?.postMessage(command,new URL(frame.src).origin,[channel.port2])})}function exportJsonFile(jsonString,fileName){let blobForExport=new Blob([jsonString],{type:ContentType.JSON}),url=URL.createObjectURL(blobForExport),link=document.createElement("a");link.href=url;let linkName=fileName??new Date().toISOString().replaceAll(/\D/g,"");link.download=`${linkName}.json`,document.body.appendChild(link),link.click(),URL.revokeObjectURL(url)}import{jsx as 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.at(-1)?.at(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"};import{Avatar as Avatar2,Group as Group2,Menu,SegmentedControl,Stack,Text,useMantineColorScheme}from"@mantine/core";import{getReferenceString,locationUtils as locationUtils2}from"@medplum/core";import{useMedplumContext}from"@medplum/react-hooks";import{useState as useState3}from"react";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}function getAppName(){return import.meta.env.MEDPLUM_APP_NAME||"Medplum"}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(),[layoutVersion]=useState3(localStorage.appShellLayoutVersion??"v1"),showLayoutToggle=props.showLayoutVersionToggle??!0;function setAppShellVersion(version){localStorage.appShellLayoutVersion=version,locationUtils2.reload()}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(()=>locationUtils2.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(Menu.Item,{leftSection:jsx9(IconSwitchHorizontal,{size:14,stroke:1.5}),onClick:()=>navigate("/signin"),children:"Switch to another project"}),jsx9(Menu.Divider,{}),jsxs2(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"}]}),showLayoutToggle&&jsx9(SegmentedControl,{size:"xs",value:layoutVersion,onChange:newValue=>setAppShellVersion(newValue),data:[{label:"v1",value:"v1"},{label:"v2",value:"v2"}]})]}),jsx9(Menu.Divider,{}),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"}),jsxs2(Text,{size:"xs",c:"dimmed",my:"sm",ta:"center",children:[getAppName()," ",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 useState4}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]=useState4(""),[timer,setTimer]=useState4(),[abortController,setAbortController]=useState4(),[autoSubmit,setAutoSubmit]=useState4(),[selected,setSelected]=useState4(defaultItems.map(toOption4)),[options,setOptions]=useState4([]),ItemComponent3=itemComponent??DefaultItemComponent,PillComponent=pillComponent??DefaultPillComponent,EmptyComponent=emptyComponent??DefaultEmptyComponent,searchRef=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
@@ -106,9 +106,9 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
106
106
  name,
107
107
  title,
108
108
  }
109
- }`.replaceAll(/\s+/g," ");return(await medplum.graphql(query)).data.StructureDefinitionList[0]}function shouldFetchResourceType(targetType){return targetType.type==="profile"&&!targetType?.error&&isEmpty4(targetType.resourceType)}import{Group as Group23,Stack as Stack12,Text as Text15}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useMedplum as useMedplum19}from"@medplum/react-hooks";import{useContext as useContext19,useEffect as useEffect11,useState as useState41}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group22,Stack as Stack11,Text as Text14}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 useState40}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon4,Button as Button4}from"@mantine/core";import{jsx as jsx76}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx76(Button4,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx76(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx76(ActionIcon4,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx76(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon5}from"@mantine/core";import{jsx as jsx77}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx77(ActionIcon5,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx77(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx78,jsxs as jsxs42}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState40(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,jsx78(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx78(Text14,{c:"dimmed",children:"(empty)"}):jsxs42(Stack11,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs42(Group22,{wrap:"nowrap",children:[jsx78("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx78(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&&jsx78(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&&jsx78(Group22,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx78(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx79,jsxs as jsxs43}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum19(),[loading,setLoading]=useState41(!0),[slices,setSlices]=useState41([]),[defaultValue2]=useState41(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState41(()=>[defaultValue2]),ctx=useContext19(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect11(()=>{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 jsx79("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 jsxs43(Stack12,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx79(Text15,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx79(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)=>jsxs43(Group23,{wrap:"nowrap",style:{flexGrow:1},children:[jsx79("div",{style:{flexGrow:1},children:jsx79(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&&jsx79(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&&jsx79(Group23,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx79(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.push(void 0),setValuesWrapper(newNonSliceValues,nonSliceIndex)},testId:"nonsliced-add"})})]})}function addPlaceholderValues(slicedValues,slices){for(let sliceIndex=0;sliceIndex<slices.length;sliceIndex++){let slice=slices[sliceIndex],sliceValues=slicedValues[sliceIndex];for(;sliceValues.length<slice.min;)sliceValues.push(void 0)}}import{ActionIcon as ActionIcon6,Flex as Flex7,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification4}from"@mantine/notifications";import{useRef as useRef11,useState as useState42}from"react";import{jsx as jsx80,jsxs as jsxs44}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState42(!1),clipboard=useClipboard(),ref=useRef11(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs44(Flex7,{gap:"xs",children:[jsx80(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx80(ActionIcon6,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification4({color:"green",message:"Copied"})},children:jsx80(IconCopy,{})})]})}import{Box as Box6,Button as Button5,Chip,Group as Group24,Modal as Modal2,NativeSelect as NativeSelect8,Stack as Stack13,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 useState43}from"react";import{Fragment as Fragment27,jsx as jsx81,jsxs as jsxs45}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState43(props.defaultValue),[open,setOpen]=useState43(!props.disabled&&(props.defaultModalOpen??!1));return jsxs45(Fragment27,{children:[jsxs45(Group24,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81("span",{"data-testid":"timinginput-display",children:formatTiming2(value)||"No repeat"}),jsx81(Button5,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx81(TimingEditorDialog,{path:props.path,visible:open,defaultValue:value,onOk:newValue=>{props.onChange&&props.onChange(newValue),setValue(newValue),setOpen(!1)},onCancel:()=>setOpen(!1)})]})}var defaultValue={repeat:{period:1,periodUnit:"d"}};function TimingEditorDialog(props){let[value,setValue]=useState43(props.defaultValue||defaultValue),[timeOfDayItems,setTimeOfDayItems]=useState43(()=>(props.defaultValue?.repeat?.timeOfDay??[]).map((v,i)=>({id:i,value:v}))),nextTimeOfDayId=useRef12(timeOfDayItems.length),{getExtendedProps}=useContext20(ElementsContext),[eventProps,repeatProps,repeatPeriodProps,repeatPeriodUnitProps,repeatDayOfWeekProps,repeatTimeOfDayProps]=useMemo19(()=>["event","repeat","repeat.period","repeat.periodUnit","repeat.dayOfWeek","repeat.timeOfDay"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setStart(newStart){setValue(value2=>({...value2,event:[newStart]}))}function setRepeat(repeat){setValue(value2=>({...value2,repeat}))}function setPeriod(period){setValue(value2=>({...value2,repeat:{...value2.repeat,period}}))}function setPeriodUnit(periodUnit){setValue(value2=>({...value2,repeat:{...value2.repeat,periodUnit}}))}function setDaysOfWeek(dayOfWeek){setValue(value2=>({...value2,repeat:{...value2.repeat,dayOfWeek}}))}function setTimeOfDay(updater){setTimeOfDayItems(items=>{let newItems=updater(items),timeOfDay=newItems.map(item=>item.value);return setValue(value2=>({...value2,repeat:{...value2.repeat,timeOfDay}})),newItems})}return jsx81(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs45(Stack13,{gap:"md",children:[jsx81(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx81(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx81(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs45(Fragment27,{children:[jsx81(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs45(Group24,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81(TextInput16,{disabled:repeatPeriodProps?.readonly,type:"number",step:1,id:"timing-dialog-period",name:"timing-dialog-period",defaultValue:value.repeat.period||1,onChange:e=>setPeriod(Number.parseInt(e.currentTarget.value,10)||1)}),jsx81(NativeSelect8,{disabled:repeatPeriodUnitProps?.readonly,id:"timing-dialog-periodUnit",name:"timing-dialog-periodUnit",defaultValue:value.repeat.periodUnit,onChange:e=>setPeriodUnit(e.currentTarget.value),data:[{label:"minute",value:"min"},{label:"hour",value:"h"},{label:"day",value:"d"},{label:"week",value:"wk"},{label:"month",value:"mo"},{label:"year",value:"a"}]})]})}),value.repeat.periodUnit==="wk"&&jsx81(FormSection,{title:"Repeat on",children:jsx81(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,value:value.repeat?.dayOfWeek,children:jsx81(Group24,{justify:"space-between",mt:"xs",gap:"xs",children:daysOfWeek.map(day=>jsx81(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,checked:(value.repeat?.dayOfWeek??[]).includes(day),children:day.charAt(0).toUpperCase()},day))})})}),jsx81(FormSection,{title:"At times",children:jsxs45(Stack13,{mt:"xs",children:[timeOfDayItems.map((item,idx)=>jsxs45(Group24,{children:[jsx81(TextInput16,{disabled:repeatTimeOfDayProps?.readonly,type:"time",id:`timing-dialog-repeat-timeOfDay[${idx}]`,name:`timing-dialog-repeat-timeOfDay[${idx}]`,"data-testid":`timing-repeat-timeOfDay-input-${idx}`,defaultValue:item.value.slice(0,5),onChange:e=>{let newValue=`${e.currentTarget.value}:00`;setTimeOfDay(items=>items.with(idx,{...item,value:newValue}))},style:{flexGrow:1}}),jsx81(ArrayRemoveButton,{testId:`timing-repeat-timeOfDay-remove-${idx}`,onClick:()=>setTimeOfDay(items=>items.toSpliced(idx,1))})]},item.id)),jsx81(Box6,{children:jsx81(ArrayAddButton,{propertyDisplayName:"Time of Day",onClick:()=>setTimeOfDay(items=>{let id=nextTimeOfDayId.current++;return items.concat({id,value:"00:00:00"})})})})]})})]}),jsx81(Group24,{justify:"flex-end",children:jsx81(Button5,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx82,jsxs as jsxs46}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 jsx82(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx82(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx82(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx82(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]=useState44(initialPropertyType);return jsxs46(Group25,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx82(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}))}),jsx82(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 jsx82("div",{children:"Property type not specified "});function getComplexInputProps(){return{name,defaultValue:defaultValue2,onChange,outcome,path,valuePath,disabled:readOnly}}function getPrimitiveInputProps(){let error=getErrorsForInput(props.outcome,valuePath??path);return{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,error,disabled:readOnly}}switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.string:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"?jsx82(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx82(TextInput17,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx82(TextInput17,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.time:return jsx82(TextInput17,{...getPrimitiveInputProps(),type:"time",step:1,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx82(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx82(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 jsx82(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx82(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:case PropertyType2.xhtml:return jsx82(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx82(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx82(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx82(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx82(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx82(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx82(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx82(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx82(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx82(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx82(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx82(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx82(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx82(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx82(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx82(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx82(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx82(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx82(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 jsx83}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState45(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 jsx83(Stack14,{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=jsx83(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"?jsx83(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx83(FormSection,{title:getPathDisplayName5(key),description:element.description,withAsterisk:required,htmlFor:key,outcome:props.outcome,fhirPath:element.path,errorExpression:valuePath,readonly:element.readonly,children:resourcePropertyInput},key)})})}var BackboneElementInput_default={nested:"BackboneElementInput_nested"};import{jsx as jsx84,jsxs as jsxs47}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState46(()=>props.defaultValue??{}),parentElementsContext=useContext23(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo22(()=>tryGetDataType2(props.typeName,profileUrl),[props.typeName,profileUrl]),type=typeSchema?.type??props.typeName,contextValue=useMemo22(()=>{if(typeSchema)return buildElementsContext4({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);if(!typeSchema)return jsxs47("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx84(Box7,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:jsx84(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}import{Button as Button6,Group as Group26}from"@mantine/core";import{useMemo as useMemo23,useState as useState47}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 jsx85,jsxs as jsxs48}from"react/jsx-runtime";function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState47(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 jsxs48("div",{children:[jsxs48(Group26,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx85("p",{style:{flex:1},children:getMonthString(month)}),jsxs48(Group26,{justify:"flex-end",gap:"xs",children:[jsx85(Button6,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx85(Button6,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs48("table",{className:CalendarInput_default.table,children:[jsx85("thead",{children:jsxs48("tr",{children:[jsx85("th",{children:"SUN"}),jsx85("th",{children:"MON"}),jsx85("th",{children:"TUE"}),jsx85("th",{children:"WED"}),jsx85("th",{children:"THU"}),jsx85("th",{children:"FRI"}),jsx85("th",{children:"SAT"})]})}),jsx85("tbody",{children:grid.map((week,weekIndex)=>jsx85("tr",{children:week.map((day,dayIndex)=>jsx85("td",{children:day&&jsx85(Button6,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,slots){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d.getTime()),available:isDayAvailable(d,slots)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,slots){for(let slot of slots){let slotStart=new Date(slot.start);if(slotStart.getFullYear()===day.getFullYear()&&slotStart.getMonth()===day.getMonth()&&slotStart.getDate()===day.getDate())return!0}return!1}import{ActionIcon as ActionIcon7,Group as Group27,LoadingOverlay,Paper as Paper2,ScrollArea as ScrollArea2,Skeleton,Stack as Stack15,Text as Text16,TextInput as TextInput18,Title as Title5}from"@mantine/core";import{useResizeObserver}from"@mantine/hooks";import{showNotification as showNotification5}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 useEffect12,useMemo as useMemo24,useRef as useRef13,useState as useState48}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",chatBubbleNameRight:"BaseChat_chatBubbleNameRight"};import{jsx as jsx86,jsxs as jsxs49}from"react/jsx-runtime";function showError(message){showNotification5({color:"red",title:"Error",message,autoClose:!1})}function parseSentTime(communication){return new Date(communication.sent??0).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function upsertCommunications(communications,received,setCommunications){let newCommunications=[...communications],foundNew=!1;for(let comm of received){let existingIdx=newCommunications.findIndex(c=>c.id===comm.id);existingIdx!==-1?newCommunications[existingIdx]=comm:(newCommunications.push(comm),foundNew=!0)}foundNew&&newCommunications.sort((a,b)=>!a.sent&&!b.sent?0:a.sent?b.sent?a.sent.localeCompare(b.sent):1:-1),setCommunications(newCommunications)}function BaseChat(props){let{title,communications,setCommunications,query,sendMessage,onMessageReceived,onMessageUpdated,inputDisabled,onError,excludeHeader=!1,...paperProps}=props,medplum=useMedplum20(),inputRef=useRef13(null),scrollAreaRef=useRef13(null),firstScrollRef=useRef13(!0),initialLoadRef=useRef13(!0),[profile,setProfile]=useState48(medplum.getProfile()),[reconnecting,setReconnecting]=useState48(!1),[loading,setLoading]=useState48(!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]);useEffect12(()=>{searchMessages().catch(err=>showNotification5({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),showNotification5({color:"red",message:"Live chat disconnected. Attempting to reconnect..."})},[reconnecting]),onWebSocketOpen:useCallback10(()=>{reconnecting&&showNotification5({color:"green",message:"Live chat reconnected."})},[reconnecting]),onSubscriptionConnect:useCallback10(()=>{reconnecting&&(searchMessages().catch(err=>showNotification5({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]);useEffect12(()=>{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);useEffect12(()=>{communications!==prevCommunicationsRef.current&&(scrollToBottomRef.current=!0),prevCommunicationsRef.current=communications},[communications]),useEffect12(()=>{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?jsxs49(Paper2,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[!excludeHeader&&jsx86(Title5,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx86("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs49(Stack15,{align:"stretch",mt:"lg",children:[jsxs49(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(Skeleton,{height:38,circle:!0,ml:"md"}),jsx86(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs49(Group27,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx86(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs49(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(Skeleton,{height:38,circle:!0,ml:"md"}),jsx86(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs49(ScrollArea2,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx86(LoadingOverlay,{visible:loading||reconnecting,style:{width:parentRect.width,height:parentRect.height,position:"absolute",zIndex:1}}),communications.map((c,i)=>{let prevCommunication=i>0?communications[i-1]:void 0,prevCommTime=prevCommunication?parseSentTime(prevCommunication):void 0,currCommTime=parseSentTime(c),showDelivered=!!c.received&&c.id===myLastDeliveredId;return jsxs49(Stack15,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx86(Text16,{fz:"xs",ta:"center",children:currCommTime}),c.sender?.reference===profileRefStr?jsxs49(Group27,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(ChatBubble,{alignment:"right",communication:c,showDelivered}),jsx86(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender,mb:showDelivered?void 0:"sm"})]}):jsxs49(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx86(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),jsx86(ChatBubble,{alignment:"left",communication:c})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsx86("div",{className:BaseChat_default.chatInputContainer,children:jsx86(Form,{onSubmit:sendMessageInternal,children:jsx86(TextInput18,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",rightSectionWidth:42,disabled:inputDisabled,rightSection:inputDisabled?void 0:jsx86(ActionIcon7,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx86(IconArrowRight,{size:"1rem",stroke:1.5})})})})})]}):null}function ChatBubble(props){let{communication,alignment,showDelivered}=props,content=communication.payload?.[0]?.contentString||"",sentTime=new Date(communication.sent??-1),seenTime=new Date(communication.received??-1),senderResource=useResource3(communication.sender);return jsxs49("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsxs49(Text16,{fz:"xs",mb:"xs",fw:500,className:alignment==="right"?BaseChat_default.chatBubbleNameRight:void 0,"aria-label":"Sender name",children:[senderResource?getDisplayString4(senderResource):"[Unknown sender]","\xA0\xB7\xA0",jsx86(Text16,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),jsx86("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx86("div",{className:BaseChat_default.chatBubble,children:content})}),showDelivered&&jsxs49("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs49("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx86("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx86("div",{style:{position:"relative"},children:jsx86(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx86("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx86("div",{className:BaseChat_default.chatBubble,children:jsx86(Skeleton,{height:14,width:parentWidth*.5,radius:"l"})})})]})}import{ActionIcon as ActionIcon8}from"@mantine/core";import{useMedplumProfile as useMedplumProfile5}from"@medplum/react-hooks";import{useEffect as useEffect13,useState as useState49}from"react";var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};import{Fragment as Fragment28,jsx as jsx87,jsxs as jsxs50}from"react/jsx-runtime";function ChatModal(props){let{open,children}=props,profile=useMedplumProfile5(),[opened,setOpened]=useState49(open??!1);return useEffect13(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?jsxs50(Fragment28,{children:[opened&&jsx87("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx87("div",{className:ChatModal_default.iconContainer,children:jsx87(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx87(IconChevronDown,{size:"1.625rem"})})}):jsx87("div",{className:ChatModal_default.iconContainer,children:jsx87(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx87(IconChevronUp,{size:"1.625rem"})})})]}):null}import{createReference as createReference3,formatCodeableConcept as formatCodeableConcept2,getReferenceString as getReferenceString5}from"@medplum/core";import{useMedplum as useMedplum21,useMedplumProfile as useMedplumProfile6,usePrevious}from"@medplum/react-hooks";import{useCallback as useCallback11,useEffect as useEffect14,useMemo as useMemo25,useState as useState50}from"react";import{jsx as jsx88}from"react/jsx-runtime";function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,excludeHeader,onError}=props,medplum=useMedplum21(),profile=useMedplumProfile6(),prevThreadId=usePrevious(thread?.id),[communications,setCommunications]=useState50([]),profileRef=useMemo25(()=>profile?createReference3(profile):void 0,[profile]),threadRef=useMemo25(()=>createReference3(thread),[thread]);useEffect14(()=>{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?jsx88(BaseChat,{title:title??(thread?.topic?formatCodeableConcept2(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled,excludeHeader,onError}):null}import{Divider as Divider4,Stack as Stack17}from"@mantine/core";import{Fragment as Fragment29}from"react";import{Group as Group28,Stack as Stack16,Text as Text17}from"@mantine/core";import{formatDateTime as formatDateTime2,formatHumanName as formatHumanName6}from"@medplum/core";import{useResource as useResource4}from"@medplum/react-hooks";var ChatListItem_default={content:"ChatListItem_content",contentContainer:"ChatListItem_contentContainer",selected:"ChatListItem_selected"};import{jsx as jsx89,jsxs as jsxs51}from"react/jsx-runtime";var ChatListItem=props=>{let{topic,lastCommunication,isSelected,getThreadUri}=props,patientResource=useResource4(topic.subject),patientName=formatHumanName6(patientResource?.name?.[0]),lastMsg=lastCommunication?.payload?.[0]?.contentString,trimmedMsg=lastMsg?.length&&lastMsg.length>100?lastMsg.slice(0,100)+"...":lastMsg,senderName=lastCommunication?.sender?.display?`${lastCommunication?.sender?.display}: `:"",content=trimmedMsg?`${senderName} ${trimmedMsg}`:"No messages available",topicName=topic.topic?.text??content;return jsx89(MedplumLink,{to:getThreadUri(topic),underline:"never",children:jsxs51(Group28,{p:"xs",align:"center",wrap:"nowrap",className:clsx_default(ChatListItem_default.contentContainer,{[ChatListItem_default.selected]:isSelected}),children:[jsx89(ResourceAvatar,{value:topic.subject,radius:"xl",size:36}),jsxs51(Stack16,{gap:0,children:[jsx89(Text17,{size:"sm",fw:700,truncate:"end",children:patientName}),jsx89(Text17,{size:"sm",fw:400,lineClamp:2,className:ChatListItem_default.content,children:topicName}),jsx89(Text17,{size:"xs",style:{marginTop:2},children:lastCommunication?formatDateTime2(lastCommunication.sent):""})]})]})})};import{jsx as jsx90,jsxs as jsxs52}from"react/jsx-runtime";var ChatList=props=>{let{threads,selectedCommunication,getThreadUri}=props;return jsx90(Stack17,{gap:0,children:threads.map(thread=>{let topicCommunication=thread[0],lastCommunication=thread[1],_isSelected=selectedCommunication?.id===topicCommunication.id;return jsxs52(Fragment29,{children:[jsx90(ChatListItem,{topic:topicCommunication,lastCommunication,isSelected:_isSelected,getThreadUri}),jsx90(Divider4,{})]},topicCommunication.id)})})};import{Button as Button9,Modal as Modal3,Stack as Stack21,Text as Text20,TextInput as TextInput20}from"@mantine/core";import{showNotification as showNotification6}from"@mantine/notifications";import{createReference as createReference6,HTTP_HL7_ORG as HTTP_HL7_ORG4,normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useMedplum as useMedplum25,useMedplumProfile as useMedplumProfile7}from"@medplum/react-hooks";import{useMemo as useMemo27,useState as useState53}from"react";import{Group as Group31,Stack as Stack20,Text as Text19,Title as Title7}from"@mantine/core";import{createReference as createReference5,getExtension as getExtension2,getReferenceString as getReferenceString6}from"@medplum/core";import{QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,useMedplum as useMedplum24,useQuestionnaireForm}from"@medplum/react-hooks";import{useCallback as useCallback12,useMemo as useMemo26,useRef as useRef15,useState as useState52}from"react";import{Button as Button7,Paper as Paper3}from"@mantine/core";import{createReference as createReference4,HTTP_HL7_ORG as HTTP_HL7_ORG2}from"@medplum/core";import{useMedplum as useMedplum22}from"@medplum/react-hooks";import{useEffect as useEffect15,useRef as useRef14}from"react";var Point=class{constructor(x,y,pressure,time){__publicField(this,"x");__publicField(this,"y");__publicField(this,"pressure");__publicField(this,"time");if(isNaN(x)||isNaN(y))throw new Error(`Point is invalid: (${x}, ${y})`);this.x=+x,this.y=+y,this.pressure=pressure||0,this.time=time||Date.now()}distanceTo(start){return Math.sqrt(Math.pow(this.x-start.x,2)+Math.pow(this.y-start.y,2))}equals(other){return this.x===other.x&&this.y===other.y&&this.pressure===other.pressure&&this.time===other.time}velocityFrom(start){return this.time!==start.time?this.distanceTo(start)/(this.time-start.time):0}},Bezier=class _Bezier{constructor(startPoint,control2,control1,endPoint,startWidth,endWidth){this.startPoint=startPoint,this.control2=control2,this.control1=control1,this.endPoint=endPoint,this.startWidth=startWidth,this.endWidth=endWidth}static fromPoints(points,widths){let c2=this.calculateControlPoints(points[0],points[1],points[2]).c2,c3=this.calculateControlPoints(points[1],points[2],points[3]).c1;return new _Bezier(points[1],c2,c3,points[2],widths.start,widths.end)}static calculateControlPoints(s1,s2,s3){let dx1=s1.x-s2.x,dy1=s1.y-s2.y,dx2=s2.x-s3.x,dy2=s2.y-s3.y,m1={x:(s1.x+s2.x)/2,y:(s1.y+s2.y)/2},m2={x:(s2.x+s3.x)/2,y:(s2.y+s3.y)/2},l1=Math.sqrt(dx1*dx1+dy1*dy1),l2=Math.sqrt(dx2*dx2+dy2*dy2),dxm=m1.x-m2.x,dym=m1.y-m2.y,k=l1+l2==0?0:l2/(l1+l2),cm={x:m2.x+dxm*k,y:m2.y+dym*k},tx=s2.x-cm.x,ty=s2.y-cm.y;return{c1:new Point(m1.x+tx,m1.y+ty),c2:new Point(m2.x+tx,m2.y+ty)}}length(){let length=0,px,py;for(let i=0;i<=10;i+=1){let t=i/10,cx=this.point(t,this.startPoint.x,this.control1.x,this.control2.x,this.endPoint.x),cy=this.point(t,this.startPoint.y,this.control1.y,this.control2.y,this.endPoint.y);if(i>0){let xdiff=cx-px,ydiff=cy-py;length+=Math.sqrt(xdiff*xdiff+ydiff*ydiff)}px=cx,py=cy}return length}point(t,start,c1,c2,end){return start*(1-t)*(1-t)*(1-t)+3*c1*(1-t)*(1-t)*t+3*c2*(1-t)*t*t+end*t*t*t}},SignatureEventTarget=class{constructor(){__publicField(this,"_et");try{this._et=new EventTarget}catch{this._et=document}}addEventListener(type,listener,options){this._et.addEventListener(type,listener,options)}dispatchEvent(event){return this._et.dispatchEvent(event)}removeEventListener(type,callback,options){this._et.removeEventListener(type,callback,options)}};function throttle(fn,wait=250){let previous=0,timeout=null,result,storedContext,storedArgs,later=()=>{previous=Date.now(),timeout=null,result=fn.apply(storedContext,storedArgs),timeout||(storedContext=null,storedArgs=[])};return function(...args){let now=Date.now(),remaining=wait-(now-previous);return storedContext=this,storedArgs=args,remaining<=0||remaining>wait?(timeout&&(clearTimeout(timeout),timeout=null),previous=now,result=fn.apply(storedContext,storedArgs),timeout||(storedContext=null,storedArgs=[])):timeout||(timeout=window.setTimeout(later,remaining)),result}}var SignaturePad=class _SignaturePad extends SignatureEventTarget{constructor(canvas,options={}){super();__publicField(this,"dotSize");__publicField(this,"minWidth");__publicField(this,"maxWidth");__publicField(this,"penColor");__publicField(this,"minDistance");__publicField(this,"velocityFilterWeight");__publicField(this,"compositeOperation");__publicField(this,"backgroundColor");__publicField(this,"throttle");__publicField(this,"canvasContextOptions");__publicField(this,"_ctx");__publicField(this,"_drawingStroke",!1);__publicField(this,"_isEmpty",!0);__publicField(this,"_dataUrl");__publicField(this,"_dataUrlOptions");__publicField(this,"_lastPoints",[]);__publicField(this,"_data",[]);__publicField(this,"_lastVelocity",0);__publicField(this,"_lastWidth",0);__publicField(this,"_strokeMoveUpdate");__publicField(this,"_strokePointerId");this.canvas=canvas,this.velocityFilterWeight=options.velocityFilterWeight||.7,this.minWidth=options.minWidth||.5,this.maxWidth=options.maxWidth||2.5,this.throttle=options.throttle??16,this.minDistance=options.minDistance??5,this.dotSize=options.dotSize||0,this.penColor=options.penColor||"black",this.backgroundColor=options.backgroundColor||"rgba(0,0,0,0)",this.compositeOperation=options.compositeOperation||"source-over",this.canvasContextOptions=options.canvasContextOptions??{},this._strokeMoveUpdate=this.throttle?throttle(_SignaturePad.prototype._strokeUpdate,this.throttle):_SignaturePad.prototype._strokeUpdate,this._handleMouseDown=this._handleMouseDown.bind(this),this._handleMouseMove=this._handleMouseMove.bind(this),this._handleMouseUp=this._handleMouseUp.bind(this),this._handleTouchStart=this._handleTouchStart.bind(this),this._handleTouchMove=this._handleTouchMove.bind(this),this._handleTouchEnd=this._handleTouchEnd.bind(this),this._handlePointerDown=this._handlePointerDown.bind(this),this._handlePointerMove=this._handlePointerMove.bind(this),this._handlePointerUp=this._handlePointerUp.bind(this),this._handlePointerCancel=this._handlePointerCancel.bind(this),this._handleTouchCancel=this._handleTouchCancel.bind(this),this._ctx=canvas.getContext("2d",this.canvasContextOptions),this.clear(),this.on()}clear(){let{_ctx:ctx,canvas}=this;ctx.fillStyle=this.backgroundColor,ctx.clearRect(0,0,canvas.width,canvas.height),ctx.fillRect(0,0,canvas.width,canvas.height),this._data=[],this._reset(this._getPointGroupOptions()),this._isEmpty=!0,this._dataUrl=void 0,this._dataUrlOptions=void 0,this._strokePointerId=void 0}redraw(){let data2=this._data,dataUrl=this._dataUrl,dataUrlOptions=this._dataUrlOptions;this.clear(),dataUrl&&this.fromDataURL(dataUrl,dataUrlOptions),this.fromData(data2,{clear:!1})}fromDataURL(dataUrl,options={}){return new Promise((resolve,reject)=>{let image=new Image,ratio=options.ratio||window.devicePixelRatio||1,width=options.width||this.canvas.width/ratio,height=options.height||this.canvas.height/ratio,xOffset=options.xOffset||0,yOffset=options.yOffset||0;this._reset(this._getPointGroupOptions()),image.onload=()=>{this._ctx.drawImage(image,xOffset,yOffset,width,height),resolve()},image.onerror=error=>{reject(error)},image.crossOrigin="anonymous",image.src=dataUrl,this._isEmpty=!1,this._dataUrl=dataUrl,this._dataUrlOptions={...options}})}toDataURL(type="image/png",encoderOptions){return type==="image/svg+xml"?(typeof encoderOptions!="object"&&(encoderOptions=void 0),`data:image/svg+xml;base64,${btoa(this.toSVG(encoderOptions))}`):(typeof encoderOptions!="number"&&(encoderOptions=void 0),this.canvas.toDataURL(type,encoderOptions))}on(){this.canvas.style.touchAction="none",this.canvas.style.msTouchAction="none",this.canvas.style.userSelect="none",this.canvas.style.webkitUserSelect="none";let isIOS=/Macintosh/.test(navigator.userAgent)&&"ontouchstart"in document;window.PointerEvent&&!isIOS?this._handlePointerEvents():(this._handleMouseEvents(),"ontouchstart"in window&&this._handleTouchEvents())}off(){this.canvas.style.touchAction="auto",this.canvas.style.msTouchAction="auto",this.canvas.style.userSelect="auto",this.canvas.style.webkitUserSelect="auto",this.canvas.removeEventListener("pointerdown",this._handlePointerDown),this.canvas.removeEventListener("mousedown",this._handleMouseDown),this.canvas.removeEventListener("touchstart",this._handleTouchStart),this._removeMoveUpEventListeners()}_getListenerFunctions(){let canvasWindow=window.document===this.canvas.ownerDocument?window:this.canvas.ownerDocument.defaultView??this.canvas.ownerDocument;return{addEventListener:canvasWindow.addEventListener.bind(canvasWindow),removeEventListener:canvasWindow.removeEventListener.bind(canvasWindow)}}_removeMoveUpEventListeners(){let{removeEventListener}=this._getListenerFunctions();removeEventListener("pointermove",this._handlePointerMove),removeEventListener("pointerup",this._handlePointerUp),removeEventListener("pointercancel",this._handlePointerCancel),removeEventListener("mousemove",this._handleMouseMove),removeEventListener("mouseup",this._handleMouseUp),removeEventListener("touchmove",this._handleTouchMove),removeEventListener("touchend",this._handleTouchEnd),removeEventListener("touchcancel",this._handleTouchCancel)}isEmpty(){return this._isEmpty}fromData(pointGroups,{clear=!0}={}){clear&&this.clear(),this._fromData(pointGroups,this._drawCurve.bind(this),this._drawDot.bind(this)),this._data=this._data.concat(pointGroups)}toData(){return this._data}_isLeftButtonPressed(event,only){return only?event.buttons===1:(event.buttons&1)===1}_pointerEventToSignatureEvent(event){return{event,type:event.type,x:event.clientX,y:event.clientY,pressure:"pressure"in event?event.pressure:0}}_touchEventToSignatureEvent(event){let touch=event.changedTouches[0];return{event,type:event.type,x:touch.clientX,y:touch.clientY,pressure:touch.force}}_handleMouseDown(event){!this._isLeftButtonPressed(event,!0)||this._drawingStroke||this._strokeBegin(this._pointerEventToSignatureEvent(event))}_handleMouseMove(event){if(!this._isLeftButtonPressed(event,!0)||!this._drawingStroke){this._strokeEnd(this._pointerEventToSignatureEvent(event),!1);return}this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event))}_handleMouseUp(event){this._isLeftButtonPressed(event)||this._strokeEnd(this._pointerEventToSignatureEvent(event))}_handleTouchStart(event){event.targetTouches.length!==1||this._drawingStroke||(event.cancelable&&event.preventDefault(),this._strokeBegin(this._touchEventToSignatureEvent(event)))}_handleTouchMove(event){if(event.targetTouches.length===1){if(event.cancelable&&event.preventDefault(),!this._drawingStroke){this._strokeEnd(this._touchEventToSignatureEvent(event),!1);return}this._strokeMoveUpdate(this._touchEventToSignatureEvent(event))}}_handleTouchEnd(event){event.targetTouches.length===0&&(event.cancelable&&event.preventDefault(),this._strokeEnd(this._touchEventToSignatureEvent(event)))}_handlePointerCancel(event){this._allowPointerId(event)&&(event.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(event),!1))}_handleTouchCancel(event){event.cancelable&&event.preventDefault(),this._strokeEnd(this._touchEventToSignatureEvent(event),!1)}_getPointerId(event){return event.persistentDeviceId||event.pointerId}_allowPointerId(event,allowUndefined=!1){return typeof this._strokePointerId>"u"?allowUndefined:this._getPointerId(event)===this._strokePointerId}_handlePointerDown(event){this._drawingStroke||!this._isLeftButtonPressed(event)||!this._allowPointerId(event,!0)||(this._strokePointerId=this._getPointerId(event),event.preventDefault(),this._strokeBegin(this._pointerEventToSignatureEvent(event)))}_handlePointerMove(event){if(this._allowPointerId(event)){if(!this._isLeftButtonPressed(event,!0)||!this._drawingStroke){this._strokeEnd(this._pointerEventToSignatureEvent(event),!1);return}event.preventDefault(),this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event))}}_handlePointerUp(event){this._isLeftButtonPressed(event)||!this._allowPointerId(event)||(event.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(event)))}_getPointGroupOptions(group){return{penColor:group&&"penColor"in group?group.penColor:this.penColor,dotSize:group&&"dotSize"in group?group.dotSize:this.dotSize,minWidth:group&&"minWidth"in group?group.minWidth:this.minWidth,maxWidth:group&&"maxWidth"in group?group.maxWidth:this.maxWidth,velocityFilterWeight:group&&"velocityFilterWeight"in group?group.velocityFilterWeight:this.velocityFilterWeight,compositeOperation:group&&"compositeOperation"in group?group.compositeOperation:this.compositeOperation}}_strokeBegin(event){if(!this.dispatchEvent(new CustomEvent("beginStroke",{detail:event,cancelable:!0})))return;let{addEventListener}=this._getListenerFunctions();switch(event.event.type){case"mousedown":addEventListener("mousemove",this._handleMouseMove,{passive:!1}),addEventListener("mouseup",this._handleMouseUp,{passive:!1});break;case"touchstart":addEventListener("touchmove",this._handleTouchMove,{passive:!1}),addEventListener("touchend",this._handleTouchEnd,{passive:!1}),addEventListener("touchcancel",this._handleTouchCancel,{passive:!1});break;case"pointerdown":addEventListener("pointermove",this._handlePointerMove,{passive:!1}),addEventListener("pointerup",this._handlePointerUp,{passive:!1}),addEventListener("pointercancel",this._handlePointerCancel,{passive:!1});break;default:}this._drawingStroke=!0;let pointGroupOptions=this._getPointGroupOptions(),newPointGroup={...pointGroupOptions,points:[]};this._data.push(newPointGroup),this._reset(pointGroupOptions),this._strokeUpdate(event)}_strokeUpdate(event){if(!this._drawingStroke)return;if(this._data.length===0){this._strokeBegin(event);return}this.dispatchEvent(new CustomEvent("beforeUpdateStroke",{detail:event}));let point=this._createPoint(event.x,event.y,event.pressure),lastPointGroup=this._data[this._data.length-1],lastPoints=lastPointGroup.points,lastPoint=lastPoints.length>0&&lastPoints[lastPoints.length-1],isLastPointTooClose=lastPoint?point.distanceTo(lastPoint)<=this.minDistance:!1,pointGroupOptions=this._getPointGroupOptions(lastPointGroup);if(!lastPoint||!(lastPoint&&isLastPointTooClose)){let curve=this._addPoint(point,pointGroupOptions);lastPoint?curve&&this._drawCurve(curve,pointGroupOptions):this._drawDot(point,pointGroupOptions),lastPoints.push({time:point.time,x:point.x,y:point.y,pressure:point.pressure})}this.dispatchEvent(new CustomEvent("afterUpdateStroke",{detail:event}))}_strokeEnd(event,shouldUpdate=!0){this._removeMoveUpEventListeners(),this._drawingStroke&&(shouldUpdate&&this._strokeUpdate(event),this._drawingStroke=!1,this._strokePointerId=void 0,this.dispatchEvent(new CustomEvent("endStroke",{detail:event})))}_handlePointerEvents(){this._drawingStroke=!1,this.canvas.addEventListener("pointerdown",this._handlePointerDown,{passive:!1})}_handleMouseEvents(){this._drawingStroke=!1,this.canvas.addEventListener("mousedown",this._handleMouseDown,{passive:!1})}_handleTouchEvents(){this.canvas.addEventListener("touchstart",this._handleTouchStart,{passive:!1})}_reset(options){this._lastPoints=[],this._lastVelocity=0,this._lastWidth=(options.minWidth+options.maxWidth)/2,this._ctx.fillStyle=options.penColor,this._ctx.globalCompositeOperation=options.compositeOperation}_createPoint(x,y,pressure){let rect=this.canvas.getBoundingClientRect();return new Point(x-rect.left,y-rect.top,pressure,new Date().getTime())}_addPoint(point,options){let{_lastPoints}=this;if(_lastPoints.push(point),_lastPoints.length>2){_lastPoints.length===3&&_lastPoints.unshift(_lastPoints[0]);let widths=this._calculateCurveWidths(_lastPoints[1],_lastPoints[2],options),curve=Bezier.fromPoints(_lastPoints,widths);return _lastPoints.shift(),curve}return null}_calculateCurveWidths(startPoint,endPoint,options){let velocity=options.velocityFilterWeight*endPoint.velocityFrom(startPoint)+(1-options.velocityFilterWeight)*this._lastVelocity,newWidth=this._strokeWidth(velocity,options),widths={end:newWidth,start:this._lastWidth};return this._lastVelocity=velocity,this._lastWidth=newWidth,widths}_strokeWidth(velocity,options){return Math.max(options.maxWidth/(velocity+1),options.minWidth)}_drawCurveSegment(x,y,width){let ctx=this._ctx;ctx.moveTo(x,y),ctx.arc(x,y,width,0,2*Math.PI,!1),this._isEmpty=!1}_drawCurve(curve,options){let ctx=this._ctx,widthDelta=curve.endWidth-curve.startWidth,drawSteps=Math.ceil(curve.length())*2;ctx.beginPath(),ctx.fillStyle=options.penColor;for(let i=0;i<drawSteps;i+=1){let t=i/drawSteps,tt=t*t,ttt=tt*t,u=1-t,uu=u*u,uuu=uu*u,x=uuu*curve.startPoint.x;x+=3*uu*t*curve.control1.x,x+=3*u*tt*curve.control2.x,x+=ttt*curve.endPoint.x;let y=uuu*curve.startPoint.y;y+=3*uu*t*curve.control1.y,y+=3*u*tt*curve.control2.y,y+=ttt*curve.endPoint.y;let width=Math.min(curve.startWidth+ttt*widthDelta,options.maxWidth);this._drawCurveSegment(x,y,width)}ctx.closePath(),ctx.fill()}_drawDot(point,options){let ctx=this._ctx,width=options.dotSize>0?options.dotSize:(options.minWidth+options.maxWidth)/2;ctx.beginPath(),this._drawCurveSegment(point.x,point.y,width),ctx.closePath(),ctx.fillStyle=options.penColor,ctx.fill()}_fromData(pointGroups,drawCurve,drawDot){for(let group of pointGroups){let{points}=group,pointGroupOptions=this._getPointGroupOptions(group);if(points.length>1)for(let j=0;j<points.length;j+=1){let basicPoint=points[j],point=new Point(basicPoint.x,basicPoint.y,basicPoint.pressure,basicPoint.time);j===0&&this._reset(pointGroupOptions);let curve=this._addPoint(point,pointGroupOptions);curve&&drawCurve(curve,pointGroupOptions)}else this._reset(pointGroupOptions),drawDot(points[0],pointGroupOptions)}}toSVG({includeBackgroundColor=!1,includeDataUrl=!1}={}){let pointGroups=this._data,ratio=Math.max(window.devicePixelRatio||1,1),minX=0,minY=0,maxX=this.canvas.width/ratio,maxY=this.canvas.height/ratio,svg=document.createElementNS("http://www.w3.org/2000/svg","svg");if(svg.setAttribute("xmlns","http://www.w3.org/2000/svg"),svg.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink"),svg.setAttribute("viewBox",`${minX} ${minY} ${maxX} ${maxY}`),svg.setAttribute("width",maxX.toString()),svg.setAttribute("height",maxY.toString()),includeBackgroundColor&&this.backgroundColor){let rect=document.createElement("rect");rect.setAttribute("width","100%"),rect.setAttribute("height","100%"),rect.setAttribute("fill",this.backgroundColor),svg.appendChild(rect)}if(includeDataUrl&&this._dataUrl){let ratio2=this._dataUrlOptions?.ratio||window.devicePixelRatio||1,width=this._dataUrlOptions?.width||this.canvas.width/ratio2,height=this._dataUrlOptions?.height||this.canvas.height/ratio2,xOffset=this._dataUrlOptions?.xOffset||0,yOffset=this._dataUrlOptions?.yOffset||0,image=document.createElement("image");image.setAttribute("x",xOffset.toString()),image.setAttribute("y",yOffset.toString()),image.setAttribute("width",width.toString()),image.setAttribute("height",height.toString()),image.setAttribute("preserveAspectRatio","none"),image.setAttribute("href",this._dataUrl),svg.appendChild(image)}return this._fromData(pointGroups,(curve,{penColor})=>{let path=document.createElement("path");if(!isNaN(curve.control1.x)&&!isNaN(curve.control1.y)&&!isNaN(curve.control2.x)&&!isNaN(curve.control2.y)){let attr=`M ${curve.startPoint.x.toFixed(3)},${curve.startPoint.y.toFixed(3)} C ${curve.control1.x.toFixed(3)},${curve.control1.y.toFixed(3)} ${curve.control2.x.toFixed(3)},${curve.control2.y.toFixed(3)} ${curve.endPoint.x.toFixed(3)},${curve.endPoint.y.toFixed(3)}`;path.setAttribute("d",attr),path.setAttribute("stroke-width",(curve.endWidth*2.25).toFixed(3)),path.setAttribute("stroke",penColor),path.setAttribute("fill","none"),path.setAttribute("stroke-linecap","round"),svg.appendChild(path)}},(point,{penColor,dotSize,minWidth,maxWidth})=>{let circle=document.createElement("circle"),size=dotSize>0?dotSize:(minWidth+maxWidth)/2;circle.setAttribute("r",size.toString()),circle.setAttribute("cx",point.x.toString()),circle.setAttribute("cy",point.y.toString()),circle.setAttribute("fill",penColor),svg.appendChild(circle)}),svg.outerHTML}};import{jsx as jsx91,jsxs as jsxs53}from"react/jsx-runtime";function SignatureInput(props){let medplum=useMedplum22(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=useRef14(null),signaturePadRef=useRef14(null),onChangeRef=useRef14(onChange);return onChangeRef.current=onChange,useEffect15(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:HTTP_HL7_ORG2+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??createReference4(medplum.getProfile()),data:signaturePadRef.current?.toDataURL().split(",")[1]})}if(canvasRef.current){let signaturePad=new SignaturePad(canvasRef.current);defaultValue2?.data&&signaturePad.fromDataURL(defaultValue2.data).catch(console.error),signaturePad.addEventListener("endStroke",handleEndStroke),signaturePadRef.current=signaturePad}return()=>{signaturePadRef.current&&signaturePadRef.current.removeEventListener("beginStroke",handleEndStroke)}},[medplum,defaultValue2,who]),jsxs53(Paper3,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[jsx91("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),jsx91(Button7,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:jsx91(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}import{Stack as Stack19}from"@mantine/core";import{isQuestionEnabled,QuestionnaireItemType as QuestionnaireItemType3}from"@medplum/react-hooks";import{Title as Title6}from"@mantine/core";import{jsx as jsx92,jsxs as jsxs54}from"react/jsx-runtime";function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return jsxs54("div",{children:[props.item.text&&jsx92(Title6,{order:3,mb:"md",children:props.item.text}),jsx92(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}import{Checkbox as Checkbox5,Group as Group29,MultiSelect,NativeSelect as NativeSelect10,Radio,Text as Text18,Textarea as Textarea3,TextInput as TextInput19}from"@mantine/core";import{capitalize as capitalize3,deepEquals,formatCoding as formatCoding2,getElementDefinition,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG3,stringify as stringify2,typedValueToString}from"@medplum/core";import{getItemAnswerOptionValue,getItemInitialValue,getNewMultiSelectValues,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,QUESTIONNAIRE_ITEM_CONTROL_URL,QuestionnaireItemType,useMedplum as useMedplum23}from"@medplum/react-hooks";import{useEffect as useEffect16,useState as useState51}from"react";import{Fragment as Fragment30,jsx as jsx93,jsxs as jsxs55}from"react/jsx-runtime";var MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS=30,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS=50;function QuestionnaireFormItem(props){let formState=props.formState,item=props.item,response=props.responseItem;function onChangeAnswer(newResponseAnswer){if(formState&&props.context)if(item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice){let updatedAnswers=[...response.answer||[]];newResponseAnswer.length===0?updatedAnswers.splice(props.index,1):updatedAnswers[props.index]=newResponseAnswer[0],formState.onChangeAnswer(props.context,props.item,updatedAnswers)}else formState.onChangeAnswer(props.context,props.item,newResponseAnswer)}let type=item.type;if(!type)return null;let name=item.linkId;if(!name)return null;let inputId=item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice?`${name}-${props.index}`:name,initial;item.initial&&item.initial.length>0?initial=item.initial[0]:item.answerOption&&item.answerOption.length>0&&(initial=item.answerOption.find(option=>option.initialSelected));let defaultValue2=getCurrentAnswer(response,props.index)??getItemInitialValue(initial),validationError=getExtension(response,`${HTTP_HL7_ORG3}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx93("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx93(CheckboxFormSection,{title:props.item.text,htmlFor:inputId,children:jsx93(Checkbox5,{id:inputId,name,required:props.required??item.required,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueBoolean:e.currentTarget.checked}])})},props.item.linkId);break;case QuestionnaireItemType.decimal:formComponent=jsx93(TextInput19,{type:"number",step:"any",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueDecimal:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.integer:formComponent=jsx93(TextInput19,{type:"number",step:1,id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueInteger:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.date:formComponent=jsx93(TextInput19,{type:"date",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueDate:e.currentTarget.value}])});break;case QuestionnaireItemType.dateTime:formComponent=jsx93(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case QuestionnaireItemType.time:formComponent=jsx93(TextInput19,{type:"time",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueTime:e.currentTarget.value}])});break;case QuestionnaireItemType.string:case QuestionnaireItemType.url:formComponent=jsx93(TextInput19,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.text:formComponent=jsx93(Textarea3,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.attachment:formComponent=jsx93(Group29,{py:4,children:jsx93(AttachmentInput,{path:"",name:inputId,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case QuestionnaireItemType.reference:formComponent=jsx93(ReferenceInput,{name:inputId,required:props.required??item.required,targetTypes:getQuestionnaireItemReferenceTargetTypes(item),searchCriteria:getQuestionnaireItemReferenceFilter(item,formState?.subject,formState?.encounter),defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueReference:newValue}])});break;case QuestionnaireItemType.quantity:formComponent=jsx93(QuantityInput,{path:"",name:inputId,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueQuantity:newValue}]),disableWheel:!0});break;case QuestionnaireItemType.choice:case QuestionnaireItemType.openChoice:isCheckboxChoice(item)?formComponent=jsx93(QuestionnaireCheckboxInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):isDropdownChoice(item)||item.answerValueSet&&!isRadiobuttonChoice(item)?formComponent=jsx93(QuestionnaireDropdownInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):formComponent=jsx93(QuestionnaireRadioButtonInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)});break;default:return null}return jsxs55(Fragment30,{children:[formComponent,validationError?.valueString&&jsx93(Text18,{c:"red",size:"lg",mt:4,children:validationError.valueString})]})}function QuestionnaireDropdownInput(props){let{name,item,required,initial,onChangeAnswer,response}=props;if(!item.answerOption?.length&&!item.answerValueSet)return jsx93(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||isMultiSelectChoice(item);if(item.answerValueSet)return jsx93(ValueSetAutocomplete,{name,placeholder:"Select items",binding:item.answerValueSet,maxValues:isMultiSelect?void 0:1,required,onChange:values=>{isMultiSelect?values.length===0?onChangeAnswer([{}]):onChangeAnswer(values.map(coding=>({valueCoding:coding}))):onChangeAnswer([{valueCoding:values[0]}])},defaultValue:defaultValue2?.value});if(isMultiSelect){let{propertyName,data:data2}=formatSelectData(item);return jsx93(MultiSelect,{data:data2,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[typedValueToString(initialValue)],required,onChange:selected=>{if(selected.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(selected,propertyName,item);onChangeAnswer(values)}}})}else{let data2=[""];if(item.answerOption)for(let option of item.answerOption){let optionValue=getItemAnswerOptionValue(option);data2.push(typedValueToString(optionValue))}return jsx93(NativeSelect10,{id:name,name,required,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){onChangeAnswer([{}]);return}let option=item.answerOption[index-1],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize3(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])},defaultValue:formatCoding2(defaultValue2?.value)||defaultValue2?.value,data:data2})}}function getValueSetOptions(valueSetUrl,medplum){return valueSetUrl?medplum.valueSetExpand({url:valueSetUrl,count:MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS+1}).then(valueSet=>valueSet.expansion?.contains??[]):Promise.resolve([])}function useValueSetOptions(valueSetUrl){let medplum=useMedplum23(),[valueSetOptions,setValueSetOptions]=useState51([]),[isLoading,setIsLoading]=useState51(!1);return useEffect16(()=>{async function loadValueSet(){if(valueSetUrl){setIsLoading(!0);try{let options=await getValueSetOptions(valueSetUrl,medplum);setValueSetOptions(options)}catch(err){console.error("Error loading value set:",err)}finally{setIsLoading(!1)}}}loadValueSet().catch(console.error)},[valueSetUrl,medplum]),[valueSetOptions,isLoading]}function getOptionsFromValueSet(valueSetOptions,name){return valueSetOptions.map((option,i)=>{let optionName=`${name}-valueset-${i}`,optionValue={type:"Coding",value:{system:option.system,code:option.code,display:option.display}};return[optionName,optionValue]})}function QuestionnaireRadioButtonInput(props){let{name,item,required,initial,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition("QuestionnaireItemAnswerOption","value[x]"),initialValue=getItemInitialValue(initial),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),options=[],defaultValue2;if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?(initialValue&&stringify2(optionValue)===stringify2(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return jsx93(Text18,{children:"Loading options..."});if(options.length===0)return jsx93(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs55(Fragment30,{children:[jsx93(Radio.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+capitalize3(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>jsx93(Radio,{id:optionName,value:optionName,py:4,required,label:jsx93(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)&&jsxs55(Text18,{size:"sm",c:"dimmed",mt:"xs",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function QuestionnaireCheckboxInput(props){let{name,item,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition("QuestionnaireItemAnswerOption","value[x]"),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),initialSelectedValues=item.answerValueSet?(response?.answer?.map(a=>a.valueCoding)||[]).filter(c=>c!==void 0):getCurrentMultiSelectAnswer(response),[selectedValues,setSelectedValues]=useState51(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 jsx93(Text18,{children:"Loading options..."});if(options.length===0)return jsx93(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS),handleCheckboxChange=(optionValue,selected)=>{if(item.answerValueSet){let currentCodings=selectedValues,newCodings;selected?newCodings=[...currentCodings,optionValue.value]:newCodings=currentCodings.filter(c=>!deepEquals(c,optionValue.value)),setSelectedValues(newCodings),newCodings.length===0?onChangeAnswer([{}]):onChangeAnswer(newCodings.map(coding=>({valueCoding:coding})))}else{let currentValues=selectedValues,optionValueStr=typedValueToString(optionValue),newValues;if(selected?newValues=[...currentValues,optionValueStr]:newValues=currentValues.filter(v=>v!==optionValueStr),setSelectedValues(newValues),newValues.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(newValues,"value"+capitalize3(optionValue.type),item);onChangeAnswer(values)}}};return jsxs55(Group29,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=typedValueToString(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>deepEquals(coding,optionValue.value)):selectedValues.includes(optionValueStr);return jsx93(Checkbox5,{id:optionName,label:jsx93(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)&&jsxs55(Text18,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx93(TextInput19,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){return getItemAnswerOptionValue(response?.answer?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response?.answer;return results?results.map(a=>getItemAnswerOptionValue(a)).map(type=>formatCoding2(type?.value)||type?.value).filter(Boolean):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals(option[1].value,defaultAnswer?.value))?.[0]}function hasChoiceType(item,type){return!!item.extension?.some(e=>e.url===QUESTIONNAIRE_ITEM_CONTROL_URL&&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"+capitalize3(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}import{Anchor as Anchor7}from"@mantine/core";import{Fragment as Fragment31,jsx as jsx94,jsxs as jsxs56}from"react/jsx-runtime";function QuestionnaireFormRepeatableGroup(props){return jsxs56(Fragment31,{children:[props.responseItems.map(response=>jsx94(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),jsx94(Anchor7,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}import{Anchor as Anchor8,Stack as Stack18}from"@mantine/core";import{QuestionnaireItemType as QuestionnaireItemType2}from"@medplum/react-hooks";import{jsx as jsx95,jsxs as jsxs57}from"react/jsx-runtime";function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,showAddButton=item.type!==QuestionnaireItemType2.choice&&item.type!==QuestionnaireItemType2.openChoice,answers=responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return jsxs57(FormSection,{title:props.item.text,withAsterisk:props.item.required,children:[jsx95(Stack18,{gap:"xs",children:answers?.map((_,index)=>jsx95(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&jsx95(Anchor8,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}import{jsx as jsx96}from"react/jsx-runtime";function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props;return jsx96(Stack19,{children:items.map((item,index)=>{if(!isQuestionEnabled(item,formState.questionnaireResponse))return null;if(item.type===QuestionnaireItemType3.display)return jsx96("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===QuestionnaireItemType3.group&&item.repeats?jsx96(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems},`repeating-group-${item.id}-${index}`):item.type===QuestionnaireItemType3.group?jsx96(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]},`group-${item.id}-${index}`):item.type===QuestionnaireItemType3.boolean?jsx96(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?jsx96(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):jsx96(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:jsx96(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}import{Button as Button8,Group as Group30,Stepper}from"@mantine/core";import{Fragment as Fragment32,jsx as jsx97,jsxs as jsxs58}from"react/jsx-runtime";function QuestionnaireFormStepper(props){let{formState,submitButtonText,excludeButtons,children}=props,pages=formState.pages,activePage=formState.activePage,showBackButton=activePage>0,showNextButton=activePage<pages.length-1,showSubmitButton=activePage===pages.length-1;return jsxs58(Fragment32,{children:[jsx97(Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>jsx97(Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&jsxs58(Group30,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx97(Button8,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&jsx97(Button8,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&jsx97(SubmitButton,{children:submitButtonText??"Submit"})]})]})}import{Fragment as Fragment33,jsx as jsx98,jsxs as jsxs59}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum24(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=useState52(!1),propsRef=useRef15(props);propsRef.current=props;let onFormChange=useCallback12(response=>{setSignatureRequiredSubmitted(!1),propsRef.current.onChange?.(response)},[]),formState=useQuestionnaireForm({questionnaire:props.questionnaire,defaultValue:props.questionnaireResponse,subject:props.subject,encounter:props.encounter,source:props.source,disablePagination:props.disablePagination,onChange:onFormChange}),formStateRef=useRef15(formState);formStateRef.current=formState;let isSignatureRequired=useMemo26(()=>formState.loading?!1:!!getExtension2(formState.questionnaire,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=useMemo26(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=useCallback12(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire2=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=createReference5(profile))}onSubmit({...response,questionnaire:questionnaire2.url??getReferenceString6(questionnaire2),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:jsxs59(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&jsx98(Title7,{children:formState.questionnaire.title}),formState.pagination?jsx98(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:jsx98(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):jsxs59(Fragment33,{children:[jsx98(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&jsxs59(Stack20,{mt:"md",gap:0,children:[jsx98(Text19,{size:"sm",fw:500,children:"Signature"}),jsx98(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&jsx98(Text19,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&jsx98(Group31,{justify:"flex-end",mt:"xl",gap:"xs",children:jsx98(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}import{jsx as jsx99,jsxs as jsxs60}from"react/jsx-runtime";var NewTopicDialog=props=>{let{subject,opened,onClose,onSubmit}=props,medplum=useMedplum25(),profile=useMedplumProfile7(),profileRef=useMemo27(()=>profile?createReference6(profile):void 0,[profile]),[topic,setTopic]=useState53(""),[practitioners,setPractitioners]=useState53(profile?.resourceType==="Practitioner"?[createReference6(profile)]:[]),[patient,setPatient]=useState53(subject?createReference6(subject):void 0),initialResponse=useMemo27(()=>{if(profile?.resourceType==="Practitioner")return{resourceType:"QuestionnaireResponse",status:"in-progress",item:[{linkId:"q1",answer:[{valueReference:createReference6(profile)}]}]}},[profile]);return jsx99(Modal3,{opened,onClose,title:"New Message",size:"md",children:jsxs60(Stack21,{gap:"xl",children:[jsxs60(Stack21,{gap:0,children:[jsx99(Text20,{fw:500,children:"Patient"}),jsx99(Text20,{c:"dimmed",children:"Select a patient"}),jsx99(ResourceInput,{resourceType:"Patient",name:"patient",required:!0,defaultValue:patient,onChange:value=>{setPatient(value?createReference6(value):void 0)}})]}),jsxs60(Stack21,{gap:0,children:[jsx99(Text20,{fw:500,children:"Practitioner (optional)"}),jsx99(Text20,{c:"dimmed",children:"Select one or more practitioners"}),jsx99(QuestionnaireForm,{questionnaire,questionnaireResponse:initialResponse,excludeButtons:!0,onChange:value=>{let references=value.item?.[0].answer?.map(item=>item.valueReference).filter(ref=>ref!==void 0)??[];setPractitioners(references)}})]}),jsxs60(Stack21,{gap:0,children:[jsx99(Text20,{fw:500,children:"Topic (optional)"}),jsx99(Text20,{c:"dimmed",children:"Enter a topic for the message"}),jsx99(TextInput20,{placeholder:"Enter your topic",value:topic,onChange:e=>setTopic(e.target.value)})]}),jsx99(Button9,{onClick:async()=>{if(!patient){showNotification6({title:"Error",message:"Please select a patient",color:"red"});return}let communication={resourceType:"Communication",status:"in-progress",subject:patient,sender:profileRef,recipient:[patient,...practitioners.map(practitioner=>({reference:practitioner.reference}))],topic:{text:topic}};try{let createdCommunication=await medplum.createResource(communication);onSubmit?.(createdCommunication),onClose()}catch(error){showNotification6({title:"Error",message:normalizeErrorString7(error),color:"red"})}},children:"Next"})]})})},questionnaire={resourceType:"Questionnaire",status:"active",item:[{linkId:"q1",type:"reference",repeats:!0,extension:[{url:`${HTTP_HL7_ORG4}/fhir/StructureDefinition/questionnaire-referenceResource`,valueCodeableConcept:{coding:[{system:`${HTTP_HL7_ORG4}/fhir/fhir-types`,display:"Practitioner",code:"Practitioner"}]}}]}]};import{ActionIcon as ActionIcon9,Checkbox as Checkbox6,CloseButton,Group as Group32,Popover,Stack as Stack22,Text as Text21,TextInput as TextInput21}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback2,useDisclosure}from"@mantine/hooks";import{showNotification as showNotification7}from"@mantine/notifications";import{createReference as createReference7,formatHumanName as formatHumanName7,getReferenceString as getReferenceString7,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useMedplum as useMedplum26,useMedplumProfile as useMedplumProfile8,useResource as useResource5}from"@medplum/react-hooks";import{useEffect as useEffect17,useMemo as useMemo28,useState as useState54}from"react";var ParticipantFilter_default={participantItem:"ParticipantFilter_participantItem"};import{jsx as jsx100,jsxs as jsxs61}from"react/jsx-runtime";function ParticipantFilter(props){let{selectedParticipants,onFilterChange}=props,[opened,{open,close}]=useDisclosure(!1),[searchQuery,setSearchQuery]=useState54(""),[searchResults,setSearchResults]=useState54([]),[isSearching,setIsSearching]=useState54(!1),[additionalParticipants,setAdditionalParticipants]=useState54([]),medplum=useMedplum26(),profile=useMedplumProfile8(),currentUserParticipant=useMemo28(()=>{if(profile)return createReference7(profile)},[profile]);useEffect17(()=>{let currentUserRef=currentUserParticipant?.reference,filtered=selectedParticipants.filter(p=>p.reference!==currentUserRef);setAdditionalParticipants(filtered)},[selectedParticipants,currentUserParticipant]);let debouncedSearch=useDebouncedCallback2(async query=>{if(!query.trim()){setSearchResults([]);return}setIsSearching(!0);try{let bundle=await medplum.search("Patient",{_type:"Patient,Practitioner",name:query,_count:"10"}),currentUserRef=currentUserParticipant?.reference,results=(bundle.entry??[]).map(entry=>entry.resource).filter(resource=>{if(!resource)return!1;let refString=getReferenceString7(resource);return!!refString&&refString!==currentUserRef}).map(resource=>createReference7(resource));setSearchResults(results)}catch(error){showNotification7({title:"Error",message:normalizeErrorString8(error),color:"red"}),setSearchResults([])}finally{setIsSearching(!1)}},300);useEffect17(()=>{debouncedSearch(searchQuery)},[searchQuery,debouncedSearch]);let isSelected=participant=>selectedParticipants.some(p=>p.reference===participant.reference),toggleParticipant=participant=>{let newParticipants=isSelected(participant)?selectedParticipants.filter(p=>p.reference!==participant.reference):[...selectedParticipants,participant];onFilterChange(newParticipants)},removeParticipant=participant=>{let newParticipants=selectedParticipants.filter(p=>p.reference!==participant.reference);onFilterChange(newParticipants)},displayParticipants=useMemo28(()=>{let result=[];for(let p of additionalParticipants)result.some(r2=>r2.reference===p.reference)||result.push(p);if(searchQuery.trim()&&searchResults.length>0)for(let p of searchResults)currentUserParticipant?.reference!==p.reference&&(result.some(r2=>r2.reference===p.reference)||result.push(p));return result},[additionalParticipants,searchQuery,searchResults,currentUserParticipant]),hasActiveFilter=selectedParticipants.length>0;return jsxs61(Popover,{opened,onChange:o=>!o&&close(),position:"bottom-start",width:360,shadow:"md",withinPortal:!0,children:[jsx100(Popover.Target,{children:jsx100(ActionIcon9,{variant:hasActiveFilter?"filled":"light",color:hasActiveFilter?"blue":"gray",onClick:opened?close:open,radius:"xl",size:"lg",children:jsx100(IconUsers,{size:18})})}),jsx100(Popover.Dropdown,{p:"md",children:jsxs61(Stack22,{gap:"md",children:[jsx100(Text21,{fw:600,size:"sm",children:"Message Participants"}),jsx100(TextInput21,{placeholder:"Search for a Patient or Practitioner...",value:searchQuery,autoFocus:!0,onChange:e=>setSearchQuery(e.target.value),rightSection:searchQuery?jsx100(CloseButton,{size:"sm",onClick:()=>setSearchQuery("")}):null}),jsxs61(Stack22,{gap:"xs",mah:250,style:{overflowY:"auto"},children:[currentUserParticipant&&jsx100(ParticipantItem,{participant:currentUserParticipant,isSelected:isSelected(currentUserParticipant),isCurrentUser:!0,onToggle:()=>toggleParticipant(currentUserParticipant)}),displayParticipants.map(participant=>jsx100(ParticipantItem,{participant,isSelected:isSelected(participant),isCurrentUser:!1,onToggle:()=>toggleParticipant(participant),onRemove:isSelected(participant)?()=>removeParticipant(participant):void 0},participant.reference)),isSearching&&jsx100(Text21,{size:"sm",c:"dimmed",ta:"center",children:"Searching..."}),searchQuery.trim()&&!isSearching&&searchResults.length===0&&jsx100(Text21,{size:"sm",c:"dimmed",ta:"center",children:"No results found"})]})]})})]})}function ParticipantItem(props){let{participant,isSelected,isCurrentUser,onToggle,onRemove}=props,patientResource=useResource5(participant);return patientResource?jsxs61(Group32,{justify:"space-between",wrap:"nowrap",className:ParticipantFilter_default.participantItem,children:[jsxs61(Group32,{gap:"sm",wrap:"nowrap",style:{flex:1,minWidth:0},children:[jsx100(Checkbox6,{checked:isSelected,onChange:onToggle}),jsx100(ResourceAvatar,{value:participant,radius:"xl",size:32}),jsxs61(Text21,{size:"sm",truncate:!0,style:{flex:1},children:[formatHumanName7(patientResource?.name?.[0]??{}),isCurrentUser&&jsxs61(Text21,{component:"span",c:"dimmed",size:"sm",children:[" ","(you)"]})]})]}),onRemove&&jsx100(CloseButton,{size:"sm",onClick:onRemove})]}):null}import{ActionIcon as ActionIcon12,Box as Box18,Button as Button10,Center as Center3,Divider as Divider6,Flex as Flex16,Group as Group50,Menu as Menu4,Pagination,Paper as Paper4,ScrollArea as ScrollArea3,Skeleton as Skeleton2,Stack as Stack32,Text as Text36,ThemeIcon}from"@mantine/core";import{useDisclosure as useDisclosure10}from"@mantine/hooks";import{showNotification as showNotification8}from"@mantine/notifications";import{getReferenceString as getReferenceString9,normalizeErrorString as normalizeErrorString10,Operator,parseSearchRequest}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate5,useThreadInbox}from"@medplum/react-hooks";import{useCallback as useCallback23,useEffect as useEffect21,useMemo as useMemo31}from"react";import{Divider as Divider5,Flex as Flex15,Group as Group49,Stack as Stack31,Text as Text35,Tooltip as Tooltip5}from"@mantine/core";import{calculateAgeString,formatAddress as formatAddress3,formatHumanName as formatHumanName8,resolveId}from"@medplum/core";import{useMedplum as useMedplum35,useResource as useResource10}from"@medplum/react-hooks";import{useEffect as useEffect20,useState as useState69}from"react";import{Box as Box10,Flex as Flex8,Group as Group35,Modal as Modal4,Text as Text23}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{getDisplayString as getDisplayString5}from"@medplum/core";import{useMedplum as useMedplum27}from"@medplum/react-hooks";import{useCallback as useCallback14,useMemo as useMemo29,useState as useState57}from"react";import{Badge}from"@mantine/core";import{jsx as jsx101}from"react/jsx-runtime";var statusToColor={draft:"blue",active:"blue","on-hold":"yellow",revoked:"red",completed:"green","entered-in-error":"red",unknown:"gray",retired:"gray",registered:"blue",preliminary:"blue",final:"green",amended:"yellow",corrected:"yellow",cancelled:"red",requested:"blue",received:"blue",accepted:"blue",rejected:"red",ready:"blue","in-progress":"blue",failed:"red",proposed:"blue",pending:"blue",booked:"blue",arrived:"blue",fulfilled:"green",noshow:"red","checked-in":"blue",waitlist:"gray",routine:"gray",urgent:"red",asap:"red",stat:"red","not-done":"red",connected:"green",disconnected:"red",finished:"green",planned:"gray"};function StatusBadge(props){let{status,...badgeProps}=props;return jsx101(Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}import{Group as Group33,Stack as Stack23,TextInput as TextInput22}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,addProfileToResource,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback13,useState as useState55}from"react";import{jsx as jsx102,jsxs as jsxs62}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG5+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState55(allergy?.code),[clinicalStatus,setClinicalStatus]=useState55(allergy?.clinicalStatus),handleSubmit=useCallback13(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference8(patient),encounter:encounter?createReference8(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0},PATIENT_ALLERGY_PROFILE))},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx102(Form,{onSubmit:handleSubmit,children:jsxs62(Stack23,{children:[jsx102(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}),jsx102(TextInput22,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx102(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG5+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx102(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx102(Group33,{justify:"flex-end",gap:4,mt:"md",children:jsx102(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon10,Box as Box8,Collapse,Group as Group34,Text as Text22}from"@mantine/core";import{useState as useState56}from"react";var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title",addButton:"CollapsibleSection_addButton"};import{jsx as jsx103,jsxs as jsxs63}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState56(!1);return jsxs63(Box8,{className:CollapsibleSection_default.root,children:[jsxs63(Group34,{justify:"space-between",className:CollapsibleSection_default.header,children:[jsxs63(Group34,{gap:8,children:[jsx103(ActionIcon10,{variant:"subtle",onClick:()=>setCollapsed(c=>!c),"aria-label":collapsed?`Show ${title.toLowerCase()}`:`Hide ${title.toLowerCase()}`,className:CollapsibleSection_default.chevron,"data-collapsed":collapsed||void 0,size:"md",children:jsx103(IconChevronDown,{size:20})}),jsx103(Text22,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx103(ActionIcon10,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx103(IconPlus,{size:18})})]}),jsx103(Collapse,{in:!collapsed,children:jsx103(Box8,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}import{ActionIcon as ActionIcon11,Box as Box9}from"@mantine/core";var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};import{jsx as jsx104,jsxs as jsxs64}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs64(Box9,{className:SummaryItem_default.item,onClick,children:[children,jsx104("div",{className:SummaryItem_default.gradient}),jsx104("div",{className:SummaryItem_default.container,children:jsx104(ActionIcon11,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx104(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment34,jsx as jsx105,jsxs as jsxs65}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum27(),{patient,encounter}=props,[allergies,setAllergies]=useState57(props.allergies),[opened,{open,close}]=useDisclosure2(!1),[editAllergy,setEditAllergy]=useState57(),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:getDisplayString5(a).localeCompare(getDisplayString5(b))}),[allergies]),handleSubmit=useCallback14(async allergy=>{if(allergy.id){let updatedAllergy=await medplum.updateResource(allergy);setAllergies(allergies.map(a=>a.id===updatedAllergy.id?updatedAllergy:a))}else{let newAllergy=await medplum.createResource(allergy);setAllergies([...allergies,newAllergy])}setEditAllergy(void 0),close()},[medplum,allergies,close]);return jsxs65(Fragment34,{children:[jsx105(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx105(Box10,{children:jsx105(Flex8,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx105(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs65(Box10,{children:[jsx105(Text23,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString5(allergy)}),jsx105(Group35,{mt:2,gap:4,children:status&&jsx105(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx105(Text23,{children:"(none)"})}),jsx105(Modal4,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx105(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 Box11,Flex as Flex9,Group as Group36,Text as Text24}from"@mantine/core";import{formatDate}from"@medplum/core";import{useResource as useResource6}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 jsx106,jsxs as jsxs66}from"react/jsx-runtime";function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=useResource6(coverage),organizationResource=useResource6(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 jsx106(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs66(Box11,{children:[jsx106(Text24,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx106(Text24,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs66(Group36,{mt:2,gap:4,children:[jsx106(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs66(Text24,{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 jsx106(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx106(Flex9,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx106(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx106(Text24,{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 Box12,Flex as Flex10,Group as Group39,Modal as Modal5,Text as Text27}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{formatDate as formatDate2,getDisplayString as getDisplayString7}from"@medplum/core";import{useState as useState60}from"react";import{Group as Group38,List,Stack as Stack25,Text as Text26,Title as Title8}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime3,formatObservationValue,isReference as isReference2}from"@medplum/core";import{useMedplum as useMedplum28,useResource as useResource8}from"@medplum/react-hooks";import{useEffect as useEffect18,useState as useState59}from"react";import{Blockquote,Stack as Stack24}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx107}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx107(Stack24,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx107(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 Group37}from"@mantine/core";import{Text as Text25}from"@mantine/core";import{getDisplayString as getDisplayString6,isOk,normalizeErrorString as normalizeErrorString9}from"@medplum/core";import{useResource as useResource7}from"@medplum/react-hooks";import{useState as useState58}from"react";import{jsx as jsx108}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState58(),resource=useResource7(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString9(outcome)}]`;else if(resource)text=getDisplayString6(resource);else return null;return link?jsx108(MedplumLink,{to:value,...rest,children:text}):jsx108(Text25,{component:"span",...rest,children:text})}import{jsx as jsx109,jsxs as jsxs67}from"react/jsx-runtime";function ResourceBadge(props){return jsxs67(Group37,{gap:"xs",children:[jsx109(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx109(ResourceName,{value:props.value,link:props.link})]})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment35,jsx as jsx110,jsxs as jsxs68}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum28(),diagnosticReport=useResource8(props.value),[specimens,setSpecimens]=useState59();if(useEffect18(()=>{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 jsxs68(Stack25,{children:[jsx110(Title8,{children:"Diagnostic Report"}),jsx110(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx110(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx110(NoteDisplay,{value:specimenNotes})]})}function DiagnosticReportHeader({value,hideSubject=!1}){return jsxs68(Group38,{mt:"md",gap:30,children:[value.subject&&!hideSubject&&jsxs68("div",{children:[jsx110(Text26,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx110(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs68("div",{children:[jsx110(Text26,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx110(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs68("div",{children:[jsx110(Text26,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx110(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs68("div",{children:[jsx110(Text26,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx110(Text26,{children:formatDateTime3(value.issued)})]}),value.status&&jsxs68("div",{children:[jsx110(Text26,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx110(StatusBadge,{status:value.status})]})]})}function SpecimenInfo(specimens){return jsxs68(Stack25,{gap:"xs",children:[jsx110(Title8,{order:2,size:"h6",children:"Specimens"}),jsx110(List,{type:"ordered",children:specimens?.map(specimen=>jsx110(List.Item,{ml:"sm",children:jsxs68(Group38,{gap:20,children:[jsxs68(Group38,{gap:5,children:[jsx110(Text26,{fw:500,children:"Collected:"})," ",formatDateTime3(specimen.collection?.collectedDateTime)]}),jsxs68(Group38,{gap:5,children:[jsx110(Text26,{fw:500,children:"Received:"})," ",formatDateTime3(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs68("table",{className:DiagnosticReportDisplay_default.table,children:[jsx110("thead",{children:jsxs68("tr",{children:[jsx110("th",{children:"Test"}),jsx110("th",{children:"Value"}),jsx110("th",{children:"Reference Range"}),jsx110("th",{children:"Interpretation"}),jsx110("th",{children:"Category"}),jsx110("th",{children:"Performer"}),jsx110("th",{children:"Status"})]})}),jsx110("tbody",{children:jsx110(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx110(Fragment35,{children:props.value?.map(observation=>jsx110(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference2(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource8(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs68(Fragment35,{children:[jsxs68("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx110("td",{rowSpan:displayNotes?2:1,children:jsx110(MedplumLink,{to:observation,children:jsx110(CodeableConceptDisplay,{value:observation.code})})}),jsx110("td",{children:jsx110(ObservationValueDisplay,{value:observation})}),jsx110("td",{children:jsx110(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx110("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx110(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx110("td",{children:observation.category&&observation.category.length>0&&jsx110(Fragment35,{children:observation.category.map(concept=>jsx110("div",{children:jsx110(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx110("td",{children:observation.performer?.map(performer=>jsx110(ReferenceDisplay,{value:performer},performer.reference))}),jsx110("td",{children:observation.status&&jsx110(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx110(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx110("tr",{children:jsx110("td",{colSpan:6,children:jsx110(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx110(Fragment35,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx110(Fragment35,{children:range.text}):jsx110(RangeDisplay,{value:range}):null}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;return code==="AA"||code==="LL"||code==="HH"||code==="A"}import{Fragment as Fragment36,jsx as jsx111,jsxs as jsxs69}from"react/jsx-runtime";function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=useState60(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=useDisclosure3(!1),diagnosticReportsRequests=new Set,filteredDiagnosticReports=diagnosticReports.filter(report=>{let flag=isLaboratoryReport(report);return flag&&report.basedOn&&report.basedOn.forEach(basedOn=>{if(basedOn.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn.reference.split("/");diagnosticReportsRequests.add(id)}}),flag}),completedRequisitionNumbers=new Set,filteredServiceRequests=serviceRequests.filter(request=>{if(request.id&&diagnosticReportsRequests.has(request.id)||request.basedOn&&request.basedOn.find(basedOn2=>{if(basedOn2.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn2.reference.split("/");return diagnosticReportsRequests.has(id)}return!1}))return!1;let shouldFilter=shouldFilterRequest(request,completedRequisitionNumbers);return!shouldFilter&&request.requisition?.value&&completedRequisitionNumbers.add(request.requisition?.value),!shouldFilter}),handleDiagnosticReportClick=report=>{setSelectedReport(report),openReportDialog()};return jsxs69(Fragment36,{children:[jsx111(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:jsxs69(Flex10,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>jsx111(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:jsxs69(Box12,{children:[jsx111(Text27,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(serviceRequest)}),jsxs69(Group39,{mt:2,gap:4,children:[serviceRequest.status&&jsx111(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),jsx111(Text27,{size:"xs",fw:500,c:"dimmed",children:formatDate2(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>jsx111(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:jsxs69(Box12,{children:[jsx111(Text27,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(report)}),jsxs69(Group39,{mt:2,gap:4,children:[report.status&&jsx111(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),jsx111(Text27,{size:"xs",fw:500,c:"dimmed",children:formatDate2(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&jsx111(Text27,{children:"(none)"})]})}),jsx111(Modal5,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&jsx111(DiagnosticReportDisplay,{value:selectedReport,hideSubject:!0})})]})}var getStatusColor=status=>{switch(status){case"active":return"indigo";case"final":return"teal";case"cancelled":return"red";default:return"gray"}};function hasLaboratoryCategory(category){if(!category.coding||!Array.isArray(category.coding))return!1;for(let coding of category.coding)if(coding.code==="LAB")return!0;return!1}function isLaboratoryReport(report){if(!report.category||!Array.isArray(report.category))return!1;for(let category of report.category)if(hasLaboratoryCategory(category))return!0;return!1}function shouldFilterRequest(request,completedRequisitionNumbers){if(["completed","draft","entered-in-error"].includes(request.status))return!0;let requisitionNumber=request.requisition?.value;return!!(requisitionNumber&&completedRequisitionNumbers.has(requisitionNumber))}import{Box as Box13,Flex as Flex11,Group as Group41,Modal as Modal6,Text as Text28}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{getDisplayString as getDisplayString8}from"@medplum/core";import{useMedplum as useMedplum29}from"@medplum/react-hooks";import{useCallback as useCallback16,useState as useState62}from"react";import{Alert as Alert4,Group as Group40,Radio as Radio2,Stack as Stack26}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG6,addProfileToResource as addProfileToResource2,createReference as createReference9}from"@medplum/core";import{useMedplumProfile as useMedplumProfile9}from"@medplum/react-hooks";import{useCallback as useCallback15,useState as useState61}from"react";import{jsx as jsx112,jsxs as jsxs70}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile9(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState61(medication?.medicationCodeableConcept),handleSubmit=useCallback15(formData=>{if(!me)throw new Error("Not signed in");onSubmit(addProfileToResource2({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&createReference9(encounter)),requester:medication?.requester??createReference9(me),medicationCodeableConcept:code,subject:createReference9(patient)},HTTP_HL7_ORG6+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx112(Form,{onSubmit:handleSubmit,children:jsxs70(Stack26,{children:[jsx112(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}),jsx112(Radio2.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx112(Radio2,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx112(Group40,{justify:"flex-end",gap:4,children:jsx112(SubmitButton,{children:"Save"})})]})}):jsx112(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment37,jsx as jsx113,jsxs as jsxs71}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum29(),[medicationRequests,setMedicationRequests]=useState62(props.medicationRequests),[editMedication,setEditMedication]=useState62(),[opened,{open,close}]=useDisclosure4(!1),handleSubmit=useCallback16(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m=>m.id===updatedMedication.id?updatedMedication:m))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs71(Fragment37,{children:[jsx113(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medicationRequests.length>0?jsx113(Flex11,{direction:"column",gap:8,children:medicationRequests.map(medication=>jsx113(SummaryItem,{onClick:()=>{setEditMedication(medication),open()},children:jsxs71(Box13,{children:[jsx113(Text28,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(medication)}),jsx113(Group41,{mt:2,gap:4,children:medication.status&&jsx113(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},medication.id))}):jsx113(Text28,{children:"(none)"})}),jsx113(Modal6,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx113(MedicationDialog,{patient:props.patient,encounter:props.encounter,medication:editMedication,onSubmit:handleSubmit})})]})}function getStatusColor2(status){if(!status)return"gray";switch(status){case"active":return"green";case"stopped":return"red";case"on-hold":return"yellow";case"cancelled":return"red";case"completed":return"blue";case"entered-in-error":return"red";case"draft":return"gray";default:return"gray"}}import{Box as Box14,Group as Group42,Text as Text29,Tooltip as Tooltip4}from"@mantine/core";import{jsx as jsx114,jsxs as jsxs72}from"react/jsx-runtime";var PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return jsx114(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx114(Box14,{className:PatientSummary_default.patientSummaryListItem,children:jsx114(Tooltip4,{label,position:"top-start",openDelay:650,children:jsxs72(Group42,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,jsx114(Text29,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};import{capitalize as capitalize4,getExtension as getExtension3,HTTP_HL7_ORG as HTTP_HL7_ORG7}from"@medplum/core";function getGenderIdentity(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-ethnicity`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getGeneralPractitioner(patient){return patient.generalPractitioner?.[0]?.display}function formatPatientGenderDisplay(patient){let capitalizedGender=patient.gender?capitalize4(patient.gender):"",genderIdentity=getGenderIdentity(patient),birthSex=getBirthSex(patient),parts=[];return capitalizedGender&&parts.push(capitalizedGender),genderIdentity&&parts.push(genderIdentity),birthSex&&parts.push(`Born as ${birthSex}`),parts.join(" \xB7 ")}function formatPatientRaceEthnicityDisplay(patient){let race=getRace(patient),ethnicity=getEthnicity(patient),parts=[];return race&&parts.push(race),ethnicity&&parts.push(ethnicity),parts.join(" \xB7 ")}var getPreferredLanguage=patient=>{if(!patient.communication?.length)return;let preferred=patient.communication?.find(comm=>comm.preferred===!0);return preferred?.language?.coding?.[0]?.display?preferred.language.coding[0].display:patient.communication[0]?.language?.coding?.[0]?.display};import{Box as Box15,Flex as Flex12,Group as Group43,Loader as Loader3,Modal as Modal7,Text as Text30}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{formatAddress as formatAddress2,getReferenceString as getReferenceString8,OperationOutcomeError}from"@medplum/core";import{useMedplum as useMedplum30,useResource as useResource9}from"@medplum/react-hooks";import{useCallback as useCallback17,useEffect as useEffect19,useMemo as useMemo30,useState as useState63}from"react";import{PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,addPreferredPharmacyToPatient,createPreferredPharmacyExtension,getPreferredPharmaciesFromPatient,isAddPharmacyResponse,isOrganizationArray,removePreferredPharmacyFromPatient}from"@medplum/core";import{Fragment as Fragment38,jsx as jsx115,jsxs as jsxs73}from"react/jsx-runtime";function Pharmacies(props){let{patient:patientProp,onClickResource,pharmacyDialogComponent}=props,PharmacyDialogComponent=pharmacyDialogComponent,medplum=useMedplum30(),[opened,{open,close}]=useDisclosure5(!1),[resolvedPharmacies,setResolvedPharmacies]=useState63([]),[loadState,setLoadState]=useState63("loading"),patient=useResource9(patientProp),pharmacyRefs=useMemo30(()=>patient?getPreferredPharmaciesFromPatient(patient):[],[patient]);useEffect19(()=>{let cancelled=!1;return(async()=>{if(props.pharmacies){cancelled||(setResolvedPharmacies(props.pharmacies),setLoadState("loaded"));return}if(pharmacyRefs.length===0){cancelled||(setResolvedPharmacies([]),setLoadState("loaded"));return}setLoadState("loading");try{let results=await Promise.all(pharmacyRefs.map(async pharmacyRef=>{try{return{...await medplum.readReference(pharmacyRef.organizationRef),isPrimary:pharmacyRef.isPrimary}}catch(error){return isNotFoundError(error),null}}));if(!cancelled){let validResults=results.filter(result=>result!==null);setResolvedPharmacies(validResults),setLoadState(validResults.length===0&&pharmacyRefs.length>0?"error":"loaded")}}catch{cancelled||setLoadState("error")}})().catch(()=>{}),()=>{cancelled=!0}},[medplum,pharmacyRefs,props.pharmacies]);let handleSubmit=useCallback17(async _pharmacy=>{patient?.id&&medplum.invalidateUrl(getReferenceString8(patient)),close()},[medplum,patient,close]);return patient?jsxs73(Fragment38,{children:[jsx115(CollapsibleSection,{title:"Pharmacies",onAdd:pharmacyDialogComponent?open:void 0,children:loadState==="loading"?jsx115(Loader3,{size:"sm"}):loadState==="error"?jsx115(Text30,{c:"red",size:"sm",children:"Failed to load pharmacies"}):resolvedPharmacies.length===0?jsx115(Text30,{children:"(none)"}):jsx115(Box15,{children:jsx115(Flex12,{direction:"column",gap:8,children:resolvedPharmacies.map((pharmacy,index)=>jsx115(SummaryItem,{onClick:()=>onClickResource?.(pharmacy),children:jsxs73(Box15,{children:[jsx115(Text30,{fw:500,className:SummaryItem_default.itemText,children:pharmacy.name}),jsxs73(Group43,{mt:2,gap:4,children:[pharmacy.isPrimary&&jsx115(StatusBadge,{color:"blue",variant:"light",status:"primary"}),pharmacy.address?.[0]&&jsx115(Text30,{size:"xs",c:"dimmed",children:formatAddress2(pharmacy.address[0])})]})]})},pharmacy.id||index))})})}),PharmacyDialogComponent?jsx115(Modal7,{opened,onClose:close,title:"Add Pharmacy",size:"lg",children:jsx115(PharmacyDialogComponent,{patient,onSubmit:handleSubmit,onClose:close})}):null]}):jsx115(Fragment38,{})}function isNotFoundError(error){return error instanceof OperationOutcomeError?error.outcome.issue?.some(issue=>issue.code==="not-found")??!1:!1}import{Box as Box16,Flex as Flex13,Group as Group45,Modal as Modal8,Text as Text31}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{formatDate as formatDate3,getDisplayString as getDisplayString9}from"@medplum/core";import{useMedplum as useMedplum31}from"@medplum/react-hooks";import{useCallback as useCallback19,useState as useState65}from"react";import{Group as Group44,Stack as Stack27}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG8,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference10}from"@medplum/core";import{useCallback as useCallback18,useState as useState64}from"react";import{jsx as jsx116,jsxs as jsxs74}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState64(condition?.code),[clinicalStatus,setClinicalStatus]=useState64(condition?.clinicalStatus),handleSubmit=useCallback18(formData=>{let updatedCondition=addProfileToResource3({...condition,resourceType:"Condition",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:createReference10(patient),encounter:encounter&&createReference10(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG8+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx116(Form,{onSubmit:handleSubmit,children:jsxs74(Stack27,{children:[jsx116(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG8+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx116(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG8+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx116(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx116(Group44,{justify:"flex-end",gap:4,mt:"md",children:jsx116(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment39,jsx as jsx117,jsxs as jsxs75}from"react/jsx-runtime";function ProblemList(props){let medplum=useMedplum31(),{patient,encounter}=props,[problems,setProblems]=useState65(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=useState65(),[opened,{open,close}]=useDisclosure6(!1),handleSubmit=useCallback19(async condition=>{if(condition.id){let updatedCondition=await medplum.updateResource(condition);setProblems(problems.map(p=>p.id===updatedCondition.id?updatedCondition:p))}else{let newCondition=await medplum.createResource(condition);setProblems([newCondition,...problems])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs75(Fragment39,{children:[jsx117(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx117(Flex13,{direction:"column",gap:8,children:problems.map(problem=>jsx117(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs75(Box16,{children:[jsx117(Text31,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString9(problem)}),jsxs75(Group45,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx117(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx117(Text31,{size:"xs",fw:500,c:"dimmed",children:formatDate3(problem.onsetDateTime)})]})]})},problem.id))}):jsx117(Text31,{children:"(none)"})}),jsx117(Modal8,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx117(ConditionDialog,{patient,encounter,condition:editCondition,onSubmit:handleSubmit})})]})}var getStatusColor3=status=>{if(!status)return"gray";switch(status){case"active":case"recurrence":case"relapse":return"green";case"inactive":return"orange";case"remission":return"blue";case"resolved":return"teal";default:return"gray"}};import{Box as Box17,Flex as Flex14,Group as Group46,Modal as Modal9,Radio as Radio3,Stack as Stack28,Text as Text32,UnstyledButton as UnstyledButton3}from"@mantine/core";import{useDisclosure as useDisclosure7}from"@mantine/hooks";import{createReference as createReference11,HTTP_HL7_ORG as HTTP_HL7_ORG9,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum32}from"@medplum/react-hooks";import{useCallback as useCallback20,useState as useState66}from"react";import{Fragment as Fragment40,jsx as jsx118,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=useMedplum32(),[sexualOrientation,setSexualOrientation]=useState66(props.sexualOrientation),[opened,{open,close}]=useDisclosure7(!1),[hoverIndex,setHoverIndex]=useState66(null),handleSubmit=useCallback20(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG9+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:createReference11(patient),encounter:encounter?createReference11(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:CodesToSystem[code],code:formData.sexualOrientation}],text:CodesToText[code]}}).then(newSexualOrientation=>{setSexualOrientation(newSexualOrientation),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs76(Fragment40,{children:[jsx118(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx118(Flex14,{direction:"column",gap:8,children:jsx118(Box17,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx118(UnstyledButton3,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx118(Box17,{pr:hoverIndex===0?24:0,children:jsx118(Text32,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx118(Text32,{children:"(none)"})}),jsx118(Modal9,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx118(Form,{onSubmit:handleSubmit,children:jsxs76(Stack28,{children:[jsx118(Radio3.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx118(Radio3,{value:code,label:text,my:"xs"},code))}),jsx118(Group46,{justify:"flex-end",gap:4,mt:"md",children:jsx118(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group47,Modal as Modal10,Radio as Radio4,Stack as Stack29,Text as Text33,UnstyledButton as UnstyledButton4}from"@mantine/core";import{useDisclosure as useDisclosure8}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG10,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference12,formatCodeableConcept as formatCodeableConcept4}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback21,useState as useState67}from"react";import{Fragment as Fragment41,jsx as jsx119,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=useMedplum33(),[smokingStatus,setSmokingStatus]=useState67(props.smokingStatus),[opened,{open,close}]=useDisclosure8(!1),handleSubmit=useCallback21(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG10+"/fhir/us/core/StructureDefinition/us-core-smokingstatus"]},status:"final",category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC2,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference12(props.patient),encounter:props.encounter?createReference12(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED2,version:SNOMED2+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return jsxs77(Fragment41,{children:[jsx119(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx119(UnstyledButton4,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx119(Text33,{children:formatCodeableConcept4(smokingStatus.valueCodeableConcept)})}):jsx119(Text33,{children:"(none)"})}),jsx119(Modal10,{opened,onClose:close,title:"Set Smoking Status",children:jsx119(Form,{onSubmit:handleSubmit,children:jsxs77(Stack29,{children:[jsx119(Radio4.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx119(Radio4,{value:code,label:text,my:"xs"},code))}),jsx119(Group47,{justify:"flex-end",gap:4,mt:"md",children:jsx119(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group48,Modal as Modal11,SimpleGrid,Stack as Stack30,Text as Text34,Textarea as Textarea4,TextInput as TextInput23}from"@mantine/core";import{useDisclosure as useDisclosure9}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum34}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState68}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference13}from"@medplum/core";function getObservationValue(obs,component){return component?obs.component?.find(c=>c.code?.coding?.[0].code===component)?.valueQuantity:obs.valueQuantity}function createObservation(patient,encounter,code,title,valueQuantity){if(isValidNumber(valueQuantity.value))return{...createBaseObservation(patient,encounter,code,title),valueQuantity}}function createCompoundObservation(patient,encounter,code,title,components){let component=components.filter(c=>isValidNumber(c.valueQuantity?.value));if(component.length!==0)return{...createBaseObservation(patient,encounter,code,title),component}}function createBaseObservation(patient,encounter,code,title){return{resourceType:"Observation",status:"preliminary",subject:createReference13(patient),encounter:encounter?createReference13(encounter):void 0,effectiveDateTime:new Date().toISOString(),category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"vital-signs",display:"Vital Signs"}]}],code:createLoincCode(code,title)}}function createLoincCode(code,display){return{coding:[{code,display,system:LOINC3}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!Number.isNaN(value)&&Number.isFinite(value)}import{Fragment as Fragment42,jsx as jsx120,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=useMedplum34(),{patient,encounter}=props,[vitals,setVitals]=useState68(props.vitals),[opened,{open,close}]=useDisclosure9(!1),handleSubmit=useCallback22(formData=>{let newObservations=[];newObservations.push(createCompoundObservation(patient,encounter,BP,"Blood pressure",[{code:createLoincCode(SYSTOLIC,"Systolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.systolic),"mm[Hg]")},{code:createLoincCode(DIASTOLIC,"Diastolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.diastolic),"mm[Hg]")}]));for(let meta of LOINC_CODES)meta.component||newObservations.push(createObservation(patient,encounter,meta.code,meta.title,createQuantity(Number.parseFloat(formData[meta.name]),meta.unit)));Promise.all(newObservations.filter(Boolean).map(obs=>medplum.createResource(obs))).then(newVitals=>setVitals([...newVitals,...vitals])).catch(console.error),close()},[medplum,patient,encounter,vitals,close]);return jsxs78(Fragment42,{children:[jsx120(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx120(Stack30,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs78(Group48,{align:"center",children:[jsx120(Text34,{c:"dimmed",children:meta.short}),obs&&jsx120(Text34,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx120(Modal11,{opened,onClose:close,title:"Add Vitals",children:jsxs78(Form,{onSubmit:handleSubmit,children:[jsx120(SimpleGrid,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx120(TextInput23,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx120(Textarea4,{name:"notes",label:"Notes"}),jsx120(Group48,{justify:"flex-end",gap:4,mt:"md",children:jsx120(SubmitButton,{children:"Save"})})]})})]})}import{Fragment as Fragment43,jsx as jsx121,jsxs as jsxs79}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum35(),{patient:propsPatient,onClickResource,onRequestLabs,pharmacyDialogComponent}=props,patient=useResource10(propsPatient),[medicalData,setMedicalData]=useState69(),[createdDate,setCreatedDate]=useState69();useEffect20(()=>{let ref=`Patient/${resolveId(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}),medplum.searchResources("ServiceRequest",{subject:ref,...searchMeta}),medplum.searchResources("DiagnosticReport",{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],serviceRequests:results[11],diagnosticReports:results[12]})}).catch(console.error)},[medplum,propsPatient]),useEffect20(()=>{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]);let languageDisplay=patient?getPreferredLanguage(patient):void 0;return patient?jsxs79(Flex15,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs79(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs79(Group49,{align:"center",gap:"sm",p:16,children:[jsx121(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs79(Stack31,{gap:0,style:{flex:1,minWidth:0},children:[jsx121(Tooltip5,{label:formatHumanName8(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx121(Text35,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:formatHumanName8(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return jsxs79(Text35,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx121(Divider5,{})]}),jsx121(Stack31,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:medicalData&&jsxs79(Fragment43,{children:[jsxs79(Stack31,{gap:"xs",py:8,children:[jsx121(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${calculateAgeString(patient.birthDate)})`:void 0,icon:jsx121(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),jsx121(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:jsx121(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),jsx121(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:jsx121(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),jsx121(PatientInfoItem,{patient,value:patient.address?.[0]?formatAddress3(patient.address[0]):void 0,icon:jsx121(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),jsx121(PatientInfoItem,{patient,value:languageDisplay,icon:jsx121(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),jsx121(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:jsx121(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add General Practitioner",label:"General Practitioner",onClickResource})]}),jsx121(Divider5,{}),jsx121(Insurance,{coverages:medicalData.coverages||[],onClickResource}),jsx121(Divider5,{}),jsx121(Allergies,{patient,allergies:medicalData.allergies,onClickResource}),jsx121(Divider5,{}),jsx121(ProblemList,{patient,problems:medicalData.problems,onClickResource}),jsx121(Divider5,{}),jsx121(Medications,{patient,medicationRequests:medicalData.medicationRequests,onClickResource}),jsx121(Divider5,{}),jsx121(Labs,{patient,serviceRequests:medicalData.serviceRequests,diagnosticReports:medicalData.diagnosticReports,onClickResource,onRequestLabs}),jsx121(Divider5,{}),jsx121(SexualOrientation,{patient,sexualOrientation:medicalData.sexualOrientation,onClickResource}),jsx121(Divider5,{}),jsx121(SmokingStatus,{patient,smokingStatus:medicalData.smokingStatus,onClickResource}),jsx121(Divider5,{}),jsx121(Vitals,{patient,vitals:medicalData.vitals,onClickResource}),jsx121(Divider5,{}),jsx121(Pharmacies,{patient,onClickResource,pharmacyDialogComponent}),jsx121(Divider5,{})]})})]}):null}var ThreadInbox_default={container:"ThreadInbox_container",rightBorder:"ThreadInbox_rightBorder",button:"ThreadInbox_button",selected:"ThreadInbox_selected"};import{Fragment as Fragment44,jsx as jsx122,jsxs as jsxs80}from"react/jsx-runtime";function ThreadInbox(props){let{query,threadId,subject,showPatientSummary=!1,pharmacyDialogComponent,onNew,getThreadUri,onChange,inProgressUri,completedUri}=props,navigate=useMedplumNavigate5(),[modalOpened,{open:openModal,close:closeModal}]=useDisclosure10(!1),currentSearch=useMemo31(()=>parseSearchRequest(`Communication?${query}`),[query]),searchParams=useMemo31(()=>new URLSearchParams(query),[query]),itemsPerPage=Number.parseInt(searchParams.get("_count")||"20",10),currentOffset=Number.parseInt(searchParams.get("_offset")||"0",10),currentPage=Math.floor(currentOffset/itemsPerPage)+1,status=searchParams.get("status")||"in-progress",selectedParticipants=useMemo31(()=>(currentSearch.filters?.filter(f=>f.code==="recipient")??[]).flatMap(f=>f.value.split(",").filter(Boolean).map(ref=>({reference:ref}))),[currentSearch]),{loading,error,threadMessages,selectedThread,total,handleThreadStatusChange,addThreadMessage,refreshThreadMessages}=useThreadInbox({query,threadId}),handleParticipantsChange=useCallback23(participants=>{let otherFilters=currentSearch.filters?.filter(f=>f.code!=="recipient")??[],participantRefs=participants.map(p=>p.reference).filter(Boolean),newFilters=participantRefs.length>0?[...otherFilters,{code:"recipient",operator:Operator.EQUALS,value:participantRefs.join(",")}]:otherFilters;onChange({...currentSearch,filters:newFilters,offset:0})},[currentSearch,onChange]),skeletonTitleWidths=[80,72,68,64],skeletonSubtitleWidths=[85,78,70,60];useEffect21(()=>{error&&showNotification8({title:"Error",message:normalizeErrorString10(error),color:"red"})},[error]);let handleTopicStatusChangeWithErrorHandling=async newStatus=>{handleThreadStatusChange(newStatus);try{await refreshThreadMessages()}catch(error2){showNotification8({title:"Error",message:normalizeErrorString10(error2),color:"red"})}},handleNewTopicCompletion=message=>{addThreadMessage(message),onNew(message)};return jsxs80(Fragment44,{children:[jsx122("div",{className:ThreadInbox_default.container,children:jsxs80(Flex16,{direction:"row",h:"100%",w:"100%",children:[jsx122(Flex16,{direction:"column",w:380,h:"100%",className:ThreadInbox_default.rightBorder,children:jsxs80(Paper4,{h:"100%",style:{display:"flex",flexDirection:"column"},children:[jsxs80(ScrollArea3,{style:{flex:1},scrollbarSize:10,type:"hover",scrollHideDelay:250,children:[jsxs80(Flex16,{h:64,align:"center",justify:"space-between",p:"md",children:[jsxs80(Group50,{gap:"xs",children:[jsx122(Button10,{onClick:()=>navigate(inProgressUri),className:clsx_default(ThreadInbox_default.button,{[ThreadInbox_default.selected]:status==="in-progress"}),h:32,radius:"xl",children:"In progress"}),jsx122(Button10,{onClick:()=>navigate(completedUri),className:clsx_default(ThreadInbox_default.button,{[ThreadInbox_default.selected]:status==="completed"}),h:32,radius:"xl",children:"Completed"}),jsx122(ParticipantFilter,{selectedParticipants,onFilterChange:handleParticipantsChange})]}),jsx122(ActionIcon12,{radius:"50%",variant:"filled",color:"blue",onClick:openModal,children:jsx122(IconPlus,{size:16})})]}),jsx122(Divider6,{}),loading?jsx122(Stack32,{gap:"md",p:"md",children:Array.from({length:10}).map((_,index)=>{let titleWidth=skeletonTitleWidths[index%skeletonTitleWidths.length],subtitleWidth=skeletonSubtitleWidths[index%skeletonSubtitleWidths.length];return jsxs80(Flex16,{gap:"sm",align:"flex-start",children:[jsx122(Skeleton2,{height:40,width:40,radius:"50%"}),jsx122(Box18,{style:{flex:1},children:jsxs80(Flex16,{direction:"column",gap:"xs",children:[jsx122(Skeleton2,{height:16,width:`${titleWidth}%`}),jsx122(Skeleton2,{height:14,width:`${subtitleWidth}%`})]})})]},index)})}):threadMessages.length>0&&jsx122(ChatList,{threads:threadMessages,selectedCommunication:selectedThread,getThreadUri}),threadMessages.length===0&&!loading&&jsx122(EmptyMessagesState,{})]}),!loading&&total!==void 0&&total>itemsPerPage&&jsx122(Box18,{p:"md",children:jsx122(Center3,{children:jsx122(Pagination,{value:currentPage,total:Math.ceil(total/itemsPerPage),onChange:page=>{let offset=(page-1)*itemsPerPage;onChange({...currentSearch,offset})},size:"sm",siblings:1,boundaries:1})})})]})}),selectedThread?jsxs80(Fragment44,{children:[jsx122(Flex16,{direction:"column",style:{flex:1},h:"100%",className:ThreadInbox_default.rightBorder,children:jsx122(Paper4,{h:"100%",children:jsxs80(Stack32,{h:"100%",gap:0,children:[jsxs80(Flex16,{h:64,align:"center",justify:"space-between",p:"md",children:[jsx122(Text36,{fw:800,truncate:!0,fz:"lg",children:selectedThread.topic?.text??"Messages"}),jsxs80(Menu4,{position:"bottom-end",shadow:"md",children:[jsx122(Menu4.Target,{children:jsx122(Button10,{variant:"light",color:getStatusColor4(selectedThread.status),rightSection:selectedThread.status==="completed"?void 0:jsx122(IconChevronDown,{size:16}),radius:"xl",size:"sm",children:selectedThread.status.split("-").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")})}),selectedThread.status!=="completed"&&jsx122(Menu4.Dropdown,{children:jsx122(Menu4.Item,{onClick:()=>handleTopicStatusChangeWithErrorHandling("completed"),children:"Completed"})})]})]}),jsx122(Divider6,{}),jsx122(Flex16,{direction:"column",style:{flex:1},h:"100%",children:jsx122(ThreadChat,{title:"Messages",thread:selectedThread,excludeHeader:!0},`${getReferenceString9(selectedThread)}`)})]})})}),selectedThread.subject&&showPatientSummary&&jsx122(Flex16,{direction:"column",w:300,h:"100%",children:jsx122(ScrollArea3,{p:0,h:"100%",scrollbarSize:10,type:"hover",scrollHideDelay:250,children:jsx122(PatientSummary,{patient:selectedThread.subject,pharmacyDialogComponent},selectedThread.id)})})]}):jsx122(Flex16,{direction:"column",style:{flex:1},h:"100%",children:jsx122(NoMessages,{})})]})}),jsx122(NewTopicDialog,{subject,opened:modalOpened,onClose:closeModal,onSubmit:handleNewTopicCompletion})]})}function NoMessages(){return jsx122(Center3,{h:"100%",w:"100%",children:jsxs80(Stack32,{align:"center",gap:"md",children:[jsx122(ThemeIcon,{size:64,variant:"light",color:"gray",children:jsx122(IconMessageCircle,{size:32})}),jsx122(Stack32,{align:"center",gap:"xs",children:jsx122(Text36,{size:"sm",c:"dimmed",ta:"center",children:"Select a message from the list to view details"})})]})})}function getStatusColor4(status){return status==="completed"?"green":status==="stopped"?"red":"blue"}function EmptyMessagesState(){return jsx122(Flex16,{direction:"column",h:"100%",justify:"center",align:"center",children:jsxs80(Stack32,{align:"center",gap:"md",pt:"xl",children:[jsx122(IconMessageCircle,{size:64,color:"var(--mantine-color-gray-4)"}),jsx122(Text36,{size:"lg",c:"dimmed",fw:500,children:"No messages found"})]})})}import{ActionIcon as ActionIcon14,Button as Button12,Center as Center4,Group as Group52,Loader as Loader4,ScrollArea as ScrollArea4,TextInput as TextInput24}from"@mantine/core";import{showNotification as showNotification9,updateNotification}from"@mantine/notifications";import{createReference as createReference14,normalizeErrorString as normalizeErrorString11}from"@medplum/core";import{useMedplum as useMedplum38,useResource as useResource12}from"@medplum/react-hooks";import{useCallback as useCallback24,useEffect as useEffect24,useRef as useRef16,useState as useState73}from"react";var import_rfc6902=__toESM(require_rfc6902(),1);import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize5,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum36}from"@medplum/react-hooks";import{useEffect as useEffect22,useMemo as useMemo32,useState as useState71}from"react";import{Button as Button11,Table}from"@mantine/core";import{useState as useState70}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment45,jsx as jsx123,jsxs as jsxs81}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState70(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx123(Fragment45,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx123(Fragment45,{children:jsxs81(Table.Tr,{children:[jsx123(Table.Td,{children:name}),jsx123(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx123(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx123(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx123(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs81(Table.Tr,{children:[jsx123(Table.Td,{children:name}),jsx123(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx123(Button11,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx124,jsxs as jsxs82}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum36(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState71(!1);useEffect22(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo32(()=>{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:`${capitalize5(op.op)} ${fhirPath}`,path:property?.path??original.resourceType+"."+fhirPath,property,originalValue:touchUpValue(property,originalValue),revisedValue:touchUpValue(property,revisedValue)})}return result},[schemaLoaded,original,revised]);return diffTable?jsxs82(Table2,{className:ResourceDiffTable_default.root,children:[jsx124(Table2.Thead,{children:jsxs82(Table2.Tr,{children:[jsx124(Table2.Th,{}),jsx124(Table2.Th,{children:"Before"}),jsx124(Table2.Th,{children:"After"})]})}),jsx124(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx124(ResourceDiffRow,{...rest},key)})})]}):null}function mergePatchOperations(patch){let result=[];for(let patchOperation of patch){let{op,path}=patchOperation;if(path.startsWith("/meta/author")||path.startsWith("/meta/compartment")||path.startsWith("/meta/lastUpdated")||path.startsWith("/meta/versionId"))continue;let count=patch.filter(el=>el.op===op&&el.path===path).length,resultOperation={op,path};count>1&&(op==="add"||op==="remove")&&/\/[0-9-]+$/.test(path)&&(resultOperation.op="replace",resultOperation.path=path.replace(/\/[^/]+$/,"")),result.some(el=>el.op===resultOperation.op&&el.path===resultOperation.path)||result.push(resultOperation)}return result}function jsonPathToFhirPath(path){let parts=path.split("/").filter(Boolean),result="";for(let i=0;i<parts.length;i++){let part=parts[i];part==="-"?result+=".last()":/^\d+$/.test(part)?result+=`[${part}]`:(i>0&&(result+="."),result+=part)}return result.endsWith(".url")&&(result=result.replace(/\.url$/,"")),result}function tryGetElementDefinition(resourceType,fhirPath){try{return getSearchParameterDetails(resourceType,{resourceType:"SearchParameter",base:[resourceType],code:resourceType+"."+fhirPath,expression:resourceType+"."+fhirPath})?.elementDefinitions?.[0]}catch(err){console.warn("Failed to get element definition",{resourceType,fhirPath,err});return}}function touchUpValue(property,input){return input&&{type:Array.isArray(input)?input[0].type:input.type,value:fixArray(input,!!property?.isArray)}}function fixArray(input,isArray){let inputValue=arrayify(input).flatMap(v=>v.value);return isArray?inputValue:inputValue[0]}import{AccessPolicyInteraction,satisfiedAccessPolicy,tryGetProfile as tryGetProfile4}from"@medplum/core";import{useMedplum as useMedplum37,useResource as useResource11}from"@medplum/react-hooks";import{useEffect as useEffect23,useMemo as useMemo33,useState as useState72}from"react";import{jsx as jsx125}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum37(),accessPolicy=medplum.getAccessPolicy(),value=useResource11(props.value),[schemaLoaded,setSchemaLoaded]=useState72(!1);useEffect23(()=>{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=useMemo33(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx125(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon13,Group as Group51,Menu as Menu5,Text as Text37}from"@mantine/core";import{formatDateTime as formatDateTime4,getReferenceString as getReferenceString10}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx126,jsxs as jsxs83}from"react/jsx-runtime";function Timeline(props){return jsx126(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 jsxs83(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs83(Group51,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx126(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs83("div",{style:{flex:1},children:[jsx126(Text37,{size:"sm",children:jsx126(ResourceName,{c:"inherit",fw:500,value:author,link:!0})}),jsxs83(Text37,{size:"xs",children:[jsx126(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime4(dateTime)}),jsx126(Text37,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx126(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs83(Menu5,{position:"bottom-end",shadow:"md",width:200,children:[jsx126(Menu5.Target,{children:jsx126(ActionIcon13,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString10(props.resource)}`,children:jsx126(IconDots,{})})}),popupMenuItems]})]}),jsx126(ErrorBoundary,{children:jsx126("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 jsx127,jsxs as jsxs84}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum38(),sender=medplum.getProfile(),inputRef=useRef16(null),resource=useResource12(props.value),[history,setHistory]=useState73(),[items,setItems]=useState73([]),[countToShow,setCountToShow]=useState73(10),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef16(items);itemsRef.current=items;let sortAndSetItems=useCallback24(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback24(batchResponse=>{let newItems=[];for(let settledResult of batchResponse){if(settledResult.status!=="fulfilled")continue;let bundle=settledResult.value;if(bundle.type==="history"&&setHistory(bundle),bundle.entry)for(let entry of bundle.entry)newItems.push(entry.resource)}sortAndSetItems(newItems)},[sortAndSetItems]),addResource=useCallback24(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback24(()=>{let resourceType,id;"resourceType"in props.value?(resourceType=props.value.resourceType,id=props.value.id):[resourceType,id]=props.value.reference?.split("/"),loadTimelineResources(medplum,resourceType,id).then(handleBatchResponse).catch(console.error)},[medplum,props.value,loadTimelineResources,handleBatchResponse]);useEffect24(()=>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:jsx127(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString11(reason),icon:jsx127(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification9({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:normalizeErrorString11(outcome),icon:jsx127(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return jsx127(Center4,{style:{width:"100%",height:"100%"},children:jsx127(Loader4,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return jsxs84(Timeline,{children:[props.createCommunication&&jsx127(Panel,{children:jsx127(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs84(Group52,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx127(ResourceAvatar,{value:sender}),jsx127(TextInput24,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx127(ActionIcon14,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx127(IconMessage,{size:16})}),jsx127(AttachmentButton,{securityContext:createReference14(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx127(ActionIcon14,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx127(IconCloudUpload,{size:16})})})]})})}),itemsToShow.map(item=>{let key=`${item.resourceType}/${item.id}/${item.meta?.versionId}`,menu=props.getMenu?props.getMenu({primaryResource:resource,currentResource:item,reloadTimeline:loadTimeline}):void 0;if(item.resourceType===resource.resourceType&&item.id===resource.id)return jsx127(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx127(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx127(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx127(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx127(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx127(TimelineItem,{resource:item,padding:!0,children:jsx127(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&jsx127(Group52,{justify:"center",pb:"lg",children:jsx127(Button12,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx127(TimelineItem,{resource,padding:!0,...rest,children:jsx127(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs84(TimelineItem,{resource,padding:!0,...rest,children:[jsx127("h3",{children:"Created"}),jsx127(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 jsx127(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx127("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 jsx127(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx127(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx127(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx127(ScrollArea4,{children:jsx127("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx127(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx127(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 jsx128}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx128(ResourceTimeline,{value:resource,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`;return Promise.allSettled([medplum.readHistory(resourceType,id),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count:100})])},...rest})}import{createReference as createReference15}from"@medplum/core";import{jsx as jsx129}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx129(ResourceTimeline,{value:encounter,loadTimelineResources:async(medplum,_resourceType,id)=>Promise.allSettled([medplum.readHistory("Encounter",id),medplum.search("Communication","encounter=Encounter/"+id),medplum.search("Media","encounter=Encounter/"+id)]),createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",encounter:createReference15(resource),subject:resource.subject,sender:createReference15(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference15(resource),subject:resource.subject,operator:createReference15(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button17,Loader as Loader6,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome8}from"@medplum/core";import{useMedplum as useMedplum40}from"@medplum/react-hooks";import{memo,useEffect as useEffect28,useRef as useRef20,useState as useState78}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx130}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 jsx130(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon16,Button as Button16,Center as Center5,Group as Group55,Loader as Loader5,Menu as Menu7,Pagination as Pagination2,Table as Table3,Text as Text39,UnstyledButton as UnstyledButton5}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals as deepEquals2,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome7}from"@medplum/core";import{useMedplum as useMedplum39}from"@medplum/react-hooks";import{useCallback as useCallback25,useEffect as useEffect27,useRef as useRef19,useState as useState77}from"react";import{Box as Box19,Button as Button13,Modal as Modal12,Text as Text38}from"@mantine/core";import{jsx as jsx131,jsxs as jsxs85}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs85(Modal12,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs85(Box19,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx131(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx131(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx131(Text38,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx131(Button13,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button14,Group as Group53,Modal as Modal13,MultiSelect as MultiSelect2,Stack as Stack33}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify3}from"@medplum/core";import{useEffect as useEffect25,useMemo as useMemo34,useRef as useRef17,useState as useState74}from"react";import{capitalize as capitalize6,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime5,Operator as Operator2}from"@medplum/core";import{Fragment as Fragment46,jsx as jsx132}from"react/jsx-runtime";var searchParamToOperators={string:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],fulltext:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],token:[Operator2.EQUALS,Operator2.NOT,Operator2.TEXT],reference:[Operator2.EQUALS,Operator2.NOT],numeric:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],quantity:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],date:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],datetime:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],uri:[Operator2.EQUALS,Operator2.NOT,Operator2.ABOVE,Operator2.BELOW]},operatorNames={eq:"equals",ne:"not equals",gt:"greater than",lt:"less than",ge:"greater than or equals",le:"less than or equals",sa:"starts after",eb:"ends before",ap:"approximately",sw:"starts with",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",present:"present",identifier:"identifier",iterate:"iterate"};function setFilters(definition,filters){return{...definition,filters,offset:0,name:void 0}}function clearFilters(definition){return setFilters(definition,[])}function clearFiltersOnField(definition,code){return setFilters(definition,(definition.filters??[]).filter(f=>f.code!==code))}function addFilter(definition,field,op,value,opt_clear){opt_clear&&(definition=clearFiltersOnField(definition,field));let nextFilters=[];return definition.filters&&nextFilters.push(...definition.filters),nextFilters.push({code:field,operator:op,value:value??""}),setFilters(definition,nextFilters)}function addField(definition,field){if(definition.fields?.includes(field))return definition;let newFields=[];return definition.fields&&newFields.push(...definition.fields),newFields.push(field),{...definition,fields:newFields,name:void 0}}function deleteFilter(definition,index){if(!definition.filters)return definition;let newFilters=[...definition.filters];return newFilters.splice(index,1),{...definition,filters:newFilters,name:void 0}}function addYesterdayFilter(definition,field){return addDayFilter(definition,field,-1)}function addTodayFilter(definition,field){return addDayFilter(definition,field,0)}function addTomorrowFilter(definition,field){return addDayFilter(definition,field,1)}function addDayFilter(definition,field,delta){let startTime=new Date;startTime.setDate(startTime.getDate()+delta),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setDate(endTime.getDate()+1),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addNext24HoursFilter(definition,field){let now=new Date,endTime=new Date(now.getTime()+1440*60*1e3);return addDateFilterBetween(definition,field,now,endTime)}function addLastMonthFilter(definition,field){return addMonthFilter(definition,field,-1)}function addThisMonthFilter(definition,field){return addMonthFilter(definition,field,0)}function addNextMonthFilter(definition,field){return addMonthFilter(definition,field,1)}function addMonthFilter(definition,field,delta){let startTime=new Date;startTime.setMonth(startTime.getMonth()+delta),startTime.setDate(1),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setMonth(endTime.getMonth()+1),endTime.setDate(1),endTime.setHours(0,0,0,0),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addYearToDateFilter(definition,field){let startTime=new Date;return startTime.setMonth(0),startTime.setDate(1),startTime.setHours(0,0,0,0),addDateFilterBetween(definition,field,startTime,new Date)}function addDateFilterBetween(definition,field,d1,d2){return definition=clearFiltersOnField(definition,field),definition=addDateFilterImpl(definition,field,Operator2.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator2.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator2.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.replaceAll(/([A-Z])/g," $1"),tmp=tmp.replaceAll(/[-_]/g," "),tmp=tmp.replaceAll(/\s+/g," "),tmp=tmp.trim(),tmp.toLowerCase()==="id"?"ID":tmp.split(/\s/).map(capitalize6).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?jsx132(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children:resource.id}):key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?formatDateTime5(resource.meta?.lastUpdated):`${resource.resourceType}.${field.name}`===field.elementDefinition?.path?renderPropertyValue(resource,field.elementDefinition):field.searchParams?.length===1&&field.name===field.searchParams[0].code?renderSearchParameterValue(resource,field.searchParams[0]):null}function renderPropertyValue(resource,elementDefinition){let path=elementDefinition.path?.split(".")?.pop()?.replaceAll("[x]","")??"",[value,propertyType]=getValueAndType({type:resource.resourceType,value:resource},path);return value?jsx132(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:jsx132(Fragment46,{children:value.map((v,index)=>jsx132(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx133,jsxs as jsxs86}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef17(!1),[state,setState]=useState74({search:JSON.parse(stringify3(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState74(!1);useEffect25(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo34(()=>{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 jsx133(Modal13,{title:"Fields",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>{props.onCancel()},size:"auto",withOverlay:!0,closeOnClickOutside:!1,overlayProps:{onMouseDownCapture:()=>{wasDropdownOpen.current=isDropdownOpen},onClick:()=>{wasDropdownOpen.current||props.onCancel(),wasDropdownOpen.current=!1},children:jsx133("div",{"data-testid":"overlay-child"})},children:jsxs86(Stack33,{children:[jsx133(MultiSelect2,{style:{width:550},placeholder:"Select fields to display",data:allFields,value:state.search.fields??[],onChange:handleChange,onDropdownOpen:()=>setIsDropdownOpen(!0),onDropdownClose:()=>setIsDropdownOpen(!1),maxDropdownHeight:"250px",clearButtonProps:{"aria-label":"Clear selection"},clearable:!0,searchable:!0}),jsx133(Group53,{justify:"flex-end",children:jsx133(Button14,{onClick:()=>props.onOk(state.search),children:"OK"})})]})})}function getFieldsList(typeSchema,searchParams){let result=[],keys=new Set,names=new Set;for(let key of Object.keys(typeSchema.elements))result.push(key),keys.add(key.toLowerCase()),names.add(buildFieldNameString(key));if(searchParams)for(let code of Object.keys(searchParams)){let name=buildFieldNameString(code);!keys.has(code)&&!names.has(name)&&(result.push(code),keys.add(code),names.add(name))}return result}import{ActionIcon as ActionIcon15,Group as Group54,Modal as Modal14,NativeSelect as NativeSelect11}from"@mantine/core";import{Operator as Operator3,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect26,useRef as useRef18,useState as useState75}from"react";import{Checkbox as Checkbox7,TextInput as TextInput25}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx134}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 jsx134(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 jsx134(Checkbox7,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType.DATE:return jsx134(TextInput25,{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 jsx134(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx134(TextInput25,{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 jsx134(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx134(TextInput25,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value),placeholder:"Search value"})}}function tryParseQuantity(value){if(value){let[valueString,systemString,unitString]=value.split("|");if(valueString)return{value:Number.parseFloat(valueString),system:systemString,unit:unitString}}}import{jsx as jsx135,jsxs as jsxs87}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState75(deepClone2(props.search)),searchRef=useRef18(search);searchRef.current=search,useEffect26(()=>{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 jsx135(Modal14,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs87(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs87("div",{children:[jsxs87("table",{children:[jsxs87("colgroup",{children:[jsx135("col",{style:{width:200}}),jsx135("col",{style:{width:200}}),jsx135("col",{style:{width:380}}),jsx135("col",{style:{width:40}})]}),jsx135("thead",{children:jsxs87("tr",{children:[jsx135("th",{children:"Field"}),jsx135("th",{children:"Operation"}),jsx135("th",{children:"Value"}),jsx135("th",{})]})}),jsx135("tbody",{children:filters.map((filter,index)=>jsx135(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`))})]}),jsx135(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx135(Group54,{justify:"flex-end",mt:"xl",children:jsx135(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value,valueRef=useRef18(value);valueRef.current=value;function setFilterCode(newCode){valueRef.current.code=newCode,valueRef.current.operator=Operator3.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 jsxs87("tr",{children:[jsx135("td",{children:jsx135(NativeSelect11,{"data-testid":`${props.id}-filter-field`,defaultValue:props.value.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...Object.keys(props.searchParams).map(param=>({value:param,label:buildFieldNameString(param)}))]})}),jsx135("td",{children:operators&&jsx135(NativeSelect11,{"data-testid":`${props.id}-filter-operation`,defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]},`${props.id}-filter-value-${props.value.code}`)}),jsx135("td",{children:searchParam&&value.operator&&jsx135(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}`)}),jsx135("td",{children:props.onDelete&&jsx135(ActionIcon15,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx135(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button15,Grid,Modal as Modal15}from"@mantine/core";import{useState as useState76}from"react";import{jsx as jsx136,jsxs as jsxs88}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState76(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx136(Modal15,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx136(Form,{onSubmit:onOk,children:jsxs88(Grid,{children:[jsx136(Grid.Col,{span:10,children:jsx136(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx136(Grid.Col,{span:2,children:jsx136(Button15,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime6,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator4,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment47,jsx as jsx137}from"react/jsx-runtime";function SearchFilterValueDisplay(props){let{resourceType,filter}=props,searchParam=globalSchema.types[resourceType].searchParams?.[filter.code];if(searchParam){if(searchParam.type==="reference"&&(filter.operator===Operator4.EQUALS||filter.operator===Operator4.NOT_EQUALS))return jsx137(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx137(Fragment47,{children:formatDateTime6(filter.value)})}return jsx137(Fragment47,{children:filter.value})}import{Menu as Menu6}from"@mantine/core";import{Operator as Operator5}from"@medplum/core";import{Fragment as Fragment48,jsx as jsx138,jsxs as jsxs89}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?jsx138(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx138(Menu6.Dropdown,{children:props.searchParams.map(searchParam=>jsx138(Menu6.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx138(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx138(NumericFilterSubMenu,{...props});case"reference":return jsx138(ReferenceFilterSubMenu,{...props});case"string":return jsx138(TextFilterSubMenu,{...props});case"token":return jsx138(TokenFilterSubMenu,{...props});case"uri":return jsx138(UriFilterSubMenu,{...props});default:return jsxs89(Fragment48,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs89(Menu6.Dropdown,{children:[jsx138(Menu6.Item,{leftSection:jsx138(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx138(Menu6.Item,{leftSection:jsx138(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.ENDS_BEFORE),children:"Before..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.STARTS_AFTER),children:"After..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Between..."}),jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx138(Menu6.Item,{leftSection:jsx138(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx138(Menu6.Item,{leftSection:jsx138(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx138(Menu6.Item,{leftSection:jsx138(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx138(Menu6.Item,{leftSection:jsx138(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx138(Menu6.Item,{leftSection:jsx138(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx138(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs89(Menu6.Dropdown,{children:[jsx138(Menu6.Item,{leftSection:jsx138(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx138(Menu6.Item,{leftSection:jsx138(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN),children:"Greater than..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN),children:"Less than..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx138(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs89(Menu6.Dropdown,{children:[jsx138(Menu6.Item,{leftSection:jsx138(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx138(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs89(Menu6.Dropdown,{children:[jsx138(Menu6.Item,{leftSection:jsx138(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx138(Menu6.Item,{leftSection:jsx138(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.CONTAINS),children:"Contains..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Does not contain..."}),jsx138(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs89(Menu6.Dropdown,{children:[jsx138(Menu6.Item,{leftSection:jsx138(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.TEXT),children:"Text contains..."}),jsx138(CommonMenuItems,{...props})]})}function UriFilterSubMenu(props){let{searchParam}=props;return jsxs89(Menu6.Dropdown,{children:[jsx138(Menu6.Item,{leftSection:jsx138(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx138(Menu6.Item,{leftSection:jsx138(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx138(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs89(Fragment48,{children:[jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx138(Menu6.Item,{leftSection:jsx138(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx138(Menu6.Divider,{}),jsx138(Menu6.Item,{leftSection:jsx138(IconX,{size:14}),onClick:()=>props.onClear(searchParam),children:"Clear filters"})]})}function getPaginationControlProps(controlName){switch(controlName){case"next":return{"aria-label":"Next page"};case"previous":return{"aria-label":"Previous page"};case"first":return{"aria-label":"First page"};case"last":return{"aria-label":"Last page"};default:return{}}}var SearchControl_default={root:"SearchControl_root",table:"SearchControl_table",tr:"SearchControl_tr",th:"SearchControl_th",control:"SearchControl_control",icon:"SearchControl_icon"};import{getElementDefinition as getElementDefinition2,getSearchParameter,getSearchParameterDetails as getSearchParameterDetails4,getSearchParameters as getSearchParameters3}from"@medplum/core";function getFieldDefinitions(search){let resourceType=search.resourceType,fields=[];for(let name of search.fields||["id","_lastUpdated"])fields.push(getFieldDefinition(resourceType,name));return fields}function getFieldDefinition(resourceType,name){if(name==="_lastUpdated")return{name:"_lastUpdated",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_lastUpdated",name:"_lastUpdated",type:"date",expression:"Resource.meta.lastUpdated"}]};if(name==="meta.versionId")return{name:"meta.versionId",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_versionId",name:"_versionId",type:"token",expression:"Resource.meta.versionId"}]};let exactElementDefinition=getElementDefinition2(resourceType,name),exactSearchParam=getSearchParameter(resourceType,name.toLowerCase());if(exactElementDefinition&&exactSearchParam)return{name,elementDefinition:exactElementDefinition,searchParams:[exactSearchParam]};if(exactElementDefinition){let allSearchParams=getSearchParameters3(resourceType),searchParams;if(allSearchParams){let pathRegex=new RegExp(`${resourceType}\\.${name.replaceAll("[x]","")}([^\\w-]|$)`);searchParams=Object.values(allSearchParams).filter(p=>!!p.expression&&pathRegex.test(p?.expression)),searchParams.length===0&&(searchParams=void 0)}return{name,elementDefinition:exactElementDefinition,searchParams}}if(exactSearchParam){let details=getSearchParameterDetails4(resourceType,exactSearchParam);return{name,elementDefinition:details.elementDefinitions?.[0],searchParams:[exactSearchParam]}}return{name}}import{Fragment as Fragment49,jsx as jsx139,jsxs as jsxs90}from"react/jsx-runtime";var SearchChangeEvent=class extends Event{constructor(definition){super("change");__publicField(this,"definition");this.definition=definition}},SearchLoadEvent=class extends Event{constructor(response){super("load");__publicField(this,"response");this.response=response}},SearchClickEvent=class extends Event{constructor(resource,browserEvent){super("click");__publicField(this,"resource");__publicField(this,"browserEvent");this.resource=resource,this.browserEvent=browserEvent}};function SearchControl(props){let medplum=useMedplum39(),[outcome,setOutcome]=useState77(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState77(search);deepEquals2(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState77({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef19(state);stateRef.current=state;let total=memoizedSearch.total??"accurate",loadResults=useCallback25(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,formatSearchQuery({...memoizedSearch,total,fields:void 0}),options)).then(response=>{setState({...stateRef.current,searchResponse:response}),onLoad&&onLoad(new SearchLoadEvent(response))}).catch(reason=>{setState({...stateRef.current,searchResponse:void 0}),setOutcome(normalizeOperationOutcome7(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback25(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect27(()=>{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 jsx139(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx139(Center5,{style:{width:"100%",height:"100%"},children:jsx139(Loader5,{})});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 jsxs90("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs90(Group55,{justify:"space-between",mb:"xl",children:[jsxs90(Group55,{gap:2,children:[jsx139(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx139(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx139(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx139(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx139(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx139(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx139(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx139(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx139(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx139(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx139(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx139(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs90(Group55,{gap:2,children:[lastResult&&jsxs90(Text39,{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()}`]}),jsx139(ActionIcon16,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx139(IconRefresh,{size:iconSize})})]})]}),jsxs90(Table3,{className:SearchControl_default.table,children:[jsxs90(Table3.Thead,{children:[jsxs90(Table3.Tr,{children:[checkboxColumn&&jsx139(Table3.Th,{children:jsx139("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx139(Table3.Th,{children:jsxs90(Menu7,{shadow:"md",width:240,position:"bottom-end",children:[jsx139(Menu7.Target,{children:jsx139(UnstyledButton5,{className:SearchControl_default.control,p:2,children:jsxs90(Group55,{justify:"space-between",wrap:"nowrap",children:[jsx139(Text39,{fw:500,children:buildFieldNameString(field.name)}),jsx139(Center5,{className:SearchControl_default.icon,children:jsx139(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx139(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&&jsxs90(Table3.Tr,{children:[checkboxColumn&&jsx139(Table3.Th,{}),fields.map(field=>jsx139(Table3.Th,{children:field.searchParams&&jsx139(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),jsx139(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs90(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx139(Table3.Td,{children:jsx139("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=>jsx139(Table3.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&jsx139(Container,{children:jsx139(Center5,{style:{height:150},children:jsx139(Text39,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx139(Center5,{m:"md",p:"md",children:jsx139(Pagination2,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),jsx139(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}`),jsx139(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}`),jsx139(SearchExportDialog,{visible:stateRef.current.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx139(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}`)]})}function FilterDescription(props){let filters=(props.filters??[]).filter(f=>props.searchParams.find(p=>p.code===f.code));return filters.length===0?jsx139("span",{children:"no filters"}):jsx139(Fragment49,{children:filters.map(filter=>jsxs90("div",{children:[getOpString(filter.operator),"\xA0",jsx139(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 jsx140,jsxs as jsxs91}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum40(),[schemaLoaded,setSchemaLoaded]=useState78(!1),[outcome,setOutcome]=useState78(),{query,fields}=props,[response,setResponse]=useState78(),[selected,setSelected]=useState78({}),responseRef=useRef20(response);responseRef.current=response;let selectedRef=useRef20({});selectedRef.current=selected,useEffect28(()=>{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(useEffect28(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx140(Loader6,{});let checkboxColumn=props.checkboxesEnabled;return jsxs91("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs91(Table4,{children:[jsx140(Table4.Thead,{children:jsxs91(Table4.Tr,{children:[checkboxColumn&&jsx140(Table4.Th,{children:jsx140("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx140(Table4.Th,{children:field.name},field.name))]})}),jsx140(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs91(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx140(Table4.Td,{children:jsx140("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=>jsx140(Table4.Td,{children:jsx140(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx140("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx140("div",{"data-testid":"search-error",children:jsx140("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx140(Button17,{onClick:()=>props.onBulk(Object.keys(selectedRef.current)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo(FhirPathTable);import{ScrollArea as ScrollArea5}from"@mantine/core";var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};import{jsx as jsx141}from"react/jsx-runtime";function InfoBar(props){return jsx141(ScrollArea5,{children:jsx141("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx141("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx141("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx141("div",{className:InfoBar_default.value,children:props.children})};import{Anchor as Anchor9,Tabs}from"@mantine/core";import{isString,locationUtils as locationUtils5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate6}from"@medplum/react-hooks";import{useState as useState79}from"react";var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};import{jsx as jsx142,jsxs as jsxs92}from"react/jsx-runtime";function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=useMedplumNavigate6(),[currentTab,setCurrentTab]=useState79(()=>{let tab=locationUtils5.getPathname().split("/").pop();return tab&&tabs.some(t=>t.value===tab)?tab:tabs[0].value});function onTabChange(newTabName){newTabName=newTabName||tabs[0].value,setCurrentTab(newTabName),navigate(`${baseUrl}/${newTabName}`)}return jsxs92(Tabs,{value:currentTab.toLowerCase(),onChange:onTabChange,...rest,children:[jsx142(Tabs.List,{className:LinkTabs_default.list,children:tabs.map(t=>jsx142(Tabs.Tab,{value:t.value,children:jsx142(Anchor9,{className:LinkTabs_default.link,href:`${baseUrl}/${t.value}`,onClick:onLinkClick,children:t.label})},t.value))}),children]})}function normalizeTabDefinitions(tabs){return tabs.map(t=>isString(t)?{label:t,value:t.toLowerCase()}:t)}function onLinkClick(e){isAuxClick(e)||e.preventDefault()}import{Box as Box21,SimpleGrid as SimpleGrid2}from"@mantine/core";import{useResource as useResource13,useSearchOne}from"@medplum/react-hooks";import{Box as Box20,Flex as Flex17,Group as Group56,Paper as Paper5,RingProgress,Text as Text40,Title as Title9}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{Fragment as Fragment50,jsx as jsx143,jsxs as jsxs93}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx143(Paper5,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs93(Group56,{children:[group.measureScore&&jsx143(MeasureScore,{group}),!group.measureScore&&jsx143(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs93(Fragment50,{children:[jsx143(Text40,{fz:"md",fw:500,mb:8,children:measure.title}),jsx143(Text40,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept5(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept5(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs93(Box20,{children:[jsx143(Title9,{order:3,children:"Not Applicable"}),jsx143(Text40,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs93(Box20,{children:[jsx143(Title9,{order:3,children:"Insufficient Data"}),jsx143(Text40,{children:`Numerator: ${numeratorCount}`}),jsx143(Text40,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx143(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx143(Flex17,{justify:"center",children:jsxs93(Text40,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx143(Fragment50,{children:unit==="%"?jsx143(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx143(Flex17,{justify:"center",children:jsx143(Text40,{fw:700,fz:18,children:jsx143(QuantityDisplay,{value:group.measureScore})})})}):jsx143(Flex17,{h:120,align:"center",children:jsx143(Title9,{order:3,children:jsx143(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 jsx144,jsxs as jsxs94}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource13(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs94(Box21,{children:[measure&&jsx144(MeasureTitle,{measure}),jsx144(SimpleGrid2,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx144(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon17,Indicator,Tooltip as Tooltip6}from"@mantine/core";import{useNotificationCount as useNotificationCount2}from"@medplum/react-hooks";import{jsx as jsx145}from"react/jsx-runtime";function NotificationIcon(props){let{resourceType,countCriteria,subscriptionCriteria}=props,unreadCount=useNotificationCount2({resourceType,countCriteria,subscriptionCriteria}),result=props.iconComponent;return props.onClick&&(result=jsx145(ActionIcon17,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=jsx145(Tooltip6,{label:props.tooltip,children:result})),unreadCount>0&&(result=jsx145(Indicator,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}import{Group as Group57,SegmentedControl as SegmentedControl2,Stack as Stack34}from"@mantine/core";import{notifications}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString12,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum41}from"@medplum/react-hooks";import{useCallback as useCallback26}from"react";import{jsx as jsx146,jsxs as jsxs95}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=useMedplum41(),{patient}=props,handleSubmit=useCallback26(async data2=>{let patientId=resolveId2(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:jsx146(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString12(err),icon:jsx146(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient]);return jsx146(Form,{onSubmit:handleSubmit,children:jsxs95(Stack34,{children:[jsx146(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx146(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})}),jsx146(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx146(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx146(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx146(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx146(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:jsx146(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx146(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:jsx146(DateTimeInput,{name:"endDate",placeholder:"End date"})}),jsx146(Group57,{justify:"right",children:jsx146(SubmitButton,{children:"Request Export"})})]})})}function saveData(data2,fileName,contentType){let content=typeof data2=="string"?data2:JSON.stringify(data2,null,2),blob=new Blob([content],{type:contentType}),url=window.URL.createObjectURL(blob),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=url,a.download=fileName,a.click(),window.URL.revokeObjectURL(url)}import{calculateAgeString as calculateAgeString2}from"@medplum/core";import{useResource as useResource14}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment51,jsx as jsx147,jsxs as jsxs96}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource14(props.patient);return patient?jsxs96(InfoBar,{children:[jsx147(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs96(InfoBar.Entry,{children:[jsx147(InfoBar.Key,{children:"Name"}),jsx147(InfoBar.Value,{children:jsx147(MedplumLink,{to:patient,fw:500,children:patient.name?jsx147(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs96(Fragment51,{children:[jsxs96(InfoBar.Entry,{children:[jsx147(InfoBar.Key,{children:"DoB"}),jsx147(InfoBar.Value,{children:patient.birthDate})]}),jsxs96(InfoBar.Entry,{children:[jsx147(InfoBar.Key,{children:"Age"}),jsx147(InfoBar.Value,{children:calculateAgeString2(patient.birthDate)})]})]}),patient.gender&&jsxs96(InfoBar.Entry,{children:[jsx147(InfoBar.Key,{children:"Gender"}),jsx147(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs96(InfoBar.Entry,{children:[jsx147(InfoBar.Key,{children:"State"}),jsx147(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs96(InfoBar.Entry,{children:[jsx147(InfoBar.Key,{children:identifier?.system}),jsx147(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Box as Box22,Button as Button18,Checkbox as Checkbox8,Flex as Flex18,Group as Group58,Loader as Loader7,Radio as Radio5,Stack as Stack35,Text as Text41,TextInput as TextInput26}from"@mantine/core";import{showNotification as showNotification10}from"@mantine/notifications";import{formatAddress as formatAddress4,normalizeErrorString as normalizeErrorString13}from"@medplum/core";import{useCallback as useCallback27,useState as useState80}from"react";var PharmacyDialog_default={pharmacyItem:"PharmacyDialog_pharmacyItem",pharmacyItemSelected:"PharmacyDialog_pharmacyItemSelected"};import{jsx as jsx148,jsxs as jsxs97}from"react/jsx-runtime";function getPharmacyKey(pharmacy,index){return pharmacy.identifier?.[0]?.value||`pharmacy-${index}`}function SearchForm({onSearch,searching}){return jsx148("form",{onSubmit:e=>{e.preventDefault();let formData=new FormData(e.currentTarget);onSearch(formData)},children:jsxs97(Stack35,{gap:"md",children:[jsx148(TextInput26,{name:"name",label:"Pharmacy Name",placeholder:"Enter pharmacy name (min 3 chars)"}),jsxs97(Group58,{grow:!0,children:[jsx148(TextInput26,{name:"city",label:"City",placeholder:"City (min 3 chars)"}),jsx148(TextInput26,{name:"state",label:"State",placeholder:"State (min 3 chars)"})]}),jsxs97(Group58,{grow:!0,children:[jsx148(TextInput26,{name:"zip",label:"Zip Code",placeholder:"Zip code (min 3 chars)"}),jsx148(TextInput26,{name:"phoneOrFax",label:"Phone or Fax",placeholder:"Phone or fax number"})]}),jsx148(TextInput26,{name:"address",label:"Address",placeholder:"Street address (min 3 chars)"}),jsx148(TextInput26,{name:"ncpdpID",label:"NCPDP ID",placeholder:"National Council for Prescription Drug Programs ID"}),jsx148(Button18,{type:"submit",loading:searching,children:"Search"})]})})}function PharmacyItem({pharmacy,pharmacyKey,isSelected,onSelect}){return jsx148(Box22,{p:"sm",className:isSelected?PharmacyDialog_default.pharmacyItemSelected:PharmacyDialog_default.pharmacyItem,onClick:onSelect,children:jsx148(Radio5,{value:pharmacyKey,label:jsxs97(Box22,{children:[jsx148(Text41,{fw:500,size:"sm",children:pharmacy.name}),pharmacy.address?.[0]&&jsx148(Text41,{size:"xs",c:"dimmed",children:formatAddress4(pharmacy.address[0])}),pharmacy.telecom?.find(t=>t.system==="phone")&&jsxs97(Text41,{size:"xs",c:"dimmed",children:["Phone: ",pharmacy.telecom.find(t=>t.system==="phone")?.value]}),pharmacy.telecom?.find(t=>t.system==="fax")&&jsxs97(Text41,{size:"xs",c:"dimmed",children:["Fax: ",pharmacy.telecom.find(t=>t.system==="fax")?.value]})]})})},pharmacyKey)}function SearchResults({searchResults,selectedPharmacy,onSelectPharmacy,setAsPrimary,onSetAsPrimary,onAddFavorite,onClose,adding}){return jsxs97(Box22,{mt:"xl",children:[jsxs97(Text41,{fw:600,mb:"md",children:["Search Results (",searchResults.length,")"]}),jsx148(Radio5.Group,{value:selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy)):"",onChange:value=>{let selected=searchResults.find((p,i)=>getPharmacyKey(p,i)===value);selected&&onSelectPharmacy(selected)},children:jsx148(Stack35,{gap:"sm",children:searchResults.map((pharmacy,index)=>{let pharmacyKey=getPharmacyKey(pharmacy,index),isSelected=selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy))===pharmacyKey:!1;return jsx148(PharmacyItem,{pharmacy,pharmacyKey,isSelected,onSelect:()=>onSelectPharmacy(pharmacy)},pharmacyKey)})})}),jsxs97(Flex18,{mt:"lg",gap:"md",align:"center",justify:"space-between",children:[jsx148(Checkbox8,{label:"Set as primary pharmacy",checked:setAsPrimary,onChange:e=>onSetAsPrimary(e.currentTarget.checked)}),jsxs97(Group58,{children:[jsx148(Button18,{variant:"subtle",onClick:onClose,children:"Cancel"}),jsx148(Button18,{onClick:onAddFavorite,disabled:!selectedPharmacy,loading:adding,children:"Add to Favorites"})]})]})]})}function PharmacyDialog(props){let{patient,onSubmit,onClose,onSearch,onAddToFavorites}=props,[searchResults,setSearchResults]=useState80([]),[searching,setSearching]=useState80(!1),[selectedPharmacy,setSelectedPharmacy]=useState80(),[setAsPrimary,setSetAsPrimary]=useState80(!1),[adding,setAdding]=useState80(!1),handleSearch=useCallback27(async formData=>{let searchParams={name:formData.get("name")||void 0,city:formData.get("city")||void 0,state:formData.get("state")||void 0,zip:formData.get("zip")||void 0,address:formData.get("address")||void 0,phoneOrFax:formData.get("phoneOrFax")||void 0,ncpdpID:formData.get("ncpdpID")||void 0},cleanParams=Object.fromEntries(Object.entries(searchParams).filter(([_,v])=>typeof v=="string"&&v.trim()!==""));if(Object.keys(cleanParams).length===0){showNotification10({color:"yellow",title:"Search Required",message:"Please enter at least one search criterion"});return}setSearching(!0),setSelectedPharmacy(void 0);try{let results=await onSearch(cleanParams);setSearchResults(results),results.length===0&&showNotification10({color:"blue",title:"No Results",message:"No pharmacies found matching your search criteria"})}catch(error){console.error("Error searching pharmacies:",error),showNotification10({color:"red",title:"Search Error",message:normalizeErrorString13(error)})}finally{setSearching(!1)}},[onSearch]),handleAddFavorite=useCallback27(async()=>{if(!(!selectedPharmacy||!patient.id)){setAdding(!0);try{let response=await onAddToFavorites({patientId:patient.id,pharmacy:selectedPharmacy,setAsPrimary});response.success?(showNotification10({color:"green",title:"Success",message:response.message}),onSubmit(response.organization||selectedPharmacy)):showNotification10({color:"red",title:"Error",message:response.message})}catch(error){console.error("Error adding pharmacy:",error),showNotification10({color:"red",title:"Error",message:normalizeErrorString13(error)})}finally{setAdding(!1)}}},[selectedPharmacy,patient.id,setAsPrimary,onAddToFavorites,onSubmit]);return jsxs97(Box22,{children:[jsx148(SearchForm,{onSearch:formData=>handleSearch(formData).catch(console.error),searching}),searching&&jsx148(Flex18,{justify:"center",mt:"xl",children:jsx148(Loader7,{})}),searchResults.length>0&&!searching&&jsx148(SearchResults,{searchResults,selectedPharmacy,onSelectPharmacy:setSelectedPharmacy,setAsPrimary,onSetAsPrimary:setSetAsPrimary,onAddFavorite:handleAddFavorite,onClose,adding})]})}import{createReference as createReference16}from"@medplum/core";import{useCallback as useCallback28}from"react";import{jsx as jsx149}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback28((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 jsx149(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference16(resource),sender:createReference16(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference16(resource),operator:createReference16(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor10,Box as Box23,Button as Button19,CloseButton as CloseButton2,Flex as Flex19,Group as Group59,Loader as Loader8,NativeSelect as NativeSelect12,Paper as Paper6,Stack as Stack36,Text as Text42,TextInput as TextInput27}from"@mantine/core";import{getReferenceString as getReferenceString11}from"@medplum/core";import{useMedplum as useMedplum42,useResource as useResource15}from"@medplum/react-hooks";import{useEffect as useEffect29,useRef as useRef21,useState as useState81}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx150,jsxs as jsxs98}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum42(),defaultValue2=useResource15(props.value),[schemaLoaded,setSchemaLoaded]=useState81(!1),[selectedKey,setSelectedKey]=useState81(),[hoverKey,setHoverKey]=useState81(),[value,setValue]=useState81();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}let valueRef=useRef21(value);if(valueRef.current=value,useEffect29(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect29(()=>(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 jsx150("div",{children:jsxs98(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx150(TextInput27,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx150(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx150(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){let actionsRef=useRef21(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 jsxs98(Stack36,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx150(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx150("div",{children:jsx150(Button19,{variant:"outline",onClick:e=>{killEvent(e),addAction({id:generateId()})},children:"Add action"})})]})}function ActionBuilder(props){let{action}=props;function onClick(e){e.stopPropagation(),props.setSelectedKey(props.action.id)}function onHover(e){killEvent(e),props.setHoverKey(props.action.id)}return jsx150("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx150(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState81(),medplum=useMedplum42(),[loading,setLoading]=useState81(!1),[resource,setResource]=useState81(),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 useEffect29(()=>{(async()=>{if(!action.definitionCanonical)return;setLoading(!0);let resource2=await medplum.readCanonical(["Questionnaire","ActivityDefinition"],action.definitionCanonical);setActionType(getInitialActionType(resource2)),setResource(resource2),setLoading(!1)})().catch(console.error)},[action.definitionCanonical,medplum]),loading?jsx150(Loader8,{}):jsxs98(Paper6,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs98(Flex19,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx150(TextInput27,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx150(CloseButton2,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs98(Stack36,{gap:"xl",p:"md",children:[jsx150(Box23,{children:jsx150(TextInput27,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx150(Box23,{children:jsx150(NativeSelect12,{label:"Type of Action",value:actionType,onChange:e=>{let value=e.currentTarget.value==="standard"?void 0:e.currentTarget.value;setActionType(value),props.onChange({...props.action,definitionCanonical:value==="standard"?void 0:props.action.definitionCanonical})},data:[{value:"standard",label:"Standard task"},{value:"questionnaire",label:"Task with Questionnaire"},{value:"activitydefinition",label:"Task with Activity Definition"}]})}),actionType==="questionnaire"&&jsxs98(Stack36,{gap:0,children:[jsxs98(Group59,{gap:0,mb:"xs",children:[jsx150(Text42,{fw:600,children:"Select questionnaire"}),jsx150(Text42,{c:"red",children:"*"})]}),jsxs98(Text42,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx150(Anchor10,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx150(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&jsxs98(Stack36,{gap:0,children:[jsxs98(Group59,{gap:0,mb:"xs",children:[jsx150(Text42,{fw:600,children:"Select activity definition"}),jsx150(Text42,{c:"red",children:"*"})]}),jsxs98(Text42,{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"," ",jsx150(Anchor10,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx150(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return jsx150(ResourceInput,{name:id,placeholder:props.placeholder,resourceType:props.resourceType,defaultValue:resource,onChange:newValue=>{newValue?props.onChange({...props.action,definitionCanonical:"url"in newValue?newValue.url:void 0,definitionUri:"url"in newValue?void 0:getReferenceString11(newValue)}):props.onChange({...props.action,definitionCanonical:void 0})}})}function getInitialActionType(resource){return resource===void 0?"standard":resource.resourceType.toLowerCase()}var nextId=1;function generateId(existing){if(existing){if(existing.startsWith("id-")){let existingNum=Number.parseInt(existing.substring(3),10);Number.isNaN(existingNum)||(nextId=Math.max(nextId,existingNum+1))}return existing}return"id-"+nextId++}function ensurePlanDefinitionKeys(planDefinition){return{...planDefinition,action:ensurePlanDefinitionActionKeys(planDefinition.action)}}function ensurePlanDefinitionActionKeys(actions){if(actions)return actions.map(action=>({...action,id:generateId(action.id),action:ensurePlanDefinitionActionKeys(action.action)}))}import{Anchor as Anchor11,Box as Box24,Group as Group60,NativeSelect as NativeSelect13,Space,Textarea as Textarea5,TextInput as TextInput28,Title as Title10}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{getQuestionnaireItemReferenceTargetTypes as getQuestionnaireItemReferenceTargetTypes2,isChoiceQuestion,QUESTIONNAIRE_ITEM_CONTROL_URL as QUESTIONNAIRE_ITEM_CONTROL_URL2,QuestionnaireItemType as QuestionnaireItemType4,setQuestionnaireItemReferenceTargetTypes,useMedplum as useMedplum43,useResource as useResource16}from"@medplum/react-hooks";import{useEffect as useEffect30,useRef as useRef22,useState as useState82}from"react";var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};import{Fragment as Fragment52,jsx as jsx151,jsxs as jsxs99}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum43(),defaultValue2=useResource16(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState82(!1),[value,setValue]=useState82(),[selectedKey,setSelectedKey]=useState82(),[hoverKey,setHoverKey]=useState82();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect30(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect30(()=>(setValue(ensureQuestionnaireKeys(defaultValue2??{resourceType:"Questionnaire",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]);let handleChange=(questionnaire2,disableSubmit)=>{setValue(questionnaire2),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire2)};return!schemaLoaded||!value?null:jsx151("div",{children:jsxs99(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx151(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx151(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource2=isResourceType(props.item),isContainer=isResource2||item.type===QuestionnaireItemType4.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef22(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 jsxs99("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx151("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs99(Fragment52,{children:[isResource2&&jsx151(TextInput28,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource2&&jsx151(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx151(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx151(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs99(Fragment52,{children:[resource.title&&jsx151(Title10,{children:resource.title}),item.text&&jsx151("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx151(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx151("div",{children:jsx151(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&&jsx151("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs99(Fragment52,{children:[jsx151(TextInput28,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx151(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"}]})]}):jsx151("div",{children:linkId})}),!isResource2&&jsx151(Box24,{className:QuestionnaireBuilder_default.movementActions,children:jsxs99(Box24,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx151(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx151(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx151(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx151(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs99("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs99(Fragment52,{children:[jsx151(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx151(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource2&&jsx151(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource2&&jsxs99(Fragment52,{children:[jsx151(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx151(Anchor11,{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 jsxs99("div",{children:[props.item.answerValueSet!==void 0?jsx151(TextInput28,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx151(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs99(Box24,{display:"flex",children:[jsx151(Anchor11,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),jsx151(Space,{w:"lg"}),jsx151(Anchor11,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx151("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs99("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx151("div",{children:jsx151(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)}),jsx151("div",{children:jsx151(Anchor11,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:props.options.filter(o=>o.id!==option.id)})},children:"Remove"})})]},option.id)})})}function ReferenceProfiles(props){let targetTypes=getQuestionnaireItemReferenceTargetTypes2(props.item)??[];return jsxs99(Fragment52,{children:[targetTypes.map((targetType,index)=>jsxs99(Group60,{children:[jsx151(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx151(Anchor11,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx151(Anchor11,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId2=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId2(){return"id-"+nextId2++}function ensureQuestionnaireKeys(questionnaire2){return{...questionnaire2,id:questionnaire2.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire2.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId2=Math.max(nextId2,Number.parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,Number.parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId2(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId2()}))}function createPage(){return{id:generateId2(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:QUESTIONNAIRE_ITEM_CONTROL_URL2,valueCodeableConcept:{coding:[{system:"http://hl7.org/fhir/questionnaire-item-control",code:"page"}]}}]}}function reorderItems(items,itemIndex,delta){let currentItems=items??[],newIndex=itemIndex+delta;if(newIndex<0||newIndex>=currentItems.length)return currentItems;let updatedItems=[...currentItems];return[updatedItems[itemIndex],updatedItems[newIndex]]=[updatedItems[newIndex],updatedItems[itemIndex]],updatedItems}import{Stack as Stack38}from"@mantine/core";import{useResource as useResource17}from"@medplum/react-hooks";import{Stack as Stack37,Text as Text43}from"@mantine/core";import{formatDate as formatDate4}from"@medplum/core";import{useMemo as useMemo35}from"react";import{Fragment as Fragment53,jsx as jsx152,jsxs as jsxs100}from"react/jsx-runtime";function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=useMemo35(()=>answer&&answer.length>0?jsx152(Fragment53,{children:answer.map((ans,index)=>jsx152(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?jsx152(Fragment53,{children:nestedAnswers.map((nestedAnswer,index)=>jsx152(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):jsx152(Text43,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return jsxs100(Stack37,{gap:0,pb:"xs",children:[jsx152(Text43,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return jsx152(Text43,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return jsx152(Text43,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return jsx152(Text43,{children:value});case"valueQuantity":return jsx152(QuantityDisplay,{value});case"valueString":return jsx152(Text43,{children:value});case"valueCoding":return jsx152(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return jsx152(RangeDisplay,{value});case"valueDateTime":return jsx152(Text43,{children:formatDate4(value)});case"valueBoolean":return jsx152(Text43,{children:value?"True":"False"});case"valueReference":return jsx152(Text43,{children:value.display??value.reference});default:return jsx152(Text43,{children:value.toString()})}}import{jsx as jsx153}from"react/jsx-runtime";function QuestionnaireResponseDisplay(props){let questionnaireResponse=useResource17(props.questionnaireResponse);return jsx153(Stack38,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>jsx153(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}import{ActionIcon as ActionIcon18,Divider as Divider7,Group as Group61,NativeSelect as NativeSelect14,Stack as Stack39,Text as Text44,TextInput as TextInput29}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect31,useState as useState83}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx154,jsxs as jsxs101}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]=useState83([]),[groupId,setGroupId]=useState83(1),[intervalId,setIntervalId]=useState83(1);return useEffect31(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs101(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx154(Stack39,{children:intervalGroups.map(intervalGroup=>jsx154(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx154(ActionIcon18,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx154(IconCirclePlus,{})}),jsx154(Group61,{justify:"flex-end",children:jsx154(SubmitButton,{children:"Save"})})]});function submitDefinition(){let qualifiedInterval=intervalGroups.flatMap(group=>group.intervals).filter(interval=>!isEmptyInterval(interval));props.onSubmit({...defaultDefinition,qualifiedInterval})}function addGroup(addedGroup){setIntervalGroups(currentGroups=>[...currentGroups,addedGroup])}function removeGroup(removedGroup){setIntervalGroups(currentGroups=>currentGroups.filter(group=>group.id!==removedGroup.id))}function changeInterval(groupId2,changedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2),index=currentGroup?.intervals.findIndex(interval=>interval.id===changedInterval.id);return index!==void 0&&currentGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g=>g.id===groupId2);if(currentGroupIndex!==-1){let currentGroup={...groups[currentGroupIndex]};addedInterval={...addedInterval,...currentGroup.filters},currentGroup.intervals=[...currentGroup.intervals,addedInterval],groups[currentGroupIndex]=currentGroup}return groups})}function removeInterval(groupId2,removedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx154(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs101(Stack39,{gap:"lg",children:[jsx154(Group61,{justify:"flex-end",children:jsx154(ActionIcon18,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx154(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx154(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx154(Divider7,{}),intervalGroup.intervals.map(interval=>jsxs101(Stack39,{gap:"xs",children:[jsxs101(Group61,{children:[jsx154(TextInput29,{"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}`),jsx154(ActionIcon18,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx154(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx154(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx154(ActionIcon18,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx154(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 jsxs101(Stack39,{style:{maxWidth:"50%"},children:[jsx154(Group61,{children:jsx154(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})}}})}),jsxs101(Group61,{gap:"xs",children:[jsx154(Text44,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx154("div",{id:`div-age-${intervalGroup.id}`,children:jsx154(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}`)})]}),jsx154(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"}]}})}}}),jsx154(NativeSelect14,{data:["","reference","critical","absolute"],label:"Category: ",defaultValue:intervalGroup.filters.category,onChange:e=>{for(let interval of intervalGroup.intervals){let newCategory=e.currentTarget.value;newCategory===""?onChange(intervalGroup.id,{...interval,category:void 0}):onChange(intervalGroup.id,{...interval,category:newCategory})}}})]})}function ensureQualifiedIntervalKeys(definition,setIntervalId){let intervals=definition.qualifiedInterval||[],nextId3=Math.max(...intervals.map(interval=>{let existingNum=Number.parseInt(interval.id?.substring(3)||"",10);return Number.isNaN(existingNum)?Number.NEGATIVE_INFINITY:existingNum}))+1;return Number.isFinite(nextId3)||(nextId3=1),definition={...definition,qualifiedInterval:intervals.map(interval=>({...interval,id:interval.id||`id-${nextId3++}`}))},setIntervalId(nextId3),definition}function groupQualifiedIntervals(intervals,setGroupId){let groupId=1,groups={};for(let interval of intervals){let groupKey=generateGroupKey(interval);groupKey in groups||(groups[groupKey]={id:`group-id-${groupId++}`,filters:Object.fromEntries(intervalFilters.map(f=>[f,interval[f]])),intervals:[]}),groups[groupKey].intervals.push(interval)}return setGroupId(groupId),Object.values(groups)}function generateGroupKey(interval){return[`gender=${interval.gender}`,`age=${formatRange2(interval.age)}`,`gestationalAge=${formatRange2(interval.gestationalAge)}`,`context=${interval.context?.text}`,`appliesTo=${interval.appliesTo?.map(c=>c.text).join("+")}`,`category=${interval.category}`].join(":")}function getUnitString(unit){return unit&&(getCodeBySystem(unit,"http://unitsofmeasure.org")||unit.text)}function isEmptyInterval(interval){return interval.range?.low?.value===void 0&&interval.range?.high?.value===void 0}import{Button as Button20,Grid as Grid2,Text as Text45}from"@mantine/core";import{formatDateTime as formatDateTime7,getReferenceString as getReferenceString12}from"@medplum/core";import{useMedplum as useMedplum44,useResource as useResource18}from"@medplum/react-hooks";import{Fragment as Fragment54,useEffect as useEffect32,useState as useState84}from"react";import{jsx as jsx155,jsxs as jsxs102}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum44(),requestGroup=useResource18(props.value),[startedLoading,setStartedLoading]=useState84(!1),[responseBundle,setResponseBundle]=useState84();if(useEffect32(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx155(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 jsxs102(Fragment54,{children:[jsx155(Grid2.Col,{span:1,p:"md",children:task?.status==="completed"?jsx155(IconCheckbox,{}):jsx155(IconSquare,{color:"gray"})}),jsxs102(Grid2.Col,{span:9,p:"xs",children:[jsx155(Text45,{fw:500,children:action.title}),action.description&&jsx155("div",{children:action.description}),jsxs102("div",{children:["Last edited by\xA0",jsx155(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime7(task?.meta?.lastUpdated)]}),jsxs102("div",{children:["Status: ",jsx155(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs102(Grid2.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx155(Button20,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx155(Button20,{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===getReferenceString12(entry.resource))return entry.resource}}import{useMedplum as useMedplum45}from"@medplum/react-hooks";import{useEffect as useEffect33,useState as useState85}from"react";import{stringify as stringify4}from"@medplum/core";function diff(original,revised){let path=buildPath(original,revised);return buildRevisions(path,original,revised)}function buildPath(orig,rev){let N=orig.length,M=rev.length,MAX=N+M+1,size=1+2*MAX,middle=Math.trunc(size/2),diagonal=new Array(size);diagonal[middle+1]={i:0,j:-1,prev:void 0,snake:!0};for(let d=0;d<MAX;d++){for(let k=-d;k<=d;k+=2){let kmiddle=middle+k,kplus=kmiddle+1,kminus=kmiddle-1,kplusNode=diagonal[kplus],kminusNode=diagonal[kminus],prev,i=0;k===-d||k!==d&&kminusNode.i<kplusNode.i?(i=kplusNode.i,prev=kplusNode):(i=kminusNode.i+1,prev=kminusNode),diagonal[kminus]=void 0;let j=i-k,node={i,j,prev:previousSnake(prev),snake:!1};for(;i<N&&j<M&&orig[i]===rev[j];)i++,j++;if(i>node.i&&(node={i,j,prev:node,snake:!0}),diagonal[kmiddle]=node,i>=N&&j>=M)return diagonal[kmiddle]}diagonal[middle+d-1]=void 0}}function buildRevisions(startNode,orig,rev){let deltas=[],path=startNode;for(path.snake&&(path=path.prev);path?.prev&&path.prev.j>=0;){let i=path.i,j=path.j;path=path.prev;let ianchor=path.i,janchor=path.j,original={position:ianchor,lines:orig.slice(ianchor,i)},revised={position:janchor,lines:rev.slice(janchor,j)},type;original.lines.length===0&&revised.lines.length>0?type="insert":original.lines.length>0&&revised.lines.length===0?type="delete":type="change",deltas.push({original,revised,type}),path.snake&&(path=path.prev)}return deltas}function previousSnake(node){return node&&!node.snake&&node.prev?node.prev:node}function blame(history){let versions=(history.entry??[]).filter(entry=>!!entry.resource).map(entry=>({meta:entry.resource?.meta,lines:stringify4(entry.resource,!0).match(/[^\r\n]+/g)})).sort((a,b)=>a.meta.lastUpdated.localeCompare(b.meta.lastUpdated));if(!versions.length)return[];let table=versions[0].lines.map(line=>({id:versions[0].meta.versionId,meta:versions[0].meta,value:line,span:1}));return compareVersions(table,versions),combineSpans(table),table}function compareVersions(table,versions){for(let i=1;i<versions.length;i++){let revisions=diff(versions[i-1].lines,versions[i].lines);for(let revision of revisions){let position=revision.original.position,oldLines=revision.original.lines,newLines=revision.revised.lines;if((revision.type==="delete"||revision.type==="change")&&table.splice(position,oldLines.length),revision.type==="insert"||revision.type==="change")for(let k=0;k<revision.revised.lines.length;k++)table.splice(position+k,0,{id:versions[i].meta.versionId,meta:versions[i].meta,value:newLines[k],span:1})}}}function combineSpans(table){let start=0;for(;start<table.length;){let curr=start;for(;curr<table.length&&table[curr].id===table[start].id;)table[curr].span=-1,curr++;table[start].span=curr-start,start=curr}}var ResourceBlame_default={container:"ResourceBlame_container",root:"ResourceBlame_root",startRow:"ResourceBlame_startRow",normalRow:"ResourceBlame_normalRow",author:"ResourceBlame_author",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 Fragment55,jsx as jsx156,jsxs as jsxs103}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum45(),[value,setValue]=useState85(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 jsx156("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx156("div",{className:ResourceBlame_default.container,children:jsx156("table",{className:ResourceBlame_default.root,children:jsx156("tbody",{children:table.map((row,index)=>jsxs103("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs103(Fragment55,{children:[jsx156("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:jsx156(ResourceName,{value:row.meta.author,link:!0,fz:"xs"})}),jsx156("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx156(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),fz:"xs",children:getTimeString(row.meta.lastUpdated)})})]}),jsx156("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx156("td",{className:ResourceBlame_default.line,children:jsx156("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 Fragment56,jsx as jsx157,jsxs as jsxs104}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 jsx157("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx157(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs104(Fragment56,{children:["...",jsx157("br",{}),props.delta.original.lines.length>0&&jsx157("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
110
- `)}),props.delta.revised.lines.length>0&&jsx157("div",{className:ResourceDiff_default.added,children:props.delta.revised.lines.join(`
111
- `)}),"...",jsx157("br",{})]})}import{ActionIcon as ActionIcon19,Alert as Alert5,Button as Button21,Group as Group62,Menu as Menu8,Stack as Stack40,TextInput as TextInput30,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 useMedplum46,useResource as useResource19}from"@medplum/react-hooks";import{useEffect as useEffect34,useMemo as useMemo36,useState as useState86}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx158,jsxs as jsxs105}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum46(),defaultValue2=useResource19(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState86(!1),[value,setValue]=useState86(),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=useMemo36(()=>defaultValue2&&satisfiedAccessPolicy2(defaultValue2,AccessPolicyInteraction2.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=useMemo36(()=>medplum.isSuperAdmin()||!accessPolicy||!isPopulated12(value?.resourceType)?!0:canWriteResourceType(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?jsx158("div",{children:"Loading..."}):canWrite?jsxs105("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs105(Stack40,{mb:"xl",children:[jsx158(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx158(TextInput30,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx158(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx158(TextInput30,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx158(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:resourceType,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl,accessPolicyResource}),jsxs105(Group62,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx158(Button21,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs105(Menu8,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx158(Menu8.Target,{children:jsx158(ActionIcon19,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx158(IconChevronDown,{size:14,stroke:1.5})})}),jsxs105(Menu8.Dropdown,{children:[props.onPatch&&jsx158(Menu8.Item,{leftSection:jsx158(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx158(Menu8.Item,{color:"red",leftSection:jsx158(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs105(Alert5,{color:"red",title:"Permission denied",icon:jsx158(IconAlertCircle,{}),children:["Your access level prevents you from editing and creating ",value.resourceType," resources."]})}import{Table as Table5}from"@mantine/core";import{formatDateTime as formatDateTime8,normalizeErrorString as normalizeErrorString14}from"@medplum/core";import{useMedplum as useMedplum47}from"@medplum/react-hooks";import{useEffect as useEffect35,useState as useState87}from"react";import{jsx as jsx159,jsxs as jsxs106}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum47(),[value,setValue]=useState87(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?jsxs106(Table5,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx159(Table5.Thead,{children:jsxs106(Table5.Tr,{children:[jsx159(Table5.Th,{children:"Author"}),jsx159(Table5.Th,{children:"Date"}),jsx159(Table5.Th,{children:"Version"})]})}),jsx159(Table5.Tbody,{children:value.entry?.map((entry,index)=>jsx159(HistoryRow,{entry},"entry-"+index))})]}):jsx159("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs106(Table5.Tr,{children:[jsx159(Table5.Td,{children:jsx159(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx159(Table5.Td,{children:formatDateTime8(resource.meta?.lastUpdated)}),jsx159(Table5.Td,{children:jsx159(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx159(Table5.Tr,{children:jsx159(Table5.Td,{colSpan:3,children:normalizeErrorString14(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button22,Stack as Stack41,Text as Text46}from"@mantine/core";import{getReferenceString as getReferenceString13,isReference as isReference3}from"@medplum/core";import{useMedplum as useMedplum48,useResource as useResource20}from"@medplum/react-hooks";import{useEffect as useEffect36,useMemo as useMemo37,useState as useState88}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx160,jsxs as jsxs107}from"react/jsx-runtime";function Scheduler(props){let medplum=useMedplum48(),questionnaire2=useResource20(props.questionnaire),[month,setMonth]=useState88(getStartMonth()),[date,setDate]=useState88(),[response,setResponse]=useState88(),[actor,setActor]=useState88(),[slots,setSlots]=useState88(),[selectedSlot,setSelectedSlot]=useState88();useEffect36(()=>{props.schedule||setSlots([]);let fetchSlots;typeof props.schedule=="function"?fetchSlots=props.schedule:(fetchSlots=async period=>{let scheduleArray=[];if(!Array.isArray(props.schedule))scheduleArray.push(isReference3(props.schedule,"Schedule")?props.schedule.reference:getReferenceString13(props.schedule));else for(let schedule of props.schedule)if(isReference3(schedule))scheduleArray.push(schedule.reference);else{let scheduleRef=getReferenceString13(schedule);scheduleArray.push(scheduleRef)}let slotSearchParams=new URLSearchParams([["_count","720"],["schedule",scheduleArray.join(",")],["start","gt"+period.start],["start","lt"+period.end]]);return medplum.searchResources("Slot",slotSearchParams)},props.schedule&&!Array.isArray(props.schedule)&&(isReference3(props.schedule)?medplum.readReference(props.schedule).then(schedule=>{let actorRef=schedule.actor?.[0];setActor(actorRef)}).catch(console.error):setActor(props.schedule.actor?.[0]))),fetchSlots({start:getStart2(month),end:getEnd2(month)}).then(setSlots).catch(console.error)},[medplum,props.schedule,month]);let startTimeToSlotMap=useMemo37(()=>{if(!date)return null;let sortedSlots=(slots||[]).filter(slot=>new Date(slot.start).getTime()>date.getTime()&&new Date(slot.start).getTime()<date.getTime()+24*3600*1e3).sort((a,b)=>new Date(a.start).getTime()-new Date(b.start).getTime()),startTimeToSlotMap2=new Map;for(let slot of sortedSlots)startTimeToSlotMap2.set(formatTime(new Date(slot.start)),slot);return startTimeToSlotMap2},[slots,date]);return!slots||!questionnaire2?null:jsxs107("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs107("div",{className:Scheduler_default.info,children:[actor&&jsx160(ResourceAvatar,{value:actor,size:"xl"}),actor&&jsx160(Text46,{size:"xl",fw:500,children:jsx160(ResourceName,{value:actor})}),jsx160("p",{children:"1 hour"}),date&&jsx160("p",{children:date.toLocaleDateString()}),selectedSlot&&jsx160("p",{children:formatTime(new Date(selectedSlot.start))})]}),jsxs107("div",{className:Scheduler_default.selection,children:[!date&&jsxs107("div",{children:[jsx160("h3",{children:"Select date"}),jsx160(CalendarInput,{slots,onChangeMonth:setMonth,onClick:setDate})]}),date&&!selectedSlot&&jsxs107("div",{children:[jsx160("h3",{children:"Select time"}),jsx160(Stack41,{children:Array.from(startTimeToSlotMap?.entries()??[]).map(([startTime,slot])=>jsx160("div",{children:jsx160(Button22,{variant:"outline",style:{width:150},onClick:()=>setSelectedSlot(slot),children:startTime})},slot.id))})]}),date&&selectedSlot&&!response&&jsx160(QuestionnaireForm,{questionnaire:questionnaire2,submitButtonText:"Next",onSubmit:setResponse}),date&&selectedSlot&&response&&jsxs107("div",{children:[jsx160("h3",{children:"You're all set!"}),jsx160("p",{children:"Check your email for a calendar invite."})]})]})]})}function getStart2(month){return formatSlotInstant(month.getTime())}function getEnd2(month){return formatSlotInstant(month.getTime()+744*60*60*1e3)}function formatSlotInstant(time){let date=new Date(Math.max(Date.now(),time));return date.setHours(0,0,0,0),date.toISOString()}function formatTime(date){return date.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})}import{createReference as createReference17}from"@medplum/core";import{jsx as jsx161}from"react/jsx-runtime";function ServiceRequestTimeline(props){let{serviceRequest,...rest}=props;return jsx161(ResourceTimeline,{value:serviceRequest,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("ServiceRequest",id),medplum.search("Communication",{"based-on":ref,_count}),medplum.search("DiagnosticReport",{"based-on":ref,_count}),medplum.search("Media",{"based-on":ref,_count}),medplum.search("DocumentReference",{related:ref,_count}),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count})])},createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",basedOn:[createReference17(resource)],subject:resource.subject,sender:createReference17(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference17(resource)],subject:resource.subject,operator:createReference17(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor12}from"@mantine/core";import{showNotification as showNotification11}from"@mantine/notifications";import{ensureTrailingSlash,locationUtils as locationUtils6,normalizeErrorString as normalizeErrorString15}from"@medplum/core";import{useMedplum as useMedplum49,useResource as useResource21}from"@medplum/react-hooks";import{jsx as jsx162}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum49(),{client,patient,encounter,children,...rest}=props,patientResource=useResource21(patient),encounterResource=useResource21(encounter);function launchApp(){let patientRef=patient,encounterRef=encounter;if(client.launchIdentifierSystems?.length){let patientIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Patient");if(patientRef&&patientResource&&patientIdentifierConfig?.system){let identifier=patientResource.identifier?.find(i=>i.system===patientIdentifierConfig.system);identifier&&(patientRef={...patient,identifier})}let encounterIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Encounter");if(encounterRef&&encounterResource&&encounterIdentifierConfig?.system){let identifier=encounterResource.identifier?.find(i=>i.system===encounterIdentifierConfig.system);identifier&&(encounterRef={...encounter,identifier})}}medplum.createResource({resourceType:"SmartAppLaunch",patient:patientRef,encounter:encounterRef}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",ensureTrailingSlash(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),locationUtils6.assign(url.toString())}).catch(err=>showNotification11({color:"red",message:normalizeErrorString15(err),autoClose:!1}))}return jsx162(Anchor12,{onClick:()=>launchApp(),...rest,children})}export{AddressDisplay,AddressInput,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,CalendarInput,ChatList,ChatListItem,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,LinkTabs,Loading,Logo,MeasureReportDisplay,MedplumLink,MemoizedFhirPathTable,MfaForm,MoneyDisplay,MoneyInput,Navbar,NewTopicDialog,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,Panel,ParticipantFilter,PatientExportForm,PatientHeader,PatientSummary,PatientTimeline,Pharmacies,PharmacyDialog,PlanDefinitionBuilder,QuantityDisplay,QuantityInput,QuestionnaireBuilder,QuestionnaireForm,QuestionnaireResponseDisplay,RangeDisplay,RangeInput,RatioInput,ReferenceDisplay,ReferenceInput,ReferenceRangeEditor,ReferenceRangeGroupEditor,RegisterForm,RequestGroupDisplay,ResourceArrayDisplay,ResourceArrayInput,ResourceAvatar,ResourceBadge,ResourceBlame,ResourceDiff,ResourceDiffTable,ResourceForm,ResourceHistoryTable,ResourceInput,ResourceName,ResourcePropertyDisplay,ResourcePropertyInput,ResourceTable,ResourceTimeline,Scheduler,SearchChangeEvent,SearchClickEvent,SearchControl,SearchFieldEditor,SearchFilterEditor,SearchLoadEvent,ServiceRequestTimeline,SignInForm,SignatureInput,SmartAppLaunchLink,Spotlight,StatusBadge,SubmitButton,ThreadChat,ThreadInbox,Timeline,TimelineItem,TimingInput,ValueSetAutocomplete,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNext24HoursFilter,addNextMonthFilter,addPreferredPharmacyToPatient,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,clearFilters,clearFiltersOnField,convertIsoToLocal,convertLocalToIso,createPreferredPharmacyExtension,createScriptTag,deleteFilter,exportJsonFile,getAppName,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getOpString,getPaginationControlProps,getPreferredPharmaciesFromPatient,getRecaptcha,getSearchOperators,getSortField,getValuePath,initRecaptcha,isAddPharmacyResponse,isAuxClick,isCheckboxCell,isOrganizationArray,isSortDescending,isSupportedProfileStructureDefinition,killEvent,parseForm,removePreferredPharmacyFromPatient,renderValue,sendCommand,setFilters,setOffset,setPage,setPropertyValue,setSort,sortByDateAndPriority,toggleSort};
109
+ }`.replaceAll(/\s+/g," ");return(await medplum.graphql(query)).data.StructureDefinitionList[0]}function shouldFetchResourceType(targetType){return targetType.type==="profile"&&!targetType?.error&&isEmpty4(targetType.resourceType)}import{Group as Group23,Stack as Stack12,Text as Text15}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useMedplum as useMedplum19}from"@medplum/react-hooks";import{useContext as useContext19,useEffect as useEffect11,useState as useState41}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group22,Stack as Stack11,Text as Text14}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 useState40}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon4,Button as Button4}from"@mantine/core";import{jsx as jsx76}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx76(Button4,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx76(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx76(ActionIcon4,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx76(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon5}from"@mantine/core";import{jsx as jsx77}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx77(ActionIcon5,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx77(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx78,jsxs as jsxs42}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState40(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,jsx78(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx78(Text14,{c:"dimmed",children:"(empty)"}):jsxs42(Stack11,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs42(Group22,{wrap:"nowrap",children:[jsx78("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx78(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&&jsx78(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&&jsx78(Group22,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx78(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx79,jsxs as jsxs43}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum19(),[loading,setLoading]=useState41(!0),[slices,setSlices]=useState41([]),[defaultValue2]=useState41(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState41(()=>[defaultValue2]),ctx=useContext19(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect11(()=>{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 jsx79("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 jsxs43(Stack12,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx79(Text15,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx79(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)=>jsxs43(Group23,{wrap:"nowrap",style:{flexGrow:1},children:[jsx79("div",{style:{flexGrow:1},children:jsx79(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&&jsx79(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&&jsx79(Group23,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx79(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.push(void 0),setValuesWrapper(newNonSliceValues,nonSliceIndex)},testId:"nonsliced-add"})})]})}function addPlaceholderValues(slicedValues,slices){for(let sliceIndex=0;sliceIndex<slices.length;sliceIndex++){let slice=slices[sliceIndex],sliceValues=slicedValues[sliceIndex];for(;sliceValues.length<slice.min;)sliceValues.push(void 0)}}import{ActionIcon as ActionIcon6,Flex as Flex7,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification4}from"@mantine/notifications";import{useRef as useRef11,useState as useState42}from"react";import{jsx as jsx80,jsxs as jsxs44}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState42(!1),clipboard=useClipboard(),ref=useRef11(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs44(Flex7,{gap:"xs",children:[jsx80(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx80(ActionIcon6,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification4({color:"green",message:"Copied"})},children:jsx80(IconCopy,{})})]})}import{Box as Box6,Button as Button5,Chip,Group as Group24,Modal as Modal2,NativeSelect as NativeSelect8,Stack as Stack13,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 useState43}from"react";import{Fragment as Fragment27,jsx as jsx81,jsxs as jsxs45}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState43(props.defaultValue),[open,setOpen]=useState43(!props.disabled&&(props.defaultModalOpen??!1));return jsxs45(Fragment27,{children:[jsxs45(Group24,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81("span",{"data-testid":"timinginput-display",children:formatTiming2(value)||"No repeat"}),jsx81(Button5,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx81(TimingEditorDialog,{path:props.path,visible:open,defaultValue:value,onOk:newValue=>{props.onChange&&props.onChange(newValue),setValue(newValue),setOpen(!1)},onCancel:()=>setOpen(!1)})]})}var defaultValue={repeat:{period:1,periodUnit:"d"}};function TimingEditorDialog(props){let[value,setValue]=useState43(props.defaultValue||defaultValue),[timeOfDayItems,setTimeOfDayItems]=useState43(()=>(props.defaultValue?.repeat?.timeOfDay??[]).map((v,i)=>({id:i,value:v}))),nextTimeOfDayId=useRef12(timeOfDayItems.length),{getExtendedProps}=useContext20(ElementsContext),[eventProps,repeatProps,repeatPeriodProps,repeatPeriodUnitProps,repeatDayOfWeekProps,repeatTimeOfDayProps]=useMemo19(()=>["event","repeat","repeat.period","repeat.periodUnit","repeat.dayOfWeek","repeat.timeOfDay"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setStart(newStart){setValue(value2=>({...value2,event:[newStart]}))}function setRepeat(repeat){setValue(value2=>({...value2,repeat}))}function setPeriod(period){setValue(value2=>({...value2,repeat:{...value2.repeat,period}}))}function setPeriodUnit(periodUnit){setValue(value2=>({...value2,repeat:{...value2.repeat,periodUnit}}))}function setDaysOfWeek(dayOfWeek){setValue(value2=>({...value2,repeat:{...value2.repeat,dayOfWeek}}))}function setTimeOfDay(updater){setTimeOfDayItems(items=>{let newItems=updater(items),timeOfDay=newItems.map(item=>item.value);return setValue(value2=>({...value2,repeat:{...value2.repeat,timeOfDay}})),newItems})}return jsx81(Modal2,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs45(Stack13,{gap:"md",children:[jsx81(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx81(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx81(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs45(Fragment27,{children:[jsx81(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs45(Group24,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81(TextInput16,{disabled:repeatPeriodProps?.readonly,type:"number",step:1,id:"timing-dialog-period",name:"timing-dialog-period",defaultValue:value.repeat.period||1,onChange:e=>setPeriod(Number.parseInt(e.currentTarget.value,10)||1)}),jsx81(NativeSelect8,{disabled:repeatPeriodUnitProps?.readonly,id:"timing-dialog-periodUnit",name:"timing-dialog-periodUnit",defaultValue:value.repeat.periodUnit,onChange:e=>setPeriodUnit(e.currentTarget.value),data:[{label:"minute",value:"min"},{label:"hour",value:"h"},{label:"day",value:"d"},{label:"week",value:"wk"},{label:"month",value:"mo"},{label:"year",value:"a"}]})]})}),value.repeat.periodUnit==="wk"&&jsx81(FormSection,{title:"Repeat on",children:jsx81(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,value:value.repeat?.dayOfWeek,children:jsx81(Group24,{justify:"space-between",mt:"xs",gap:"xs",children:daysOfWeek.map(day=>jsx81(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,checked:(value.repeat?.dayOfWeek??[]).includes(day),children:day.charAt(0).toUpperCase()},day))})})}),jsx81(FormSection,{title:"At times",children:jsxs45(Stack13,{mt:"xs",children:[timeOfDayItems.map((item,idx)=>jsxs45(Group24,{children:[jsx81(TextInput16,{disabled:repeatTimeOfDayProps?.readonly,type:"time",id:`timing-dialog-repeat-timeOfDay[${idx}]`,name:`timing-dialog-repeat-timeOfDay[${idx}]`,"data-testid":`timing-repeat-timeOfDay-input-${idx}`,defaultValue:item.value.slice(0,5),onChange:e=>{let newValue=`${e.currentTarget.value}:00`;setTimeOfDay(items=>items.with(idx,{...item,value:newValue}))},style:{flexGrow:1}}),jsx81(ArrayRemoveButton,{testId:`timing-repeat-timeOfDay-remove-${idx}`,onClick:()=>setTimeOfDay(items=>items.toSpliced(idx,1))})]},item.id)),jsx81(Box6,{children:jsx81(ArrayAddButton,{propertyDisplayName:"Time of Day",onClick:()=>setTimeOfDay(items=>{let id=nextTimeOfDayId.current++;return items.concat({id,value:"00:00:00"})})})})]})})]}),jsx81(Group24,{justify:"flex-end",children:jsx81(Button5,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx82,jsxs as jsxs46}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 jsx82(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx82(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx82(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx82(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]=useState44(initialPropertyType);return jsxs46(Group25,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx82(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}))}),jsx82(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 jsx82("div",{children:"Property type not specified "});function getComplexInputProps(){return{name,defaultValue:defaultValue2,onChange,outcome,path,valuePath,disabled:readOnly}}function getPrimitiveInputProps(){let error=getErrorsForInput(props.outcome,valuePath??path);return{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,error,disabled:readOnly}}switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.string:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"?jsx82(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx82(TextInput17,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx82(TextInput17,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.time:return jsx82(TextInput17,{...getPrimitiveInputProps(),type:"time",step:1,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx82(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx82(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 jsx82(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx82(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:case PropertyType2.xhtml:return jsx82(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx82(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx82(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx82(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx82(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx82(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx82(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx82(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx82(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx82(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx82(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx82(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx82(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx82(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx82(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx82(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx82(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx82(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx82(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 jsx83}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState45(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 jsx83(Stack14,{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=jsx83(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"?jsx83(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx83(FormSection,{title:getPathDisplayName5(key),description:element.description,withAsterisk:required,htmlFor:key,outcome:props.outcome,fhirPath:element.path,errorExpression:valuePath,readonly:element.readonly,children:resourcePropertyInput},key)})})}var BackboneElementInput_default={nested:"BackboneElementInput_nested"};import{jsx as jsx84,jsxs as jsxs47}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState46(()=>props.defaultValue??{}),parentElementsContext=useContext23(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo22(()=>tryGetDataType2(props.typeName,profileUrl),[props.typeName,profileUrl]),type=typeSchema?.type??props.typeName,contextValue=useMemo22(()=>{if(typeSchema)return buildElementsContext4({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);if(!typeSchema)return jsxs47("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx84(Box7,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:jsx84(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}import{Button as Button6,Group as Group26}from"@mantine/core";import{useMemo as useMemo23,useState as useState47}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 jsx85,jsxs as jsxs48}from"react/jsx-runtime";function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState47(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 jsxs48("div",{children:[jsxs48(Group26,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx85("p",{style:{flex:1},children:getMonthString(month)}),jsxs48(Group26,{justify:"flex-end",gap:"xs",children:[jsx85(Button6,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx85(Button6,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs48("table",{className:CalendarInput_default.table,children:[jsx85("thead",{children:jsxs48("tr",{children:[jsx85("th",{children:"SUN"}),jsx85("th",{children:"MON"}),jsx85("th",{children:"TUE"}),jsx85("th",{children:"WED"}),jsx85("th",{children:"THU"}),jsx85("th",{children:"FRI"}),jsx85("th",{children:"SAT"})]})}),jsx85("tbody",{children:grid.map((week,weekIndex)=>jsx85("tr",{children:week.map((day,dayIndex)=>jsx85("td",{children:day&&jsx85(Button6,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,slots){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d.getTime()),available:isDayAvailable(d,slots)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,slots){for(let slot of slots){let slotStart=new Date(slot.start);if(slotStart.getFullYear()===day.getFullYear()&&slotStart.getMonth()===day.getMonth()&&slotStart.getDate()===day.getDate())return!0}return!1}import{ActionIcon as ActionIcon7,Group as Group27,LoadingOverlay,Menu as Menu4,Paper as Paper2,Popover,ScrollArea as ScrollArea2,Skeleton,Stack as Stack16,Text as Text17,TextInput as TextInput19,Title as Title5}from"@mantine/core";import{useResizeObserver}from"@mantine/hooks";import{showNotification as showNotification5}from"@mantine/notifications";import{getDisplayString as getDisplayString4,getReferenceString as getReferenceString5,normalizeErrorString as normalizeErrorString6}from"@medplum/core";import{useCachedBinaryUrl as useCachedBinaryUrl3,useMedplum as useMedplum21,useResource as useResource3,useSubscription}from"@medplum/react-hooks";import{useCallback as useCallback10,useEffect as useEffect13,useMemo as useMemo24,useRef as useRef13,useState as useState49}from"react";var BaseChat_default={chatPaper:"BaseChat_chatPaper",chatTitle:"BaseChat_chatTitle",chatBody:"BaseChat_chatBody",chatScrollArea:"BaseChat_chatScrollArea",chatInputContainer:"BaseChat_chatInputContainer",chatPendingFile:"BaseChat_chatPendingFile",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble",chatBubbleNameRight:"BaseChat_chatBubbleNameRight",chatBubbleAttachmentWithText:"BaseChat_chatBubbleAttachmentWithText",chatBubbleAttachmentIcon:"BaseChat_chatBubbleAttachmentIcon",chatBubbleMenu:"BaseChat_chatBubbleMenu"};import{Box as Box8,Divider as Divider4,Loader as Loader3,Stack as Stack15,Text as Text16,TextInput as TextInput18,UnstyledButton as UnstyledButton3}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback2}from"@mantine/hooks";import{getReferenceString as getReferenceString4}from"@medplum/core";import{useMedplum as useMedplum20}from"@medplum/react-hooks";import{useEffect as useEffect12,useState as useState48}from"react";import{jsx as jsx86,jsxs as jsxs49}from"react/jsx-runtime";function DocumentPicker({subjectRef,onSelect,onUpload}){let medplum=useMedplum20(),[search,setSearch]=useState48(""),[docs,setDocs]=useState48([]),[loading,setLoading]=useState48(!0),subjectRefStr=subjectRef?getReferenceString4(subjectRef):void 0,fetchDocs=useDebouncedCallback2(async query=>{setLoading(!0);try{let params=new URLSearchParams;subjectRefStr&&params.set("subject",subjectRefStr),query.trim()&&params.set("description:contains",query.trim()),params.set("_sort","-date"),params.set("_count","5");let results=await medplum.searchResources("DocumentReference",params);setDocs([...results])}catch(err){console.error(err)}finally{setLoading(!1)}},300);useEffect12(()=>{fetchDocs(search)},[fetchDocs,search]);let getDocName=doc=>doc.description??doc.content?.[0]?.attachment?.title??"Untitled";return jsxs49(Stack15,{gap:0,w:280,children:[jsx86(Text16,{fw:500,fz:"sm",px:"sm",pt:"sm",pb:"xs",children:"Attachments"}),jsx86(Box8,{px:"sm",pb:"xs",children:jsx86(TextInput18,{placeholder:"Search for a Document...",size:"xs",value:search,onChange:e=>setSearch(e.currentTarget.value)})}),jsx86(Divider4,{}),loading?jsx86(Box8,{py:"sm",style:{display:"flex",justifyContent:"center"},children:jsx86(Loader3,{size:"xs"})}):jsxs49(Stack15,{gap:0,children:[docs.map(doc=>jsxs49(UnstyledButton3,{px:"sm",py:"xs",onClick:()=>onSelect(doc),style:{display:"flex",alignItems:"center",gap:8},children:[jsx86(IconFileText,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-blue-6)"}}),jsx86(Text16,{fz:"sm",truncate:!0,children:getDocName(doc)})]},doc.id)),docs.length===0&&jsx86(Text16,{fz:"xs",c:"dimmed",px:"sm",py:"xs",children:"No documents found"})]}),jsx86(Divider4,{}),jsxs49(UnstyledButton3,{px:"sm",py:"xs",onClick:onUpload,style:{display:"flex",alignItems:"center",gap:8},children:[jsx86(IconPaperclip,{size:"1rem",style:{flexShrink:0,color:"var(--mantine-color-gray-6)"}}),jsx86(Text16,{fz:"sm",c:"dimmed",children:"Upload an image, pdf, etc."})]})]})}import{jsx as jsx87,jsxs as jsxs50}from"react/jsx-runtime";function toSafeUrl(url){if(url)try{let{protocol}=new URL(url);return protocol==="https:"||protocol==="http:"||protocol==="blob:"?url:void 0}catch{return}}function showError(message){showNotification5({color:"red",title:"Error",message,autoClose:!1})}function parseSentTime(communication){return new Date(communication.sent??0).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}function upsertCommunications(communications,received,setCommunications){let newCommunications=[...communications],foundNew=!1;for(let comm of received){let existingIdx=newCommunications.findIndex(c=>c.id===comm.id);existingIdx!==-1?newCommunications[existingIdx]=comm:(newCommunications.push(comm),foundNew=!0)}foundNew&&newCommunications.sort((a,b)=>!a.sent&&!b.sent?0:a.sent?b.sent?a.sent.localeCompare(b.sent):1:-1),setCommunications(newCommunications)}function BaseChat(props){let{title,communications,setCommunications,query,sendMessage,onMessageReceived,onMessageUpdated,inputDisabled,onError,excludeHeader=!1,uploadEnabled=!1,attachmentSubjectRef,onViewInDocuments,...paperProps}=props,medplum=useMedplum21(),inputRef=useRef13(null),scrollAreaRef=useRef13(null),firstScrollRef=useRef13(!0),initialLoadRef=useRef13(!0),[profile,setProfile]=useState49(medplum.getProfile()),[reconnecting,setReconnecting]=useState49(!1),[loading,setLoading]=useState49(!0),[pendingFile,setPendingFile]=useState49(void 0),[pendingDocRef,setPendingDocRef]=useState49(void 0),[pickerOpen,setPickerOpen]=useState49(!1),fileInputRef=useRef13(null);loading||(initialLoadRef.current=!1);let profileRefStr=useMemo24(()=>profile?getReferenceString5(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=>showNotification5({color:"red",message:normalizeErrorString6(err)}))},[searchMessages]),useSubscription(`Communication?${query}`,bundle=>{let communication=bundle.entry?.[1]?.resource;upsertCommunications(communicationsRef.current,[communication],setCommunications),getReferenceString5(communication.sender)!==profileRefStr&&(communicationsRef.current.find(c=>c.id===communication.id)?onMessageUpdated?.(communication):onMessageReceived?.(communication))},{onWebSocketClose:useCallback10(()=>{reconnecting||setReconnecting(!0),showNotification5({color:"red",message:"Live chat disconnected. Attempting to reconnect..."})},[reconnecting]),onWebSocketOpen:useCallback10(()=>{reconnecting&&showNotification5({color:"green",message:"Live chat reconnected."})},[reconnecting]),onSubscriptionConnect:useCallback10(()=>{reconnecting&&(searchMessages().catch(err=>showNotification5({color:"red",message:normalizeErrorString6(err)})),setReconnecting(!1))},[reconnecting,searchMessages]),onError:useCallback10(err=>{onError?onError(err):showError(normalizeErrorString6(err))},[onError])});let sendMessageInternal=useCallback10(formData=>{if(inputDisabled)return;let message=formData.message?.trim()??"";!message&&!pendingFile&&!pendingDocRef||(inputRef.current&&(inputRef.current.value=""),fileInputRef.current&&(fileInputRef.current.value=""),sendMessage(message,pendingFile,pendingDocRef),setPendingFile(void 0),setPendingDocRef(void 0),scrollToBottomRef.current=!0)},[inputDisabled,sendMessage,pendingFile,pendingDocRef]);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?jsxs50(Paper2,{className:BaseChat_default.chatPaper,p:0,radius:"md",...paperProps,children:[!excludeHeader&&jsx87(Title5,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx87("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs50(Stack16,{align:"stretch",mt:"lg",children:[jsxs50(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx87(Skeleton,{height:38,circle:!0,ml:"md"}),jsx87(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs50(Group27,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx87(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx87(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs50(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx87(Skeleton,{height:38,circle:!0,ml:"md"}),jsx87(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs50(ScrollArea2,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx87(LoadingOverlay,{visible:loading||reconnecting,style:{width:parentRect.width,height:parentRect.height,position:"absolute",zIndex:1}}),communications.map((c,i)=>{let prevCommunication=i>0?communications[i-1]:void 0,prevCommTime=prevCommunication?parseSentTime(prevCommunication):void 0,currCommTime=parseSentTime(c),showDelivered=!!c.received&&c.id===myLastDeliveredId,payloads=c.payload??[],contentRef=payloads.find(p=>p.contentReference)?.contentReference,contentAttachment=payloads.find(p=>p.contentAttachment)?.contentAttachment,hasAttachment=!!(contentRef||contentAttachment),isSender=c.sender?.reference===profileRefStr,menu=hasAttachment?jsx87(ChatBubbleMenu,{contentRef,contentAttachment,onViewInDocuments}):null;return jsxs50(Stack16,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx87(Text17,{fz:"xs",ta:"center",children:currCommTime}),isSender?jsxs50(Group27,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx87("div",{className:BaseChat_default.chatBubbleMenu,children:menu}),jsx87(ChatBubble,{alignment:"right",communication:c,showDelivered}),jsx87(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender,mb:showDelivered?void 0:"sm"})]}):jsxs50(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx87(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),jsx87(ChatBubble,{alignment:"left",communication:c}),jsx87("div",{className:BaseChat_default.chatBubbleMenu,children:menu})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsxs50("div",{className:BaseChat_default.chatInputContainer,children:[(pendingFile||pendingDocRef)&&jsxs50(Group27,{className:BaseChat_default.chatPendingFile,gap:4,align:"center",wrap:"nowrap",children:[pendingDocRef?jsx87(IconFileText,{size:"0.75rem"}):jsx87(IconPaperclip,{size:"0.75rem"}),jsx87(Text17,{fz:"xs",c:"dimmed",flex:1,truncate:!0,children:pendingDocRef?pendingDocRef.description??pendingDocRef.content?.[0]?.attachment?.title??"Document":pendingFile?.name}),jsx87(ActionIcon7,{size:"xs",variant:"subtle",color:"red",onClick:()=>{setPendingDocRef(void 0),setPendingFile(void 0),fileInputRef.current&&(fileInputRef.current.value="")},"aria-label":"Remove attachment",children:jsx87(IconX,{size:"0.75rem"})})]}),jsx87("input",{ref:fileInputRef,type:"file",style:{display:"none"},disabled:inputDisabled,onChange:e=>{let file=e.target.files?.[0];file&&(setPendingFile(file),setPendingDocRef(void 0))}}),jsx87(Form,{onSubmit:sendMessageInternal,children:jsx87(TextInput19,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",leftSectionWidth:42,rightSectionWidth:42,disabled:inputDisabled,leftSection:!inputDisabled&&uploadEnabled?jsxs50(Popover,{opened:pickerOpen,onChange:setPickerOpen,position:"top-start",withArrow:!0,shadow:"md",withinPortal:!0,children:[jsx87(Popover.Target,{children:jsx87(ActionIcon7,{onClick:()=>setPickerOpen(o=>!o),size:"1.5rem",radius:"xl",color:pendingFile||pendingDocRef?"blue":"gray",variant:pendingFile||pendingDocRef?"filled":"subtle","aria-label":"Attach file",children:jsx87(IconPaperclip,{size:"1rem",stroke:1.5})})}),jsx87(Popover.Dropdown,{p:0,children:jsx87(DocumentPicker,{subjectRef:attachmentSubjectRef,onSelect:doc=>{setPendingDocRef(doc),setPendingFile(void 0),setPickerOpen(!1)},onUpload:()=>{setPickerOpen(!1),fileInputRef.current?.click()}})})]}):void 0,rightSection:inputDisabled?void 0:jsx87(ActionIcon7,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx87(IconArrowRight,{size:"1rem",stroke:1.5})})})})]})]}):null}function ChatBubble(props){let{communication,alignment,showDelivered}=props,payloads=communication.payload??[],textContent=payloads.find(p=>p.contentString)?.contentString??"",contentRef=payloads.find(p=>p.contentReference)?.contentReference,attachment=payloads.find(p=>p.contentAttachment)?.contentAttachment,sentTime=new Date(communication.sent??-1),seenTime=new Date(communication.received??-1),senderResource=useResource3(communication.sender);return jsxs50("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsxs50(Text17,{fz:"xs",mb:"xs",fw:500,className:alignment==="right"?BaseChat_default.chatBubbleNameRight:void 0,"aria-label":"Sender name",children:[senderResource?getDisplayString4(senderResource):"[Unknown sender]","\xA0\xB7\xA0",jsx87(Text17,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),jsx87("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsxs50("div",{className:BaseChat_default.chatBubble,children:[textContent&&jsx87("span",{children:textContent}),contentRef&&jsx87(ChatBubbleDocumentReference,{reference:contentRef,hasText:!!textContent}),attachment&&jsx87(ChatBubbleAttachment,{attachment,hasText:!!textContent})]})}),showDelivered&&jsxs50("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleAttachment({attachment,hasText}){return jsx87("div",{className:hasText?BaseChat_default.chatBubbleAttachmentWithText:void 0,children:jsxs50(Group27,{gap:4,wrap:"nowrap",children:[jsx87("span",{className:BaseChat_default.chatBubbleAttachmentIcon,children:jsx87(IconPaperclip,{size:"0.75rem"})}),jsx87(Text17,{fz:"xs",truncate:!0,children:attachment.title??"File attached"})]})})}function ChatBubbleDocumentReference({reference,hasText}){let attachment=useResource3(reference)?.content?.[0]?.attachment;return attachment?jsx87(ChatBubbleAttachment,{attachment,hasText}):null}function ChatBubbleMenu({contentRef,contentAttachment,onViewInDocuments}){let docRef=useResource3(contentRef),attachment=contentRef?docRef?.content?.[0]?.attachment:contentAttachment,cachedUrl=useCachedBinaryUrl3(attachment?.url),handleDownload=()=>{let href=toSafeUrl(cachedUrl??attachment?.url);href&&window.open(href,"_blank","noopener,noreferrer")};return jsxs50(Menu4,{withinPortal:!0,position:"bottom-start",shadow:"md",children:[jsx87(Menu4.Target,{children:jsx87(ActionIcon7,{variant:"outline",color:"gray",radius:"xl",size:"sm","aria-label":"Attachment options",children:jsx87(IconDots,{size:"0.75rem"})})}),jsxs50(Menu4.Dropdown,{children:[contentRef&&onViewInDocuments&&jsx87(Menu4.Item,{leftSection:jsx87(IconFileExport,{size:"0.9rem"}),onClick:()=>onViewInDocuments(contentRef),children:"View in Documents"}),jsx87(Menu4.Item,{leftSection:jsx87(IconDownload,{size:"0.9rem"}),onClick:handleDownload,children:"Download"})]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs50("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx87("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx87("div",{style:{position:"relative"},children:jsx87(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx87("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx87("div",{className:BaseChat_default.chatBubble,children:jsx87(Skeleton,{height:14,width:parentWidth*.5,radius:"l"})})})]})}import{ActionIcon as ActionIcon8}from"@mantine/core";import{useMedplumProfile as useMedplumProfile5}from"@medplum/react-hooks";import{useEffect as useEffect14,useState as useState50}from"react";var ChatModal_default={iconContainer:"ChatModal_iconContainer",icon:"ChatModal_icon",chatModalContainer:"ChatModal_chatModalContainer"};import{Fragment as Fragment28,jsx as jsx88,jsxs as jsxs51}from"react/jsx-runtime";function ChatModal(props){let{open,children}=props,profile=useMedplumProfile5(),[opened,setOpened]=useState50(open??!1);return useEffect14(()=>{setOpened(prevVal=>open??prevVal)},[open]),profile?jsxs51(Fragment28,{children:[opened&&jsx88("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx88("div",{className:ChatModal_default.iconContainer,children:jsx88(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx88(IconChevronDown,{size:"1.625rem"})})}):jsx88("div",{className:ChatModal_default.iconContainer,children:jsx88(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx88(IconChevronUp,{size:"1.625rem"})})})]}):null}import{createReference as createReference3,formatCodeableConcept as formatCodeableConcept2,getReferenceString as getReferenceString6}from"@medplum/core";import{useMedplum as useMedplum22,useMedplumProfile as useMedplumProfile6,usePrevious}from"@medplum/react-hooks";import{useCallback as useCallback11,useEffect as useEffect15,useMemo as useMemo25,useState as useState51}from"react";import{jsx as jsx89}from"react/jsx-runtime";function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,excludeHeader,uploadEnabled,onError,onViewInDocuments}=props,medplum=useMedplum22(),profile=useMedplumProfile6(),prevThreadId=usePrevious(thread?.id),[communications,setCommunications]=useState51([]),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,file,existingDocRef)=>{let profileRefStr=profileRef?getReferenceString6(profileRef):void 0;if(!profileRefStr)return;(async()=>{let payload=[];if(message&&payload.push({contentString:message}),existingDocRef)payload.push({contentReference:createReference3(existingDocRef)});else if(file){let docRef=await medplum.createDocumentReference({data:file,contentType:file.type||"application/octet-stream",filename:file.name,additionalFields:thread.subject?{subject:thread.subject}:void 0});payload.push({contentReference:createReference3(docRef)})}let communication=await medplum.createResource({resourceType:"Communication",status:"in-progress",sender:profileRef,recipient:thread.recipient?.filter(ref=>getReferenceString6(ref)!==profileRefStr)??[],sent:new Date().toISOString(),payload,partOf:[threadRef]});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?jsx89(BaseChat,{title:title??(thread?.topic?formatCodeableConcept2(thread.topic):"[No thread title]"),communications,setCommunications,query:`part-of=Communication/${thread.id}`,sendMessage,onMessageReceived,inputDisabled,excludeHeader,uploadEnabled,onError,attachmentSubjectRef:thread.subject,onViewInDocuments}):null}import{Divider as Divider5,Stack as Stack18}from"@mantine/core";import{Fragment as Fragment29}from"react";import{Group as Group28,Stack as Stack17,Text as Text18}from"@mantine/core";import{formatDateTime as formatDateTime2,formatHumanName as formatHumanName6}from"@medplum/core";import{useResource as useResource4}from"@medplum/react-hooks";var ChatListItem_default={content:"ChatListItem_content",contentContainer:"ChatListItem_contentContainer",selected:"ChatListItem_selected"};import{jsx as jsx90,jsxs as jsxs52}from"react/jsx-runtime";var ChatListItem=props=>{let{topic,lastCommunication,isSelected,getThreadUri}=props,patientResource=useResource4(topic.subject),patientName=formatHumanName6(patientResource?.name?.[0]),lastMsg=lastCommunication?.payload?.[0]?.contentString,trimmedMsg=lastMsg?.length&&lastMsg.length>100?lastMsg.slice(0,100)+"...":lastMsg,senderName=lastCommunication?.sender?.display?`${lastCommunication?.sender?.display}: `:"",content=trimmedMsg?`${senderName} ${trimmedMsg}`:"No messages available",topicName=topic.topic?.text??content;return jsx90(MedplumLink,{to:getThreadUri(topic),underline:"never",children:jsxs52(Group28,{p:"xs",align:"center",wrap:"nowrap",className:clsx_default(ChatListItem_default.contentContainer,{[ChatListItem_default.selected]:isSelected}),children:[jsx90(ResourceAvatar,{value:topic.subject,radius:"xl",size:36}),jsxs52(Stack17,{gap:0,children:[jsx90(Text18,{size:"sm",fw:700,truncate:"end",children:patientName}),jsx90(Text18,{size:"sm",fw:400,lineClamp:2,className:ChatListItem_default.content,children:topicName}),jsx90(Text18,{size:"xs",style:{marginTop:2},children:lastCommunication?formatDateTime2(lastCommunication.sent):""})]})]})})};import{jsx as jsx91,jsxs as jsxs53}from"react/jsx-runtime";var ChatList=props=>{let{threads,selectedCommunication,getThreadUri}=props;return jsx91(Stack18,{gap:0,children:threads.map(thread=>{let topicCommunication=thread[0],lastCommunication=thread[1],_isSelected=selectedCommunication?.id===topicCommunication.id;return jsxs53(Fragment29,{children:[jsx91(ChatListItem,{topic:topicCommunication,lastCommunication,isSelected:_isSelected,getThreadUri}),jsx91(Divider5,{})]},topicCommunication.id)})})};import{Button as Button9,Modal as Modal3,Stack as Stack22,Text as Text21,TextInput as TextInput21}from"@mantine/core";import{showNotification as showNotification6}from"@mantine/notifications";import{createReference as createReference6,HTTP_HL7_ORG as HTTP_HL7_ORG4,normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useMedplum as useMedplum26,useMedplumProfile as useMedplumProfile7}from"@medplum/react-hooks";import{useMemo as useMemo27,useState as useState54}from"react";import{Group as Group31,Stack as Stack21,Text as Text20,Title as Title7}from"@mantine/core";import{createReference as createReference5,getExtension as getExtension2,getReferenceString as getReferenceString7}from"@medplum/core";import{QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,useMedplum as useMedplum25,useQuestionnaireForm}from"@medplum/react-hooks";import{useCallback as useCallback12,useMemo as useMemo26,useRef as useRef15,useState as useState53}from"react";import{Button as Button7,Paper as Paper3}from"@mantine/core";import{createReference as createReference4,HTTP_HL7_ORG as HTTP_HL7_ORG2}from"@medplum/core";import{useMedplum as useMedplum23}from"@medplum/react-hooks";import{useEffect as useEffect16,useRef as useRef14}from"react";var Point=class{constructor(x,y,pressure,time){__publicField(this,"x");__publicField(this,"y");__publicField(this,"pressure");__publicField(this,"time");if(isNaN(x)||isNaN(y))throw new Error(`Point is invalid: (${x}, ${y})`);this.x=+x,this.y=+y,this.pressure=pressure||0,this.time=time||Date.now()}distanceTo(start){return Math.sqrt(Math.pow(this.x-start.x,2)+Math.pow(this.y-start.y,2))}equals(other){return this.x===other.x&&this.y===other.y&&this.pressure===other.pressure&&this.time===other.time}velocityFrom(start){return this.time!==start.time?this.distanceTo(start)/(this.time-start.time):0}},Bezier=class _Bezier{constructor(startPoint,control2,control1,endPoint,startWidth,endWidth){this.startPoint=startPoint,this.control2=control2,this.control1=control1,this.endPoint=endPoint,this.startWidth=startWidth,this.endWidth=endWidth}static fromPoints(points,widths){let c2=this.calculateControlPoints(points[0],points[1],points[2]).c2,c3=this.calculateControlPoints(points[1],points[2],points[3]).c1;return new _Bezier(points[1],c2,c3,points[2],widths.start,widths.end)}static calculateControlPoints(s1,s2,s3){let dx1=s1.x-s2.x,dy1=s1.y-s2.y,dx2=s2.x-s3.x,dy2=s2.y-s3.y,m1={x:(s1.x+s2.x)/2,y:(s1.y+s2.y)/2},m2={x:(s2.x+s3.x)/2,y:(s2.y+s3.y)/2},l1=Math.sqrt(dx1*dx1+dy1*dy1),l2=Math.sqrt(dx2*dx2+dy2*dy2),dxm=m1.x-m2.x,dym=m1.y-m2.y,k=l1+l2==0?0:l2/(l1+l2),cm={x:m2.x+dxm*k,y:m2.y+dym*k},tx=s2.x-cm.x,ty=s2.y-cm.y;return{c1:new Point(m1.x+tx,m1.y+ty),c2:new Point(m2.x+tx,m2.y+ty)}}length(){let length=0,px,py;for(let i=0;i<=10;i+=1){let t=i/10,cx=this.point(t,this.startPoint.x,this.control1.x,this.control2.x,this.endPoint.x),cy=this.point(t,this.startPoint.y,this.control1.y,this.control2.y,this.endPoint.y);if(i>0){let xdiff=cx-px,ydiff=cy-py;length+=Math.sqrt(xdiff*xdiff+ydiff*ydiff)}px=cx,py=cy}return length}point(t,start,c1,c2,end){return start*(1-t)*(1-t)*(1-t)+3*c1*(1-t)*(1-t)*t+3*c2*(1-t)*t*t+end*t*t*t}},SignatureEventTarget=class{constructor(){__publicField(this,"_et");try{this._et=new EventTarget}catch{this._et=document}}addEventListener(type,listener,options){this._et.addEventListener(type,listener,options)}dispatchEvent(event){return this._et.dispatchEvent(event)}removeEventListener(type,callback,options){this._et.removeEventListener(type,callback,options)}};function throttle(fn,wait=250){let previous=0,timeout=null,result,storedContext,storedArgs,later=()=>{previous=Date.now(),timeout=null,result=fn.apply(storedContext,storedArgs),timeout||(storedContext=null,storedArgs=[])};return function(...args){let now=Date.now(),remaining=wait-(now-previous);return storedContext=this,storedArgs=args,remaining<=0||remaining>wait?(timeout&&(clearTimeout(timeout),timeout=null),previous=now,result=fn.apply(storedContext,storedArgs),timeout||(storedContext=null,storedArgs=[])):timeout||(timeout=window.setTimeout(later,remaining)),result}}var SignaturePad=class _SignaturePad extends SignatureEventTarget{constructor(canvas,options={}){super();__publicField(this,"dotSize");__publicField(this,"minWidth");__publicField(this,"maxWidth");__publicField(this,"penColor");__publicField(this,"minDistance");__publicField(this,"velocityFilterWeight");__publicField(this,"compositeOperation");__publicField(this,"backgroundColor");__publicField(this,"throttle");__publicField(this,"canvasContextOptions");__publicField(this,"_ctx");__publicField(this,"_drawingStroke",!1);__publicField(this,"_isEmpty",!0);__publicField(this,"_dataUrl");__publicField(this,"_dataUrlOptions");__publicField(this,"_lastPoints",[]);__publicField(this,"_data",[]);__publicField(this,"_lastVelocity",0);__publicField(this,"_lastWidth",0);__publicField(this,"_strokeMoveUpdate");__publicField(this,"_strokePointerId");this.canvas=canvas,this.velocityFilterWeight=options.velocityFilterWeight||.7,this.minWidth=options.minWidth||.5,this.maxWidth=options.maxWidth||2.5,this.throttle=options.throttle??16,this.minDistance=options.minDistance??5,this.dotSize=options.dotSize||0,this.penColor=options.penColor||"black",this.backgroundColor=options.backgroundColor||"rgba(0,0,0,0)",this.compositeOperation=options.compositeOperation||"source-over",this.canvasContextOptions=options.canvasContextOptions??{},this._strokeMoveUpdate=this.throttle?throttle(_SignaturePad.prototype._strokeUpdate,this.throttle):_SignaturePad.prototype._strokeUpdate,this._handleMouseDown=this._handleMouseDown.bind(this),this._handleMouseMove=this._handleMouseMove.bind(this),this._handleMouseUp=this._handleMouseUp.bind(this),this._handleTouchStart=this._handleTouchStart.bind(this),this._handleTouchMove=this._handleTouchMove.bind(this),this._handleTouchEnd=this._handleTouchEnd.bind(this),this._handlePointerDown=this._handlePointerDown.bind(this),this._handlePointerMove=this._handlePointerMove.bind(this),this._handlePointerUp=this._handlePointerUp.bind(this),this._handlePointerCancel=this._handlePointerCancel.bind(this),this._handleTouchCancel=this._handleTouchCancel.bind(this),this._ctx=canvas.getContext("2d",this.canvasContextOptions),this.clear(),this.on()}clear(){let{_ctx:ctx,canvas}=this;ctx.fillStyle=this.backgroundColor,ctx.clearRect(0,0,canvas.width,canvas.height),ctx.fillRect(0,0,canvas.width,canvas.height),this._data=[],this._reset(this._getPointGroupOptions()),this._isEmpty=!0,this._dataUrl=void 0,this._dataUrlOptions=void 0,this._strokePointerId=void 0}redraw(){let data2=this._data,dataUrl=this._dataUrl,dataUrlOptions=this._dataUrlOptions;this.clear(),dataUrl&&this.fromDataURL(dataUrl,dataUrlOptions),this.fromData(data2,{clear:!1})}fromDataURL(dataUrl,options={}){return new Promise((resolve,reject)=>{let image=new Image,ratio=options.ratio||window.devicePixelRatio||1,width=options.width||this.canvas.width/ratio,height=options.height||this.canvas.height/ratio,xOffset=options.xOffset||0,yOffset=options.yOffset||0;this._reset(this._getPointGroupOptions()),image.onload=()=>{this._ctx.drawImage(image,xOffset,yOffset,width,height),resolve()},image.onerror=error=>{reject(error)},image.crossOrigin="anonymous",image.src=dataUrl,this._isEmpty=!1,this._dataUrl=dataUrl,this._dataUrlOptions={...options}})}toDataURL(type="image/png",encoderOptions){return type==="image/svg+xml"?(typeof encoderOptions!="object"&&(encoderOptions=void 0),`data:image/svg+xml;base64,${btoa(this.toSVG(encoderOptions))}`):(typeof encoderOptions!="number"&&(encoderOptions=void 0),this.canvas.toDataURL(type,encoderOptions))}on(){this.canvas.style.touchAction="none",this.canvas.style.msTouchAction="none",this.canvas.style.userSelect="none",this.canvas.style.webkitUserSelect="none";let isIOS=/Macintosh/.test(navigator.userAgent)&&"ontouchstart"in document;window.PointerEvent&&!isIOS?this._handlePointerEvents():(this._handleMouseEvents(),"ontouchstart"in window&&this._handleTouchEvents())}off(){this.canvas.style.touchAction="auto",this.canvas.style.msTouchAction="auto",this.canvas.style.userSelect="auto",this.canvas.style.webkitUserSelect="auto",this.canvas.removeEventListener("pointerdown",this._handlePointerDown),this.canvas.removeEventListener("mousedown",this._handleMouseDown),this.canvas.removeEventListener("touchstart",this._handleTouchStart),this._removeMoveUpEventListeners()}_getListenerFunctions(){let canvasWindow=window.document===this.canvas.ownerDocument?window:this.canvas.ownerDocument.defaultView??this.canvas.ownerDocument;return{addEventListener:canvasWindow.addEventListener.bind(canvasWindow),removeEventListener:canvasWindow.removeEventListener.bind(canvasWindow)}}_removeMoveUpEventListeners(){let{removeEventListener}=this._getListenerFunctions();removeEventListener("pointermove",this._handlePointerMove),removeEventListener("pointerup",this._handlePointerUp),removeEventListener("pointercancel",this._handlePointerCancel),removeEventListener("mousemove",this._handleMouseMove),removeEventListener("mouseup",this._handleMouseUp),removeEventListener("touchmove",this._handleTouchMove),removeEventListener("touchend",this._handleTouchEnd),removeEventListener("touchcancel",this._handleTouchCancel)}isEmpty(){return this._isEmpty}fromData(pointGroups,{clear=!0}={}){clear&&this.clear(),this._fromData(pointGroups,this._drawCurve.bind(this),this._drawDot.bind(this)),this._data=this._data.concat(pointGroups)}toData(){return this._data}_isLeftButtonPressed(event,only){return only?event.buttons===1:(event.buttons&1)===1}_pointerEventToSignatureEvent(event){return{event,type:event.type,x:event.clientX,y:event.clientY,pressure:"pressure"in event?event.pressure:0}}_touchEventToSignatureEvent(event){let touch=event.changedTouches[0];return{event,type:event.type,x:touch.clientX,y:touch.clientY,pressure:touch.force}}_handleMouseDown(event){!this._isLeftButtonPressed(event,!0)||this._drawingStroke||this._strokeBegin(this._pointerEventToSignatureEvent(event))}_handleMouseMove(event){if(!this._isLeftButtonPressed(event,!0)||!this._drawingStroke){this._strokeEnd(this._pointerEventToSignatureEvent(event),!1);return}this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event))}_handleMouseUp(event){this._isLeftButtonPressed(event)||this._strokeEnd(this._pointerEventToSignatureEvent(event))}_handleTouchStart(event){event.targetTouches.length!==1||this._drawingStroke||(event.cancelable&&event.preventDefault(),this._strokeBegin(this._touchEventToSignatureEvent(event)))}_handleTouchMove(event){if(event.targetTouches.length===1){if(event.cancelable&&event.preventDefault(),!this._drawingStroke){this._strokeEnd(this._touchEventToSignatureEvent(event),!1);return}this._strokeMoveUpdate(this._touchEventToSignatureEvent(event))}}_handleTouchEnd(event){event.targetTouches.length===0&&(event.cancelable&&event.preventDefault(),this._strokeEnd(this._touchEventToSignatureEvent(event)))}_handlePointerCancel(event){this._allowPointerId(event)&&(event.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(event),!1))}_handleTouchCancel(event){event.cancelable&&event.preventDefault(),this._strokeEnd(this._touchEventToSignatureEvent(event),!1)}_getPointerId(event){return event.persistentDeviceId||event.pointerId}_allowPointerId(event,allowUndefined=!1){return typeof this._strokePointerId>"u"?allowUndefined:this._getPointerId(event)===this._strokePointerId}_handlePointerDown(event){this._drawingStroke||!this._isLeftButtonPressed(event)||!this._allowPointerId(event,!0)||(this._strokePointerId=this._getPointerId(event),event.preventDefault(),this._strokeBegin(this._pointerEventToSignatureEvent(event)))}_handlePointerMove(event){if(this._allowPointerId(event)){if(!this._isLeftButtonPressed(event,!0)||!this._drawingStroke){this._strokeEnd(this._pointerEventToSignatureEvent(event),!1);return}event.preventDefault(),this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event))}}_handlePointerUp(event){this._isLeftButtonPressed(event)||!this._allowPointerId(event)||(event.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(event)))}_getPointGroupOptions(group){return{penColor:group&&"penColor"in group?group.penColor:this.penColor,dotSize:group&&"dotSize"in group?group.dotSize:this.dotSize,minWidth:group&&"minWidth"in group?group.minWidth:this.minWidth,maxWidth:group&&"maxWidth"in group?group.maxWidth:this.maxWidth,velocityFilterWeight:group&&"velocityFilterWeight"in group?group.velocityFilterWeight:this.velocityFilterWeight,compositeOperation:group&&"compositeOperation"in group?group.compositeOperation:this.compositeOperation}}_strokeBegin(event){if(!this.dispatchEvent(new CustomEvent("beginStroke",{detail:event,cancelable:!0})))return;let{addEventListener}=this._getListenerFunctions();switch(event.event.type){case"mousedown":addEventListener("mousemove",this._handleMouseMove,{passive:!1}),addEventListener("mouseup",this._handleMouseUp,{passive:!1});break;case"touchstart":addEventListener("touchmove",this._handleTouchMove,{passive:!1}),addEventListener("touchend",this._handleTouchEnd,{passive:!1}),addEventListener("touchcancel",this._handleTouchCancel,{passive:!1});break;case"pointerdown":addEventListener("pointermove",this._handlePointerMove,{passive:!1}),addEventListener("pointerup",this._handlePointerUp,{passive:!1}),addEventListener("pointercancel",this._handlePointerCancel,{passive:!1});break;default:}this._drawingStroke=!0;let pointGroupOptions=this._getPointGroupOptions(),newPointGroup={...pointGroupOptions,points:[]};this._data.push(newPointGroup),this._reset(pointGroupOptions),this._strokeUpdate(event)}_strokeUpdate(event){if(!this._drawingStroke)return;if(this._data.length===0){this._strokeBegin(event);return}this.dispatchEvent(new CustomEvent("beforeUpdateStroke",{detail:event}));let point=this._createPoint(event.x,event.y,event.pressure),lastPointGroup=this._data[this._data.length-1],lastPoints=lastPointGroup.points,lastPoint=lastPoints.length>0&&lastPoints[lastPoints.length-1],isLastPointTooClose=lastPoint?point.distanceTo(lastPoint)<=this.minDistance:!1,pointGroupOptions=this._getPointGroupOptions(lastPointGroup);if(!lastPoint||!(lastPoint&&isLastPointTooClose)){let curve=this._addPoint(point,pointGroupOptions);lastPoint?curve&&this._drawCurve(curve,pointGroupOptions):this._drawDot(point,pointGroupOptions),lastPoints.push({time:point.time,x:point.x,y:point.y,pressure:point.pressure})}this.dispatchEvent(new CustomEvent("afterUpdateStroke",{detail:event}))}_strokeEnd(event,shouldUpdate=!0){this._removeMoveUpEventListeners(),this._drawingStroke&&(shouldUpdate&&this._strokeUpdate(event),this._drawingStroke=!1,this._strokePointerId=void 0,this.dispatchEvent(new CustomEvent("endStroke",{detail:event})))}_handlePointerEvents(){this._drawingStroke=!1,this.canvas.addEventListener("pointerdown",this._handlePointerDown,{passive:!1})}_handleMouseEvents(){this._drawingStroke=!1,this.canvas.addEventListener("mousedown",this._handleMouseDown,{passive:!1})}_handleTouchEvents(){this.canvas.addEventListener("touchstart",this._handleTouchStart,{passive:!1})}_reset(options){this._lastPoints=[],this._lastVelocity=0,this._lastWidth=(options.minWidth+options.maxWidth)/2,this._ctx.fillStyle=options.penColor,this._ctx.globalCompositeOperation=options.compositeOperation}_createPoint(x,y,pressure){let rect=this.canvas.getBoundingClientRect();return new Point(x-rect.left,y-rect.top,pressure,new Date().getTime())}_addPoint(point,options){let{_lastPoints}=this;if(_lastPoints.push(point),_lastPoints.length>2){_lastPoints.length===3&&_lastPoints.unshift(_lastPoints[0]);let widths=this._calculateCurveWidths(_lastPoints[1],_lastPoints[2],options),curve=Bezier.fromPoints(_lastPoints,widths);return _lastPoints.shift(),curve}return null}_calculateCurveWidths(startPoint,endPoint,options){let velocity=options.velocityFilterWeight*endPoint.velocityFrom(startPoint)+(1-options.velocityFilterWeight)*this._lastVelocity,newWidth=this._strokeWidth(velocity,options),widths={end:newWidth,start:this._lastWidth};return this._lastVelocity=velocity,this._lastWidth=newWidth,widths}_strokeWidth(velocity,options){return Math.max(options.maxWidth/(velocity+1),options.minWidth)}_drawCurveSegment(x,y,width){let ctx=this._ctx;ctx.moveTo(x,y),ctx.arc(x,y,width,0,2*Math.PI,!1),this._isEmpty=!1}_drawCurve(curve,options){let ctx=this._ctx,widthDelta=curve.endWidth-curve.startWidth,drawSteps=Math.ceil(curve.length())*2;ctx.beginPath(),ctx.fillStyle=options.penColor;for(let i=0;i<drawSteps;i+=1){let t=i/drawSteps,tt=t*t,ttt=tt*t,u=1-t,uu=u*u,uuu=uu*u,x=uuu*curve.startPoint.x;x+=3*uu*t*curve.control1.x,x+=3*u*tt*curve.control2.x,x+=ttt*curve.endPoint.x;let y=uuu*curve.startPoint.y;y+=3*uu*t*curve.control1.y,y+=3*u*tt*curve.control2.y,y+=ttt*curve.endPoint.y;let width=Math.min(curve.startWidth+ttt*widthDelta,options.maxWidth);this._drawCurveSegment(x,y,width)}ctx.closePath(),ctx.fill()}_drawDot(point,options){let ctx=this._ctx,width=options.dotSize>0?options.dotSize:(options.minWidth+options.maxWidth)/2;ctx.beginPath(),this._drawCurveSegment(point.x,point.y,width),ctx.closePath(),ctx.fillStyle=options.penColor,ctx.fill()}_fromData(pointGroups,drawCurve,drawDot){for(let group of pointGroups){let{points}=group,pointGroupOptions=this._getPointGroupOptions(group);if(points.length>1)for(let j=0;j<points.length;j+=1){let basicPoint=points[j],point=new Point(basicPoint.x,basicPoint.y,basicPoint.pressure,basicPoint.time);j===0&&this._reset(pointGroupOptions);let curve=this._addPoint(point,pointGroupOptions);curve&&drawCurve(curve,pointGroupOptions)}else this._reset(pointGroupOptions),drawDot(points[0],pointGroupOptions)}}toSVG({includeBackgroundColor=!1,includeDataUrl=!1}={}){let pointGroups=this._data,ratio=Math.max(window.devicePixelRatio||1,1),minX=0,minY=0,maxX=this.canvas.width/ratio,maxY=this.canvas.height/ratio,svg=document.createElementNS("http://www.w3.org/2000/svg","svg");if(svg.setAttribute("xmlns","http://www.w3.org/2000/svg"),svg.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink"),svg.setAttribute("viewBox",`${minX} ${minY} ${maxX} ${maxY}`),svg.setAttribute("width",maxX.toString()),svg.setAttribute("height",maxY.toString()),includeBackgroundColor&&this.backgroundColor){let rect=document.createElement("rect");rect.setAttribute("width","100%"),rect.setAttribute("height","100%"),rect.setAttribute("fill",this.backgroundColor),svg.appendChild(rect)}if(includeDataUrl&&this._dataUrl){let ratio2=this._dataUrlOptions?.ratio||window.devicePixelRatio||1,width=this._dataUrlOptions?.width||this.canvas.width/ratio2,height=this._dataUrlOptions?.height||this.canvas.height/ratio2,xOffset=this._dataUrlOptions?.xOffset||0,yOffset=this._dataUrlOptions?.yOffset||0,image=document.createElement("image");image.setAttribute("x",xOffset.toString()),image.setAttribute("y",yOffset.toString()),image.setAttribute("width",width.toString()),image.setAttribute("height",height.toString()),image.setAttribute("preserveAspectRatio","none"),image.setAttribute("href",this._dataUrl),svg.appendChild(image)}return this._fromData(pointGroups,(curve,{penColor})=>{let path=document.createElement("path");if(!isNaN(curve.control1.x)&&!isNaN(curve.control1.y)&&!isNaN(curve.control2.x)&&!isNaN(curve.control2.y)){let attr=`M ${curve.startPoint.x.toFixed(3)},${curve.startPoint.y.toFixed(3)} C ${curve.control1.x.toFixed(3)},${curve.control1.y.toFixed(3)} ${curve.control2.x.toFixed(3)},${curve.control2.y.toFixed(3)} ${curve.endPoint.x.toFixed(3)},${curve.endPoint.y.toFixed(3)}`;path.setAttribute("d",attr),path.setAttribute("stroke-width",(curve.endWidth*2.25).toFixed(3)),path.setAttribute("stroke",penColor),path.setAttribute("fill","none"),path.setAttribute("stroke-linecap","round"),svg.appendChild(path)}},(point,{penColor,dotSize,minWidth,maxWidth})=>{let circle=document.createElement("circle"),size=dotSize>0?dotSize:(minWidth+maxWidth)/2;circle.setAttribute("r",size.toString()),circle.setAttribute("cx",point.x.toString()),circle.setAttribute("cy",point.y.toString()),circle.setAttribute("fill",penColor),svg.appendChild(circle)}),svg.outerHTML}};import{jsx as jsx92,jsxs as jsxs54}from"react/jsx-runtime";function SignatureInput(props){let medplum=useMedplum23(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=useRef14(null),signaturePadRef=useRef14(null),onChangeRef=useRef14(onChange);return onChangeRef.current=onChange,useEffect16(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:HTTP_HL7_ORG2+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??createReference4(medplum.getProfile()),data:signaturePadRef.current?.toDataURL().split(",")[1]})}if(canvasRef.current){let signaturePad=new SignaturePad(canvasRef.current);defaultValue2?.data&&signaturePad.fromDataURL(defaultValue2.data).catch(console.error),signaturePad.addEventListener("endStroke",handleEndStroke),signaturePadRef.current=signaturePad}return()=>{signaturePadRef.current&&signaturePadRef.current.removeEventListener("beginStroke",handleEndStroke)}},[medplum,defaultValue2,who]),jsxs54(Paper3,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[jsx92("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),jsx92(Button7,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:jsx92(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}import{Stack as Stack20}from"@mantine/core";import{isQuestionEnabled,QuestionnaireItemType as QuestionnaireItemType3}from"@medplum/react-hooks";import{Title as Title6}from"@mantine/core";import{jsx as jsx93,jsxs as jsxs55}from"react/jsx-runtime";function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return jsxs55("div",{children:[props.item.text&&jsx93(Title6,{order:3,mb:"md",children:props.item.text}),jsx93(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}import{Checkbox as Checkbox5,Group as Group29,MultiSelect,NativeSelect as NativeSelect10,Radio,Text as Text19,Textarea as Textarea3,TextInput as TextInput20}from"@mantine/core";import{capitalize as capitalize3,deepEquals,formatCoding as formatCoding2,getElementDefinition,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG3,stringify as stringify2,typedValueToString}from"@medplum/core";import{getItemAnswerOptionValue,getItemInitialValue,getNewMultiSelectValues,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,QUESTIONNAIRE_ITEM_CONTROL_URL,QuestionnaireItemType,useMedplum as useMedplum24}from"@medplum/react-hooks";import{useEffect as useEffect17,useState as useState52}from"react";import{Fragment as Fragment30,jsx as jsx94,jsxs as jsxs56}from"react/jsx-runtime";var MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS=30,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS=50;function QuestionnaireFormItem(props){let formState=props.formState,item=props.item,response=props.responseItem;function onChangeAnswer(newResponseAnswer){if(formState&&props.context)if(item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice){let updatedAnswers=[...response.answer||[]];newResponseAnswer.length===0?updatedAnswers.splice(props.index,1):updatedAnswers[props.index]=newResponseAnswer[0],formState.onChangeAnswer(props.context,props.item,updatedAnswers)}else formState.onChangeAnswer(props.context,props.item,newResponseAnswer)}let type=item.type;if(!type)return null;let name=item.linkId;if(!name)return null;let inputId=item.repeats&&props.index!==void 0&&item.type!==QuestionnaireItemType.choice&&item.type!==QuestionnaireItemType.openChoice?`${name}-${props.index}`:name,initial;item.initial&&item.initial.length>0?initial=item.initial[0]:item.answerOption&&item.answerOption.length>0&&(initial=item.answerOption.find(option=>option.initialSelected));let defaultValue2=getCurrentAnswer(response,props.index)??getItemInitialValue(initial),validationError=getExtension(response,`${HTTP_HL7_ORG3}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx94("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx94(CheckboxFormSection,{title:props.item.text,htmlFor:inputId,children:jsx94(Checkbox5,{id:inputId,name,required:props.required??item.required,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueBoolean:e.currentTarget.checked}])})},props.item.linkId);break;case QuestionnaireItemType.decimal:formComponent=jsx94(TextInput20,{type:"number",step:"any",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueDecimal:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.integer:formComponent=jsx94(TextInput20,{type:"number",step:1,id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueInteger:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.date:formComponent=jsx94(TextInput20,{type:"date",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueDate:e.currentTarget.value}])});break;case QuestionnaireItemType.dateTime:formComponent=jsx94(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case QuestionnaireItemType.time:formComponent=jsx94(TextInput20,{type:"time",id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueTime:e.currentTarget.value}])});break;case QuestionnaireItemType.string:case QuestionnaireItemType.url:formComponent=jsx94(TextInput20,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.text:formComponent=jsx94(Textarea3,{id:inputId,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>{let value=e.currentTarget.value;onChangeAnswer(value===""?[]:[{valueString:value}])}});break;case QuestionnaireItemType.attachment:formComponent=jsx94(Group29,{py:4,children:jsx94(AttachmentInput,{path:"",name:inputId,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case QuestionnaireItemType.reference:formComponent=jsx94(ReferenceInput,{name:inputId,required:props.required??item.required,targetTypes:getQuestionnaireItemReferenceTargetTypes(item),searchCriteria:getQuestionnaireItemReferenceFilter(item,formState?.subject,formState?.encounter),defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueReference:newValue}])});break;case QuestionnaireItemType.quantity:formComponent=jsx94(QuantityInput,{path:"",name:inputId,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueQuantity:newValue}]),disableWheel:!0});break;case QuestionnaireItemType.choice:case QuestionnaireItemType.openChoice:isCheckboxChoice(item)?formComponent=jsx94(QuestionnaireCheckboxInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):isDropdownChoice(item)||item.answerValueSet&&!isRadiobuttonChoice(item)?formComponent=jsx94(QuestionnaireDropdownInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):formComponent=jsx94(QuestionnaireRadioButtonInput,{name:inputId,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)});break;default:return null}return jsxs56(Fragment30,{children:[formComponent,validationError?.valueString&&jsx94(Text19,{c:"red",size:"lg",mt:4,children:validationError.valueString})]})}function QuestionnaireDropdownInput(props){let{name,item,required,initial,onChangeAnswer,response}=props;if(!item.answerOption?.length&&!item.answerValueSet)return jsx94(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||isMultiSelectChoice(item);if(item.answerValueSet)return jsx94(ValueSetAutocomplete,{name,placeholder:"Select items",binding:item.answerValueSet,maxValues:isMultiSelect?void 0:1,required,onChange:values=>{isMultiSelect?values.length===0?onChangeAnswer([{}]):onChangeAnswer(values.map(coding=>({valueCoding:coding}))):onChangeAnswer([{valueCoding:values[0]}])},defaultValue:defaultValue2?.value});if(isMultiSelect){let{propertyName,data:data2}=formatSelectData(item);return jsx94(MultiSelect,{data:data2,placeholder:"Select items",searchable:!0,defaultValue:currentAnswer||[typedValueToString(initialValue)],required,onChange:selected=>{if(selected.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(selected,propertyName,item);onChangeAnswer(values)}}})}else{let data2=[""];if(item.answerOption)for(let option of item.answerOption){let optionValue=getItemAnswerOptionValue(option);data2.push(typedValueToString(optionValue))}return jsx94(NativeSelect10,{id:name,name,required,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){onChangeAnswer([{}]);return}let option=item.answerOption[index-1],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize3(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])},defaultValue:formatCoding2(defaultValue2?.value)||defaultValue2?.value,data:data2})}}function getValueSetOptions(valueSetUrl,medplum){return valueSetUrl?medplum.valueSetExpand({url:valueSetUrl,count:MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS+1}).then(valueSet=>valueSet.expansion?.contains??[]):Promise.resolve([])}function useValueSetOptions(valueSetUrl){let medplum=useMedplum24(),[valueSetOptions,setValueSetOptions]=useState52([]),[isLoading,setIsLoading]=useState52(!1);return useEffect17(()=>{async function loadValueSet(){if(valueSetUrl){setIsLoading(!0);try{let options=await getValueSetOptions(valueSetUrl,medplum);setValueSetOptions(options)}catch(err){console.error("Error loading value set:",err)}finally{setIsLoading(!1)}}}loadValueSet().catch(console.error)},[valueSetUrl,medplum]),[valueSetOptions,isLoading]}function getOptionsFromValueSet(valueSetOptions,name){return valueSetOptions.map((option,i)=>{let optionName=`${name}-valueset-${i}`,optionValue={type:"Coding",value:{system:option.system,code:option.code,display:option.display}};return[optionName,optionValue]})}function QuestionnaireRadioButtonInput(props){let{name,item,required,initial,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition("QuestionnaireItemAnswerOption","value[x]"),initialValue=getItemInitialValue(initial),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),options=[],defaultValue2;if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?(initialValue&&stringify2(optionValue)===stringify2(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return jsx94(Text19,{children:"Loading options..."});if(options.length===0)return jsx94(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs56(Fragment30,{children:[jsx94(Radio.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+capitalize3(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>jsx94(Radio,{id:optionName,value:optionName,py:4,required,label:jsx94(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)&&jsxs56(Text19,{size:"sm",c:"dimmed",mt:"xs",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function QuestionnaireCheckboxInput(props){let{name,item,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition("QuestionnaireItemAnswerOption","value[x]"),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),initialSelectedValues=item.answerValueSet?(response?.answer?.map(a=>a.valueCoding)||[]).filter(c=>c!==void 0):getCurrentMultiSelectAnswer(response),[selectedValues,setSelectedValues]=useState52(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 jsx94(Text19,{children:"Loading options..."});if(options.length===0)return jsx94(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS),handleCheckboxChange=(optionValue,selected)=>{if(item.answerValueSet){let currentCodings=selectedValues,newCodings;selected?newCodings=[...currentCodings,optionValue.value]:newCodings=currentCodings.filter(c=>!deepEquals(c,optionValue.value)),setSelectedValues(newCodings),newCodings.length===0?onChangeAnswer([{}]):onChangeAnswer(newCodings.map(coding=>({valueCoding:coding})))}else{let currentValues=selectedValues,optionValueStr=typedValueToString(optionValue),newValues;if(selected?newValues=[...currentValues,optionValueStr]:newValues=currentValues.filter(v=>v!==optionValueStr),setSelectedValues(newValues),newValues.length===0)onChangeAnswer([{}]);else{let values=getNewMultiSelectValues(newValues,"value"+capitalize3(optionValue.type),item);onChangeAnswer(values)}}};return jsxs56(Group29,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=typedValueToString(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>deepEquals(coding,optionValue.value)):selectedValues.includes(optionValueStr);return jsx94(Checkbox5,{id:optionName,label:jsx94(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)&&jsxs56(Text19,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx94(TextInput20,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){return getItemAnswerOptionValue(response?.answer?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response?.answer;return results?results.map(a=>getItemAnswerOptionValue(a)).map(type=>formatCoding2(type?.value)||type?.value).filter(Boolean):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals(option[1].value,defaultAnswer?.value))?.[0]}function hasChoiceType(item,type){return!!item.extension?.some(e=>e.url===QUESTIONNAIRE_ITEM_CONTROL_URL&&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"+capitalize3(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}import{Anchor as Anchor7}from"@mantine/core";import{Fragment as Fragment31,jsx as jsx95,jsxs as jsxs57}from"react/jsx-runtime";function QuestionnaireFormRepeatableGroup(props){return jsxs57(Fragment31,{children:[props.responseItems.map(response=>jsx95(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),jsx95(Anchor7,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}import{Anchor as Anchor8,Stack as Stack19}from"@mantine/core";import{QuestionnaireItemType as QuestionnaireItemType2}from"@medplum/react-hooks";import{jsx as jsx96,jsxs as jsxs58}from"react/jsx-runtime";function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,showAddButton=item.type!==QuestionnaireItemType2.choice&&item.type!==QuestionnaireItemType2.openChoice,answers=responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return jsxs58(FormSection,{title:props.item.text,withAsterisk:props.item.required,children:[jsx96(Stack19,{gap:"xs",children:answers?.map((_,index)=>jsx96(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&jsx96(Anchor8,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}import{jsx as jsx97}from"react/jsx-runtime";function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props;return jsx97(Stack20,{children:items.map((item,index)=>{if(!isQuestionEnabled(item,formState.questionnaireResponse))return null;if(item.type===QuestionnaireItemType3.display)return jsx97("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===QuestionnaireItemType3.group&&item.repeats?jsx97(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems},`repeating-group-${item.id}-${index}`):item.type===QuestionnaireItemType3.group?jsx97(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]},`group-${item.id}-${index}`):item.type===QuestionnaireItemType3.boolean?jsx97(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?jsx97(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):jsx97(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:jsx97(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}import{Button as Button8,Group as Group30,Stepper}from"@mantine/core";import{Fragment as Fragment32,jsx as jsx98,jsxs as jsxs59}from"react/jsx-runtime";function QuestionnaireFormStepper(props){let{formState,submitButtonText,excludeButtons,children}=props,pages=formState.pages,activePage=formState.activePage,showBackButton=activePage>0,showNextButton=activePage<pages.length-1,showSubmitButton=activePage===pages.length-1;return jsxs59(Fragment32,{children:[jsx98(Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>jsx98(Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&jsxs59(Group30,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx98(Button8,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&jsx98(Button8,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&jsx98(SubmitButton,{children:submitButtonText??"Submit"})]})]})}import{Fragment as Fragment33,jsx as jsx99,jsxs as jsxs60}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum25(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=useState53(!1),propsRef=useRef15(props);propsRef.current=props;let onFormChange=useCallback12(response=>{setSignatureRequiredSubmitted(!1),propsRef.current.onChange?.(response)},[]),formState=useQuestionnaireForm({questionnaire:props.questionnaire,defaultValue:props.questionnaireResponse,subject:props.subject,encounter:props.encounter,source:props.source,disablePagination:props.disablePagination,onChange:onFormChange}),formStateRef=useRef15(formState);formStateRef.current=formState;let isSignatureRequired=useMemo26(()=>formState.loading?!1:!!getExtension2(formState.questionnaire,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=useMemo26(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=useCallback12(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire2=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=createReference5(profile))}onSubmit({...response,questionnaire:questionnaire2.url??getReferenceString7(questionnaire2),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:jsxs60(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&jsx99(Title7,{children:formState.questionnaire.title}),formState.pagination?jsx99(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:jsx99(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):jsxs60(Fragment33,{children:[jsx99(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&jsxs60(Stack21,{mt:"md",gap:0,children:[jsx99(Text20,{size:"sm",fw:500,children:"Signature"}),jsx99(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&jsx99(Text20,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&jsx99(Group31,{justify:"flex-end",mt:"xl",gap:"xs",children:jsx99(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}import{jsx as jsx100,jsxs as jsxs61}from"react/jsx-runtime";var NewTopicDialog=props=>{let{subject,opened,onClose,onSubmit,allowPatientSelection=!1}=props,medplum=useMedplum26(),profile=useMedplumProfile7(),profileRef=useMemo27(()=>profile?createReference6(profile):void 0,[profile]),[topic,setTopic]=useState54(""),[practitioners,setPractitioners]=useState54(profile?.resourceType==="Practitioner"?[createReference6(profile)]:[]),[patient,setPatient]=useState54(subject?createReference6(subject):void 0),initialResponse=useMemo27(()=>{if(profile?.resourceType==="Practitioner")return{resourceType:"QuestionnaireResponse",status:"in-progress",item:[{linkId:"q1",answer:[{valueReference:createReference6(profile)}]}]}},[profile]);return jsx100(Modal3,{opened,onClose,title:"New Message",size:"md",children:jsxs61(Stack22,{gap:"xl",children:[jsxs61(Stack22,{gap:0,children:[jsx100(Text21,{fw:500,children:"Patient"}),allowPatientSelection&&jsx100(Text21,{c:"dimmed",children:"Select a patient"}),jsx100(ResourceInput,{resourceType:"Patient",name:"patient",required:!0,defaultValue:patient,disabled:!allowPatientSelection&&!!patient,onChange:value=>{setPatient(value?createReference6(value):void 0)}})]}),jsxs61(Stack22,{gap:0,children:[jsx100(Text21,{fw:500,children:"Practitioner (optional)"}),jsx100(Text21,{c:"dimmed",children:"Select one or more practitioners"}),jsx100(QuestionnaireForm,{questionnaire,questionnaireResponse:initialResponse,excludeButtons:!0,onChange:value=>{let references=value.item?.[0].answer?.map(item=>item.valueReference).filter(ref=>ref!==void 0)??[];setPractitioners(references)}})]}),jsxs61(Stack22,{gap:0,children:[jsx100(Text21,{fw:500,children:"Topic (optional)"}),jsx100(Text21,{c:"dimmed",children:"Enter a topic for the message"}),jsx100(TextInput21,{placeholder:"Enter your topic",value:topic,onChange:e=>setTopic(e.target.value)})]}),jsx100(Button9,{onClick:async()=>{if(!patient){showNotification6({title:"Error",message:"Please select a patient",color:"red"});return}let communication={resourceType:"Communication",status:"in-progress",subject:patient,sender:profileRef,recipient:[patient,...practitioners.map(practitioner=>({reference:practitioner.reference}))],topic:{text:topic}};try{let createdCommunication=await medplum.createResource(communication);onSubmit?.(createdCommunication),onClose()}catch(error){showNotification6({title:"Error",message:normalizeErrorString7(error),color:"red"})}},children:"Next"})]})})},questionnaire={resourceType:"Questionnaire",status:"active",item:[{linkId:"q1",type:"reference",repeats:!0,extension:[{url:`${HTTP_HL7_ORG4}/fhir/StructureDefinition/questionnaire-referenceResource`,valueCodeableConcept:{coding:[{system:`${HTTP_HL7_ORG4}/fhir/fhir-types`,display:"Practitioner",code:"Practitioner"}]}}]}]};import{ActionIcon as ActionIcon9,Checkbox as Checkbox6,CloseButton,Group as Group32,Indicator,Popover as Popover2,Stack as Stack23,Text as Text22,TextInput as TextInput22,Tooltip as Tooltip4}from"@mantine/core";import{useDebouncedCallback as useDebouncedCallback3,useDisclosure}from"@mantine/hooks";import{showNotification as showNotification7}from"@mantine/notifications";import{createReference as createReference7,formatHumanName as formatHumanName7,getReferenceString as getReferenceString8,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useMedplum as useMedplum27,useMedplumProfile as useMedplumProfile8,useResource as useResource5}from"@medplum/react-hooks";import{useEffect as useEffect18,useMemo as useMemo28,useState as useState55}from"react";var ParticipantFilter_default={participantItem:"ParticipantFilter_participantItem"};import{jsx as jsx101,jsxs as jsxs62}from"react/jsx-runtime";function ParticipantFilter(props){let{selectedParticipants,onFilterChange}=props,[opened,{open,close}]=useDisclosure(!1),[searchQuery,setSearchQuery]=useState55(""),[searchResults,setSearchResults]=useState55([]),[isSearching,setIsSearching]=useState55(!1),medplum=useMedplum27(),profile=useMedplumProfile8(),currentUserParticipant=useMemo28(()=>{if(profile)return createReference7(profile)},[profile]),additionalParticipants=useMemo28(()=>{let currentUserRef=currentUserParticipant?.reference;return selectedParticipants.filter(p=>p.reference!==currentUserRef)},[selectedParticipants,currentUserParticipant]),debouncedSearch=useDebouncedCallback3(async query=>{if(!query.trim()){setSearchResults([]);return}setIsSearching(!0);try{let bundle=await medplum.search("Patient",{_type:"Patient,Practitioner",name:query,_count:"10"}),currentUserRef=currentUserParticipant?.reference,results=(bundle.entry??[]).map(entry=>entry.resource).filter(resource=>{if(!resource)return!1;let refString=getReferenceString8(resource);return!!refString&&refString!==currentUserRef}).map(resource=>createReference7(resource));setSearchResults(results)}catch(error){showNotification7({title:"Error",message:normalizeErrorString8(error),color:"red"}),setSearchResults([])}finally{setIsSearching(!1)}},300);useEffect18(()=>{debouncedSearch(searchQuery)},[searchQuery,debouncedSearch]);let isSelected=participant=>selectedParticipants.some(p=>p.reference===participant.reference),toggleParticipant=participant=>{let newParticipants=isSelected(participant)?selectedParticipants.filter(p=>p.reference!==participant.reference):[...selectedParticipants,participant];onFilterChange(newParticipants)},removeParticipant=participant=>{let newParticipants=selectedParticipants.filter(p=>p.reference!==participant.reference);onFilterChange(newParticipants)},displayParticipants=useMemo28(()=>{let result=[];for(let p of additionalParticipants)result.some(r2=>r2.reference===p.reference)||result.push(p);if(searchQuery.trim()&&searchResults.length>0)for(let p of searchResults)currentUserParticipant?.reference!==p.reference&&(result.some(r2=>r2.reference===p.reference)||result.push(p));return result},[additionalParticipants,searchQuery,searchResults,currentUserParticipant]),hasActiveFilter=selectedParticipants.length>0;return jsxs62(Popover2,{opened,onChange:o=>!o&&close(),position:"bottom-start",width:360,shadow:"md",radius:"md",withinPortal:!0,children:[jsx101(Popover2.Target,{children:jsx101(Tooltip4,{label:"Message Participants",position:"bottom",openDelay:500,disabled:opened,children:jsx101(Indicator,{disabled:!hasActiveFilter,color:"blue",size:8,offset:4,children:jsx101(ActionIcon9,{variant:"transparent",onClick:opened?close:open,radius:"xl",size:32,className:"outline-icon-button","data-opened":opened||void 0,children:jsx101(IconUsers,{size:16})})})})}),jsx101(Popover2.Dropdown,{p:"md",children:jsxs62(Stack23,{gap:"md",children:[jsx101(Text22,{size:"xs",c:"dimmed",fw:500,children:"Message Participants"}),jsx101(TextInput22,{placeholder:"Search for a Patient or Practitioner...",value:searchQuery,autoFocus:!0,onChange:e=>setSearchQuery(e.target.value),rightSection:searchQuery?jsx101(CloseButton,{size:"sm",onClick:()=>setSearchQuery("")}):null}),jsxs62(Stack23,{gap:"xs",mah:250,style:{overflowY:"auto"},children:[currentUserParticipant&&jsx101(ParticipantItem,{participant:currentUserParticipant,isSelected:isSelected(currentUserParticipant),isCurrentUser:!0,onToggle:()=>toggleParticipant(currentUserParticipant)}),displayParticipants.map(participant=>jsx101(ParticipantItem,{participant,isSelected:isSelected(participant),isCurrentUser:!1,onToggle:()=>toggleParticipant(participant),onRemove:isSelected(participant)?()=>removeParticipant(participant):void 0},participant.reference)),isSearching&&jsx101(Text22,{size:"sm",c:"dimmed",ta:"center",children:"Searching..."}),searchQuery.trim()&&!isSearching&&searchResults.length===0&&jsx101(Text22,{size:"sm",c:"dimmed",ta:"center",children:"No results found"})]})]})})]})}function ParticipantItem(props){let{participant,isSelected,isCurrentUser,onToggle,onRemove}=props,patientResource=useResource5(participant);return patientResource?jsxs62(Group32,{justify:"space-between",wrap:"nowrap",className:ParticipantFilter_default.participantItem,children:[jsxs62(Group32,{gap:"sm",wrap:"nowrap",style:{flex:1,minWidth:0},children:[jsx101(Checkbox6,{checked:isSelected,onChange:onToggle}),jsx101(ResourceAvatar,{value:participant,radius:"xl",size:32}),jsxs62(Text22,{size:"sm",truncate:!0,style:{flex:1},children:[formatHumanName7(patientResource?.name?.[0]??{}),isCurrentUser&&jsxs62(Text22,{component:"span",c:"dimmed",size:"sm",children:[" ","(you)"]})]})]}),onRemove&&jsx101(CloseButton,{size:"sm",onClick:onRemove})]}):null}import{ActionIcon as ActionIcon12,Box as Box19,Button as Button10,Center as Center3,Divider as Divider7,Flex as Flex16,Group as Group50,Menu as Menu5,Pagination,Paper as Paper4,ScrollArea as ScrollArea3,Skeleton as Skeleton2,Stack as Stack33,Tabs,Text as Text37,ThemeIcon,Tooltip as Tooltip7}from"@mantine/core";import{useDisclosure as useDisclosure10}from"@mantine/hooks";import{showNotification as showNotification8}from"@mantine/notifications";import{getReferenceString as getReferenceString10,normalizeErrorString as normalizeErrorString10,Operator,parseSearchRequest}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate5,useThreadInbox}from"@medplum/react-hooks";import{useCallback as useCallback23,useEffect as useEffect22,useMemo as useMemo31}from"react";import{Divider as Divider6,Flex as Flex15,Group as Group49,Stack as Stack32,Text as Text36,Tooltip as Tooltip6}from"@mantine/core";import{calculateAgeString,formatAddress as formatAddress3,formatHumanName as formatHumanName8,resolveId}from"@medplum/core";import{useMedplum as useMedplum36,useResource as useResource10}from"@medplum/react-hooks";import{useEffect as useEffect21,useState as useState70}from"react";import{Box as Box11,Flex as Flex8,Group as Group35,Modal as Modal4,Text as Text24}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{getDisplayString as getDisplayString5}from"@medplum/core";import{useMedplum as useMedplum28}from"@medplum/react-hooks";import{useCallback as useCallback14,useMemo as useMemo29,useState as useState58}from"react";import{Badge}from"@mantine/core";import{jsx as jsx102}from"react/jsx-runtime";var statusToColor={draft:"blue",active:"blue","on-hold":"yellow",revoked:"red",completed:"green","entered-in-error":"red",unknown:"gray",retired:"gray",registered:"blue",preliminary:"blue",final:"green",amended:"yellow",corrected:"yellow",cancelled:"red",requested:"blue",received:"blue",accepted:"blue",rejected:"red",ready:"blue","in-progress":"blue",failed:"red",proposed:"blue",pending:"blue",booked:"blue",arrived:"blue",fulfilled:"green",noshow:"red","checked-in":"blue",waitlist:"gray",routine:"gray",urgent:"red",asap:"red",stat:"red","not-done":"red",connected:"green",disconnected:"red",finished:"green",planned:"gray"};function StatusBadge(props){let{status,...badgeProps}=props;return jsx102(Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}import{Group as Group33,Stack as Stack24,TextInput as TextInput23}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,addProfileToResource,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback13,useState as useState56}from"react";import{jsx as jsx103,jsxs as jsxs63}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG5+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState56(allergy?.code),[clinicalStatus,setClinicalStatus]=useState56(allergy?.clinicalStatus),handleSubmit=useCallback13(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference8(patient),encounter:encounter?createReference8(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0},PATIENT_ALLERGY_PROFILE))},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx103(Form,{onSubmit:handleSubmit,children:jsxs63(Stack24,{children:[jsx103(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}),jsx103(TextInput23,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx103(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG5+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx103(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx103(Group33,{justify:"flex-end",gap:4,mt:"md",children:jsx103(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon10,Box as Box9,Collapse,Group as Group34,Text as Text23}from"@mantine/core";import{useState as useState57}from"react";var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title",addButton:"CollapsibleSection_addButton"};import{jsx as jsx104,jsxs as jsxs64}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState57(!1);return jsxs64(Box9,{className:CollapsibleSection_default.root,children:[jsxs64(Group34,{justify:"space-between",className:CollapsibleSection_default.header,children:[jsxs64(Group34,{gap:8,children:[jsx104(ActionIcon10,{variant:"subtle",onClick:()=>setCollapsed(c=>!c),"aria-label":collapsed?`Show ${title.toLowerCase()}`:`Hide ${title.toLowerCase()}`,className:CollapsibleSection_default.chevron,"data-collapsed":collapsed||void 0,size:"md",children:jsx104(IconChevronDown,{size:20})}),jsx104(Text23,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx104(ActionIcon10,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx104(IconPlus,{size:18})})]}),jsx104(Collapse,{in:!collapsed,children:jsx104(Box9,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}import{ActionIcon as ActionIcon11,Box as Box10}from"@mantine/core";var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};import{jsx as jsx105,jsxs as jsxs65}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs65(Box10,{className:SummaryItem_default.item,onClick,children:[children,jsx105("div",{className:SummaryItem_default.gradient}),jsx105("div",{className:SummaryItem_default.container,children:jsx105(ActionIcon11,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx105(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment34,jsx as jsx106,jsxs as jsxs66}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum28(),{patient,encounter}=props,[allergies,setAllergies]=useState58(props.allergies),[opened,{open,close}]=useDisclosure2(!1),[editAllergy,setEditAllergy]=useState58(),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:getDisplayString5(a).localeCompare(getDisplayString5(b))}),[allergies]),handleSubmit=useCallback14(async allergy=>{if(allergy.id){let updatedAllergy=await medplum.updateResource(allergy);setAllergies(allergies.map(a=>a.id===updatedAllergy.id?updatedAllergy:a))}else{let newAllergy=await medplum.createResource(allergy);setAllergies([...allergies,newAllergy])}setEditAllergy(void 0),close()},[medplum,allergies,close]);return jsxs66(Fragment34,{children:[jsx106(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx106(Box11,{children:jsx106(Flex8,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx106(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs66(Box11,{children:[jsx106(Text24,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString5(allergy)}),jsx106(Group35,{mt:2,gap:4,children:status&&jsx106(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx106(Text24,{children:"(none)"})}),jsx106(Modal4,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx106(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 Box12,Flex as Flex9,Group as Group36,Text as Text25}from"@mantine/core";import{formatDate}from"@medplum/core";import{useResource as useResource6}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 jsx107,jsxs as jsxs67}from"react/jsx-runtime";function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=useResource6(coverage),organizationResource=useResource6(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 jsx107(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs67(Box12,{children:[jsx107(Text25,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx107(Text25,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs67(Group36,{mt:2,gap:4,children:[jsx107(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs67(Text25,{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 jsx107(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx107(Flex9,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx107(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx107(Text25,{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 Box13,Flex as Flex10,Group as Group39,Modal as Modal5,Text as Text28}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{formatDate as formatDate2,getDisplayString as getDisplayString7}from"@medplum/core";import{useState as useState61}from"react";import{Group as Group38,List,Stack as Stack26,Text as Text27,Title as Title8}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime3,formatObservationValue,isReference as isReference2}from"@medplum/core";import{useMedplum as useMedplum29,useResource as useResource8}from"@medplum/react-hooks";import{useEffect as useEffect19,useState as useState60}from"react";import{Blockquote,Stack as Stack25}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx108}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx108(Stack25,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx108(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 Group37}from"@mantine/core";import{Text as Text26}from"@mantine/core";import{getDisplayString as getDisplayString6,isOk,normalizeErrorString as normalizeErrorString9}from"@medplum/core";import{useResource as useResource7}from"@medplum/react-hooks";import{useState as useState59}from"react";import{jsx as jsx109}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState59(),resource=useResource7(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString9(outcome)}]`;else if(resource)text=getDisplayString6(resource);else return null;return link?jsx109(MedplumLink,{to:value,...rest,children:text}):jsx109(Text26,{component:"span",...rest,children:text})}import{jsx as jsx110,jsxs as jsxs68}from"react/jsx-runtime";function ResourceBadge(props){return jsxs68(Group37,{gap:"xs",children:[jsx110(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx110(ResourceName,{value:props.value,link:props.link})]})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment35,jsx as jsx111,jsxs as jsxs69}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum29(),diagnosticReport=useResource8(props.value),[specimens,setSpecimens]=useState60();if(useEffect19(()=>{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 jsxs69(Stack26,{children:[jsx111(Title8,{children:"Diagnostic Report"}),jsx111(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx111(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx111(NoteDisplay,{value:specimenNotes})]})}function DiagnosticReportHeader({value,hideSubject=!1}){return jsxs69(Group38,{mt:"md",gap:30,children:[value.subject&&!hideSubject&&jsxs69("div",{children:[jsx111(Text27,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx111(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs69("div",{children:[jsx111(Text27,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx111(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs69("div",{children:[jsx111(Text27,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx111(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs69("div",{children:[jsx111(Text27,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx111(Text27,{children:formatDateTime3(value.issued)})]}),value.status&&jsxs69("div",{children:[jsx111(Text27,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx111(StatusBadge,{status:value.status})]})]})}function SpecimenInfo(specimens){return jsxs69(Stack26,{gap:"xs",children:[jsx111(Title8,{order:2,size:"h6",children:"Specimens"}),jsx111(List,{type:"ordered",children:specimens?.map(specimen=>jsx111(List.Item,{ml:"sm",children:jsxs69(Group38,{gap:20,children:[jsxs69(Group38,{gap:5,children:[jsx111(Text27,{fw:500,children:"Collected:"})," ",formatDateTime3(specimen.collection?.collectedDateTime)]}),jsxs69(Group38,{gap:5,children:[jsx111(Text27,{fw:500,children:"Received:"})," ",formatDateTime3(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs69("table",{className:DiagnosticReportDisplay_default.table,children:[jsx111("thead",{children:jsxs69("tr",{children:[jsx111("th",{children:"Test"}),jsx111("th",{children:"Value"}),jsx111("th",{children:"Reference Range"}),jsx111("th",{children:"Interpretation"}),jsx111("th",{children:"Category"}),jsx111("th",{children:"Performer"}),jsx111("th",{children:"Status"})]})}),jsx111("tbody",{children:jsx111(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx111(Fragment35,{children:props.value?.map(observation=>jsx111(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference2(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource8(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs69(Fragment35,{children:[jsxs69("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx111("td",{rowSpan:displayNotes?2:1,children:jsx111(MedplumLink,{to:observation,children:jsx111(CodeableConceptDisplay,{value:observation.code})})}),jsx111("td",{children:jsx111(ObservationValueDisplay,{value:observation})}),jsx111("td",{children:jsx111(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx111("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx111(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx111("td",{children:observation.category&&observation.category.length>0&&jsx111(Fragment35,{children:observation.category.map(concept=>jsx111("div",{children:jsx111(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx111("td",{children:observation.performer?.map(performer=>jsx111(ReferenceDisplay,{value:performer},performer.reference))}),jsx111("td",{children:observation.status&&jsx111(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx111(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx111("tr",{children:jsx111("td",{colSpan:6,children:jsx111(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx111(Fragment35,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx111(Fragment35,{children:range.text}):jsx111(RangeDisplay,{value:range}):null}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;return code==="AA"||code==="LL"||code==="HH"||code==="A"}import{Fragment as Fragment36,jsx as jsx112,jsxs as jsxs70}from"react/jsx-runtime";function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=useState61(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=useDisclosure3(!1),diagnosticReportsRequests=new Set,filteredDiagnosticReports=diagnosticReports.filter(report=>{let flag=isLaboratoryReport(report);return flag&&report.basedOn&&report.basedOn.forEach(basedOn=>{if(basedOn.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn.reference.split("/");diagnosticReportsRequests.add(id)}}),flag}),completedRequisitionNumbers=new Set,filteredServiceRequests=serviceRequests.filter(request=>{if(request.id&&diagnosticReportsRequests.has(request.id)||request.basedOn&&request.basedOn.find(basedOn2=>{if(basedOn2.reference?.startsWith("ServiceRequest/")){let[,id]=basedOn2.reference.split("/");return diagnosticReportsRequests.has(id)}return!1}))return!1;let shouldFilter=shouldFilterRequest(request,completedRequisitionNumbers);return!shouldFilter&&request.requisition?.value&&completedRequisitionNumbers.add(request.requisition?.value),!shouldFilter}),handleDiagnosticReportClick=report=>{setSelectedReport(report),openReportDialog()};return jsxs70(Fragment36,{children:[jsx112(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:jsxs70(Flex10,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>jsx112(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:jsxs70(Box13,{children:[jsx112(Text28,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(serviceRequest)}),jsxs70(Group39,{mt:2,gap:4,children:[serviceRequest.status&&jsx112(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),jsx112(Text28,{size:"xs",fw:500,c:"dimmed",children:formatDate2(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>jsx112(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:jsxs70(Box13,{children:[jsx112(Text28,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(report)}),jsxs70(Group39,{mt:2,gap:4,children:[report.status&&jsx112(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),jsx112(Text28,{size:"xs",fw:500,c:"dimmed",children:formatDate2(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&jsx112(Text28,{children:"(none)"})]})}),jsx112(Modal5,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&jsx112(DiagnosticReportDisplay,{value:selectedReport,hideSubject:!0})})]})}var getStatusColor=status=>{switch(status){case"active":return"indigo";case"final":return"teal";case"cancelled":return"red";default:return"gray"}};function hasLaboratoryCategory(category){if(!category.coding||!Array.isArray(category.coding))return!1;for(let coding of category.coding)if(coding.code==="LAB")return!0;return!1}function isLaboratoryReport(report){if(!report.category||!Array.isArray(report.category))return!1;for(let category of report.category)if(hasLaboratoryCategory(category))return!0;return!1}function shouldFilterRequest(request,completedRequisitionNumbers){if(["completed","draft","entered-in-error"].includes(request.status))return!0;let requisitionNumber=request.requisition?.value;return!!(requisitionNumber&&completedRequisitionNumbers.has(requisitionNumber))}import{Box as Box14,Flex as Flex11,Group as Group41,Modal as Modal6,Text as Text29}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{getDisplayString as getDisplayString8}from"@medplum/core";import{useMedplum as useMedplum30}from"@medplum/react-hooks";import{useCallback as useCallback16,useState as useState63}from"react";import{Alert as Alert4,Group as Group40,Radio as Radio2,Stack as Stack27}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG6,addProfileToResource as addProfileToResource2,createReference as createReference9}from"@medplum/core";import{useMedplumProfile as useMedplumProfile9}from"@medplum/react-hooks";import{useCallback as useCallback15,useState as useState62}from"react";import{jsx as jsx113,jsxs as jsxs71}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile9(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState62(medication?.medicationCodeableConcept),handleSubmit=useCallback15(formData=>{if(!me)throw new Error("Not signed in");onSubmit(addProfileToResource2({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&createReference9(encounter)),requester:medication?.requester??createReference9(me),medicationCodeableConcept:code,subject:createReference9(patient)},HTTP_HL7_ORG6+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx113(Form,{onSubmit:handleSubmit,children:jsxs71(Stack27,{children:[jsx113(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}),jsx113(Radio2.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx113(Radio2,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx113(Group40,{justify:"flex-end",gap:4,children:jsx113(SubmitButton,{children:"Save"})})]})}):jsx113(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment37,jsx as jsx114,jsxs as jsxs72}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum30(),[medicationRequests,setMedicationRequests]=useState63(props.medicationRequests),[editMedication,setEditMedication]=useState63(),[opened,{open,close}]=useDisclosure4(!1),handleSubmit=useCallback16(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m=>m.id===updatedMedication.id?updatedMedication:m))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs72(Fragment37,{children:[jsx114(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medicationRequests.length>0?jsx114(Flex11,{direction:"column",gap:8,children:medicationRequests.map(medication=>jsx114(SummaryItem,{onClick:()=>{setEditMedication(medication),open()},children:jsxs72(Box14,{children:[jsx114(Text29,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(medication)}),jsx114(Group41,{mt:2,gap:4,children:medication.status&&jsx114(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},medication.id))}):jsx114(Text29,{children:"(none)"})}),jsx114(Modal6,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx114(MedicationDialog,{patient:props.patient,encounter:props.encounter,medication:editMedication,onSubmit:handleSubmit})})]})}function getStatusColor2(status){if(!status)return"gray";switch(status){case"active":return"green";case"stopped":return"red";case"on-hold":return"yellow";case"cancelled":return"red";case"completed":return"blue";case"entered-in-error":return"red";case"draft":return"gray";default:return"gray"}}import{Box as Box15,Group as Group42,Text as Text30,Tooltip as Tooltip5}from"@mantine/core";import{jsx as jsx115,jsxs as jsxs73}from"react/jsx-runtime";var PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return jsx115(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx115(Box15,{className:PatientSummary_default.patientSummaryListItem,children:jsx115(Tooltip5,{label,position:"top-start",openDelay:650,children:jsxs73(Group42,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,jsx115(Text30,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};import{capitalize as capitalize4,getExtension as getExtension3,HTTP_HL7_ORG as HTTP_HL7_ORG7}from"@medplum/core";function getGenderIdentity(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension3(patient,`${HTTP_HL7_ORG7}/fhir/us/core/StructureDefinition/us-core-ethnicity`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getGeneralPractitioner(patient){return patient.generalPractitioner?.[0]?.display}function formatPatientGenderDisplay(patient){let capitalizedGender=patient.gender?capitalize4(patient.gender):"",genderIdentity=getGenderIdentity(patient),birthSex=getBirthSex(patient),parts=[];return capitalizedGender&&parts.push(capitalizedGender),genderIdentity&&parts.push(genderIdentity),birthSex&&parts.push(`Born as ${birthSex}`),parts.join(" \xB7 ")}function formatPatientRaceEthnicityDisplay(patient){let race=getRace(patient),ethnicity=getEthnicity(patient),parts=[];return race&&parts.push(race),ethnicity&&parts.push(ethnicity),parts.join(" \xB7 ")}var getPreferredLanguage=patient=>{if(!patient.communication?.length)return;let preferred=patient.communication?.find(comm=>comm.preferred===!0);return preferred?.language?.coding?.[0]?.display?preferred.language.coding[0].display:patient.communication[0]?.language?.coding?.[0]?.display};import{Box as Box16,Flex as Flex12,Group as Group43,Loader as Loader4,Modal as Modal7,Text as Text31}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{formatAddress as formatAddress2,getReferenceString as getReferenceString9,OperationOutcomeError}from"@medplum/core";import{useMedplum as useMedplum31,useResource as useResource9}from"@medplum/react-hooks";import{useCallback as useCallback17,useEffect as useEffect20,useMemo as useMemo30,useState as useState64}from"react";import{PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,addPreferredPharmacyToPatient,createPreferredPharmacyExtension,getPreferredPharmaciesFromPatient,isAddPharmacyResponse,isOrganizationArray,removePreferredPharmacyFromPatient}from"@medplum/core";import{Fragment as Fragment38,jsx as jsx116,jsxs as jsxs74}from"react/jsx-runtime";function Pharmacies(props){let{patient:patientProp,onClickResource,pharmacyDialogComponent}=props,PharmacyDialogComponent=pharmacyDialogComponent,medplum=useMedplum31(),[opened,{open,close}]=useDisclosure5(!1),[resolvedPharmacies,setResolvedPharmacies]=useState64([]),[loadState,setLoadState]=useState64("loading"),patient=useResource9(patientProp),pharmacyRefs=useMemo30(()=>patient?getPreferredPharmaciesFromPatient(patient):[],[patient]);useEffect20(()=>{let cancelled=!1;return(async()=>{if(props.pharmacies){cancelled||(setResolvedPharmacies(props.pharmacies),setLoadState("loaded"));return}if(pharmacyRefs.length===0){cancelled||(setResolvedPharmacies([]),setLoadState("loaded"));return}setLoadState("loading");try{let results=await Promise.all(pharmacyRefs.map(async pharmacyRef=>{try{return{...await medplum.readReference(pharmacyRef.organizationRef),isPrimary:pharmacyRef.isPrimary}}catch(error){return isNotFoundError(error),null}}));if(!cancelled){let validResults=results.filter(result=>result!==null);setResolvedPharmacies(validResults),setLoadState(validResults.length===0&&pharmacyRefs.length>0?"error":"loaded")}}catch{cancelled||setLoadState("error")}})().catch(()=>{}),()=>{cancelled=!0}},[medplum,pharmacyRefs,props.pharmacies]);let handleSubmit=useCallback17(async _pharmacy=>{patient?.id&&medplum.invalidateUrl(getReferenceString9(patient)),close()},[medplum,patient,close]);return patient?jsxs74(Fragment38,{children:[jsx116(CollapsibleSection,{title:"Pharmacies",onAdd:pharmacyDialogComponent?open:void 0,children:loadState==="loading"?jsx116(Loader4,{size:"sm"}):loadState==="error"?jsx116(Text31,{c:"red",size:"sm",children:"Failed to load pharmacies"}):resolvedPharmacies.length===0?jsx116(Text31,{children:"(none)"}):jsx116(Box16,{children:jsx116(Flex12,{direction:"column",gap:8,children:resolvedPharmacies.map((pharmacy,index)=>jsx116(SummaryItem,{onClick:()=>onClickResource?.(pharmacy),children:jsxs74(Box16,{children:[jsx116(Text31,{fw:500,className:SummaryItem_default.itemText,children:pharmacy.name}),jsxs74(Group43,{mt:2,gap:4,children:[pharmacy.isPrimary&&jsx116(StatusBadge,{color:"blue",variant:"light",status:"primary"}),pharmacy.address?.[0]&&jsx116(Text31,{size:"xs",c:"dimmed",children:formatAddress2(pharmacy.address[0])})]})]})},pharmacy.id||index))})})}),PharmacyDialogComponent?jsx116(Modal7,{opened,onClose:close,title:"Add Pharmacy",size:"lg",children:jsx116(PharmacyDialogComponent,{patient,onSubmit:handleSubmit,onClose:close})}):null]}):jsx116(Fragment38,{})}function isNotFoundError(error){return error instanceof OperationOutcomeError?error.outcome.issue?.some(issue=>issue.code==="not-found")??!1:!1}import{Box as Box17,Flex as Flex13,Group as Group45,Modal as Modal8,Text as Text32}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{formatDate as formatDate3,getDisplayString as getDisplayString9}from"@medplum/core";import{useMedplum as useMedplum32}from"@medplum/react-hooks";import{useCallback as useCallback19,useState as useState66}from"react";import{Group as Group44,Stack as Stack28}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG8,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference10}from"@medplum/core";import{useCallback as useCallback18,useState as useState65}from"react";import{jsx as jsx117,jsxs as jsxs75}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState65(condition?.code),[clinicalStatus,setClinicalStatus]=useState65(condition?.clinicalStatus),handleSubmit=useCallback18(formData=>{let updatedCondition=addProfileToResource3({...condition,resourceType:"Condition",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:createReference10(patient),encounter:encounter&&createReference10(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG8+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx117(Form,{onSubmit:handleSubmit,children:jsxs75(Stack28,{children:[jsx117(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG8+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx117(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG8+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx117(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx117(Group44,{justify:"flex-end",gap:4,mt:"md",children:jsx117(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment39,jsx as jsx118,jsxs as jsxs76}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}]=useDisclosure6(!1),handleSubmit=useCallback19(async condition=>{if(condition.id){let updatedCondition=await medplum.updateResource(condition);setProblems(problems.map(p=>p.id===updatedCondition.id?updatedCondition:p))}else{let newCondition=await medplum.createResource(condition);setProblems([newCondition,...problems])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs76(Fragment39,{children:[jsx118(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx118(Flex13,{direction:"column",gap:8,children:problems.map(problem=>jsx118(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs76(Box17,{children:[jsx118(Text32,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString9(problem)}),jsxs76(Group45,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx118(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx118(Text32,{size:"xs",fw:500,c:"dimmed",children:formatDate3(problem.onsetDateTime)})]})]})},problem.id))}):jsx118(Text32,{children:"(none)"})}),jsx118(Modal8,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx118(ConditionDialog,{patient,encounter,condition:editCondition,onSubmit:handleSubmit})})]})}var getStatusColor3=status=>{if(!status)return"gray";switch(status){case"active":case"recurrence":case"relapse":return"green";case"inactive":return"orange";case"remission":return"blue";case"resolved":return"teal";default:return"gray"}};import{Box as Box18,Flex as Flex14,Group as Group46,Modal as Modal9,Radio as Radio3,Stack as Stack29,Text as Text33,UnstyledButton as UnstyledButton4}from"@mantine/core";import{useDisclosure as useDisclosure7}from"@mantine/hooks";import{createReference as createReference11,HTTP_HL7_ORG as HTTP_HL7_ORG9,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback20,useState as useState67}from"react";import{Fragment as Fragment40,jsx as jsx119,jsxs as jsxs77}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}]=useDisclosure7(!1),[hoverIndex,setHoverIndex]=useState67(null),handleSubmit=useCallback20(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG9+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:createReference11(patient),encounter:encounter?createReference11(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:CodesToSystem[code],code:formData.sexualOrientation}],text:CodesToText[code]}}).then(newSexualOrientation=>{setSexualOrientation(newSexualOrientation),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs77(Fragment40,{children:[jsx119(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx119(Flex14,{direction:"column",gap:8,children:jsx119(Box18,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx119(UnstyledButton4,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx119(Box18,{pr:hoverIndex===0?24:0,children:jsx119(Text33,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx119(Text33,{children:"(none)"})}),jsx119(Modal9,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx119(Form,{onSubmit:handleSubmit,children:jsxs77(Stack29,{children:[jsx119(Radio3.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx119(Radio3,{value:code,label:text,my:"xs"},code))}),jsx119(Group46,{justify:"flex-end",gap:4,mt:"md",children:jsx119(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group47,Modal as Modal10,Radio as Radio4,Stack as Stack30,Text as Text34,UnstyledButton as UnstyledButton5}from"@mantine/core";import{useDisclosure as useDisclosure8}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG10,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference12,formatCodeableConcept as formatCodeableConcept4}from"@medplum/core";import{useMedplum as useMedplum34}from"@medplum/react-hooks";import{useCallback as useCallback21,useState as useState68}from"react";import{Fragment as Fragment41,jsx as jsx120,jsxs as jsxs78}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}]=useDisclosure8(!1),handleSubmit=useCallback21(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG10+"/fhir/us/core/StructureDefinition/us-core-smokingstatus"]},status:"final",category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC2,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference12(props.patient),encounter:props.encounter?createReference12(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED2,version:SNOMED2+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return jsxs78(Fragment41,{children:[jsx120(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx120(UnstyledButton5,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx120(Text34,{children:formatCodeableConcept4(smokingStatus.valueCodeableConcept)})}):jsx120(Text34,{children:"(none)"})}),jsx120(Modal10,{opened,onClose:close,title:"Set Smoking Status",children:jsx120(Form,{onSubmit:handleSubmit,children:jsxs78(Stack30,{children:[jsx120(Radio4.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx120(Radio4,{value:code,label:text,my:"xs"},code))}),jsx120(Group47,{justify:"flex-end",gap:4,mt:"md",children:jsx120(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group48,Modal as Modal11,SimpleGrid,Stack as Stack31,Text as Text35,Textarea as Textarea4,TextInput as TextInput24}from"@mantine/core";import{useDisclosure as useDisclosure9}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState69}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference13}from"@medplum/core";function getObservationValue(obs,component){return component?obs.component?.find(c=>c.code?.coding?.[0].code===component)?.valueQuantity:obs.valueQuantity}function createObservation(patient,encounter,code,title,valueQuantity){if(isValidNumber(valueQuantity.value))return{...createBaseObservation(patient,encounter,code,title),valueQuantity}}function createCompoundObservation(patient,encounter,code,title,components){let component=components.filter(c=>isValidNumber(c.valueQuantity?.value));if(component.length!==0)return{...createBaseObservation(patient,encounter,code,title),component}}function createBaseObservation(patient,encounter,code,title){return{resourceType:"Observation",status:"preliminary",subject:createReference13(patient),encounter:encounter?createReference13(encounter):void 0,effectiveDateTime:new Date().toISOString(),category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"vital-signs",display:"Vital Signs"}]}],code:createLoincCode(code,title)}}function createLoincCode(code,display){return{coding:[{code,display,system:LOINC3}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!Number.isNaN(value)&&Number.isFinite(value)}import{Fragment as Fragment42,jsx as jsx121,jsxs as jsxs79}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}]=useDisclosure9(!1),handleSubmit=useCallback22(formData=>{let newObservations=[];newObservations.push(createCompoundObservation(patient,encounter,BP,"Blood pressure",[{code:createLoincCode(SYSTOLIC,"Systolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.systolic),"mm[Hg]")},{code:createLoincCode(DIASTOLIC,"Diastolic blood pressure"),valueQuantity:createQuantity(Number.parseFloat(formData.diastolic),"mm[Hg]")}]));for(let meta of LOINC_CODES)meta.component||newObservations.push(createObservation(patient,encounter,meta.code,meta.title,createQuantity(Number.parseFloat(formData[meta.name]),meta.unit)));Promise.all(newObservations.filter(Boolean).map(obs=>medplum.createResource(obs))).then(newVitals=>setVitals([...newVitals,...vitals])).catch(console.error),close()},[medplum,patient,encounter,vitals,close]);return jsxs79(Fragment42,{children:[jsx121(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx121(Stack31,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs79(Group48,{align:"center",children:[jsx121(Text35,{c:"dimmed",children:meta.short}),obs&&jsx121(Text35,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx121(Modal11,{opened,onClose:close,title:"Add Vitals",children:jsxs79(Form,{onSubmit:handleSubmit,children:[jsx121(SimpleGrid,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx121(TextInput24,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx121(Textarea4,{name:"notes",label:"Notes"}),jsx121(Group48,{justify:"flex-end",gap:4,mt:"md",children:jsx121(SubmitButton,{children:"Save"})})]})})]})}import{Fragment as Fragment43,jsx as jsx122,jsxs as jsxs80}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum36(),{patient:propsPatient,onClickResource,onRequestLabs,pharmacyDialogComponent}=props,patient=useResource10(propsPatient),[medicalData,setMedicalData]=useState70(),[createdDate,setCreatedDate]=useState70();useEffect21(()=>{let ref=`Patient/${resolveId(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}),medplum.searchResources("ServiceRequest",{subject:ref,...searchMeta}),medplum.searchResources("DiagnosticReport",{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],serviceRequests:results[11],diagnosticReports:results[12]})}).catch(console.error)},[medplum,propsPatient]),useEffect21(()=>{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]);let languageDisplay=patient?getPreferredLanguage(patient):void 0;return patient?jsxs80(Flex15,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs80(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs80(Group49,{align:"center",gap:"sm",p:16,children:[jsx122(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs80(Stack32,{gap:0,style:{flex:1,minWidth:0},children:[jsx122(Tooltip6,{label:formatHumanName8(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx122(Text36,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:formatHumanName8(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return jsxs80(Text36,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx122(Divider6,{})]}),jsx122(Stack32,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:medicalData&&jsxs80(Fragment43,{children:[jsxs80(Stack32,{gap:"xs",py:8,children:[jsx122(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${calculateAgeString(patient.birthDate)})`:void 0,icon:jsx122(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),jsx122(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:jsx122(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),jsx122(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:jsx122(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),jsx122(PatientInfoItem,{patient,value:patient.address?.[0]?formatAddress3(patient.address[0]):void 0,icon:jsx122(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),jsx122(PatientInfoItem,{patient,value:languageDisplay,icon:jsx122(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),jsx122(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:jsx122(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add General Practitioner",label:"General Practitioner",onClickResource})]}),jsx122(Divider6,{}),jsx122(Insurance,{coverages:medicalData.coverages||[],onClickResource}),jsx122(Divider6,{}),jsx122(Allergies,{patient,allergies:medicalData.allergies,onClickResource}),jsx122(Divider6,{}),jsx122(ProblemList,{patient,problems:medicalData.problems,onClickResource}),jsx122(Divider6,{}),jsx122(Medications,{patient,medicationRequests:medicalData.medicationRequests,onClickResource}),jsx122(Divider6,{}),jsx122(Labs,{patient,serviceRequests:medicalData.serviceRequests,diagnosticReports:medicalData.diagnosticReports,onClickResource,onRequestLabs}),jsx122(Divider6,{}),jsx122(SexualOrientation,{patient,sexualOrientation:medicalData.sexualOrientation,onClickResource}),jsx122(Divider6,{}),jsx122(SmokingStatus,{patient,smokingStatus:medicalData.smokingStatus,onClickResource}),jsx122(Divider6,{}),jsx122(Vitals,{patient,vitals:medicalData.vitals,onClickResource}),jsx122(Divider6,{}),jsx122(Pharmacies,{patient,onClickResource,pharmacyDialogComponent}),jsx122(Divider6,{})]})})]}):null}var ThreadInbox_default={container:"ThreadInbox_container",rightBorder:"ThreadInbox_rightBorder"};import{Fragment as Fragment44,jsx as jsx123,jsxs as jsxs81}from"react/jsx-runtime";function ThreadInbox(props){let{query,threadId,subject,showPatientSummary=!1,pharmacyDialogComponent,onNew,getThreadUri,uploadEnabled,onViewInDocuments,onChange,inProgressUri,completedUri,allowPatientSelection=!1}=props,navigate=useMedplumNavigate5(),[modalOpened,{open:openModal,close:closeModal}]=useDisclosure10(!1),currentSearch=useMemo31(()=>parseSearchRequest(`Communication?${query}`),[query]),searchParams=useMemo31(()=>new URLSearchParams(query),[query]),itemsPerPage=Number.parseInt(searchParams.get("_count")||"20",10),currentOffset=Number.parseInt(searchParams.get("_offset")||"0",10),currentPage=Math.floor(currentOffset/itemsPerPage)+1,status=searchParams.get("status")||"in-progress",selectedParticipants=useMemo31(()=>(currentSearch.filters?.filter(f=>f.code==="recipient")??[]).flatMap(f=>f.value.split(",").filter(Boolean).map(ref=>({reference:ref}))),[currentSearch]),{loading,error,threadMessages,selectedThread,total,handleThreadStatusChange,addThreadMessage,refreshThreadMessages}=useThreadInbox({query,threadId}),handleParticipantsChange=useCallback23(participants=>{let otherFilters=currentSearch.filters?.filter(f=>f.code!=="recipient")??[],participantRefs=participants.map(p=>p.reference).filter(Boolean),newFilters=participantRefs.length>0?[...otherFilters,{code:"recipient",operator:Operator.EQUALS,value:participantRefs.join(",")}]:otherFilters;onChange({...currentSearch,filters:newFilters,offset:0})},[currentSearch,onChange]),skeletonTitleWidths=[80,72,68,64],skeletonSubtitleWidths=[85,78,70,60];useEffect22(()=>{error&&showNotification8({title:"Error",message:normalizeErrorString10(error),color:"red"})},[error]);let handleTopicStatusChangeWithErrorHandling=async newStatus=>{handleThreadStatusChange(newStatus);try{await refreshThreadMessages()}catch(error2){showNotification8({title:"Error",message:normalizeErrorString10(error2),color:"red"})}},handleNewTopicCompletion=message=>{addThreadMessage(message),onNew(message)};return jsxs81(Fragment44,{children:[jsx123("div",{className:ThreadInbox_default.container,children:jsxs81(Flex16,{direction:"row",h:"100%",w:"100%",children:[jsx123(Flex16,{direction:"column",w:380,h:"100%",className:ThreadInbox_default.rightBorder,children:jsxs81(Paper4,{h:"100%",style:{display:"flex",flexDirection:"column"},children:[jsxs81(ScrollArea3,{style:{flex:1},scrollbarSize:10,type:"hover",scrollHideDelay:250,children:[jsxs81(Flex16,{h:64,align:"center",justify:"space-between",p:"md",children:[jsx123(Tabs,{value:status,onChange:value=>{navigate(value==="in-progress"?inProgressUri:completedUri)},variant:"unstyled",className:"pill-tabs",children:jsxs81(Tabs.List,{children:[jsx123(Tabs.Tab,{value:"in-progress",children:"In Progress"}),jsx123(Tabs.Tab,{value:"completed",children:"Completed"})]})}),jsxs81(Group50,{gap:"xs",children:[jsx123(ParticipantFilter,{selectedParticipants,onFilterChange:handleParticipantsChange}),jsx123(Tooltip7,{label:"New Message",position:"bottom",openDelay:500,children:jsx123(ActionIcon12,{radius:"xl",variant:"filled",color:"blue",size:32,onClick:openModal,children:jsx123(IconPlus,{size:16})})})]})]}),jsx123(Divider7,{}),loading?jsx123(Stack33,{gap:"md",p:"md",children:Array.from({length:10}).map((_,index)=>{let titleWidth=skeletonTitleWidths[index%skeletonTitleWidths.length],subtitleWidth=skeletonSubtitleWidths[index%skeletonSubtitleWidths.length];return jsxs81(Flex16,{gap:"sm",align:"flex-start",children:[jsx123(Skeleton2,{height:40,width:40,radius:"50%"}),jsx123(Box19,{style:{flex:1},children:jsxs81(Flex16,{direction:"column",gap:"xs",children:[jsx123(Skeleton2,{height:16,width:`${titleWidth}%`}),jsx123(Skeleton2,{height:14,width:`${subtitleWidth}%`})]})})]},index)})}):threadMessages.length>0&&jsx123(ChatList,{threads:threadMessages,selectedCommunication:selectedThread,getThreadUri}),threadMessages.length===0&&!loading&&jsx123(EmptyMessagesState,{})]}),!loading&&total!==void 0&&total>itemsPerPage&&jsx123(Box19,{p:"md",children:jsx123(Center3,{children:jsx123(Pagination,{value:currentPage,total:Math.ceil(total/itemsPerPage),onChange:page=>{let offset=(page-1)*itemsPerPage;onChange({...currentSearch,offset})},size:"sm",siblings:1,boundaries:1})})})]})}),selectedThread?jsxs81(Fragment44,{children:[jsx123(Flex16,{direction:"column",style:{flex:1},h:"100%",className:ThreadInbox_default.rightBorder,children:jsx123(Paper4,{h:"100%",children:jsxs81(Stack33,{h:"100%",gap:0,children:[jsxs81(Flex16,{h:64,align:"center",justify:"space-between",p:"md",children:[jsx123(Text37,{fw:800,truncate:!0,fz:"lg",children:selectedThread.topic?.text??"Messages"}),jsxs81(Menu5,{position:"bottom-end",shadow:"md",children:[jsx123(Menu5.Target,{children:jsx123(Button10,{variant:"light",color:getStatusColor4(selectedThread.status),rightSection:selectedThread.status==="completed"?void 0:jsx123(IconChevronDown,{size:16}),radius:"xl",size:"sm",children:selectedThread.status.split("-").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")})}),selectedThread.status!=="completed"&&jsx123(Menu5.Dropdown,{children:jsx123(Menu5.Item,{onClick:()=>handleTopicStatusChangeWithErrorHandling("completed"),children:"Completed"})})]})]}),jsx123(Divider7,{}),jsx123(Flex16,{direction:"column",style:{flex:1},h:"100%",children:jsx123(ThreadChat,{title:"Messages",thread:selectedThread,excludeHeader:!0,uploadEnabled,onViewInDocuments},`${getReferenceString10(selectedThread)}`)})]})})}),selectedThread.subject&&showPatientSummary&&jsx123(Flex16,{direction:"column",w:300,h:"100%",children:jsx123(ScrollArea3,{p:0,h:"100%",scrollbarSize:10,type:"hover",scrollHideDelay:250,children:jsx123(PatientSummary,{patient:selectedThread.subject,pharmacyDialogComponent},selectedThread.id)})})]}):jsx123(Flex16,{direction:"column",style:{flex:1},h:"100%",children:jsx123(NoMessages,{})})]})}),jsx123(NewTopicDialog,{subject,opened:modalOpened,onClose:closeModal,onSubmit:handleNewTopicCompletion,allowPatientSelection})]})}function NoMessages(){return jsx123(Center3,{h:"100%",w:"100%",children:jsxs81(Stack33,{align:"center",gap:"md",children:[jsx123(ThemeIcon,{size:64,variant:"light",color:"gray",children:jsx123(IconMessageCircle,{size:32})}),jsx123(Stack33,{align:"center",gap:"xs",children:jsx123(Text37,{size:"sm",c:"dimmed",ta:"center",children:"Select a message from the list to view details"})})]})})}function getStatusColor4(status){return status==="completed"?"green":status==="stopped"?"red":"blue"}function EmptyMessagesState(){return jsx123(Flex16,{direction:"column",h:"100%",justify:"center",align:"center",children:jsxs81(Stack33,{align:"center",gap:"md",pt:"xl",children:[jsx123(IconMessageCircle,{size:64,color:"var(--mantine-color-gray-4)"}),jsx123(Text37,{size:"lg",c:"dimmed",fw:500,children:"No messages found"})]})})}import{ActionIcon as ActionIcon14,Button as Button12,Center as Center4,Group as Group52,Loader as Loader5,ScrollArea as ScrollArea4,TextInput as TextInput25}from"@mantine/core";import{showNotification as showNotification9,updateNotification}from"@mantine/notifications";import{createReference as createReference14,normalizeErrorString as normalizeErrorString11}from"@medplum/core";import{useMedplum as useMedplum39,useResource as useResource12}from"@medplum/react-hooks";import{useCallback as useCallback24,useEffect as useEffect25,useRef as useRef16,useState as useState74}from"react";var import_rfc6902=__toESM(require_rfc6902(),1);import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize5,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum37}from"@medplum/react-hooks";import{useEffect as useEffect23,useMemo as useMemo32,useState as useState72}from"react";import{Button as Button11,Table}from"@mantine/core";import{useState as useState71}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment45,jsx as jsx124,jsxs as jsxs82}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState71(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx124(Fragment45,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx124(Fragment45,{children:jsxs82(Table.Tr,{children:[jsx124(Table.Td,{children:name}),jsx124(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx124(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx124(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx124(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs82(Table.Tr,{children:[jsx124(Table.Td,{children:name}),jsx124(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx124(Button11,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx125,jsxs as jsxs83}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum37(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState72(!1);useEffect23(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo32(()=>{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:`${capitalize5(op.op)} ${fhirPath}`,path:property?.path??original.resourceType+"."+fhirPath,property,originalValue:touchUpValue(property,originalValue),revisedValue:touchUpValue(property,revisedValue)})}return result},[schemaLoaded,original,revised]);return diffTable?jsxs83(Table2,{className:ResourceDiffTable_default.root,children:[jsx125(Table2.Thead,{children:jsxs83(Table2.Tr,{children:[jsx125(Table2.Th,{}),jsx125(Table2.Th,{children:"Before"}),jsx125(Table2.Th,{children:"After"})]})}),jsx125(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx125(ResourceDiffRow,{...rest},key)})})]}):null}function mergePatchOperations(patch){let result=[];for(let patchOperation of patch){let{op,path}=patchOperation;if(path.startsWith("/meta/author")||path.startsWith("/meta/compartment")||path.startsWith("/meta/lastUpdated")||path.startsWith("/meta/versionId"))continue;let count=patch.filter(el=>el.op===op&&el.path===path).length,resultOperation={op,path};count>1&&(op==="add"||op==="remove")&&/\/[0-9-]+$/.test(path)&&(resultOperation.op="replace",resultOperation.path=path.replace(/\/[^/]+$/,"")),result.some(el=>el.op===resultOperation.op&&el.path===resultOperation.path)||result.push(resultOperation)}return result}function jsonPathToFhirPath(path){let parts=path.split("/").filter(Boolean),result="";for(let i=0;i<parts.length;i++){let part=parts[i];part==="-"?result+=".last()":/^\d+$/.test(part)?result+=`[${part}]`:(i>0&&(result+="."),result+=part)}return result.endsWith(".url")&&(result=result.replace(/\.url$/,"")),result}function tryGetElementDefinition(resourceType,fhirPath){try{return getSearchParameterDetails(resourceType,{resourceType:"SearchParameter",base:[resourceType],code:resourceType+"."+fhirPath,expression:resourceType+"."+fhirPath})?.elementDefinitions?.[0]}catch(err){console.warn("Failed to get element definition",{resourceType,fhirPath,err});return}}function touchUpValue(property,input){return input&&{type:Array.isArray(input)?input[0].type:input.type,value:fixArray(input,!!property?.isArray)}}function fixArray(input,isArray){let inputValue=arrayify(input).flatMap(v=>v.value);return isArray?inputValue:inputValue[0]}import{AccessPolicyInteraction,satisfiedAccessPolicy,tryGetProfile as tryGetProfile4}from"@medplum/core";import{useMedplum as useMedplum38,useResource as useResource11}from"@medplum/react-hooks";import{useEffect as useEffect24,useMemo as useMemo33,useState as useState73}from"react";import{jsx as jsx126}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum38(),accessPolicy=medplum.getAccessPolicy(),value=useResource11(props.value),[schemaLoaded,setSchemaLoaded]=useState73(!1);useEffect24(()=>{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=useMemo33(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx126(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon13,Group as Group51,Menu as Menu6,Text as Text38}from"@mantine/core";import{formatDateTime as formatDateTime4,getReferenceString as getReferenceString11}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx127,jsxs as jsxs84}from"react/jsx-runtime";function Timeline(props){return jsx127(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 jsxs84(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs84(Group51,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx127(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs84("div",{style:{flex:1},children:[jsx127(Text38,{size:"sm",children:jsx127(ResourceName,{c:"inherit",fw:500,value:author,link:!0})}),jsxs84(Text38,{size:"xs",children:[jsx127(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime4(dateTime)}),jsx127(Text38,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx127(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs84(Menu6,{position:"bottom-end",shadow:"md",width:200,children:[jsx127(Menu6.Target,{children:jsx127(ActionIcon13,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString11(props.resource)}`,children:jsx127(IconDots,{})})}),popupMenuItems]})]}),jsx127(ErrorBoundary,{children:jsx127("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 jsx128,jsxs as jsxs85}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum39(),sender=medplum.getProfile(),inputRef=useRef16(null),resource=useResource12(props.value),[history,setHistory]=useState74(),[items,setItems]=useState74([]),[countToShow,setCountToShow]=useState74(10),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef16(items);itemsRef.current=items;let sortAndSetItems=useCallback24(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback24(batchResponse=>{let newItems=[];for(let settledResult of batchResponse){if(settledResult.status!=="fulfilled")continue;let bundle=settledResult.value;if(bundle.type==="history"&&setHistory(bundle),bundle.entry)for(let entry of bundle.entry)newItems.push(entry.resource)}sortAndSetItems(newItems)},[sortAndSetItems]),addResource=useCallback24(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback24(()=>{let resourceType,id;"resourceType"in props.value?(resourceType=props.value.resourceType,id=props.value.id):[resourceType,id]=props.value.reference?.split("/"),loadTimelineResources(medplum,resourceType,id).then(handleBatchResponse).catch(console.error)},[medplum,props.value,loadTimelineResources,handleBatchResponse]);useEffect25(()=>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:jsx128(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString11(reason),icon:jsx128(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification9({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:normalizeErrorString11(outcome),icon:jsx128(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return jsx128(Center4,{style:{width:"100%",height:"100%"},children:jsx128(Loader5,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return jsxs85(Timeline,{children:[props.createCommunication&&jsx128(Panel,{children:jsx128(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs85(Group52,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx128(ResourceAvatar,{value:sender}),jsx128(TextInput25,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx128(ActionIcon14,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx128(IconMessage,{size:16})}),jsx128(AttachmentButton,{securityContext:createReference14(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx128(ActionIcon14,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx128(IconCloudUpload,{size:16})})})]})})}),itemsToShow.map(item=>{let key=`${item.resourceType}/${item.id}/${item.meta?.versionId}`,menu=props.getMenu?props.getMenu({primaryResource:resource,currentResource:item,reloadTimeline:loadTimeline}):void 0;if(item.resourceType===resource.resourceType&&item.id===resource.id)return jsx128(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx128(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx128(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx128(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx128(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx128(TimelineItem,{resource:item,padding:!0,children:jsx128(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&jsx128(Group52,{justify:"center",pb:"lg",children:jsx128(Button12,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx128(TimelineItem,{resource,padding:!0,...rest,children:jsx128(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs85(TimelineItem,{resource,padding:!0,...rest,children:[jsx128("h3",{children:"Created"}),jsx128(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 jsx128(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx128("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 jsx128(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx128(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx128(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx128(ScrollArea4,{children:jsx128("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx128(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx128(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 jsx129}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx129(ResourceTimeline,{value:resource,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`;return Promise.allSettled([medplum.readHistory(resourceType,id),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count:100})])},...rest})}import{createReference as createReference15}from"@medplum/core";import{jsx as jsx130}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx130(ResourceTimeline,{value:encounter,loadTimelineResources:async(medplum,_resourceType,id)=>Promise.allSettled([medplum.readHistory("Encounter",id),medplum.search("Communication","encounter=Encounter/"+id),medplum.search("Media","encounter=Encounter/"+id)]),createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",encounter:createReference15(resource),subject:resource.subject,sender:createReference15(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference15(resource),subject:resource.subject,operator:createReference15(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button17,Loader as Loader7,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome8}from"@medplum/core";import{useMedplum as useMedplum41}from"@medplum/react-hooks";import{memo,useEffect as useEffect29,useRef as useRef20,useState as useState79}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx131}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 jsx131(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon16,Button as Button16,Center as Center5,Group as Group55,Loader as Loader6,Menu as Menu8,Pagination as Pagination2,Table as Table3,Text as Text40,UnstyledButton as UnstyledButton6}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals as deepEquals2,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome7}from"@medplum/core";import{useMedplum as useMedplum40}from"@medplum/react-hooks";import{useCallback as useCallback25,useEffect as useEffect28,useRef as useRef19,useState as useState78}from"react";import{Box as Box20,Button as Button13,Modal as Modal12,Text as Text39}from"@mantine/core";import{jsx as jsx132,jsxs as jsxs86}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs86(Modal12,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs86(Box20,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx132(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx132(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx132(Text39,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx132(Button13,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button14,Group as Group53,Modal as Modal13,MultiSelect as MultiSelect2,Stack as Stack34}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify3}from"@medplum/core";import{useEffect as useEffect26,useMemo as useMemo34,useRef as useRef17,useState as useState75}from"react";import{capitalize as capitalize6,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime5,Operator as Operator2}from"@medplum/core";import{Fragment as Fragment46,jsx as jsx133}from"react/jsx-runtime";var searchParamToOperators={string:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],fulltext:[Operator2.EQUALS,Operator2.NOT,Operator2.CONTAINS,Operator2.EXACT],token:[Operator2.EQUALS,Operator2.NOT,Operator2.TEXT],reference:[Operator2.EQUALS,Operator2.NOT],numeric:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],quantity:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS],date:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],datetime:[Operator2.EQUALS,Operator2.NOT_EQUALS,Operator2.GREATER_THAN,Operator2.LESS_THAN,Operator2.GREATER_THAN_OR_EQUALS,Operator2.LESS_THAN_OR_EQUALS,Operator2.STARTS_AFTER,Operator2.ENDS_BEFORE,Operator2.APPROXIMATELY],uri:[Operator2.EQUALS,Operator2.NOT,Operator2.ABOVE,Operator2.BELOW]},operatorNames={eq:"equals",ne:"not equals",gt:"greater than",lt:"less than",ge:"greater than or equals",le:"less than or equals",sa:"starts after",eb:"ends before",ap:"approximately",sw:"starts with",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",present:"present",identifier:"identifier",iterate:"iterate"};function setFilters(definition,filters){return{...definition,filters,offset:0,name:void 0}}function clearFilters(definition){return setFilters(definition,[])}function clearFiltersOnField(definition,code){return setFilters(definition,(definition.filters??[]).filter(f=>f.code!==code))}function addFilter(definition,field,op,value,opt_clear){opt_clear&&(definition=clearFiltersOnField(definition,field));let nextFilters=[];return definition.filters&&nextFilters.push(...definition.filters),nextFilters.push({code:field,operator:op,value:value??""}),setFilters(definition,nextFilters)}function addField(definition,field){if(definition.fields?.includes(field))return definition;let newFields=[];return definition.fields&&newFields.push(...definition.fields),newFields.push(field),{...definition,fields:newFields,name:void 0}}function deleteFilter(definition,index){if(!definition.filters)return definition;let newFilters=[...definition.filters];return newFilters.splice(index,1),{...definition,filters:newFilters,name:void 0}}function addYesterdayFilter(definition,field){return addDayFilter(definition,field,-1)}function addTodayFilter(definition,field){return addDayFilter(definition,field,0)}function addTomorrowFilter(definition,field){return addDayFilter(definition,field,1)}function addDayFilter(definition,field,delta){let startTime=new Date;startTime.setDate(startTime.getDate()+delta),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setDate(endTime.getDate()+1),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addNext24HoursFilter(definition,field){let now=new Date,endTime=new Date(now.getTime()+1440*60*1e3);return addDateFilterBetween(definition,field,now,endTime)}function addLastMonthFilter(definition,field){return addMonthFilter(definition,field,-1)}function addThisMonthFilter(definition,field){return addMonthFilter(definition,field,0)}function addNextMonthFilter(definition,field){return addMonthFilter(definition,field,1)}function addMonthFilter(definition,field,delta){let startTime=new Date;startTime.setMonth(startTime.getMonth()+delta),startTime.setDate(1),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setMonth(endTime.getMonth()+1),endTime.setDate(1),endTime.setHours(0,0,0,0),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addYearToDateFilter(definition,field){let startTime=new Date;return startTime.setMonth(0),startTime.setDate(1),startTime.setHours(0,0,0,0),addDateFilterBetween(definition,field,startTime,new Date)}function addDateFilterBetween(definition,field,d1,d2){return definition=clearFiltersOnField(definition,field),definition=addDateFilterImpl(definition,field,Operator2.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator2.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator2.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.replaceAll(/([A-Z])/g," $1"),tmp=tmp.replaceAll(/[-_]/g," "),tmp=tmp.replaceAll(/\s+/g," "),tmp=tmp.trim(),tmp.toLowerCase()==="id"?"ID":tmp.split(/\s/).map(capitalize6).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?jsx133(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children:resource.id}):key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?formatDateTime5(resource.meta?.lastUpdated):`${resource.resourceType}.${field.name}`===field.elementDefinition?.path?renderPropertyValue(resource,field.elementDefinition):field.searchParams?.length===1&&field.name===field.searchParams[0].code?renderSearchParameterValue(resource,field.searchParams[0]):null}function renderPropertyValue(resource,elementDefinition){let path=elementDefinition.path?.split(".")?.pop()?.replaceAll("[x]","")??"",[value,propertyType]=getValueAndType({type:resource.resourceType,value:resource},path);return value?jsx133(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:jsx133(Fragment46,{children:value.map((v,index)=>jsx133(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx134,jsxs as jsxs87}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef17(!1),[state,setState]=useState75({search:JSON.parse(stringify3(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState75(!1);useEffect26(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo34(()=>{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 jsx134(Modal13,{title:"Fields",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>{props.onCancel()},size:"auto",withOverlay:!0,closeOnClickOutside:!1,overlayProps:{onMouseDownCapture:()=>{wasDropdownOpen.current=isDropdownOpen},onClick:()=>{wasDropdownOpen.current||props.onCancel(),wasDropdownOpen.current=!1},children:jsx134("div",{"data-testid":"overlay-child"})},children:jsxs87(Stack34,{children:[jsx134(MultiSelect2,{style:{width:550},placeholder:"Select fields to display",data:allFields,value:state.search.fields??[],onChange:handleChange,onDropdownOpen:()=>setIsDropdownOpen(!0),onDropdownClose:()=>setIsDropdownOpen(!1),maxDropdownHeight:"250px",clearButtonProps:{"aria-label":"Clear selection"},clearable:!0,searchable:!0}),jsx134(Group53,{justify:"flex-end",children:jsx134(Button14,{onClick:()=>props.onOk(state.search),children:"OK"})})]})})}function getFieldsList(typeSchema,searchParams){let result=[],keys=new Set,names=new Set;for(let key of Object.keys(typeSchema.elements))result.push(key),keys.add(key.toLowerCase()),names.add(buildFieldNameString(key));if(searchParams)for(let code of Object.keys(searchParams)){let name=buildFieldNameString(code);!keys.has(code)&&!names.has(name)&&(result.push(code),keys.add(code),names.add(name))}return result}import{ActionIcon as ActionIcon15,Group as Group54,Modal as Modal14,NativeSelect as NativeSelect11}from"@mantine/core";import{Operator as Operator3,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect27,useRef as useRef18,useState as useState76}from"react";import{Checkbox as Checkbox7,TextInput as TextInput26}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx135}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 jsx135(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 jsx135(Checkbox7,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType.DATE:return jsx135(TextInput26,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.DATETIME:return jsx135(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx135(TextInput26,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.QUANTITY:return jsx135(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx135(TextInput26,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value),placeholder:"Search value"})}}function tryParseQuantity(value){if(value){let[valueString,systemString,unitString]=value.split("|");if(valueString)return{value:Number.parseFloat(valueString),system:systemString,unit:unitString}}}import{jsx as jsx136,jsxs as jsxs88}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState76(deepClone2(props.search)),searchRef=useRef18(search);searchRef.current=search,useEffect27(()=>{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 jsx136(Modal14,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs88(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs88("div",{children:[jsxs88("table",{children:[jsxs88("colgroup",{children:[jsx136("col",{style:{width:200}}),jsx136("col",{style:{width:200}}),jsx136("col",{style:{width:380}}),jsx136("col",{style:{width:40}})]}),jsx136("thead",{children:jsxs88("tr",{children:[jsx136("th",{children:"Field"}),jsx136("th",{children:"Operation"}),jsx136("th",{children:"Value"}),jsx136("th",{})]})}),jsx136("tbody",{children:filters.map((filter,index)=>jsx136(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`))})]}),jsx136(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx136(Group54,{justify:"flex-end",mt:"xl",children:jsx136(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value,valueRef=useRef18(value);valueRef.current=value;function setFilterCode(newCode){valueRef.current.code=newCode,valueRef.current.operator=Operator3.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 jsxs88("tr",{children:[jsx136("td",{children:jsx136(NativeSelect11,{"data-testid":`${props.id}-filter-field`,defaultValue:props.value.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...Object.keys(props.searchParams).map(param=>({value:param,label:buildFieldNameString(param)}))]})}),jsx136("td",{children:operators&&jsx136(NativeSelect11,{"data-testid":`${props.id}-filter-operation`,defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]},`${props.id}-filter-value-${props.value.code}`)}),jsx136("td",{children:searchParam&&value.operator&&jsx136(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}`)}),jsx136("td",{children:props.onDelete&&jsx136(ActionIcon15,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx136(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button15,Grid,Modal as Modal15}from"@mantine/core";import{useState as useState77}from"react";import{jsx as jsx137,jsxs as jsxs89}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState77(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx137(Modal15,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx137(Form,{onSubmit:onOk,children:jsxs89(Grid,{children:[jsx137(Grid.Col,{span:10,children:jsx137(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx137(Grid.Col,{span:2,children:jsx137(Button15,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime6,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator4,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment47,jsx as jsx138}from"react/jsx-runtime";function SearchFilterValueDisplay(props){let{resourceType,filter}=props,searchParam=globalSchema.types[resourceType].searchParams?.[filter.code];if(searchParam){if(searchParam.type==="reference"&&(filter.operator===Operator4.EQUALS||filter.operator===Operator4.NOT_EQUALS))return jsx138(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx138(Fragment47,{children:formatDateTime6(filter.value)})}return jsx138(Fragment47,{children:filter.value})}import{Menu as Menu7}from"@mantine/core";import{Operator as Operator5}from"@medplum/core";import{Fragment as Fragment48,jsx as jsx139,jsxs as jsxs90}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?jsx139(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx139(Menu7.Dropdown,{children:props.searchParams.map(searchParam=>jsx139(Menu7.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx139(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx139(NumericFilterSubMenu,{...props});case"reference":return jsx139(ReferenceFilterSubMenu,{...props});case"string":return jsx139(TextFilterSubMenu,{...props});case"token":return jsx139(TokenFilterSubMenu,{...props});case"uri":return jsx139(UriFilterSubMenu,{...props});default:return jsxs90(Fragment48,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs90(Menu7.Dropdown,{children:[jsx139(Menu7.Item,{leftSection:jsx139(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx139(Menu7.Item,{leftSection:jsx139(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.ENDS_BEFORE),children:"Before..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.STARTS_AFTER),children:"After..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Between..."}),jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx139(Menu7.Item,{leftSection:jsx139(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx139(Menu7.Item,{leftSection:jsx139(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx139(Menu7.Item,{leftSection:jsx139(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx139(Menu7.Item,{leftSection:jsx139(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx139(Menu7.Item,{leftSection:jsx139(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx139(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs90(Menu7.Dropdown,{children:[jsx139(Menu7.Item,{leftSection:jsx139(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx139(Menu7.Item,{leftSection:jsx139(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT_EQUALS),children:"Does not equal..."}),jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN),children:"Greater than..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN),children:"Less than..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx139(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs90(Menu7.Dropdown,{children:[jsx139(Menu7.Item,{leftSection:jsx139(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx139(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs90(Menu7.Dropdown,{children:[jsx139(Menu7.Item,{leftSection:jsx139(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx139(Menu7.Item,{leftSection:jsx139(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.CONTAINS),children:"Contains..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Does not contain..."}),jsx139(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs90(Menu7.Dropdown,{children:[jsx139(Menu7.Item,{leftSection:jsx139(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.TEXT),children:"Text contains..."}),jsx139(CommonMenuItems,{...props})]})}function UriFilterSubMenu(props){let{searchParam}=props;return jsxs90(Menu7.Dropdown,{children:[jsx139(Menu7.Item,{leftSection:jsx139(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.EQUALS),children:"Equals..."}),jsx139(Menu7.Item,{leftSection:jsx139(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator5.NOT),children:"Does not equal..."}),jsx139(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs90(Fragment48,{children:[jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx139(Menu7.Item,{leftSection:jsx139(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx139(Menu7.Divider,{}),jsx139(Menu7.Item,{leftSection:jsx139(IconX,{size:14}),onClick:()=>props.onClear(searchParam),children:"Clear filters"})]})}function getPaginationControlProps(controlName){switch(controlName){case"next":return{"aria-label":"Next page"};case"previous":return{"aria-label":"Previous page"};case"first":return{"aria-label":"First page"};case"last":return{"aria-label":"Last page"};default:return{}}}var SearchControl_default={root:"SearchControl_root",table:"SearchControl_table",tr:"SearchControl_tr",th:"SearchControl_th",control:"SearchControl_control",icon:"SearchControl_icon"};import{getElementDefinition as getElementDefinition2,getSearchParameter,getSearchParameterDetails as getSearchParameterDetails4,getSearchParameters as getSearchParameters3}from"@medplum/core";function getFieldDefinitions(search){let resourceType=search.resourceType,fields=[];for(let name of search.fields||["id","_lastUpdated"])fields.push(getFieldDefinition(resourceType,name));return fields}function getFieldDefinition(resourceType,name){if(name==="_lastUpdated")return{name:"_lastUpdated",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_lastUpdated",name:"_lastUpdated",type:"date",expression:"Resource.meta.lastUpdated"}]};if(name==="meta.versionId")return{name:"meta.versionId",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_versionId",name:"_versionId",type:"token",expression:"Resource.meta.versionId"}]};let exactElementDefinition=getElementDefinition2(resourceType,name),exactSearchParam=getSearchParameter(resourceType,name.toLowerCase());if(exactElementDefinition&&exactSearchParam)return{name,elementDefinition:exactElementDefinition,searchParams:[exactSearchParam]};if(exactElementDefinition){let allSearchParams=getSearchParameters3(resourceType),searchParams;if(allSearchParams){let pathRegex=new RegExp(`${resourceType}\\.${name.replaceAll("[x]","")}([^\\w-]|$)`);searchParams=Object.values(allSearchParams).filter(p=>!!p.expression&&pathRegex.test(p?.expression)),searchParams.length===0&&(searchParams=void 0)}return{name,elementDefinition:exactElementDefinition,searchParams}}if(exactSearchParam){let details=getSearchParameterDetails4(resourceType,exactSearchParam);return{name,elementDefinition:details.elementDefinitions?.[0],searchParams:[exactSearchParam]}}return{name}}import{Fragment as Fragment49,jsx as jsx140,jsxs as jsxs91}from"react/jsx-runtime";var SearchChangeEvent=class extends Event{constructor(definition){super("change");__publicField(this,"definition");this.definition=definition}},SearchLoadEvent=class extends Event{constructor(response){super("load");__publicField(this,"response");this.response=response}},SearchClickEvent=class extends Event{constructor(resource,browserEvent){super("click");__publicField(this,"resource");__publicField(this,"browserEvent");this.resource=resource,this.browserEvent=browserEvent}};function SearchControl(props){let medplum=useMedplum40(),[outcome,setOutcome]=useState78(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState78(search);deepEquals2(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState78({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef19(state);stateRef.current=state;let total=memoizedSearch.total??"accurate",loadResults=useCallback25(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,formatSearchQuery({...memoizedSearch,total,fields:void 0}),options)).then(response=>{setState({...stateRef.current,searchResponse:response}),onLoad&&onLoad(new SearchLoadEvent(response))}).catch(reason=>{setState({...stateRef.current,searchResponse:void 0}),setOutcome(normalizeOperationOutcome7(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback25(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect28(()=>{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 jsx140(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx140(Center5,{style:{width:"100%",height:"100%"},children:jsx140(Loader6,{})});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 jsxs91("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs91(Group55,{justify:"space-between",mb:"xl",children:[jsxs91(Group55,{gap:2,children:[jsx140(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx140(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx140(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx140(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx140(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx140(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx140(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx140(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx140(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx140(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx140(Button16,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx140(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs91(Group55,{gap:2,children:[lastResult&&jsxs91(Text40,{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()}`]}),jsx140(ActionIcon16,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx140(IconRefresh,{size:iconSize})})]})]}),jsxs91(Table3,{className:SearchControl_default.table,children:[jsxs91(Table3.Thead,{children:[jsxs91(Table3.Tr,{children:[checkboxColumn&&jsx140(Table3.Th,{children:jsx140("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx140(Table3.Th,{children:jsxs91(Menu8,{shadow:"md",width:240,position:"bottom-end",children:[jsx140(Menu8.Target,{children:jsx140(UnstyledButton6,{className:SearchControl_default.control,p:2,children:jsxs91(Group55,{justify:"space-between",wrap:"nowrap",children:[jsx140(Text40,{fw:500,children:buildFieldNameString(field.name)}),jsx140(Center5,{className:SearchControl_default.icon,children:jsx140(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx140(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&&jsxs91(Table3.Tr,{children:[checkboxColumn&&jsx140(Table3.Th,{}),fields.map(field=>jsx140(Table3.Th,{children:field.searchParams&&jsx140(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),jsx140(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs91(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx140(Table3.Td,{children:jsx140("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=>jsx140(Table3.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&jsx140(Container,{children:jsx140(Center5,{style:{height:150},children:jsx140(Text40,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx140(Center5,{m:"md",p:"md",children:jsx140(Pagination2,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),jsx140(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}`),jsx140(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}`),jsx140(SearchExportDialog,{visible:stateRef.current.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx140(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}`)]})}function FilterDescription(props){let filters=(props.filters??[]).filter(f=>props.searchParams.find(p=>p.code===f.code));return filters.length===0?jsx140("span",{children:"no filters"}):jsx140(Fragment49,{children:filters.map(filter=>jsxs91("div",{children:[getOpString(filter.operator),"\xA0",jsx140(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 jsx141,jsxs as jsxs92}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum41(),[schemaLoaded,setSchemaLoaded]=useState79(!1),[outcome,setOutcome]=useState79(),{query,fields}=props,[response,setResponse]=useState79(),[selected,setSelected]=useState79({}),responseRef=useRef20(response);responseRef.current=response;let selectedRef=useRef20({});selectedRef.current=selected,useEffect29(()=>{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(useEffect29(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx141(Loader7,{});let checkboxColumn=props.checkboxesEnabled;return jsxs92("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs92(Table4,{children:[jsx141(Table4.Thead,{children:jsxs92(Table4.Tr,{children:[checkboxColumn&&jsx141(Table4.Th,{children:jsx141("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx141(Table4.Th,{children:field.name},field.name))]})}),jsx141(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs92(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx141(Table4.Td,{children:jsx141("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=>jsx141(Table4.Td,{children:jsx141(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx141("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx141("div",{"data-testid":"search-error",children:jsx141("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx141(Button17,{onClick:()=>props.onBulk(Object.keys(selectedRef.current)),children:"Bulk..."})]})}var MemoizedFhirPathTable=memo(FhirPathTable);import{ScrollArea as ScrollArea5}from"@mantine/core";var InfoBar_default={root:"InfoBar_root",entry:"InfoBar_entry",key:"InfoBar_key",value:"InfoBar_value"};import{jsx as jsx142}from"react/jsx-runtime";function InfoBar(props){return jsx142(ScrollArea5,{children:jsx142("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx142("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx142("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx142("div",{className:InfoBar_default.value,children:props.children})};import{Anchor as Anchor9,Tabs as Tabs2}from"@mantine/core";import{isString,locationUtils as locationUtils5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate6}from"@medplum/react-hooks";import{useState as useState80}from"react";var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};import{jsx as jsx143,jsxs as jsxs93}from"react/jsx-runtime";function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=useMedplumNavigate6(),[currentTab,setCurrentTab]=useState80(()=>{let tab=locationUtils5.getPathname().split("/").pop();return tab&&tabs.some(t=>t.value===tab)?tab:tabs[0].value});function onTabChange(newTabName){newTabName=newTabName||tabs[0].value,setCurrentTab(newTabName),navigate(`${baseUrl}/${newTabName}`)}return jsxs93(Tabs2,{value:currentTab.toLowerCase(),onChange:onTabChange,...rest,children:[jsx143(Tabs2.List,{className:LinkTabs_default.list,children:tabs.map(t=>jsx143(Tabs2.Tab,{value:t.value,children:jsx143(Anchor9,{className:LinkTabs_default.link,href:`${baseUrl}/${t.value}`,onClick:onLinkClick,children:t.label})},t.value))}),children]})}function normalizeTabDefinitions(tabs){return tabs.map(t=>isString(t)?{label:t,value:t.toLowerCase()}:t)}function onLinkClick(e){isAuxClick(e)||e.preventDefault()}import{Box as Box22,SimpleGrid as SimpleGrid2}from"@mantine/core";import{useResource as useResource13,useSearchOne}from"@medplum/react-hooks";import{Box as Box21,Flex as Flex17,Group as Group56,Paper as Paper5,RingProgress,Text as Text41,Title as Title9}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{Fragment as Fragment50,jsx as jsx144,jsxs as jsxs94}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx144(Paper5,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs94(Group56,{children:[group.measureScore&&jsx144(MeasureScore,{group}),!group.measureScore&&jsx144(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs94(Fragment50,{children:[jsx144(Text41,{fz:"md",fw:500,mb:8,children:measure.title}),jsx144(Text41,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept5(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept5(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs94(Box21,{children:[jsx144(Title9,{order:3,children:"Not Applicable"}),jsx144(Text41,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs94(Box21,{children:[jsx144(Title9,{order:3,children:"Insufficient Data"}),jsx144(Text41,{children:`Numerator: ${numeratorCount}`}),jsx144(Text41,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx144(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx144(Flex17,{justify:"center",children:jsxs94(Text41,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx144(Fragment50,{children:unit==="%"?jsx144(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx144(Flex17,{justify:"center",children:jsx144(Text41,{fw:700,fz:18,children:jsx144(QuantityDisplay,{value:group.measureScore})})})}):jsx144(Flex17,{h:120,align:"center",children:jsx144(Title9,{order:3,children:jsx144(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 jsx145,jsxs as jsxs95}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource13(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs95(Box22,{children:[measure&&jsx145(MeasureTitle,{measure}),jsx145(SimpleGrid2,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx145(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon17,Indicator as Indicator2,Tooltip as Tooltip8}from"@mantine/core";import{useNotificationCount as useNotificationCount2}from"@medplum/react-hooks";import{jsx as jsx146}from"react/jsx-runtime";function NotificationIcon(props){let{resourceType,countCriteria,subscriptionCriteria}=props,unreadCount=useNotificationCount2({resourceType,countCriteria,subscriptionCriteria}),result=props.iconComponent;return props.onClick&&(result=jsx146(ActionIcon17,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=jsx146(Tooltip8,{label:props.tooltip,children:result})),unreadCount>0&&(result=jsx146(Indicator2,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}import{Group as Group57,SegmentedControl as SegmentedControl2,Stack as Stack35}from"@mantine/core";import{notifications}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString12,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum42}from"@medplum/react-hooks";import{useCallback as useCallback26}from"react";import{jsx as jsx147,jsxs as jsxs96}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=useMedplum42(),{patient}=props,handleSubmit=useCallback26(async data2=>{let patientId=resolveId2(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:jsx147(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString12(err),icon:jsx147(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient]);return jsx147(Form,{onSubmit:handleSubmit,children:jsxs96(Stack35,{children:[jsx147(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx147(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})}),jsx147(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx147(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx147(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx147(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx147(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:jsx147(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx147(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:jsx147(DateTimeInput,{name:"endDate",placeholder:"End date"})}),jsx147(Group57,{justify:"right",children:jsx147(SubmitButton,{children:"Request Export"})})]})})}function saveData(data2,fileName,contentType){let content=typeof data2=="string"?data2:JSON.stringify(data2,null,2),blob=new Blob([content],{type:contentType}),url=window.URL.createObjectURL(blob),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=url,a.download=fileName,a.click(),window.URL.revokeObjectURL(url)}import{calculateAgeString as calculateAgeString2}from"@medplum/core";import{useResource as useResource14}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment51,jsx as jsx148,jsxs as jsxs97}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource14(props.patient);return patient?jsxs97(InfoBar,{children:[jsx148(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs97(InfoBar.Entry,{children:[jsx148(InfoBar.Key,{children:"Name"}),jsx148(InfoBar.Value,{children:jsx148(MedplumLink,{to:patient,fw:500,children:patient.name?jsx148(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs97(Fragment51,{children:[jsxs97(InfoBar.Entry,{children:[jsx148(InfoBar.Key,{children:"DoB"}),jsx148(InfoBar.Value,{children:patient.birthDate})]}),jsxs97(InfoBar.Entry,{children:[jsx148(InfoBar.Key,{children:"Age"}),jsx148(InfoBar.Value,{children:calculateAgeString2(patient.birthDate)})]})]}),patient.gender&&jsxs97(InfoBar.Entry,{children:[jsx148(InfoBar.Key,{children:"Gender"}),jsx148(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs97(InfoBar.Entry,{children:[jsx148(InfoBar.Key,{children:"State"}),jsx148(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs97(InfoBar.Entry,{children:[jsx148(InfoBar.Key,{children:identifier?.system}),jsx148(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Box as Box23,Button as Button18,Checkbox as Checkbox8,Flex as Flex18,Group as Group58,Loader as Loader8,Radio as Radio5,Stack as Stack36,Text as Text42,TextInput as TextInput27}from"@mantine/core";import{showNotification as showNotification10}from"@mantine/notifications";import{formatAddress as formatAddress4,normalizeErrorString as normalizeErrorString13}from"@medplum/core";import{useCallback as useCallback27,useState as useState81}from"react";var PharmacyDialog_default={pharmacyItem:"PharmacyDialog_pharmacyItem",pharmacyItemSelected:"PharmacyDialog_pharmacyItemSelected"};import{jsx as jsx149,jsxs as jsxs98}from"react/jsx-runtime";function getPharmacyKey(pharmacy,index){return pharmacy.identifier?.[0]?.value||`pharmacy-${index}`}function SearchForm({onSearch,searching}){return jsx149("form",{onSubmit:e=>{e.preventDefault();let formData=new FormData(e.currentTarget);onSearch(formData)},children:jsxs98(Stack36,{gap:"md",children:[jsx149(TextInput27,{name:"name",label:"Pharmacy Name",placeholder:"Enter pharmacy name (min 3 chars)"}),jsxs98(Group58,{grow:!0,children:[jsx149(TextInput27,{name:"city",label:"City",placeholder:"City (min 3 chars)"}),jsx149(TextInput27,{name:"state",label:"State",placeholder:"State (min 3 chars)"})]}),jsxs98(Group58,{grow:!0,children:[jsx149(TextInput27,{name:"zip",label:"Zip Code",placeholder:"Zip code (min 3 chars)"}),jsx149(TextInput27,{name:"phoneOrFax",label:"Phone or Fax",placeholder:"Phone or fax number"})]}),jsx149(TextInput27,{name:"address",label:"Address",placeholder:"Street address (min 3 chars)"}),jsx149(TextInput27,{name:"ncpdpID",label:"NCPDP ID",placeholder:"National Council for Prescription Drug Programs ID"}),jsx149(Button18,{type:"submit",loading:searching,children:"Search"})]})})}function PharmacyItem({pharmacy,pharmacyKey,isSelected,onSelect}){return jsx149(Box23,{p:"sm",className:isSelected?PharmacyDialog_default.pharmacyItemSelected:PharmacyDialog_default.pharmacyItem,onClick:onSelect,children:jsx149(Radio5,{value:pharmacyKey,label:jsxs98(Box23,{children:[jsx149(Text42,{fw:500,size:"sm",children:pharmacy.name}),pharmacy.address?.[0]&&jsx149(Text42,{size:"xs",c:"dimmed",children:formatAddress4(pharmacy.address[0])}),pharmacy.telecom?.find(t=>t.system==="phone")&&jsxs98(Text42,{size:"xs",c:"dimmed",children:["Phone: ",pharmacy.telecom.find(t=>t.system==="phone")?.value]}),pharmacy.telecom?.find(t=>t.system==="fax")&&jsxs98(Text42,{size:"xs",c:"dimmed",children:["Fax: ",pharmacy.telecom.find(t=>t.system==="fax")?.value]})]})})},pharmacyKey)}function SearchResults({searchResults,selectedPharmacy,onSelectPharmacy,setAsPrimary,onSetAsPrimary,onAddFavorite,onClose,adding}){return jsxs98(Box23,{mt:"xl",children:[jsxs98(Text42,{fw:600,mb:"md",children:["Search Results (",searchResults.length,")"]}),jsx149(Radio5.Group,{value:selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy)):"",onChange:value=>{let selected=searchResults.find((p,i)=>getPharmacyKey(p,i)===value);selected&&onSelectPharmacy(selected)},children:jsx149(Stack36,{gap:"sm",children:searchResults.map((pharmacy,index)=>{let pharmacyKey=getPharmacyKey(pharmacy,index),isSelected=selectedPharmacy?getPharmacyKey(selectedPharmacy,searchResults.indexOf(selectedPharmacy))===pharmacyKey:!1;return jsx149(PharmacyItem,{pharmacy,pharmacyKey,isSelected,onSelect:()=>onSelectPharmacy(pharmacy)},pharmacyKey)})})}),jsxs98(Flex18,{mt:"lg",gap:"md",align:"center",justify:"space-between",children:[jsx149(Checkbox8,{label:"Set as primary pharmacy",checked:setAsPrimary,onChange:e=>onSetAsPrimary(e.currentTarget.checked)}),jsxs98(Group58,{children:[jsx149(Button18,{variant:"subtle",onClick:onClose,children:"Cancel"}),jsx149(Button18,{onClick:onAddFavorite,disabled:!selectedPharmacy,loading:adding,children:"Add to Favorites"})]})]})]})}function PharmacyDialog(props){let{patient,onSubmit,onClose,onSearch,onAddToFavorites}=props,[searchResults,setSearchResults]=useState81([]),[searching,setSearching]=useState81(!1),[selectedPharmacy,setSelectedPharmacy]=useState81(),[setAsPrimary,setSetAsPrimary]=useState81(!1),[adding,setAdding]=useState81(!1),handleSearch=useCallback27(async formData=>{let searchParams={name:formData.get("name")||void 0,city:formData.get("city")||void 0,state:formData.get("state")||void 0,zip:formData.get("zip")||void 0,address:formData.get("address")||void 0,phoneOrFax:formData.get("phoneOrFax")||void 0,ncpdpID:formData.get("ncpdpID")||void 0},cleanParams=Object.fromEntries(Object.entries(searchParams).filter(([_,v])=>typeof v=="string"&&v.trim()!==""));if(Object.keys(cleanParams).length===0){showNotification10({color:"yellow",title:"Search Required",message:"Please enter at least one search criterion"});return}setSearching(!0),setSelectedPharmacy(void 0);try{let results=await onSearch(cleanParams);setSearchResults(results),results.length===0&&showNotification10({color:"blue",title:"No Results",message:"No pharmacies found matching your search criteria"})}catch(error){console.error("Error searching pharmacies:",error),showNotification10({color:"red",title:"Search Error",message:normalizeErrorString13(error)})}finally{setSearching(!1)}},[onSearch]),handleAddFavorite=useCallback27(async()=>{if(!(!selectedPharmacy||!patient.id)){setAdding(!0);try{let response=await onAddToFavorites({patientId:patient.id,pharmacy:selectedPharmacy,setAsPrimary});response.success?(showNotification10({color:"green",title:"Success",message:response.message}),onSubmit(response.organization||selectedPharmacy)):showNotification10({color:"red",title:"Error",message:response.message})}catch(error){console.error("Error adding pharmacy:",error),showNotification10({color:"red",title:"Error",message:normalizeErrorString13(error)})}finally{setAdding(!1)}}},[selectedPharmacy,patient.id,setAsPrimary,onAddToFavorites,onSubmit]);return jsxs98(Box23,{children:[jsx149(SearchForm,{onSearch:formData=>handleSearch(formData).catch(console.error),searching}),searching&&jsx149(Flex18,{justify:"center",mt:"xl",children:jsx149(Loader8,{})}),searchResults.length>0&&!searching&&jsx149(SearchResults,{searchResults,selectedPharmacy,onSelectPharmacy:setSelectedPharmacy,setAsPrimary,onSetAsPrimary:setSetAsPrimary,onAddFavorite:handleAddFavorite,onClose,adding})]})}import{createReference as createReference16}from"@medplum/core";import{useCallback as useCallback28}from"react";import{jsx as jsx150}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback28((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 jsx150(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference16(resource),sender:createReference16(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference16(resource),operator:createReference16(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor10,Box as Box24,Button as Button19,CloseButton as CloseButton2,Flex as Flex19,Group as Group59,Loader as Loader9,NativeSelect as NativeSelect12,Paper as Paper6,Stack as Stack37,Text as Text43,TextInput as TextInput28}from"@mantine/core";import{getReferenceString as getReferenceString12}from"@medplum/core";import{useMedplum as useMedplum43,useResource as useResource15}from"@medplum/react-hooks";import{useEffect as useEffect30,useRef as useRef21,useState as useState82}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx151,jsxs as jsxs99}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum43(),defaultValue2=useResource15(props.value),[schemaLoaded,setSchemaLoaded]=useState82(!1),[selectedKey,setSelectedKey]=useState82(),[hoverKey,setHoverKey]=useState82(),[value,setValue]=useState82();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}let valueRef=useRef21(value);if(valueRef.current=value,useEffect30(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect30(()=>(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 jsx151("div",{children:jsxs99(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx151(TextInput28,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx151(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx151(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){let actionsRef=useRef21(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 jsxs99(Stack37,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx151(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx151("div",{children:jsx151(Button19,{variant:"outline",onClick:e=>{killEvent(e),addAction({id:generateId()})},children:"Add action"})})]})}function ActionBuilder(props){let{action}=props;function onClick(e){e.stopPropagation(),props.setSelectedKey(props.action.id)}function onHover(e){killEvent(e),props.setHoverKey(props.action.id)}return jsx151("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx151(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState82(),medplum=useMedplum43(),[loading,setLoading]=useState82(!1),[resource,setResource]=useState82(),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 useEffect30(()=>{(async()=>{if(!action.definitionCanonical)return;setLoading(!0);let resource2=await medplum.readCanonical(["Questionnaire","ActivityDefinition"],action.definitionCanonical);setActionType(getInitialActionType(resource2)),setResource(resource2),setLoading(!1)})().catch(console.error)},[action.definitionCanonical,medplum]),loading?jsx151(Loader9,{}):jsxs99(Paper6,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs99(Flex19,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx151(TextInput28,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx151(CloseButton2,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs99(Stack37,{gap:"xl",p:"md",children:[jsx151(Box24,{children:jsx151(TextInput28,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx151(Box24,{children:jsx151(NativeSelect12,{label:"Type of Action",value:actionType,onChange:e=>{let value=e.currentTarget.value==="standard"?void 0:e.currentTarget.value;setActionType(value),props.onChange({...props.action,definitionCanonical:value==="standard"?void 0:props.action.definitionCanonical})},data:[{value:"standard",label:"Standard task"},{value:"questionnaire",label:"Task with Questionnaire"},{value:"activitydefinition",label:"Task with Activity Definition"}]})}),actionType==="questionnaire"&&jsxs99(Stack37,{gap:0,children:[jsxs99(Group59,{gap:0,mb:"xs",children:[jsx151(Text43,{fw:600,children:"Select questionnaire"}),jsx151(Text43,{c:"red",children:"*"})]}),jsxs99(Text43,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx151(Anchor10,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx151(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&jsxs99(Stack37,{gap:0,children:[jsxs99(Group59,{gap:0,mb:"xs",children:[jsx151(Text43,{fw:600,children:"Select activity definition"}),jsx151(Text43,{c:"red",children:"*"})]}),jsxs99(Text43,{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"," ",jsx151(Anchor10,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx151(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return jsx151(ResourceInput,{name:id,placeholder:props.placeholder,resourceType:props.resourceType,defaultValue:resource,onChange:newValue=>{newValue?props.onChange({...props.action,definitionCanonical:"url"in newValue?newValue.url:void 0,definitionUri:"url"in newValue?void 0:getReferenceString12(newValue)}):props.onChange({...props.action,definitionCanonical:void 0})}})}function getInitialActionType(resource){return resource===void 0?"standard":resource.resourceType.toLowerCase()}var nextId=1;function generateId(existing){if(existing){if(existing.startsWith("id-")){let existingNum=Number.parseInt(existing.substring(3),10);Number.isNaN(existingNum)||(nextId=Math.max(nextId,existingNum+1))}return existing}return"id-"+nextId++}function ensurePlanDefinitionKeys(planDefinition){return{...planDefinition,action:ensurePlanDefinitionActionKeys(planDefinition.action)}}function ensurePlanDefinitionActionKeys(actions){if(actions)return actions.map(action=>({...action,id:generateId(action.id),action:ensurePlanDefinitionActionKeys(action.action)}))}import{Anchor as Anchor11,Box as Box25,Group as Group60,NativeSelect as NativeSelect13,Space,Textarea as Textarea5,TextInput as TextInput29,Title as Title10}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{getQuestionnaireItemReferenceTargetTypes as getQuestionnaireItemReferenceTargetTypes2,isChoiceQuestion,QUESTIONNAIRE_ITEM_CONTROL_URL as QUESTIONNAIRE_ITEM_CONTROL_URL2,QuestionnaireItemType as QuestionnaireItemType4,setQuestionnaireItemReferenceTargetTypes,useMedplum as useMedplum44,useResource as useResource16}from"@medplum/react-hooks";import{useEffect as useEffect31,useRef as useRef22,useState as useState83}from"react";var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};import{Fragment as Fragment52,jsx as jsx152,jsxs as jsxs100}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum44(),defaultValue2=useResource16(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState83(!1),[value,setValue]=useState83(),[selectedKey,setSelectedKey]=useState83(),[hoverKey,setHoverKey]=useState83();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect31(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect31(()=>(setValue(ensureQuestionnaireKeys(defaultValue2??{resourceType:"Questionnaire",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]);let handleChange=(questionnaire2,disableSubmit)=>{setValue(questionnaire2),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire2)};return!schemaLoaded||!value?null:jsx152("div",{children:jsxs100(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx152(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx152(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource3=isResourceType(props.item),isContainer=isResource3||item.type===QuestionnaireItemType4.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef22(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 jsxs100("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx152("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs100(Fragment52,{children:[isResource3&&jsx152(TextInput29,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource3&&jsx152(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx152(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx152(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs100(Fragment52,{children:[resource.title&&jsx152(Title10,{children:resource.title}),item.text&&jsx152("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx152(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx152("div",{children:jsx152(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&&jsx152("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs100(Fragment52,{children:[jsx152(TextInput29,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx152(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"}]})]}):jsx152("div",{children:linkId})}),!isResource3&&jsx152(Box25,{className:QuestionnaireBuilder_default.movementActions,children:jsxs100(Box25,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx152(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx152(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx152(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx152(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs100("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs100(Fragment52,{children:[jsx152(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx152(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource3&&jsx152(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource3&&jsxs100(Fragment52,{children:[jsx152(Anchor11,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx152(Anchor11,{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 jsxs100("div",{children:[props.item.answerValueSet!==void 0?jsx152(TextInput29,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx152(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs100(Box25,{display:"flex",children:[jsx152(Anchor11,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),jsx152(Space,{w:"lg"}),jsx152(Anchor11,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx152("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs100("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx152("div",{children:jsx152(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)}),jsx152("div",{children:jsx152(Anchor11,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:props.options.filter(o=>o.id!==option.id)})},children:"Remove"})})]},option.id)})})}function ReferenceProfiles(props){let targetTypes=getQuestionnaireItemReferenceTargetTypes2(props.item)??[];return jsxs100(Fragment52,{children:[targetTypes.map((targetType,index)=>jsxs100(Group60,{children:[jsx152(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx152(Anchor11,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx152(Anchor11,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId2=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId2(){return"id-"+nextId2++}function ensureQuestionnaireKeys(questionnaire2){return{...questionnaire2,id:questionnaire2.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire2.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId2=Math.max(nextId2,Number.parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,Number.parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId2(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId2()}))}function createPage(){return{id:generateId2(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:QUESTIONNAIRE_ITEM_CONTROL_URL2,valueCodeableConcept:{coding:[{system:"http://hl7.org/fhir/questionnaire-item-control",code:"page"}]}}]}}function reorderItems(items,itemIndex,delta){let currentItems=items??[],newIndex=itemIndex+delta;if(newIndex<0||newIndex>=currentItems.length)return currentItems;let updatedItems=[...currentItems];return[updatedItems[itemIndex],updatedItems[newIndex]]=[updatedItems[newIndex],updatedItems[itemIndex]],updatedItems}import{Stack as Stack39}from"@mantine/core";import{useResource as useResource17}from"@medplum/react-hooks";import{Stack as Stack38,Text as Text44}from"@mantine/core";import{formatDate as formatDate4}from"@medplum/core";import{useMemo as useMemo35}from"react";import{Fragment as Fragment53,jsx as jsx153,jsxs as jsxs101}from"react/jsx-runtime";function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=useMemo35(()=>answer&&answer.length>0?jsx153(Fragment53,{children:answer.map((ans,index)=>jsx153(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?jsx153(Fragment53,{children:nestedAnswers.map((nestedAnswer,index)=>jsx153(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):jsx153(Text44,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return jsxs101(Stack38,{gap:0,pb:"xs",children:[jsx153(Text44,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return jsx153(Text44,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return jsx153(Text44,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return jsx153(Text44,{children:value});case"valueQuantity":return jsx153(QuantityDisplay,{value});case"valueString":return jsx153(Text44,{children:value});case"valueCoding":return jsx153(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return jsx153(RangeDisplay,{value});case"valueDateTime":return jsx153(Text44,{children:formatDate4(value)});case"valueBoolean":return jsx153(Text44,{children:value?"True":"False"});case"valueReference":return jsx153(Text44,{children:value.display??value.reference});default:return jsx153(Text44,{children:value.toString()})}}import{jsx as jsx154}from"react/jsx-runtime";function QuestionnaireResponseDisplay(props){let questionnaireResponse=useResource17(props.questionnaireResponse);return jsx154(Stack39,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>jsx154(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}import{ActionIcon as ActionIcon18,Divider as Divider8,Group as Group61,NativeSelect as NativeSelect14,Stack as Stack40,Text as Text45,TextInput as TextInput30}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect32,useState as useState84}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx155,jsxs as jsxs102}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]=useState84([]),[groupId,setGroupId]=useState84(1),[intervalId,setIntervalId]=useState84(1);return useEffect32(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs102(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx155(Stack40,{children:intervalGroups.map(intervalGroup=>jsx155(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx155(ActionIcon18,{title:"Add Group",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),addGroup({id:`group-id-${groupId}`,filters:{},intervals:[]}),setGroupId(id=>id+1)},children:jsx155(IconCirclePlus,{})}),jsx155(Group61,{justify:"flex-end",children:jsx155(SubmitButton,{children:"Save"})})]});function submitDefinition(){let qualifiedInterval=intervalGroups.flatMap(group=>group.intervals).filter(interval=>!isEmptyInterval(interval));props.onSubmit({...defaultDefinition,qualifiedInterval})}function addGroup(addedGroup){setIntervalGroups(currentGroups=>[...currentGroups,addedGroup])}function removeGroup(removedGroup){setIntervalGroups(currentGroups=>currentGroups.filter(group=>group.id!==removedGroup.id))}function changeInterval(groupId2,changedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2),index=currentGroup?.intervals.findIndex(interval=>interval.id===changedInterval.id);return index!==void 0&&currentGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g=>g.id===groupId2);if(currentGroupIndex!==-1){let currentGroup={...groups[currentGroupIndex]};addedInterval={...addedInterval,...currentGroup.filters},currentGroup.intervals=[...currentGroup.intervals,addedInterval],groups[currentGroupIndex]=currentGroup}return groups})}function removeInterval(groupId2,removedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx155(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs102(Stack40,{gap:"lg",children:[jsx155(Group61,{justify:"flex-end",children:jsx155(ActionIcon18,{title:"Remove Group",variant:"subtle","data-testid":`remove-group-button-${intervalGroup.id}`,size:"sm",onClick:e=>{killEvent(e),props.onRemoveGroup(intervalGroup)},children:jsx155(IconCircleMinus,{})},`remove-group-button-${intervalGroup.id}`)}),jsx155(ReferenceRangeGroupFilters,{intervalGroup,onChange:props.onChange}),jsx155(Divider8,{}),intervalGroup.intervals.map(interval=>jsxs102(Stack40,{gap:"xs",children:[jsxs102(Group61,{children:[jsx155(TextInput30,{"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}`),jsx155(ActionIcon18,{title:"Remove Interval",variant:"subtle",size:"sm","data-testid":`remove-interval-${interval.id}`,onClick:e=>{killEvent(e),props.onRemove(intervalGroup.id,interval)},children:jsx155(IconCircleMinus,{})},`remove-interval-${interval.id}`)]}),jsx155(RangeInput,{path:"",onChange:range=>{props.onChange(intervalGroup.id,{...interval,range})},name:`range-${interval.id}`,defaultValue:interval.range},`range-${interval.id}`)]},`interval-${interval.id}`)),jsx155(ActionIcon18,{title:"Add Interval",variant:"subtle",size:"sm",onClick:e=>{killEvent(e),props.onAdd(intervalGroup.id,{range:{low:{unit},high:{unit}}})},children:jsx155(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 jsxs102(Stack40,{style:{maxWidth:"50%"},children:[jsx155(Group61,{children:jsx155(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})}}})}),jsxs102(Group61,{gap:"xs",children:[jsx155(Text45,{component:"label",htmlFor:`div-age-${intervalGroup.id}`,children:"Age:"}),jsx155("div",{id:`div-age-${intervalGroup.id}`,children:jsx155(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}`)})]}),jsx155(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"}]}})}}}),jsx155(NativeSelect14,{data:["","reference","critical","absolute"],label:"Category: ",defaultValue:intervalGroup.filters.category,onChange:e=>{for(let interval of intervalGroup.intervals){let newCategory=e.currentTarget.value;newCategory===""?onChange(intervalGroup.id,{...interval,category:void 0}):onChange(intervalGroup.id,{...interval,category:newCategory})}}})]})}function ensureQualifiedIntervalKeys(definition,setIntervalId){let intervals=definition.qualifiedInterval||[],nextId3=Math.max(...intervals.map(interval=>{let existingNum=Number.parseInt(interval.id?.substring(3)||"",10);return Number.isNaN(existingNum)?Number.NEGATIVE_INFINITY:existingNum}))+1;return Number.isFinite(nextId3)||(nextId3=1),definition={...definition,qualifiedInterval:intervals.map(interval=>({...interval,id:interval.id||`id-${nextId3++}`}))},setIntervalId(nextId3),definition}function groupQualifiedIntervals(intervals,setGroupId){let groupId=1,groups={};for(let interval of intervals){let groupKey=generateGroupKey(interval);groupKey in groups||(groups[groupKey]={id:`group-id-${groupId++}`,filters:Object.fromEntries(intervalFilters.map(f=>[f,interval[f]])),intervals:[]}),groups[groupKey].intervals.push(interval)}return setGroupId(groupId),Object.values(groups)}function generateGroupKey(interval){return[`gender=${interval.gender}`,`age=${formatRange2(interval.age)}`,`gestationalAge=${formatRange2(interval.gestationalAge)}`,`context=${interval.context?.text}`,`appliesTo=${interval.appliesTo?.map(c=>c.text).join("+")}`,`category=${interval.category}`].join(":")}function getUnitString(unit){return unit&&(getCodeBySystem(unit,"http://unitsofmeasure.org")||unit.text)}function isEmptyInterval(interval){return interval.range?.low?.value===void 0&&interval.range?.high?.value===void 0}import{Button as Button20,Grid as Grid2,Text as Text46}from"@mantine/core";import{formatDateTime as formatDateTime7,getReferenceString as getReferenceString13}from"@medplum/core";import{useMedplum as useMedplum45,useResource as useResource18}from"@medplum/react-hooks";import{Fragment as Fragment54,useEffect as useEffect33,useState as useState85}from"react";import{jsx as jsx156,jsxs as jsxs103}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum45(),requestGroup=useResource18(props.value),[startedLoading,setStartedLoading]=useState85(!1),[responseBundle,setResponseBundle]=useState85();if(useEffect33(()=>{requestGroup&&!startedLoading&&(medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log),setStartedLoading(!0))},[medplum,requestGroup,startedLoading]),!requestGroup||!responseBundle)return null;return jsx156(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 jsxs103(Fragment54,{children:[jsx156(Grid2.Col,{span:1,p:"md",children:task?.status==="completed"?jsx156(IconCheckbox,{}):jsx156(IconSquare,{color:"gray"})}),jsxs103(Grid2.Col,{span:9,p:"xs",children:[jsx156(Text46,{fw:500,children:action.title}),action.description&&jsx156("div",{children:action.description}),jsxs103("div",{children:["Last edited by\xA0",jsx156(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime7(task?.meta?.lastUpdated)]}),jsxs103("div",{children:["Status: ",jsx156(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs103(Grid2.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx156(Button20,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx156(Button20,{onClick:()=>props.onEdit(task,taskInput,taskOutput),children:"Edit"})]})]},`action-${index}`)})});function buildBatchRequest(request){let batchEntries=[];if(request.action)for(let action of request.action)action.resource?.reference&&batchEntries.push({request:{method:"GET",url:action.resource.reference}});return{resourceType:"Bundle",type:"batch",entry:batchEntries}}function findBundleEntry(reference){for(let entry of responseBundle?.entry??[])if(entry.resource&&reference.reference===getReferenceString13(entry.resource))return entry.resource}}import{useMedplum as useMedplum46}from"@medplum/react-hooks";import{useEffect as useEffect34,useState as useState86}from"react";import{stringify as stringify4}from"@medplum/core";function diff(original,revised){let path=buildPath(original,revised);return buildRevisions(path,original,revised)}function buildPath(orig,rev){let N=orig.length,M=rev.length,MAX=N+M+1,size=1+2*MAX,middle=Math.trunc(size/2),diagonal=new Array(size);diagonal[middle+1]={i:0,j:-1,prev:void 0,snake:!0};for(let d=0;d<MAX;d++){for(let k=-d;k<=d;k+=2){let kmiddle=middle+k,kplus=kmiddle+1,kminus=kmiddle-1,kplusNode=diagonal[kplus],kminusNode=diagonal[kminus],prev,i=0;k===-d||k!==d&&kminusNode.i<kplusNode.i?(i=kplusNode.i,prev=kplusNode):(i=kminusNode.i+1,prev=kminusNode),diagonal[kminus]=void 0;let j=i-k,node={i,j,prev:previousSnake(prev),snake:!1};for(;i<N&&j<M&&orig[i]===rev[j];)i++,j++;if(i>node.i&&(node={i,j,prev:node,snake:!0}),diagonal[kmiddle]=node,i>=N&&j>=M)return diagonal[kmiddle]}diagonal[middle+d-1]=void 0}}function buildRevisions(startNode,orig,rev){let deltas=[],path=startNode;for(path.snake&&(path=path.prev);path?.prev&&path.prev.j>=0;){let i=path.i,j=path.j;path=path.prev;let ianchor=path.i,janchor=path.j,original={position:ianchor,lines:orig.slice(ianchor,i)},revised={position:janchor,lines:rev.slice(janchor,j)},type;original.lines.length===0&&revised.lines.length>0?type="insert":original.lines.length>0&&revised.lines.length===0?type="delete":type="change",deltas.push({original,revised,type}),path.snake&&(path=path.prev)}return deltas}function previousSnake(node){return node&&!node.snake&&node.prev?node.prev:node}function blame(history){let versions=(history.entry??[]).filter(entry=>!!entry.resource).map(entry=>({meta:entry.resource?.meta,lines:stringify4(entry.resource,!0).match(/[^\r\n]+/g)})).sort((a,b)=>a.meta.lastUpdated.localeCompare(b.meta.lastUpdated));if(!versions.length)return[];let table=versions[0].lines.map(line=>({id:versions[0].meta.versionId,meta:versions[0].meta,value:line,span:1}));return compareVersions(table,versions),combineSpans(table),table}function compareVersions(table,versions){for(let i=1;i<versions.length;i++){let revisions=diff(versions[i-1].lines,versions[i].lines);for(let revision of revisions){let position=revision.original.position,oldLines=revision.original.lines,newLines=revision.revised.lines;if((revision.type==="delete"||revision.type==="change")&&table.splice(position,oldLines.length),revision.type==="insert"||revision.type==="change")for(let k=0;k<revision.revised.lines.length;k++)table.splice(position+k,0,{id:versions[i].meta.versionId,meta:versions[i].meta,value:newLines[k],span:1})}}}function combineSpans(table){let start=0;for(;start<table.length;){let curr=start;for(;curr<table.length&&table[curr].id===table[start].id;)table[curr].span=-1,curr++;table[start].span=curr-start,start=curr}}var ResourceBlame_default={container:"ResourceBlame_container",root:"ResourceBlame_root",startRow:"ResourceBlame_startRow",normalRow:"ResourceBlame_normalRow",author:"ResourceBlame_author",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 Fragment55,jsx as jsx157,jsxs as jsxs104}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum46(),[value,setValue]=useState86(props.history);if(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)return jsx157("div",{children:"Loading..."});let resource=value.entry?.[0]?.resource;if(!resource)return null;let table=blame(value);return jsx157("div",{className:ResourceBlame_default.container,children:jsx157("table",{className:ResourceBlame_default.root,children:jsx157("tbody",{children:table.map((row,index)=>jsxs104("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs104(Fragment55,{children:[jsx157("td",{className:ResourceBlame_default.author,rowSpan:row.span,children:jsx157(ResourceName,{value:row.meta.author,link:!0,fz:"xs"})}),jsx157("td",{className:ResourceBlame_default.dateTime,rowSpan:row.span,children:jsx157(MedplumLink,{to:getVersionUrl(resource,row.meta.versionId),fz:"xs",children:getTimeString(row.meta.lastUpdated)})})]}),jsx157("td",{className:ResourceBlame_default.lineNumber,children:index+1}),jsx157("td",{className:ResourceBlame_default.line,children:jsx157("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 Fragment56,jsx as jsx158,jsxs as jsxs105}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 jsx158("pre",{style:{color:"gray"},children:deltas.map((delta,index)=>jsx158(ChangeDiff,{delta},"delta"+index))})}function ChangeDiff(props){return jsxs105(Fragment56,{children:["...",jsx158("br",{}),props.delta.original.lines.length>0&&jsx158("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
110
+ `)}),props.delta.revised.lines.length>0&&jsx158("div",{className:ResourceDiff_default.added,children:props.delta.revised.lines.join(`
111
+ `)}),"...",jsx158("br",{})]})}import{ActionIcon as ActionIcon19,Alert as Alert5,Button as Button21,Group as Group62,Menu as Menu9,Stack as Stack41,TextInput as TextInput31,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 useMedplum47,useResource as useResource19}from"@medplum/react-hooks";import{useEffect as useEffect35,useMemo as useMemo36,useState as useState87}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx159,jsxs as jsxs106}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum47(),defaultValue2=useResource19(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState87(!1),[value,setValue]=useState87(),accessPolicy=medplum.getAccessPolicy(),theme=useMantineTheme();useEffect35(()=>{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=useMemo36(()=>defaultValue2&&satisfiedAccessPolicy2(defaultValue2,AccessPolicyInteraction2.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=useMemo36(()=>medplum.isSuperAdmin()||!accessPolicy||!isPopulated12(value?.resourceType)?!0:canWriteResourceType(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?jsx159("div",{children:"Loading..."}):canWrite?jsxs106("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs106(Stack41,{mb:"xl",children:[jsx159(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx159(TextInput31,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx159(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx159(TextInput31,{name:"id",defaultValue:value.id,disabled:!0})})]}),jsx159(BackboneElementInput,{path:value.resourceType,valuePath:value.resourceType,typeName:resourceType,defaultValue:value,outcome,onChange:setValue,profileUrl:props.profileUrl,accessPolicyResource}),jsxs106(Group62,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx159(Button21,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs106(Menu9,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx159(Menu9.Target,{children:jsx159(ActionIcon19,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx159(IconChevronDown,{size:14,stroke:1.5})})}),jsxs106(Menu9.Dropdown,{children:[props.onPatch&&jsx159(Menu9.Item,{leftSection:jsx159(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx159(Menu9.Item,{color:"red",leftSection:jsx159(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs106(Alert5,{color:"red",title:"Permission denied",icon:jsx159(IconAlertCircle,{}),children:["Your access level prevents you from editing and creating ",value.resourceType," resources."]})}import{Table as Table5}from"@mantine/core";import{formatDateTime as formatDateTime8,normalizeErrorString as normalizeErrorString14}from"@medplum/core";import{useMedplum as useMedplum48}from"@medplum/react-hooks";import{useEffect as useEffect36,useState as useState88}from"react";import{jsx as jsx160,jsxs as jsxs107}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum48(),[value,setValue]=useState88(props.history);return useEffect36(()=>{!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?jsxs107(Table5,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx160(Table5.Thead,{children:jsxs107(Table5.Tr,{children:[jsx160(Table5.Th,{children:"Author"}),jsx160(Table5.Th,{children:"Date"}),jsx160(Table5.Th,{children:"Version"})]})}),jsx160(Table5.Tbody,{children:value.entry?.map((entry,index)=>jsx160(HistoryRow,{entry},"entry-"+index))})]}):jsx160("div",{children:"Loading..."})}function HistoryRow(props){let{response,resource}=props.entry;return resource?jsxs107(Table5.Tr,{children:[jsx160(Table5.Td,{children:jsx160(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx160(Table5.Td,{children:formatDateTime8(resource.meta?.lastUpdated)}),jsx160(Table5.Td,{children:jsx160(MedplumLink,{to:getVersionUrl2(resource),children:resource.meta?.versionId})})]}):jsx160(Table5.Tr,{children:jsx160(Table5.Td,{colSpan:3,children:normalizeErrorString14(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button22,Loader as Loader10,Stack as Stack42,Text as Text47}from"@mantine/core";import{showNotification as showNotification11}from"@mantine/notifications";import{getReferenceString as getReferenceString14,isReference as isReference3,isResource as isResource2,normalizeErrorString as normalizeErrorString15}from"@medplum/core";import{useMedplum as useMedplum49}from"@medplum/react-hooks";import{useEffect as useEffect37,useMemo as useMemo37,useState as useState89}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx161,jsxs as jsxs108}from"react/jsx-runtime";function onlyPractitioner(schedule){let refs=schedule.actor.filter(ref=>isReference3(ref,"Practitioner"));if(refs.length===1)return refs[0]}function Scheduler(props){let medplum=useMedplum49(),[month,setMonth]=useState89(getStartMonth()),[date,setDate]=useState89(),[actor,setActor]=useState89(),[slots,setSlots]=useState89(),[selectedSlot,setSelectedSlot]=useState89(),handleSelectSlot=slot=>{setSelectedSlot(slot),props.onSelectSlot?.(slot)};useEffect37(()=>{props.schedule||setSlots([]),(props.fetchSlots??(async period=>{let scheduleArray=[];if(!Array.isArray(props.schedule))scheduleArray.push(isReference3(props.schedule,"Schedule")?props.schedule.reference:getReferenceString14(props.schedule));else for(let schedule of props.schedule)if(isReference3(schedule))scheduleArray.push(schedule.reference);else{let scheduleRef=getReferenceString14(schedule);scheduleArray.push(scheduleRef)}let slotSearchParams=new URLSearchParams([["_count","720"],["schedule",scheduleArray.join(",")],["start","gt"+period.start],["start","lt"+period.end]]);return medplum.searchResources("Slot",slotSearchParams)}))({start:getStart2(month),end:getEnd2(month)}).then(setSlots).catch(console.error)},[medplum,props.schedule,props.fetchSlots,month]),useEffect37(()=>{props.schedule&&!Array.isArray(props.schedule)&&(isResource2(props.schedule)?setActor(onlyPractitioner(props.schedule)):medplum.readReference(props.schedule).then(schedule=>setActor(onlyPractitioner(schedule))).catch(error=>{showNotification11({color:"red",title:"Error",message:normalizeErrorString15(error)})}))},[medplum,props.schedule]);let startTimeToSlotMap=useMemo37(()=>{if(!date)return null;let sortedSlots=(slots||[]).filter(slot=>new Date(slot.start).getTime()>date.getTime()&&new Date(slot.start).getTime()<date.getTime()+24*3600*1e3).sort((a,b)=>new Date(a.start).getTime()-new Date(b.start).getTime()),startTimeToSlotMap2=new Map;for(let slot of sortedSlots)startTimeToSlotMap2.set(formatTime(new Date(slot.start)),slot);return startTimeToSlotMap2},[slots,date]);return slots?jsxs108("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs108("div",{className:Scheduler_default.info,children:[actor&&jsx161(ResourceAvatar,{value:actor,size:"xl"}),actor&&jsx161(Text47,{size:"xl",fw:500,children:jsx161(ResourceName,{value:actor})}),jsx161("p",{children:"1 hour"}),date&&jsx161("p",{children:date.toLocaleDateString()}),selectedSlot&&jsx161("p",{children:formatTime(new Date(selectedSlot.start))})]}),jsxs108("div",{className:Scheduler_default.selection,children:[!date&&jsxs108("div",{children:[jsx161("h3",{children:"Select date"}),jsx161(CalendarInput,{slots,onChangeMonth:setMonth,onClick:setDate})]}),date&&!selectedSlot&&jsxs108("div",{children:[jsx161("h3",{children:"Select time"}),jsx161(Stack42,{children:Array.from(startTimeToSlotMap?.entries()??[]).map(([startTime,slot])=>jsx161("div",{children:jsx161(Button22,{variant:"outline",style:{width:150},onClick:()=>handleSelectSlot(slot),children:startTime})},slot.id))})]}),props.children]})]}):jsx161("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:jsx161(Loader10,{})})}function getStart2(month){return formatSlotInstant(month.getTime())}function getEnd2(month){return formatSlotInstant(month.getTime()+744*60*60*1e3)}function formatSlotInstant(time){let date=new Date(Math.max(Date.now(),time));return date.setHours(0,0,0,0),date.toISOString()}function formatTime(date){return date.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})}import{createReference as createReference17}from"@medplum/core";import{jsx as jsx162}from"react/jsx-runtime";function ServiceRequestTimeline(props){let{serviceRequest,...rest}=props;return jsx162(ResourceTimeline,{value:serviceRequest,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("ServiceRequest",id),medplum.search("Communication",{"based-on":ref,_count}),medplum.search("DiagnosticReport",{"based-on":ref,_count}),medplum.search("Media",{"based-on":ref,_count}),medplum.search("DocumentReference",{related:ref,_count}),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count})])},createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",basedOn:[createReference17(resource)],subject:resource.subject,sender:createReference17(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference17(resource)],subject:resource.subject,operator:createReference17(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor12}from"@mantine/core";import{showNotification as showNotification12}from"@mantine/notifications";import{ensureTrailingSlash,locationUtils as locationUtils6,normalizeErrorString as normalizeErrorString16}from"@medplum/core";import{useMedplum as useMedplum50,useResource as useResource20}from"@medplum/react-hooks";import{jsx as jsx163}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum50(),{client,patient,encounter,children,...rest}=props,patientResource=useResource20(patient),encounterResource=useResource20(encounter);function launchApp(){let patientRef=patient,encounterRef=encounter;if(client.launchIdentifierSystems?.length){let patientIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Patient");if(patientRef&&patientResource&&patientIdentifierConfig?.system){let identifier=patientResource.identifier?.find(i=>i.system===patientIdentifierConfig.system);identifier&&(patientRef={...patient,identifier})}let encounterIdentifierConfig=client.launchIdentifierSystems.find(config=>config.resourceType==="Encounter");if(encounterRef&&encounterResource&&encounterIdentifierConfig?.system){let identifier=encounterResource.identifier?.find(i=>i.system===encounterIdentifierConfig.system);identifier&&(encounterRef={...encounter,identifier})}}medplum.createResource({resourceType:"SmartAppLaunch",patient:patientRef,encounter:encounterRef}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",ensureTrailingSlash(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),locationUtils6.assign(url.toString())}).catch(err=>showNotification12({color:"red",message:normalizeErrorString16(err),autoClose:!1}))}return jsx163(Anchor12,{onClick:()=>launchApp(),...rest,children})}export{AddressDisplay,AddressInput,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,CalendarInput,ChatList,ChatListItem,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,LinkTabs,Loading,Logo,MeasureReportDisplay,MedplumLink,MemoizedFhirPathTable,MfaForm,MoneyDisplay,MoneyInput,Navbar,NewTopicDialog,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,PATIENT_PREFERRED_PHARMACY_URL,PHARMACY_PREFERENCE_TYPE_SYSTEM,PHARMACY_TYPE_PREFERRED,PHARMACY_TYPE_PRIMARY,Panel,ParticipantFilter,PatientExportForm,PatientHeader,PatientSummary,PatientTimeline,Pharmacies,PharmacyDialog,PlanDefinitionBuilder,QuantityDisplay,QuantityInput,QuestionnaireBuilder,QuestionnaireForm,QuestionnaireResponseDisplay,RangeDisplay,RangeInput,RatioInput,ReferenceDisplay,ReferenceInput,ReferenceRangeEditor,ReferenceRangeGroupEditor,RegisterForm,RequestGroupDisplay,ResourceArrayDisplay,ResourceArrayInput,ResourceAvatar,ResourceBadge,ResourceBlame,ResourceDiff,ResourceDiffTable,ResourceForm,ResourceHistoryTable,ResourceInput,ResourceName,ResourcePropertyDisplay,ResourcePropertyInput,ResourceTable,ResourceTimeline,Scheduler,SearchChangeEvent,SearchClickEvent,SearchControl,SearchFieldEditor,SearchFilterEditor,SearchLoadEvent,ServiceRequestTimeline,SignInForm,SignatureInput,SmartAppLaunchLink,Spotlight,StatusBadge,SubmitButton,ThreadChat,ThreadInbox,Timeline,TimelineItem,TimingInput,ValueSetAutocomplete,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNext24HoursFilter,addNextMonthFilter,addPreferredPharmacyToPatient,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,clearFilters,clearFiltersOnField,convertIsoToLocal,convertLocalToIso,createPreferredPharmacyExtension,createScriptTag,deleteFilter,exportJsonFile,getAppName,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getOpString,getPaginationControlProps,getPreferredPharmaciesFromPatient,getRecaptcha,getSearchOperators,getSortField,getValuePath,initRecaptcha,isAddPharmacyResponse,isAuxClick,isCheckboxCell,isOrganizationArray,isSortDescending,isSupportedProfileStructureDefinition,killEvent,parseForm,removePreferredPharmacyFromPatient,renderValue,sendCommand,setFilters,setOffset,setPage,setPropertyValue,setSort,sortByDateAndPriority,toggleSort};
112
112
  /*! Bundled license information:
113
113
 
114
114
  @tabler/icons-react/dist/esm/defaultAttributes.mjs:
@@ -141,6 +141,7 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
141
141
  @tabler/icons-react/dist/esm/icons/IconCopy.mjs:
142
142
  @tabler/icons-react/dist/esm/icons/IconCurrencyDollar.mjs:
143
143
  @tabler/icons-react/dist/esm/icons/IconDots.mjs:
144
+ @tabler/icons-react/dist/esm/icons/IconDownload.mjs:
144
145
  @tabler/icons-react/dist/esm/icons/IconEdit.mjs:
145
146
  @tabler/icons-react/dist/esm/icons/IconEmpathize.mjs:
146
147
  @tabler/icons-react/dist/esm/icons/IconEqualNot.mjs:
@@ -148,7 +149,9 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
148
149
  @tabler/icons-react/dist/esm/icons/IconEyeOff.mjs:
149
150
  @tabler/icons-react/dist/esm/icons/IconEye.mjs:
150
151
  @tabler/icons-react/dist/esm/icons/IconFileAlert.mjs:
152
+ @tabler/icons-react/dist/esm/icons/IconFileExport.mjs:
151
153
  @tabler/icons-react/dist/esm/icons/IconFilePlus.mjs:
154
+ @tabler/icons-react/dist/esm/icons/IconFileText.mjs:
152
155
  @tabler/icons-react/dist/esm/icons/IconFilter.mjs:
153
156
  @tabler/icons-react/dist/esm/icons/IconLanguage.mjs:
154
157
  @tabler/icons-react/dist/esm/icons/IconLayoutSidebar.mjs:
@@ -158,6 +161,7 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
158
161
  @tabler/icons-react/dist/esm/icons/IconMathLower.mjs:
159
162
  @tabler/icons-react/dist/esm/icons/IconMessageCircle.mjs:
160
163
  @tabler/icons-react/dist/esm/icons/IconMessage.mjs:
164
+ @tabler/icons-react/dist/esm/icons/IconPaperclip.mjs:
161
165
  @tabler/icons-react/dist/esm/icons/IconPencil.mjs:
162
166
  @tabler/icons-react/dist/esm/icons/IconPlus.mjs:
163
167
  @tabler/icons-react/dist/esm/icons/IconRefresh.mjs: