@medplum/react 5.0.8 → 5.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +7 -5
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/cjs/index.css +1 -1
- package/dist/cjs/index.css.map +4 -4
- package/dist/cjs/index.d.ts +3 -1
- package/dist/esm/index.css +1 -1
- package/dist/esm/index.css.map +4 -4
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.mjs +8 -6
- package/dist/esm/index.mjs.map +4 -4
- package/package.json +8 -8
package/dist/esm/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __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),[useProps9,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||useProps9?.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 useState12}from"react";import{Alert}from"@mantine/core";import{locationUtils,normalizeErrorString}from"@medplum/core";import{forwardRef,createElement}from"react";var defaultAttributes={outline:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},filled:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"currentColor",stroke:"none"}};var createReactComponent=(type,iconName,iconNamePascal,iconNode)=>{let Component2=forwardRef(({color="currentColor",size=24,stroke=2,title,className,children,...rest},ref)=>createElement("svg",{ref,...defaultAttributes[type],width:size,height:size,className:["tabler-icon",`tabler-icon-${iconName}`,className].join(" "),...type==="filled"?{fill:color}:{strokeWidth:stroke,stroke:color},...rest},[title&&createElement("title",{key:"svg-title"},title),...iconNode.map(([tag,attrs])=>createElement(tag,attrs)),...Array.isArray(children)?children:[children]]));return Component2.displayName=`${iconNamePascal}`,Component2};var __iconNode=[["path",{d:"M14 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-0"}],["path",{d:"M4 6l8 0",key:"svg-1"}],["path",{d:"M16 6l4 0",key:"svg-2"}],["path",{d:"M8 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-3"}],["path",{d:"M4 12l2 0",key:"svg-4"}],["path",{d:"M10 12l10 0",key:"svg-5"}],["path",{d:"M17 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-6"}],["path",{d:"M4 18l11 0",key:"svg-7"}],["path",{d:"M19 18l1 0",key:"svg-8"}]],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 0z",key:"svg-0"}],["path",{d:"M16 4a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-1"}],["path",{d:"M16 20a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-2"}],["path",{d:"M11 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-3"}],["path",{d:"M21 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-4"}],["path",{d:"M5.058 18.306l2.88 -4.606",key:"svg-5"}],["path",{d:"M10.061 10.303l2.877 -4.604",key:"svg-6"}],["path",{d:"M10.065 13.705l2.876 4.6",key:"svg-7"}],["path",{d:"M15.063 5.7l2.881 4.61",key:"svg-8"}]],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:"M7 3m0 2a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2z",key:"svg-0"}],["path",{d:"M17 17v2a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2",key:"svg-1"}]],IconBoxMultiple=createReactComponent("outline","box-multiple","BoxMultiple",__iconNode9);var __iconNode10=[["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",__iconNode10);var __iconNode11=[["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",__iconNode11);var __iconNode12=[["path",{d:"M12 7m-8 0a8 4 0 1 0 16 0a8 4 0 1 0 -16 0",key:"svg-0"}],["path",{d:"M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.333 -1 1.246 -4.345 2.737 -10.035a7.45 7.45 0 0 0 .263 -1.965",key:"svg-1"}]],IconBucket=createReactComponent("outline","bucket","Bucket",__iconNode12);var __iconNode13=[["path",{d:"M3 20h18v-8a3 3 0 0 0 -3 -3h-12a3 3 0 0 0 -3 3v8z",key:"svg-0"}],["path",{d:"M3 14.803c.312 .135 .654 .204 1 .197a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1c.35 .007 .692 -.062 1 -.197",key:"svg-1"}],["path",{d:"M12 4l1.465 1.638a2 2 0 1 1 -3.015 .099l1.55 -1.737z",key:"svg-2"}]],IconCake=createReactComponent("outline","cake","Cake",__iconNode13);var __iconNode14=[["path",{d:"M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12z",key:"svg-0"}],["path",{d:"M16 3v4",key:"svg-1"}],["path",{d:"M8 3v4",key:"svg-2"}],["path",{d:"M4 11h16",key:"svg-3"}],["path",{d:"M11 15h1",key:"svg-4"}],["path",{d:"M12 15v3",key:"svg-5"}]],IconCalendar=createReactComponent("outline","calendar","Calendar",__iconNode14);var __iconNode15=[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]],IconCheck=createReactComponent("outline","check","Check",__iconNode15);var __iconNode16=[["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",__iconNode16);var __iconNode17=[["path",{d:"M6 9l6 6l6 -6",key:"svg-0"}]],IconChevronDown=createReactComponent("outline","chevron-down","ChevronDown",__iconNode17);var __iconNode18=[["path",{d:"M9 6l6 6l-6 6",key:"svg-0"}]],IconChevronRight=createReactComponent("outline","chevron-right","ChevronRight",__iconNode18);var __iconNode19=[["path",{d:"M6 15l6 -6l6 6",key:"svg-0"}]],IconChevronUp=createReactComponent("outline","chevron-up","ChevronUp",__iconNode19);var __iconNode20=[["path",{d:"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M9 12l6 0",key:"svg-1"}]],IconCircleMinus=createReactComponent("outline","circle-minus","CircleMinus",__iconNode20);var __iconNode21=[["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",__iconNode21);var __iconNode22=[["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",__iconNode22);var __iconNode23=[["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",__iconNode23);var __iconNode24=[["path",{d:"M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z",key:"svg-0"}],["path",{d:"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1",key:"svg-1"}]],IconCopy=createReactComponent("outline","copy","Copy",__iconNode24);var __iconNode25=[["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",__iconNode25);var __iconNode26=[["path",{d:"M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}]],IconDots=createReactComponent("outline","dots","Dots",__iconNode26);var __iconNode27=[["path",{d:"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1",key:"svg-0"}],["path",{d:"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]],IconEdit=createReactComponent("outline","edit","Edit",__iconNode27);var __iconNode28=[["path",{d:"M12 5.5m-2.5 0a2.5 2.5 0 1 0 5 0a2.5 2.5 0 1 0 -5 0",key:"svg-0"}],["path",{d:"M12 21.368l5.095 -5.096a3.088 3.088 0 1 0 -4.367 -4.367l-.728 .727l-.728 -.727a3.088 3.088 0 1 0 -4.367 4.367l5.095 5.096z",key:"svg-1"}]],IconEmpathize=createReactComponent("outline","empathize","Empathize",__iconNode28);var __iconNode29=[["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",__iconNode29);var __iconNode30=[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}]],IconEqual=createReactComponent("outline","equal","Equal",__iconNode30);var __iconNode31=[["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",__iconNode31);var __iconNode32=[["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",__iconNode32);var __iconNode33=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z",key:"svg-1"}],["path",{d:"M12 17l.01 0",key:"svg-2"}],["path",{d:"M12 11l0 3",key:"svg-3"}]],IconFileAlert=createReactComponent("outline","file-alert","FileAlert",__iconNode33);var __iconNode34=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z",key:"svg-1"}],["path",{d:"M12 11l0 6",key:"svg-2"}],["path",{d:"M9 14l6 0",key:"svg-3"}]],IconFilePlus=createReactComponent("outline","file-plus","FilePlus",__iconNode34);var __iconNode35=[["path",{d:"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z",key:"svg-0"}]],IconFilter=createReactComponent("outline","filter","Filter",__iconNode35);var __iconNode36=[["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",__iconNode36);var __iconNode37=[["path",{d:"M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z",key:"svg-0"}],["path",{d:"M9 4l0 16",key:"svg-1"}]],IconLayoutSidebar=createReactComponent("outline","layout-sidebar","LayoutSidebar",__iconNode37);var __iconNode38=[["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",__iconNode38);var __iconNode39=[["path",{d:"M9 11a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-0"}],["path",{d:"M17.657 16.657l-4.243 4.243a2 2 0 0 1 -2.827 0l-4.244 -4.243a8 8 0 1 1 11.314 0z",key:"svg-1"}]],IconMapPin=createReactComponent("outline","map-pin","MapPin",__iconNode39);var __iconNode40=[["path",{d:"M5 18l14 -6l-14 -6",key:"svg-0"}]],IconMathGreater=createReactComponent("outline","math-greater","MathGreater",__iconNode40);var __iconNode41=[["path",{d:"M19 18l-14 -6l14 -6",key:"svg-0"}]],IconMathLower=createReactComponent("outline","math-lower","MathLower",__iconNode41);var __iconNode42=[["path",{d:"M8 9h8",key:"svg-0"}],["path",{d:"M8 13h6",key:"svg-1"}],["path",{d:"M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12z",key:"svg-2"}]],IconMessage=createReactComponent("outline","message","Message",__iconNode42);var __iconNode43=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]],IconPlus=createReactComponent("outline","plus","Plus",__iconNode43);var __iconNode44=[["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",__iconNode44);var __iconNode45=[["path",{d:"M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]],IconSearch=createReactComponent("outline","search","Search",__iconNode45);var __iconNode46=[["path",{d:"M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z",key:"svg-0"}],["path",{d:"M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-1"}]],IconSettings=createReactComponent("outline","settings","Settings",__iconNode46);var __iconNode47=[["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",__iconNode47);var __iconNode48=[["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",__iconNode48);var __iconNode49=[["path",{d:"M3 3m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z",key:"svg-0"}]],IconSquare=createReactComponent("outline","square","Square",__iconNode49);var __iconNode50=[["path",{d:"M6 4h-1a2 2 0 0 0 -2 2v3.5h0a5.5 5.5 0 0 0 11 0v-3.5a2 2 0 0 0 -2 -2h-1",key:"svg-0"}],["path",{d:"M8 15a6 6 0 1 0 12 0v-3",key:"svg-1"}],["path",{d:"M11 3v2",key:"svg-2"}],["path",{d:"M6 3v2",key:"svg-3"}],["path",{d:"M20 10m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-4"}]],IconStethoscope=createReactComponent("outline","stethoscope","Stethoscope",__iconNode50);var __iconNode51=[["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",__iconNode51);var __iconNode52=[["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",__iconNode52);var __iconNode53=[["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",__iconNode53);var __iconNode54=[["path",{d:"M18 6l-12 12",key:"svg-0"}],["path",{d:"M6 6l12 12",key:"svg-1"}]],IconX=createReactComponent("outline","x","X",__iconNode54);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");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,{}),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"}]}),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(IconSwitchHorizontal,{size:14,stroke:1.5}),onClick:()=>navigate("/signin"),children:"Add another account"}),jsx9(Menu.Item,{leftSection:jsx9(IconSettings,{size:14,stroke:1.5}),onClick:()=>navigate(`/${getReferenceString(profile)}`),children:"Account settings"}),jsx9(Menu.Item,{leftSection:jsx9(IconLogout,{size:14,stroke:1.5}),onClick:async()=>{await medplum.signOut(),navigate("/signin")},children:"Sign out"}),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=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),[useProps9,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||useProps9?.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 useState12}from"react";import{Alert}from"@mantine/core";import{locationUtils,normalizeErrorString}from"@medplum/core";import{forwardRef,createElement}from"react";var defaultAttributes={outline:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},filled:{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"currentColor",stroke:"none"}};var createReactComponent=(type,iconName,iconNamePascal,iconNode)=>{let Component2=forwardRef(({color="currentColor",size=24,stroke=2,title,className,children,...rest},ref)=>createElement("svg",{ref,...defaultAttributes[type],width:size,height:size,className:["tabler-icon",`tabler-icon-${iconName}`,className].join(" "),...type==="filled"?{fill:color}:{strokeWidth:stroke,stroke:color},...rest},[title&&createElement("title",{key:"svg-title"},title),...iconNode.map(([tag,attrs])=>createElement(tag,attrs)),...Array.isArray(children)?children:[children]]));return Component2.displayName=`${iconNamePascal}`,Component2};var __iconNode=[["path",{d:"M14 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-0"}],["path",{d:"M4 6l8 0",key:"svg-1"}],["path",{d:"M16 6l4 0",key:"svg-2"}],["path",{d:"M8 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-3"}],["path",{d:"M4 12l2 0",key:"svg-4"}],["path",{d:"M10 12l10 0",key:"svg-5"}],["path",{d:"M17 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-6"}],["path",{d:"M4 18l11 0",key:"svg-7"}],["path",{d:"M19 18l1 0",key:"svg-8"}]],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 0z",key:"svg-0"}],["path",{d:"M16 4a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-1"}],["path",{d:"M16 20a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-2"}],["path",{d:"M11 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-3"}],["path",{d:"M21 12a2 2 0 1 0 -4 0a2 2 0 0 0 4 0z",key:"svg-4"}],["path",{d:"M5.058 18.306l2.88 -4.606",key:"svg-5"}],["path",{d:"M10.061 10.303l2.877 -4.604",key:"svg-6"}],["path",{d:"M10.065 13.705l2.876 4.6",key:"svg-7"}],["path",{d:"M15.063 5.7l2.881 4.61",key:"svg-8"}]],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:"M7 3m0 2a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2z",key:"svg-0"}],["path",{d:"M17 17v2a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2",key:"svg-1"}]],IconBoxMultiple=createReactComponent("outline","box-multiple","BoxMultiple",__iconNode9);var __iconNode10=[["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",__iconNode10);var __iconNode11=[["path",{d:"M3 7m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v9a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z",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",__iconNode11);var __iconNode12=[["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",__iconNode12);var __iconNode13=[["path",{d:"M12 7m-8 0a8 4 0 1 0 16 0a8 4 0 1 0 -16 0",key:"svg-0"}],["path",{d:"M4 7c0 .664 .088 1.324 .263 1.965l2.737 10.035c.5 1.5 2.239 2 5 2s4.5 -.5 5 -2c.333 -1 1.246 -4.345 2.737 -10.035a7.45 7.45 0 0 0 .263 -1.965",key:"svg-1"}]],IconBucket=createReactComponent("outline","bucket","Bucket",__iconNode13);var __iconNode14=[["path",{d:"M3 20h18v-8a3 3 0 0 0 -3 -3h-12a3 3 0 0 0 -3 3v8z",key:"svg-0"}],["path",{d:"M3 14.803c.312 .135 .654 .204 1 .197a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1a2.4 2.4 0 0 0 2 -1a2.4 2.4 0 0 1 2 -1a2.4 2.4 0 0 1 2 1a2.4 2.4 0 0 0 2 1c.35 .007 .692 -.062 1 -.197",key:"svg-1"}],["path",{d:"M12 4l1.465 1.638a2 2 0 1 1 -3.015 .099l1.55 -1.737z",key:"svg-2"}]],IconCake=createReactComponent("outline","cake","Cake",__iconNode14);var __iconNode15=[["path",{d:"M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12z",key:"svg-0"}],["path",{d:"M16 3v4",key:"svg-1"}],["path",{d:"M8 3v4",key:"svg-2"}],["path",{d:"M4 11h16",key:"svg-3"}],["path",{d:"M11 15h1",key:"svg-4"}],["path",{d:"M12 15v3",key:"svg-5"}]],IconCalendar=createReactComponent("outline","calendar","Calendar",__iconNode15);var __iconNode16=[["path",{d:"M5 12l5 5l10 -10",key:"svg-0"}]],IconCheck=createReactComponent("outline","check","Check",__iconNode16);var __iconNode17=[["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",__iconNode17);var __iconNode18=[["path",{d:"M6 9l6 6l6 -6",key:"svg-0"}]],IconChevronDown=createReactComponent("outline","chevron-down","ChevronDown",__iconNode18);var __iconNode19=[["path",{d:"M9 6l6 6l-6 6",key:"svg-0"}]],IconChevronRight=createReactComponent("outline","chevron-right","ChevronRight",__iconNode19);var __iconNode20=[["path",{d:"M6 15l6 -6l6 6",key:"svg-0"}]],IconChevronUp=createReactComponent("outline","chevron-up","ChevronUp",__iconNode20);var __iconNode21=[["path",{d:"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",key:"svg-0"}],["path",{d:"M9 12l6 0",key:"svg-1"}]],IconCircleMinus=createReactComponent("outline","circle-minus","CircleMinus",__iconNode21);var __iconNode22=[["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",__iconNode22);var __iconNode23=[["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",__iconNode23);var __iconNode24=[["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",__iconNode24);var __iconNode25=[["path",{d:"M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z",key:"svg-0"}],["path",{d:"M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1",key:"svg-1"}]],IconCopy=createReactComponent("outline","copy","Copy",__iconNode25);var __iconNode26=[["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",__iconNode26);var __iconNode27=[["path",{d:"M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-0"}],["path",{d:"M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-1"}],["path",{d:"M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",key:"svg-2"}]],IconDots=createReactComponent("outline","dots","Dots",__iconNode27);var __iconNode28=[["path",{d:"M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1",key:"svg-0"}],["path",{d:"M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z",key:"svg-1"}],["path",{d:"M16 5l3 3",key:"svg-2"}]],IconEdit=createReactComponent("outline","edit","Edit",__iconNode28);var __iconNode29=[["path",{d:"M12 5.5m-2.5 0a2.5 2.5 0 1 0 5 0a2.5 2.5 0 1 0 -5 0",key:"svg-0"}],["path",{d:"M12 21.368l5.095 -5.096a3.088 3.088 0 1 0 -4.367 -4.367l-.728 .727l-.728 -.727a3.088 3.088 0 1 0 -4.367 4.367l5.095 5.096z",key:"svg-1"}]],IconEmpathize=createReactComponent("outline","empathize","Empathize",__iconNode29);var __iconNode30=[["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",__iconNode30);var __iconNode31=[["path",{d:"M5 10h14",key:"svg-0"}],["path",{d:"M5 14h14",key:"svg-1"}]],IconEqual=createReactComponent("outline","equal","Equal",__iconNode31);var __iconNode32=[["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",__iconNode32);var __iconNode33=[["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",__iconNode33);var __iconNode34=[["path",{d:"M14 3v4a1 1 0 0 0 1 1h4",key:"svg-0"}],["path",{d:"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z",key:"svg-1"}],["path",{d:"M12 17l.01 0",key:"svg-2"}],["path",{d:"M12 11l0 3",key:"svg-3"}]],IconFileAlert=createReactComponent("outline","file-alert","FileAlert",__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 2z",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",__iconNode35);var __iconNode36=[["path",{d:"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z",key:"svg-0"}]],IconFilter=createReactComponent("outline","filter","Filter",__iconNode36);var __iconNode37=[["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",__iconNode37);var __iconNode38=[["path",{d:"M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z",key:"svg-0"}],["path",{d:"M9 4l0 16",key:"svg-1"}]],IconLayoutSidebar=createReactComponent("outline","layout-sidebar","LayoutSidebar",__iconNode38);var __iconNode39=[["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",__iconNode39);var __iconNode40=[["path",{d:"M9 11a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-0"}],["path",{d:"M17.657 16.657l-4.243 4.243a2 2 0 0 1 -2.827 0l-4.244 -4.243a8 8 0 1 1 11.314 0z",key:"svg-1"}]],IconMapPin=createReactComponent("outline","map-pin","MapPin",__iconNode40);var __iconNode41=[["path",{d:"M5 18l14 -6l-14 -6",key:"svg-0"}]],IconMathGreater=createReactComponent("outline","math-greater","MathGreater",__iconNode41);var __iconNode42=[["path",{d:"M19 18l-14 -6l14 -6",key:"svg-0"}]],IconMathLower=createReactComponent("outline","math-lower","MathLower",__iconNode42);var __iconNode43=[["path",{d:"M8 9h8",key:"svg-0"}],["path",{d:"M8 13h6",key:"svg-1"}],["path",{d:"M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12z",key:"svg-2"}]],IconMessage=createReactComponent("outline","message","Message",__iconNode43);var __iconNode44=[["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",__iconNode44);var __iconNode45=[["path",{d:"M12 5l0 14",key:"svg-0"}],["path",{d:"M5 12l14 0",key:"svg-1"}]],IconPlus=createReactComponent("outline","plus","Plus",__iconNode45);var __iconNode46=[["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",__iconNode46);var __iconNode47=[["path",{d:"M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0",key:"svg-0"}],["path",{d:"M21 21l-6 -6",key:"svg-1"}]],IconSearch=createReactComponent("outline","search","Search",__iconNode47);var __iconNode48=[["path",{d:"M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z",key:"svg-0"}],["path",{d:"M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0",key:"svg-1"}]],IconSettings=createReactComponent("outline","settings","Settings",__iconNode48);var __iconNode49=[["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",__iconNode49);var __iconNode50=[["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",__iconNode50);var __iconNode51=[["path",{d:"M3 3m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z",key:"svg-0"}]],IconSquare=createReactComponent("outline","square","Square",__iconNode51);var __iconNode52=[["path",{d:"M6 4h-1a2 2 0 0 0 -2 2v3.5h0a5.5 5.5 0 0 0 11 0v-3.5a2 2 0 0 0 -2 -2h-1",key:"svg-0"}],["path",{d:"M8 15a6 6 0 1 0 12 0v-3",key:"svg-1"}],["path",{d:"M11 3v2",key:"svg-2"}],["path",{d:"M6 3v2",key:"svg-3"}],["path",{d:"M20 10m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",key:"svg-4"}]],IconStethoscope=createReactComponent("outline","stethoscope","Stethoscope",__iconNode52);var __iconNode53=[["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",__iconNode53);var __iconNode54=[["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",__iconNode54);var __iconNode55=[["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",__iconNode55);var __iconNode56=[["path",{d:"M18 6l-12 12",key:"svg-0"}],["path",{d:"M6 6l12 12",key:"svg-1"}]],IconX=createReactComponent("outline","x","X",__iconNode56);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");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,{}),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"}]}),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(IconSwitchHorizontal,{size:14,stroke:1.5}),onClick:()=>navigate("/signin"),children:"Add another account"}),jsx9(Menu.Item,{leftSection:jsx9(IconSettings,{size:14,stroke:1.5}),onClick:()=>navigate(`/${getReferenceString(profile)}`),children:"Account settings"}),jsx9(Menu.Item,{leftSection:jsx9(IconLogout,{size:14,stroke:1.5}),onClick:async()=>{await medplum.signOut(),navigate("/signin")},children:"Sign out"}),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
|
|
@@ -61,7 +61,7 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
|
|
|
61
61
|
display
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
-
}`.replaceAll(/\s+/g," ")}function getResourcesFromResponse(response,query){let resources=[];return response.data.Patients1&&resources.push(...response.data.Patients1),response.data.Patients2&&resources.push(...response.data.Patients2),response.data.ServiceRequestList&&resources.push(...response.data.ServiceRequestList),sortByRelevance(dedupeResources(resources),query).slice(0,5)}function dedupeResources(resources){let ids=new Set,result=[];for(let resource of resources)ids.has(resource.id)||(ids.add(resource.id),result.push(resource));return result}function sortByRelevance(resources,query){return resources.sort((a,b)=>getResourceScore(b,query)-getResourceScore(a,query))}function getResourceScore(resource,query){let bestScore=0;if(resource.identifier)for(let identifier of resource.identifier)bestScore=Math.max(bestScore,getStringScore(identifier.value,query));if(resource.resourceType==="Patient"&&resource.name)for(let name of resource.name)bestScore=Math.max(bestScore,getStringScore(formatHumanName2(name),query));return bestScore}function getStringScore(str,query){if(!str)return 0;let index=str.toLowerCase().indexOf(query.toLowerCase());return index<0?0:100-index}import{jsx as jsx12,jsxs as jsxs5}from"react/jsx-runtime";function Header(props){let profile=useMedplumProfile2(),[userMenuOpened,setUserMenuOpened]=useState5(!1);return jsx12(MantineAppShell.Header,{p:8,style:{zIndex:101},children:jsxs5(Group5,{justify:"space-between",children:[jsxs5(Group5,{gap:"xs",children:[jsx12(UnstyledButton,{className:Header_default.logoButton,"aria-expanded":props.navbarOpen,"aria-controls":"navbar",onClick:()=>props.navbarToggle(),children:props.logo}),!props.headerSearchDisabled&&jsx12(HeaderSearchInput,{pathname:props.pathname,searchParams:props.searchParams})]}),jsxs5(Group5,{gap:"lg",pr:"sm",children:[props.notifications,jsxs5(Menu2,{width:260,shadow:"xl",position:"bottom-end",transitionProps:{transition:"fade-down"},opened:userMenuOpened,onClose:()=>setUserMenuOpened(!1),children:[jsx12(Menu2.Target,{children:jsx12(UnstyledButton,{className:Header_default.user,"aria-label":"User menu","data-active":userMenuOpened||void 0,onClick:()=>setUserMenuOpened(o=>!o),children:jsxs5(Group5,{gap:7,children:[jsx12(ResourceAvatar,{value:profile,radius:"xl",size:24}),jsx12(Text3,{size:"sm",className:Header_default.userName,children:formatHumanName3(profile?.name?.[0])}),jsx12(IconChevronDown,{size:12,stroke:1.5})]})})}),jsx12(Menu2.Dropdown,{children:jsx12(HeaderDropdown,{version:props.version})})]})]})]})})}import{Button as Button2,AppShell as MantineAppShell2,Menu as Menu3,ScrollArea as ScrollArea2,Space,Text as Text5,Tooltip,UnstyledButton as UnstyledButton3}from"@mantine/core";import{clamp}from"@mantine/hooks";import{useSyncExternalStore}from"react";function createStore(initialState){let state=initialState,initialized=!1,listeners=new Set;return{getState(){return state},updateState(value){state=typeof value=="function"?value(state):value},setState(value){this.updateState(value),listeners.forEach(listener=>listener(state))},initialize(value){initialized||(state=value,initialized=!0)},subscribe(callback){return listeners.add(callback),()=>listeners.delete(callback)}}}function useStore(store){return useSyncExternalStore(store.subscribe,()=>store.getState(),()=>store.getState())}var createSpotlightStore=()=>createStore({opened:!1,empty:!1,selected:-1,listId:"",query:"",registeredActions:new Set}),useSpotlight=store=>useStore(store);function updateSpotlightStateAction(update,store){let state=store.getState();store.setState({...state,...update(store.getState())})}function openSpotlightAction(store){updateSpotlightStateAction(()=>({opened:!0,selected:-1}),store)}function closeSpotlightAction(store){updateSpotlightStateAction(()=>({opened:!1}),store)}function toggleSpotlightAction(store){updateSpotlightStateAction(state=>({opened:!state.opened,selected:state.opened?state.selected:-1}),store)}function setSelectedAction(index,store){store.updateState(state=>({...state,selected:index}))}function setListId(id,store){store.updateState(state=>({...state,listId:id}))}function findElementByQuerySelector(selector,root=document){let element=root.querySelector(selector);if(element)return element;let children=root instanceof ShadowRoot?root.host.children:root.children;for(let i=0;i<children.length;i+=1){let child=children[i];if(child.shadowRoot){let shadowElement=findElementByQuerySelector(selector,child.shadowRoot);if(shadowElement)return shadowElement}let nestedElement=findElementByQuerySelector(selector,child);if(nestedElement)return nestedElement}return null}function selectAction(index,store){let state=store.getState(),actionsList=state.listId?findElementByQuerySelector(`#${state.listId}`):null,selected=actionsList?.querySelector("[data-selected]"),actions=actionsList?.querySelectorAll("[data-action]")??[],nextIndex=index===-1?actions.length-1:index===actions.length?0:index,selectedIndex=clamp(nextIndex,0,actions.length-1);return selected?.removeAttribute("data-selected"),actions[selectedIndex]?.scrollIntoView({block:"nearest"}),actions[selectedIndex]?.setAttribute("data-selected","true"),setSelectedAction(selectedIndex,store),selectedIndex}function selectNextAction(store){return selectAction(store.getState().selected+1,store)}function selectPreviousAction(store){return selectAction(store.getState().selected-1,store)}function triggerSelectedAction(store){let state=store.getState();findElementByQuerySelector(`#${state.listId} [data-selected]`)?.click()}function registerAction(id,store){let state=store.getState();return state.registeredActions.add(id),()=>{state.registeredActions.delete(id)}}function setQuery(query,store){updateSpotlightStateAction(()=>({query}),store),Promise.resolve().then(()=>{selectAction(0,store),updateSpotlightStateAction(state=>({empty:state.query.trim().length>0&&state.registeredActions.size===0||!1}),store)})}function clearSpotlightState({clearQuery},store){store.updateState(state=>({...state,selected:-1,query:clearQuery?"":state.query,empty:clearQuery?!1:state.empty}))}var spotlightActions={open:openSpotlightAction,close:closeSpotlightAction,toggle:toggleSpotlightAction,updateState:updateSpotlightStateAction,setSelectedAction,setListId,selectAction,selectNextAction,selectPreviousAction,triggerSelectedAction,registerAction,setQuery,clearSpotlightState};function createSpotlight(){let store=createSpotlightStore();return[store,{open:()=>openSpotlightAction(store),close:()=>closeSpotlightAction(store),toggle:()=>toggleSpotlightAction(store)}]}var[spotlightStore,spotlight]=createSpotlight(),{open:openSpotlight,close:closeSpotlight,toggle:toggleSpotlight}=spotlight;function isActionsGroup(item){let _item=item;return _item.group!==void 0&&Array.isArray(_item.actions)}import{jsx as jsx20,jsxs as jsxs7}from"react/jsx-runtime";import{getDefaultZIndex as getDefaultZIndex2,factory as factory8,useProps as useProps8}from"@mantine/core";import{useUncontrolled}from"@mantine/hooks";function getKeywords(keywords){return Array.isArray(keywords)?keywords.map(keyword=>keyword.trim()).join(",").toLowerCase().trim():typeof keywords=="string"?keywords.toLowerCase().trim():""}function getFlatActions(data2){return data2.reduce((acc,item)=>"actions"in item?[...acc,...item.actions.map(action=>({...action,group:item.group}))]:[...acc,item],[])}function flatActionsToGroups(data2){let groups={},result=[];return data2.forEach(action=>{action.group?(groups[action.group]||(groups[action.group]={pushed:!1,data:{group:action.group,actions:[]}}),groups[action.group].data.actions.push(action),groups[action.group].pushed||(groups[action.group].pushed=!0,result.push(groups[action.group].data))):result.push(action)}),result}var defaultSpotlightFilter=(_query,data2)=>{let query=_query.trim().toLowerCase(),priorityMatrix=[[],[]];return getFlatActions(data2).forEach(item=>{item.label?.toLowerCase().includes(query)?priorityMatrix[0].push(item):(item.description?.toLowerCase().includes(query)||getKeywords(item.keywords).includes(query))&&priorityMatrix[1].push(item)}),flatActionsToGroups(priorityMatrix.flat())};function limitActions(actions,limit){if(!Array.isArray(actions))return[];let count=0;return actions.reduce((acc,item)=>{if(count>=limit)return acc;if(isActionsGroup(item)){let groupActions=limitActions(item.actions,limit-count);acc.push({group:item.group,actions:groupActions}),count+=groupActions.length}else acc.push(item),count+=1;return acc},[])}import{jsx as jsx13,jsxs as jsxs6,Fragment as Fragment4}from"react/jsx-runtime";import{factory,useProps,Highlight,UnstyledButton as UnstyledButton2,Box}from"@mantine/core";import{createSafeContext}from"@mantine/core";var[SpotlightProvider,useSpotlightContext]=createSafeContext("Spotlight component was not found in tree");var classes={root:"m_d2b315db",content:"m_3cd250e0",body:"m_d2abce9b",search:"m_f366a061",actionsList:"m_6e463822",action:"m_d49bb8ef",actionBody:"m_3d475731",actionSection:"m_832642f6",actionLabel:"m_6c2a1345",actionDescription:"m_a6d9d78d",empty:"m_82f78f74",footer:"m_ddcaf054",actionsGroup:"m_5a3e5f7b"};var defaultProps={dimmedSections:!0,highlightQuery:!1},SpotlightAction=factory((_props,ref)=>{let props=useProps("SpotlightAction",defaultProps,_props),{className,style,classNames,styles,id,description,label,leftSection,rightSection,children,dimmedSections,highlightQuery,highlightColor,closeSpotlightOnTrigger,onClick,onMouseDown,keywords,vars,...others}=props,ctx=useSpotlightContext(),stylesApi={classNames,styles},labelNode=highlightQuery&&typeof label=="string"?jsx13(Highlight,{component:"span",highlight:ctx.query,color:highlightColor,...ctx.getStyles("actionLabel",stylesApi),children:label}):jsx13("span",{...ctx.getStyles("actionLabel",stylesApi),children:label});return jsx13(UnstyledButton2,{ref,"data-action":!0,...ctx.getStyles("action",{className,style,...stylesApi}),...others,onMouseDown:event=>{event.preventDefault(),onMouseDown?.(event)},onClick:event=>{onClick?.(event),(closeSpotlightOnTrigger??ctx.closeOnActionTrigger)&&spotlightActions.close(ctx.store)},tabIndex:-1,children:children||jsxs6(Fragment4,{children:[leftSection&&jsx13(Box,{component:"span",mod:{position:"left",dimmed:dimmedSections},...ctx.getStyles("actionSection",stylesApi),children:leftSection}),jsxs6("span",{...ctx.getStyles("actionBody",stylesApi),children:[labelNode,jsx13("span",{...ctx.getStyles("actionDescription",stylesApi),children:description})]}),rightSection&&jsx13(Box,{component:"span",mod:{position:"right",dimmed:dimmedSections},...ctx.getStyles("actionSection",stylesApi),children:rightSection})]})})});SpotlightAction.classes=classes;SpotlightAction.displayName="@mantine/spotlight/SpotlightAction";import{jsx as jsx14}from"react/jsx-runtime";import{factory as factory2,useProps as useProps2,Box as Box2}from"@mantine/core";var SpotlightActionsGroup=factory2((props,ref)=>{let{className,style,styles,classNames,label,children,...others}=useProps2("SpotlightActionsGroup",null,props),ctx=useSpotlightContext();return jsx14(Box2,{...ctx.getStyles("actionsGroup",{className,style,classNames,styles}),ref,...others,__vars:{"--spotlight-label":`'${label?.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`},children})});SpotlightActionsGroup.classes=classes;SpotlightActionsGroup.displayName="@mantine/core/SpotlightActionsGroup";import{jsx as jsx15}from"react/jsx-runtime";import{useId,useEffect as useEffect2}from"react";import{factory as factory3,useProps as useProps3,ScrollArea}from"@mantine/core";var SpotlightActionsList=factory3((props,ref)=>{let{className,style,id,children,vars,classNames,styles,...others}=useProps3("SpotlightActionsList",null,props),ctx=useSpotlightContext(),generatedId=`mantine-${useId().replace(/:/g,"")}`,listId=id||generatedId;return useEffect2(()=>(spotlightActions.setListId(listId,ctx.store),()=>spotlightActions.setListId("",ctx.store)),[]),jsx15(ScrollArea.Autosize,{...ctx.getStyles("actionsList",{className,style,classNames,styles}),ref,type:"scroll",scrollbarSize:"var(--spotlight-actions-list-padding)",offsetScrollbars:"y",id:listId,...others,children})});SpotlightActionsList.classes=classes;SpotlightActionsList.displayName="@mantine/spotlight/SpotlightActionsList";import{jsx as jsx16}from"react/jsx-runtime";import{factory as factory4,useProps as useProps4,Box as Box3}from"@mantine/core";var SpotlightEmpty=factory4((props,ref)=>{let{className,style,classNames,styles,...others}=useProps4("SpotlightEmpty",null,props),ctx=useSpotlightContext();return jsx16(Box3,{ref,...ctx.getStyles("empty",{classNames,styles,className,style}),...others})});SpotlightEmpty.classes=classes;SpotlightEmpty.displayName="@mantine/spotlight/SpotlightEmpty";import{jsx as jsx17}from"react/jsx-runtime";import{factory as factory5,useProps as useProps5,Box as Box4}from"@mantine/core";var SpotlightFooter=factory5((props,ref)=>{let{className,style,classNames,styles,...others}=useProps5("SpotlightFooter",null,props),ctx=useSpotlightContext();return jsx17(Box4,{ref,...ctx.getStyles("footer",{className,classNames,style,styles}),...others})});SpotlightFooter.classes=classes;SpotlightFooter.displayName="@mantine/spotlight/SpotlightFooter";import{jsx as jsx18}from"react/jsx-runtime";import{getDefaultZIndex,factory as factory6,useProps as useProps6,useMantineTheme,useStyles,Modal,rem,resolveStyles,resolveClassNames}from"@mantine/core";import{useHotkeys,useDidUpdate}from"@mantine/hooks";function getHotkeys(hotkeys,store){if(!hotkeys)return[];let open=()=>spotlightActions.open(store);return Array.isArray(hotkeys)?hotkeys.map(hotkey=>[hotkey,open]):[[hotkeys,open]]}var defaultProps2={size:600,yOffset:80,zIndex:getDefaultZIndex("max"),overlayProps:{backgroundOpacity:.35,blur:7},transitionProps:{duration:200,transition:"pop"},store:spotlightStore,clearQueryOnClose:!0,closeOnActionTrigger:!0,shortcut:"mod + K",maxHeight:400},SpotlightRoot=factory6((_props,ref)=>{let props=useProps6("SpotlightRoot",defaultProps2,_props),{classNames,className,style,styles,unstyled,vars,store,children,query,onQueryChange,transitionProps,clearQueryOnClose,shortcut,tagsToIgnore,triggerOnContentEditable,disabled,onSpotlightOpen,onSpotlightClose,forceOpened,closeOnActionTrigger,maxHeight,scrollable,attributes,...others}=props,theme=useMantineTheme(),{opened,query:storeQuery}=useSpotlight(store),_query=typeof query=="string"?query:storeQuery,setQuery2=q=>{onQueryChange?.(q),spotlightActions.setQuery(q,store)},getStyles=useStyles({name:"Spotlight",classes,props,className,style,classNames,styles,unstyled,attributes});return useHotkeys(getHotkeys(shortcut,store),tagsToIgnore,triggerOnContentEditable),useDidUpdate(()=>{opened?onSpotlightOpen?.():onSpotlightClose?.()},[opened]),disabled?null:jsx18(SpotlightProvider,{value:{getStyles,query:_query,setQuery:setQuery2,store,closeOnActionTrigger},children:jsx18(Modal,{ref,...others,withCloseButton:!1,opened:opened||!!forceOpened,padding:0,onClose:()=>spotlightActions.close(store),className,style,classNames:resolveClassNames({theme,classNames:[classes,classNames],props,stylesCtx:void 0}),styles:resolveStyles({theme,styles,props,stylesCtx:void 0}),transitionProps:{...transitionProps,onExited:()=>{clearQueryOnClose&&setQuery2(""),spotlightActions.clearSpotlightState({clearQuery:clearQueryOnClose},store),transitionProps?.onExited?.()}},__vars:{"--spotlight-max-height":scrollable?rem(maxHeight):void 0},__staticSelector:"Spotlight","data-scrollable":scrollable||void 0,children})})});SpotlightRoot.classes=classes;SpotlightRoot.displayName="@mantine/spotlight/SpotlightRoot";import{jsx as jsx19}from"react/jsx-runtime";import{useState as useState6}from"react";import{factory as factory7,useProps as useProps7,Input}from"@mantine/core";var defaultProps3={size:"lg"},SpotlightSearch=factory7((props,ref)=>{let{classNames,styles,onKeyDown,onChange,vars,value,...others}=useProps7("SpotlightSearch",defaultProps3,props),ctx=useSpotlightContext(),inputStyles=ctx.getStyles("search"),[isComposing,setIsComposing]=useState6(!1),handleKeyDown=event=>{onKeyDown?.(event),!isComposing&&(event.nativeEvent.code==="ArrowDown"&&(event.preventDefault(),spotlightActions.selectNextAction(ctx.store)),event.nativeEvent.code==="ArrowUp"&&(event.preventDefault(),spotlightActions.selectPreviousAction(ctx.store)),(event.nativeEvent.code==="Enter"||event.nativeEvent.code==="NumpadEnter")&&(event.preventDefault(),spotlightActions.triggerSelectedAction(ctx.store)))};return jsx19(Input,{ref,classNames:[{input:inputStyles.className},classNames],styles:[{input:inputStyles.style},styles],...others,value:value??ctx.query,onChange:event=>{ctx.setQuery(event.currentTarget.value),onChange?.(event)},onKeyDown:handleKeyDown,onCompositionStart:()=>setIsComposing(!0),onCompositionEnd:()=>setIsComposing(!1)})});SpotlightSearch.classes=classes;SpotlightSearch.displayName="@mantine/spotlight/SpotlightSearch";var defaultProps4={size:600,yOffset:80,limit:1/0,zIndex:getDefaultZIndex2("max"),overlayProps:{backgroundOpacity:.35,blur:7},transitionProps:{duration:200,transition:"pop"},store:spotlightStore,filter:defaultSpotlightFilter,clearQueryOnClose:!0,closeOnActionTrigger:!0,shortcut:"mod + K"},Spotlight=factory8((_props,ref)=>{let props=useProps8("Spotlight",defaultProps4,_props),{searchProps,filter,query,onQueryChange,actions,nothingFound,highlightQuery,limit,scrollAreaProps,...others}=props,[_query,setQuery2]=useUncontrolled({value:query,defaultValue:"",finalValue:"",onChange:onQueryChange}),filteredActions=limitActions(filter(_query,actions),limit).map(item=>{if(isActionsGroup(item)){let items=item.actions.map(({id,...actionData})=>jsx20(SpotlightAction,{highlightQuery,...actionData},id));return jsx20(SpotlightActionsGroup,{label:item.group,children:items},item.group)}return jsx20(SpotlightAction,{highlightQuery,...item},item.id)});return jsxs7(SpotlightRoot,{...others,query:_query,onQueryChange:setQuery2,ref,children:[jsx20(SpotlightSearch,{...searchProps}),jsxs7(SpotlightActionsList,{...scrollAreaProps,children:[filteredActions,filteredActions.length===0&¬hingFound&&jsx20(SpotlightEmpty,{children:nothingFound})]})]})});Spotlight.classes=classes;Spotlight.displayName="@mantine/spotlight/Spotlight";Spotlight.Search=SpotlightSearch;Spotlight.ActionsList=SpotlightActionsList;Spotlight.Action=SpotlightAction;Spotlight.Empty=SpotlightEmpty;Spotlight.ActionsGroup=SpotlightActionsGroup;Spotlight.Footer=SpotlightFooter;Spotlight.Root=SpotlightRoot;Spotlight.open=spotlight.open;Spotlight.close=spotlight.close;Spotlight.toggle=spotlight.toggle;import{formatHumanName as formatHumanName5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate4,useMedplumProfile as useMedplumProfile3}from"@medplum/react-hooks";import{Fragment as Fragment5,useState as useState11}from"react";import{Group as Group6,Modal as Modal2,NativeSelect as NativeSelect2,Stack as Stack2,TextInput as TextInput3}from"@mantine/core";import{showNotification as showNotification2}from"@mantine/notifications";import{deepClone,normalizeErrorString as normalizeErrorString3}from"@medplum/core";import{useMedplum as useMedplum2}from"@medplum/react-hooks";import{useState as useState7}from"react";import{createContext as createContext2}from"react";var FormContext=createContext2({submitting:!1});FormContext.displayName="FormContext";function parseForm(form){let result={};for(let element of Array.from(form.elements))element instanceof HTMLInputElement?parseInputElement(result,element):element instanceof HTMLTextAreaElement?result[element.name]=element.value:element instanceof HTMLSelectElement&&parseSelectElement(result,element);return result}function parseInputElement(result,el){el.disabled||(el.type==="checkbox"||el.type==="radio")&&!el.checked||(result[el.name]=el.value)}function parseSelectElement(result,el){result[el.name]=el.value}import{jsx as jsx21}from"react/jsx-runtime";function Form(props){let[submitting,setSubmitting]=useState7(!1);return jsx21(FormContext.Provider,{value:{submitting},children:jsx21("form",{style:props.style,"data-testid":props.testid,onSubmit:e=>{e.preventDefault();let formData=parseForm(e.target);if(props.onSubmit){setSubmitting(!0);let result=props.onSubmit(formData);result?.then?result.catch(console.error).finally(()=>{setSubmitting(!1)}):setSubmitting(!1)}},children:props.children})})}import{Button}from"@mantine/core";import{useContext as useContext2}from"react";import{jsx as jsx22}from"react/jsx-runtime";function SubmitButton(props){let{children,...buttonProps}=props,{submitting}=useContext2(FormContext);return jsx22(Button,{type:"submit",loading:submitting,...buttonProps,children})}import{jsx as jsx23,jsxs as jsxs8}from"react/jsx-runtime";function BookmarkDialog(props){let medplum=useMedplum2(),config=medplum.getUserConfiguration();function submitHandler(formData){let{menuname,bookmarkname:name}=formData,target=`${props.pathname}?${props.searchParams.toString()}`,newConfig=deepClone(config);newConfig.menu?.find(({title})=>title===menuname)?.link?.push({name,target}),medplum.updateResource(newConfig).then(res=>{config.menu=res.menu,medplum.dispatchEvent({type:"change"}),showNotification2({color:"green",message:"Success"}),props.onOk()}).catch(err=>{showNotification2({color:"red",message:normalizeErrorString3(err)})})}return jsx23(Modal2,{title:"Add Bookmark",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:jsx23(Form,{onSubmit:submitHandler,children:jsxs8(Stack2,{children:[jsx23(SelectMenu,{config}),jsx23(TextInput3,{label:"Bookmark Name",type:"text",name:"bookmarkname",placeholder:"Bookmark Name",withAsterisk:!0}),jsx23(Group6,{justify:"flex-end",children:jsx23(SubmitButton,{mt:"sm",children:"OK"})})]})})})}function SelectMenu(props){function userConfigToMenu(config){return config?.menu?.map(menu=>menu.title)}let menus=userConfigToMenu(props.config);return jsx23(NativeSelect2,{name:"menuname",defaultValue:menus[0],label:"Select Menu Option",data:menus,withAsterisk:!0})}import{useCallback as useCallback4,useState as useState9}from"react";import{useState as useState8}from"react";import{Group as Group7,Text as Text4}from"@mantine/core";import{useMedplum as useMedplum3}from"@medplum/react-hooks";import{forwardRef as forwardRef3,useCallback as useCallback3}from"react";import{jsx as jsx24,jsxs as jsxs9}from"react/jsx-runtime";function toKey(element){return typeof element.code=="string"?element.code:JSON.stringify(element)}function getDisplay(item){return typeof item.display=="string"?item.display:toKey(item)}function toOption2(element){return{value:toKey(element),label:getDisplay(element),resource:element}}function createValue(input){return{code:input,display:input}}function ValueSetAutocomplete(props){let medplum=useMedplum3(),{binding,creatable,clearable,expandParams,withHelpText,...rest}=props,loadValues=useCallback3(async(input,signal)=>{if(!binding)return[];let valueSetElements=(await medplum.valueSetExpand({...expandParams,url:binding,filter:input,count:10},{signal})).expansion?.contains??[],newData=[];for(let valueSetElement of valueSetElements)valueSetElement.code&&!newData.some(item=>item.code===valueSetElement.code)&&newData.push(valueSetElement);return newData},[medplum,expandParams,binding]);return jsx24(AsyncAutocomplete,{...rest,creatable:creatable??!0,clearable:clearable??!0,toOption:toOption2,loadOptions:loadValues,onCreate:createValue,itemComponent:withHelpText?ItemComponent2:void 0})}var ItemComponent2=forwardRef3(({label,resource,active,...others},ref)=>jsx24("div",{ref,...others,children:jsxs9(Group7,{wrap:"nowrap",gap:"xs",children:[active&&jsx24(IconCheck,{size:12}),jsxs9("div",{children:[jsx24(Text4,{children:label}),jsx24(Text4,{size:"xs",c:"dimmed",children:`${resource.system}#${resource.code}`})]})]})}));import{jsx as jsx25}from"react/jsx-runtime";function CodeInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,...rest}=props,[value,setValue]=useState8(defaultValue2);function handleChange(newValues){let newValue=newValues[0],newCode=valueSetElementToCode(newValue);setValue(newCode),onChange&&onChange(newCode)}return jsx25(ValueSetAutocomplete,{defaultValue:codeToValueSetElement(value),onChange:handleChange,withHelpText:withHelpText??!0,...rest})}function codeToValueSetElement(code){return code?{code}:void 0}function valueSetElementToCode(element){return element?.code}import{jsx as jsx26}from"react/jsx-runtime";function ResourceTypeInput(props){let[resourceType,setResourceType]=useState9(props.defaultValue),onChange=props.onChange,setResourceTypeWrapper=useCallback4(newResourceType=>{setResourceType(newResourceType),onChange&&onChange(newResourceType)},[onChange]);return jsx26(CodeInput,{disabled:props.disabled,"data-autofocus":props.autoFocus,"data-testid":props.testId,defaultValue:resourceType,onChange:setResourceTypeWrapper,name:props.name,placeholder:props.placeholder,binding:"https://medplum.com/fhir/ValueSet/resource-types",creatable:!1,maxValues:props.maxValues??1,clearable:!1,withHelpText:!1})}var Navbar_default={navbar:"Navbar_navbar",logoButton:"Navbar_logoButton",menuTitle:"Navbar_menuTitle",link:"Navbar_link",toggleButton:"Navbar_toggleButton"};import{formatHumanName as formatHumanName4,isUUID as isUUID2}from"@medplum/core";import{useMedplum as useMedplum4,useMedplumNavigate as useMedplumNavigate3}from"@medplum/react-hooks";import{useState as useState10}from"react";import{jsx as jsx27}from"react/jsx-runtime";function Spotlight2(){let medplum=useMedplum4(),navigate=useMedplumNavigate3(),[nothingFoundMessage,setNothingFoundMessage]=useState10("Type to search..."),[actions,setActions]=useState10([]);return jsx27(Spotlight,{actions,nothingFound:nothingFoundMessage,highlightQuery:!0,searchProps:{leftSection:jsx27(IconSearch,{size:20,stroke:1.5}),placeholder:"Search..."},onQueryChange:query=>{if(!query){setNothingFoundMessage("Type to search..."),setActions([]);return}setNothingFoundMessage("Searching...");let graphqlQuery=buildGraphQLQuery2(query);medplum.graphql(graphqlQuery).then(response=>{let resources=getResourcesFromResponse2(response),newActions=resourcesToActions(resources,navigate);setActions(newActions)}).catch(error=>{console.error("GraphQL query failed:",error)}).finally(()=>{setNothingFoundMessage("No results found")})}})}function buildGraphQLQuery2(input){let escaped=JSON.stringify(input);return isUUID2(input)?`{
|
|
64
|
+
}`.replaceAll(/\s+/g," ")}function getResourcesFromResponse(response,query){let resources=[];return response.data.Patients1&&resources.push(...response.data.Patients1),response.data.Patients2&&resources.push(...response.data.Patients2),response.data.ServiceRequestList&&resources.push(...response.data.ServiceRequestList),sortByRelevance(dedupeResources(resources),query).slice(0,5)}function dedupeResources(resources){let ids=new Set,result=[];for(let resource of resources)ids.has(resource.id)||(ids.add(resource.id),result.push(resource));return result}function sortByRelevance(resources,query){return resources.sort((a,b)=>getResourceScore(b,query)-getResourceScore(a,query))}function getResourceScore(resource,query){let bestScore=0;if(resource.identifier)for(let identifier of resource.identifier)bestScore=Math.max(bestScore,getStringScore(identifier.value,query));if(resource.resourceType==="Patient"&&resource.name)for(let name of resource.name)bestScore=Math.max(bestScore,getStringScore(formatHumanName2(name),query));return bestScore}function getStringScore(str,query){if(!str)return 0;let index=str.toLowerCase().indexOf(query.toLowerCase());return index<0?0:100-index}import{jsx as jsx12,jsxs as jsxs5}from"react/jsx-runtime";function Header(props){let profile=useMedplumProfile2(),[userMenuOpened,setUserMenuOpened]=useState5(!1);return jsx12(MantineAppShell.Header,{p:8,style:{zIndex:101},children:jsxs5(Group5,{justify:"space-between",children:[jsxs5(Group5,{gap:"xs",children:[jsx12(UnstyledButton,{className:Header_default.logoButton,"aria-expanded":props.navbarOpen,"aria-controls":"navbar",onClick:()=>props.navbarToggle(),children:props.logo}),!props.headerSearchDisabled&&jsx12(HeaderSearchInput,{pathname:props.pathname,searchParams:props.searchParams})]}),jsxs5(Group5,{gap:"lg",pr:"sm",children:[props.notifications,jsxs5(Menu2,{width:260,shadow:"xl",position:"bottom-end",transitionProps:{transition:"fade-down"},opened:userMenuOpened,onClose:()=>setUserMenuOpened(!1),children:[jsx12(Menu2.Target,{children:jsx12(UnstyledButton,{className:Header_default.user,"aria-label":"User menu","data-active":userMenuOpened||void 0,onClick:()=>setUserMenuOpened(o=>!o),children:jsxs5(Group5,{gap:7,children:[jsx12(ResourceAvatar,{value:profile,radius:"xl",size:24}),jsx12(Text3,{size:"sm",className:Header_default.userName,children:formatHumanName3(profile?.name?.[0])}),jsx12(IconChevronDown,{size:12,stroke:1.5})]})})}),jsx12(Menu2.Dropdown,{children:jsx12(HeaderDropdown,{version:props.version})})]})]})]})})}import{Button as Button2,Divider,AppShell as MantineAppShell2,Menu as Menu3,ScrollArea as ScrollArea2,Space,Text as Text5,Tooltip,UnstyledButton as UnstyledButton3}from"@mantine/core";import{clamp}from"@mantine/hooks";import{useSyncExternalStore}from"react";function createStore(initialState){let state=initialState,initialized=!1,listeners=new Set;return{getState(){return state},updateState(value){state=typeof value=="function"?value(state):value},setState(value){this.updateState(value),listeners.forEach(listener=>listener(state))},initialize(value){initialized||(state=value,initialized=!0)},subscribe(callback){return listeners.add(callback),()=>listeners.delete(callback)}}}function useStore(store){return useSyncExternalStore(store.subscribe,()=>store.getState(),()=>store.getState())}var createSpotlightStore=()=>createStore({opened:!1,empty:!1,selected:-1,listId:"",query:"",registeredActions:new Set}),useSpotlight=store=>useStore(store);function updateSpotlightStateAction(update,store){let state=store.getState();store.setState({...state,...update(store.getState())})}function openSpotlightAction(store){updateSpotlightStateAction(()=>({opened:!0,selected:-1}),store)}function closeSpotlightAction(store){updateSpotlightStateAction(()=>({opened:!1}),store)}function toggleSpotlightAction(store){updateSpotlightStateAction(state=>({opened:!state.opened,selected:state.opened?state.selected:-1}),store)}function setSelectedAction(index,store){store.updateState(state=>({...state,selected:index}))}function setListId(id,store){store.updateState(state=>({...state,listId:id}))}function findElementByQuerySelector(selector,root=document){let element=root.querySelector(selector);if(element)return element;let children=root instanceof ShadowRoot?root.host.children:root.children;for(let i=0;i<children.length;i+=1){let child=children[i];if(child.shadowRoot){let shadowElement=findElementByQuerySelector(selector,child.shadowRoot);if(shadowElement)return shadowElement}let nestedElement=findElementByQuerySelector(selector,child);if(nestedElement)return nestedElement}return null}function selectAction(index,store){let state=store.getState(),actionsList=state.listId?findElementByQuerySelector(`#${state.listId}`):null,selected=actionsList?.querySelector("[data-selected]"),actions=actionsList?.querySelectorAll("[data-action]")??[],nextIndex=index===-1?actions.length-1:index===actions.length?0:index,selectedIndex=clamp(nextIndex,0,actions.length-1);return selected?.removeAttribute("data-selected"),actions[selectedIndex]?.scrollIntoView({block:"nearest"}),actions[selectedIndex]?.setAttribute("data-selected","true"),setSelectedAction(selectedIndex,store),selectedIndex}function selectNextAction(store){return selectAction(store.getState().selected+1,store)}function selectPreviousAction(store){return selectAction(store.getState().selected-1,store)}function triggerSelectedAction(store){let state=store.getState();findElementByQuerySelector(`#${state.listId} [data-selected]`)?.click()}function registerAction(id,store){let state=store.getState();return state.registeredActions.add(id),()=>{state.registeredActions.delete(id)}}function setQuery(query,store){updateSpotlightStateAction(()=>({query}),store),Promise.resolve().then(()=>{selectAction(0,store),updateSpotlightStateAction(state=>({empty:state.query.trim().length>0&&state.registeredActions.size===0||!1}),store)})}function clearSpotlightState({clearQuery},store){store.updateState(state=>({...state,selected:-1,query:clearQuery?"":state.query,empty:clearQuery?!1:state.empty}))}var spotlightActions={open:openSpotlightAction,close:closeSpotlightAction,toggle:toggleSpotlightAction,updateState:updateSpotlightStateAction,setSelectedAction,setListId,selectAction,selectNextAction,selectPreviousAction,triggerSelectedAction,registerAction,setQuery,clearSpotlightState};function createSpotlight(){let store=createSpotlightStore();return[store,{open:()=>openSpotlightAction(store),close:()=>closeSpotlightAction(store),toggle:()=>toggleSpotlightAction(store)}]}var[spotlightStore,spotlight]=createSpotlight(),{open:openSpotlight,close:closeSpotlight,toggle:toggleSpotlight}=spotlight;function isActionsGroup(item){let _item=item;return _item.group!==void 0&&Array.isArray(_item.actions)}import{jsx as jsx20,jsxs as jsxs7}from"react/jsx-runtime";import{getDefaultZIndex as getDefaultZIndex2,factory as factory8,useProps as useProps8}from"@mantine/core";import{useUncontrolled}from"@mantine/hooks";function getKeywords(keywords){return Array.isArray(keywords)?keywords.map(keyword=>keyword.trim()).join(",").toLowerCase().trim():typeof keywords=="string"?keywords.toLowerCase().trim():""}function getFlatActions(data2){return data2.reduce((acc,item)=>"actions"in item?[...acc,...item.actions.map(action=>({...action,group:item.group}))]:[...acc,item],[])}function flatActionsToGroups(data2){let groups={},result=[];return data2.forEach(action=>{action.group?(groups[action.group]||(groups[action.group]={pushed:!1,data:{group:action.group,actions:[]}}),groups[action.group].data.actions.push(action),groups[action.group].pushed||(groups[action.group].pushed=!0,result.push(groups[action.group].data))):result.push(action)}),result}var defaultSpotlightFilter=(_query,data2)=>{let query=_query.trim().toLowerCase(),priorityMatrix=[[],[]];return getFlatActions(data2).forEach(item=>{item.label?.toLowerCase().includes(query)?priorityMatrix[0].push(item):(item.description?.toLowerCase().includes(query)||getKeywords(item.keywords).includes(query))&&priorityMatrix[1].push(item)}),flatActionsToGroups(priorityMatrix.flat())};function limitActions(actions,limit){if(!Array.isArray(actions))return[];let count=0;return actions.reduce((acc,item)=>{if(count>=limit)return acc;if(isActionsGroup(item)){let groupActions=limitActions(item.actions,limit-count);acc.push({group:item.group,actions:groupActions}),count+=groupActions.length}else acc.push(item),count+=1;return acc},[])}import{jsx as jsx13,jsxs as jsxs6,Fragment as Fragment4}from"react/jsx-runtime";import{factory,useProps,Highlight,UnstyledButton as UnstyledButton2,Box}from"@mantine/core";import{createSafeContext}from"@mantine/core";var[SpotlightProvider,useSpotlightContext]=createSafeContext("Spotlight component was not found in tree");var classes={root:"m_d2b315db",content:"m_3cd250e0",body:"m_d2abce9b",search:"m_f366a061",actionsList:"m_6e463822",action:"m_d49bb8ef",actionBody:"m_3d475731",actionSection:"m_832642f6",actionLabel:"m_6c2a1345",actionDescription:"m_a6d9d78d",empty:"m_82f78f74",footer:"m_ddcaf054",actionsGroup:"m_5a3e5f7b"};var defaultProps={dimmedSections:!0,highlightQuery:!1},SpotlightAction=factory((_props,ref)=>{let props=useProps("SpotlightAction",defaultProps,_props),{className,style,classNames,styles,id,description,label,leftSection,rightSection,children,dimmedSections,highlightQuery,highlightColor,closeSpotlightOnTrigger,onClick,onMouseDown,keywords,vars,...others}=props,ctx=useSpotlightContext(),stylesApi={classNames,styles},labelNode=highlightQuery&&typeof label=="string"?jsx13(Highlight,{component:"span",highlight:ctx.query,color:highlightColor,...ctx.getStyles("actionLabel",stylesApi),children:label}):jsx13("span",{...ctx.getStyles("actionLabel",stylesApi),children:label});return jsx13(UnstyledButton2,{ref,"data-action":!0,...ctx.getStyles("action",{className,style,...stylesApi}),...others,onMouseDown:event=>{event.preventDefault(),onMouseDown?.(event)},onClick:event=>{onClick?.(event),(closeSpotlightOnTrigger??ctx.closeOnActionTrigger)&&spotlightActions.close(ctx.store)},tabIndex:-1,children:children||jsxs6(Fragment4,{children:[leftSection&&jsx13(Box,{component:"span",mod:{position:"left",dimmed:dimmedSections},...ctx.getStyles("actionSection",stylesApi),children:leftSection}),jsxs6("span",{...ctx.getStyles("actionBody",stylesApi),children:[labelNode,jsx13("span",{...ctx.getStyles("actionDescription",stylesApi),children:description})]}),rightSection&&jsx13(Box,{component:"span",mod:{position:"right",dimmed:dimmedSections},...ctx.getStyles("actionSection",stylesApi),children:rightSection})]})})});SpotlightAction.classes=classes;SpotlightAction.displayName="@mantine/spotlight/SpotlightAction";import{jsx as jsx14}from"react/jsx-runtime";import{factory as factory2,useProps as useProps2,Box as Box2}from"@mantine/core";var SpotlightActionsGroup=factory2((props,ref)=>{let{className,style,styles,classNames,label,children,...others}=useProps2("SpotlightActionsGroup",null,props),ctx=useSpotlightContext();return jsx14(Box2,{...ctx.getStyles("actionsGroup",{className,style,classNames,styles}),ref,...others,__vars:{"--spotlight-label":`'${label?.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`},children})});SpotlightActionsGroup.classes=classes;SpotlightActionsGroup.displayName="@mantine/core/SpotlightActionsGroup";import{jsx as jsx15}from"react/jsx-runtime";import{useId,useEffect as useEffect2}from"react";import{factory as factory3,useProps as useProps3,ScrollArea}from"@mantine/core";var SpotlightActionsList=factory3((props,ref)=>{let{className,style,id,children,vars,classNames,styles,...others}=useProps3("SpotlightActionsList",null,props),ctx=useSpotlightContext(),generatedId=`mantine-${useId().replace(/:/g,"")}`,listId=id||generatedId;return useEffect2(()=>(spotlightActions.setListId(listId,ctx.store),()=>spotlightActions.setListId("",ctx.store)),[]),jsx15(ScrollArea.Autosize,{...ctx.getStyles("actionsList",{className,style,classNames,styles}),ref,type:"scroll",scrollbarSize:"var(--spotlight-actions-list-padding)",offsetScrollbars:"y",id:listId,...others,children})});SpotlightActionsList.classes=classes;SpotlightActionsList.displayName="@mantine/spotlight/SpotlightActionsList";import{jsx as jsx16}from"react/jsx-runtime";import{factory as factory4,useProps as useProps4,Box as Box3}from"@mantine/core";var SpotlightEmpty=factory4((props,ref)=>{let{className,style,classNames,styles,...others}=useProps4("SpotlightEmpty",null,props),ctx=useSpotlightContext();return jsx16(Box3,{ref,...ctx.getStyles("empty",{classNames,styles,className,style}),...others})});SpotlightEmpty.classes=classes;SpotlightEmpty.displayName="@mantine/spotlight/SpotlightEmpty";import{jsx as jsx17}from"react/jsx-runtime";import{factory as factory5,useProps as useProps5,Box as Box4}from"@mantine/core";var SpotlightFooter=factory5((props,ref)=>{let{className,style,classNames,styles,...others}=useProps5("SpotlightFooter",null,props),ctx=useSpotlightContext();return jsx17(Box4,{ref,...ctx.getStyles("footer",{className,classNames,style,styles}),...others})});SpotlightFooter.classes=classes;SpotlightFooter.displayName="@mantine/spotlight/SpotlightFooter";import{jsx as jsx18}from"react/jsx-runtime";import{getDefaultZIndex,factory as factory6,useProps as useProps6,useMantineTheme,useStyles,Modal,rem,resolveStyles,resolveClassNames}from"@mantine/core";import{useHotkeys,useDidUpdate}from"@mantine/hooks";function getHotkeys(hotkeys,store){if(!hotkeys)return[];let open=()=>spotlightActions.open(store);return Array.isArray(hotkeys)?hotkeys.map(hotkey=>[hotkey,open]):[[hotkeys,open]]}var defaultProps2={size:600,yOffset:80,zIndex:getDefaultZIndex("max"),overlayProps:{backgroundOpacity:.35,blur:7},transitionProps:{duration:200,transition:"pop"},store:spotlightStore,clearQueryOnClose:!0,closeOnActionTrigger:!0,shortcut:"mod + K",maxHeight:400},SpotlightRoot=factory6((_props,ref)=>{let props=useProps6("SpotlightRoot",defaultProps2,_props),{classNames,className,style,styles,unstyled,vars,store,children,query,onQueryChange,transitionProps,clearQueryOnClose,shortcut,tagsToIgnore,triggerOnContentEditable,disabled,onSpotlightOpen,onSpotlightClose,forceOpened,closeOnActionTrigger,maxHeight,scrollable,attributes,...others}=props,theme=useMantineTheme(),{opened,query:storeQuery}=useSpotlight(store),_query=typeof query=="string"?query:storeQuery,setQuery2=q=>{onQueryChange?.(q),spotlightActions.setQuery(q,store)},getStyles=useStyles({name:"Spotlight",classes,props,className,style,classNames,styles,unstyled,attributes});return useHotkeys(getHotkeys(shortcut,store),tagsToIgnore,triggerOnContentEditable),useDidUpdate(()=>{opened?onSpotlightOpen?.():onSpotlightClose?.()},[opened]),disabled?null:jsx18(SpotlightProvider,{value:{getStyles,query:_query,setQuery:setQuery2,store,closeOnActionTrigger},children:jsx18(Modal,{ref,...others,withCloseButton:!1,opened:opened||!!forceOpened,padding:0,onClose:()=>spotlightActions.close(store),className,style,classNames:resolveClassNames({theme,classNames:[classes,classNames],props,stylesCtx:void 0}),styles:resolveStyles({theme,styles,props,stylesCtx:void 0}),transitionProps:{...transitionProps,onExited:()=>{clearQueryOnClose&&setQuery2(""),spotlightActions.clearSpotlightState({clearQuery:clearQueryOnClose},store),transitionProps?.onExited?.()}},__vars:{"--spotlight-max-height":scrollable?rem(maxHeight):void 0},__staticSelector:"Spotlight","data-scrollable":scrollable||void 0,children})})});SpotlightRoot.classes=classes;SpotlightRoot.displayName="@mantine/spotlight/SpotlightRoot";import{jsx as jsx19}from"react/jsx-runtime";import{useState as useState6}from"react";import{factory as factory7,useProps as useProps7,Input}from"@mantine/core";var defaultProps3={size:"lg"},SpotlightSearch=factory7((props,ref)=>{let{classNames,styles,onKeyDown,onChange,vars,value,...others}=useProps7("SpotlightSearch",defaultProps3,props),ctx=useSpotlightContext(),inputStyles=ctx.getStyles("search"),[isComposing,setIsComposing]=useState6(!1),handleKeyDown=event=>{onKeyDown?.(event),!isComposing&&(event.nativeEvent.code==="ArrowDown"&&(event.preventDefault(),spotlightActions.selectNextAction(ctx.store)),event.nativeEvent.code==="ArrowUp"&&(event.preventDefault(),spotlightActions.selectPreviousAction(ctx.store)),(event.nativeEvent.code==="Enter"||event.nativeEvent.code==="NumpadEnter")&&(event.preventDefault(),spotlightActions.triggerSelectedAction(ctx.store)))};return jsx19(Input,{ref,classNames:[{input:inputStyles.className},classNames],styles:[{input:inputStyles.style},styles],...others,value:value??ctx.query,onChange:event=>{ctx.setQuery(event.currentTarget.value),onChange?.(event)},onKeyDown:handleKeyDown,onCompositionStart:()=>setIsComposing(!0),onCompositionEnd:()=>setIsComposing(!1)})});SpotlightSearch.classes=classes;SpotlightSearch.displayName="@mantine/spotlight/SpotlightSearch";var defaultProps4={size:600,yOffset:80,limit:1/0,zIndex:getDefaultZIndex2("max"),overlayProps:{backgroundOpacity:.35,blur:7},transitionProps:{duration:200,transition:"pop"},store:spotlightStore,filter:defaultSpotlightFilter,clearQueryOnClose:!0,closeOnActionTrigger:!0,shortcut:"mod + K"},Spotlight=factory8((_props,ref)=>{let props=useProps8("Spotlight",defaultProps4,_props),{searchProps,filter,query,onQueryChange,actions,nothingFound,highlightQuery,limit,scrollAreaProps,...others}=props,[_query,setQuery2]=useUncontrolled({value:query,defaultValue:"",finalValue:"",onChange:onQueryChange}),filteredActions=limitActions(filter(_query,actions),limit).map(item=>{if(isActionsGroup(item)){let items=item.actions.map(({id,...actionData})=>jsx20(SpotlightAction,{highlightQuery,...actionData},id));return jsx20(SpotlightActionsGroup,{label:item.group,children:items},item.group)}return jsx20(SpotlightAction,{highlightQuery,...item},item.id)});return jsxs7(SpotlightRoot,{...others,query:_query,onQueryChange:setQuery2,ref,children:[jsx20(SpotlightSearch,{...searchProps}),jsxs7(SpotlightActionsList,{...scrollAreaProps,children:[filteredActions,filteredActions.length===0&¬hingFound&&jsx20(SpotlightEmpty,{children:nothingFound})]})]})});Spotlight.classes=classes;Spotlight.displayName="@mantine/spotlight/Spotlight";Spotlight.Search=SpotlightSearch;Spotlight.ActionsList=SpotlightActionsList;Spotlight.Action=SpotlightAction;Spotlight.Empty=SpotlightEmpty;Spotlight.ActionsGroup=SpotlightActionsGroup;Spotlight.Footer=SpotlightFooter;Spotlight.Root=SpotlightRoot;Spotlight.open=spotlight.open;Spotlight.close=spotlight.close;Spotlight.toggle=spotlight.toggle;import{formatHumanName as formatHumanName5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate4,useMedplumProfile as useMedplumProfile3}from"@medplum/react-hooks";import{Fragment as Fragment5,useState as useState11}from"react";import{Group as Group6,Modal as Modal2,NativeSelect as NativeSelect2,Stack as Stack2,TextInput as TextInput3}from"@mantine/core";import{showNotification as showNotification2}from"@mantine/notifications";import{deepClone,normalizeErrorString as normalizeErrorString3}from"@medplum/core";import{useMedplum as useMedplum2}from"@medplum/react-hooks";import{useState as useState7}from"react";import{createContext as createContext2}from"react";var FormContext=createContext2({submitting:!1});FormContext.displayName="FormContext";function parseForm(form){let result={};for(let element of Array.from(form.elements))element instanceof HTMLInputElement?parseInputElement(result,element):element instanceof HTMLTextAreaElement?result[element.name]=element.value:element instanceof HTMLSelectElement&&parseSelectElement(result,element);return result}function parseInputElement(result,el){el.disabled||(el.type==="checkbox"||el.type==="radio")&&!el.checked||(result[el.name]=el.value)}function parseSelectElement(result,el){result[el.name]=el.value}import{jsx as jsx21}from"react/jsx-runtime";function Form(props){let[submitting,setSubmitting]=useState7(!1);return jsx21(FormContext.Provider,{value:{submitting},children:jsx21("form",{style:props.style,"data-testid":props.testid,onSubmit:e=>{e.preventDefault();let formData=parseForm(e.target);if(props.onSubmit){setSubmitting(!0);let result=props.onSubmit(formData);result?.then?result.catch(console.error).finally(()=>{setSubmitting(!1)}):setSubmitting(!1)}},children:props.children})})}import{Button}from"@mantine/core";import{useContext as useContext2}from"react";import{jsx as jsx22}from"react/jsx-runtime";function SubmitButton(props){let{children,...buttonProps}=props,{submitting}=useContext2(FormContext);return jsx22(Button,{type:"submit",loading:submitting,...buttonProps,children})}import{jsx as jsx23,jsxs as jsxs8}from"react/jsx-runtime";function BookmarkDialog(props){let medplum=useMedplum2(),config=medplum.getUserConfiguration();function submitHandler(formData){let{menuname,bookmarkname:name}=formData,target=`${props.pathname}?${props.searchParams.toString()}`,newConfig=deepClone(config);newConfig.menu?.find(({title})=>title===menuname)?.link?.push({name,target}),medplum.updateResource(newConfig).then(res=>{config.menu=res.menu,medplum.dispatchEvent({type:"change"}),showNotification2({color:"green",message:"Success"}),props.onOk()}).catch(err=>{showNotification2({color:"red",message:normalizeErrorString3(err)})})}return jsx23(Modal2,{title:"Add Bookmark",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:jsx23(Form,{onSubmit:submitHandler,children:jsxs8(Stack2,{children:[jsx23(SelectMenu,{config}),jsx23(TextInput3,{label:"Bookmark Name",type:"text",name:"bookmarkname",placeholder:"Bookmark Name",withAsterisk:!0}),jsx23(Group6,{justify:"flex-end",children:jsx23(SubmitButton,{mt:"sm",children:"OK"})})]})})})}function SelectMenu(props){function userConfigToMenu(config){return config?.menu?.map(menu=>menu.title)}let menus=userConfigToMenu(props.config);return jsx23(NativeSelect2,{name:"menuname",defaultValue:menus[0],label:"Select Menu Option",data:menus,withAsterisk:!0})}import{useCallback as useCallback4,useState as useState9}from"react";import{useState as useState8}from"react";import{Group as Group7,Text as Text4}from"@mantine/core";import{useMedplum as useMedplum3}from"@medplum/react-hooks";import{forwardRef as forwardRef3,useCallback as useCallback3}from"react";import{jsx as jsx24,jsxs as jsxs9}from"react/jsx-runtime";function toKey(element){return typeof element.code=="string"?element.code:JSON.stringify(element)}function getDisplay(item){return typeof item.display=="string"?item.display:toKey(item)}function toOption2(element){return{value:toKey(element),label:getDisplay(element),resource:element}}function createValue(input){return{code:input,display:input}}function ValueSetAutocomplete(props){let medplum=useMedplum3(),{binding,creatable,clearable,expandParams,withHelpText,...rest}=props,loadValues=useCallback3(async(input,signal)=>{if(!binding)return[];let valueSetElements=(await medplum.valueSetExpand({...expandParams,url:binding,filter:input,count:10},{signal})).expansion?.contains??[],newData=[];for(let valueSetElement of valueSetElements)valueSetElement.code&&!newData.some(item=>item.code===valueSetElement.code)&&newData.push(valueSetElement);return newData},[medplum,expandParams,binding]);return jsx24(AsyncAutocomplete,{...rest,creatable:creatable??!0,clearable:clearable??!0,toOption:toOption2,loadOptions:loadValues,onCreate:createValue,itemComponent:withHelpText?ItemComponent2:void 0})}var ItemComponent2=forwardRef3(({label,resource,active,...others},ref)=>jsx24("div",{ref,...others,children:jsxs9(Group7,{wrap:"nowrap",gap:"xs",children:[active&&jsx24(IconCheck,{size:12}),jsxs9("div",{children:[jsx24(Text4,{children:label}),jsx24(Text4,{size:"xs",c:"dimmed",children:`${resource.system}#${resource.code}`})]})]})}));import{jsx as jsx25}from"react/jsx-runtime";function CodeInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,...rest}=props,[value,setValue]=useState8(defaultValue2);function handleChange(newValues){let newValue=newValues[0],newCode=valueSetElementToCode(newValue);setValue(newCode),onChange&&onChange(newCode)}return jsx25(ValueSetAutocomplete,{defaultValue:codeToValueSetElement(value),onChange:handleChange,withHelpText:withHelpText??!0,...rest})}function codeToValueSetElement(code){return code?{code}:void 0}function valueSetElementToCode(element){return element?.code}import{jsx as jsx26}from"react/jsx-runtime";function ResourceTypeInput(props){let[resourceType,setResourceType]=useState9(props.defaultValue),onChange=props.onChange,setResourceTypeWrapper=useCallback4(newResourceType=>{setResourceType(newResourceType),onChange&&onChange(newResourceType)},[onChange]);return jsx26(CodeInput,{disabled:props.disabled,"data-autofocus":props.autoFocus,"data-testid":props.testId,defaultValue:resourceType,onChange:setResourceTypeWrapper,name:props.name,placeholder:props.placeholder,binding:"https://medplum.com/fhir/ValueSet/resource-types",creatable:!1,maxValues:props.maxValues??1,clearable:!1,withHelpText:!1})}var Navbar_default={navbar:"Navbar_navbar",logoButton:"Navbar_logoButton",menuTitle:"Navbar_menuTitle",link:"Navbar_link",toggleButton:"Navbar_toggleButton"};import{formatHumanName as formatHumanName4,isUUID as isUUID2}from"@medplum/core";import{useMedplum as useMedplum4,useMedplumNavigate as useMedplumNavigate3}from"@medplum/react-hooks";import{useState as useState10}from"react";import{jsx as jsx27}from"react/jsx-runtime";function Spotlight2(){let medplum=useMedplum4(),navigate=useMedplumNavigate3(),[nothingFoundMessage,setNothingFoundMessage]=useState10("Type to search..."),[actions,setActions]=useState10([]);return jsx27(Spotlight,{actions,nothingFound:nothingFoundMessage,highlightQuery:!0,searchProps:{leftSection:jsx27(IconSearch,{size:20,stroke:1.5}),placeholder:"Search..."},onQueryChange:query=>{if(!query){setNothingFoundMessage("Type to search..."),setActions([]);return}setNothingFoundMessage("Searching...");let graphqlQuery=buildGraphQLQuery2(query);medplum.graphql(graphqlQuery).then(response=>{let resources=getResourcesFromResponse2(response),newActions=resourcesToActions(resources,navigate);setActions(newActions)}).catch(error=>{console.error("GraphQL query failed:",error)}).finally(()=>{setNothingFoundMessage("No results found")})}})}function buildGraphQLQuery2(input){let escaped=JSON.stringify(input);return isUUID2(input)?`{
|
|
65
65
|
Patients1: PatientList(_id: ${escaped}, _count: 1) {
|
|
66
66
|
resourceType
|
|
67
67
|
id
|
|
@@ -124,16 +124,16 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
|
|
|
124
124
|
display
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
|
-
}`.replaceAll(/\s+/g," ")}function getResourcesFromResponse2(response){let resources=[];return response.data.Patients1&&resources.push(...response.data.Patients1),response.data.Patients2&&resources.push(...response.data.Patients2),response.data.ServiceRequestList&&resources.push(...response.data.ServiceRequestList),dedupeResources2(resources)}function dedupeResources2(resources){let ids=new Set,result=[];for(let resource of resources)ids.has(resource.id)||(ids.add(resource.id),result.push(resource));return result}function resourcesToActions(resources,navigate){let patientActions=[],serviceRequestActions=[];for(let resource of resources)resource.resourceType==="Patient"?patientActions.push({id:resource.id,label:resource.name?formatHumanName4(resource.name[0]):resource.id,description:resource.birthDate,onClick:()=>navigate(`/Patient/${resource.id}`)}):resource.resourceType==="ServiceRequest"&&serviceRequestActions.push({id:resource.id,label:resource.id,description:resource.subject?.display,onClick:()=>navigate(`/ServiceRequest/${resource.id}`)});let result=[];return patientActions.length>0&&result.push({group:"Patients",actions:patientActions}),serviceRequestActions.length>0&&result.push({group:"Service Requests",actions:serviceRequestActions}),result}import{Fragment as Fragment6,jsx as jsx28,jsxs as jsxs10}from"react/jsx-runtime";function Navbar(props){let navigate=useMedplumNavigate4(),profile=useMedplumProfile3(),activeLink=getActiveLink(props.pathname,props.searchParams,props.menus),[userMenuOpened,setUserMenuOpened]=useState11(!1),[bookmarkDialogVisible,setBookmarkDialogVisible]=useState11(!1);function onLinkClick2(e,to){e.stopPropagation(),e.preventDefault(),navigate(to),window.innerWidth<768&&props.closeNavbar()}function navigateResourceType(resourceType){resourceType&&navigate(`/${resourceType}`)}let opened=props.opened??!0;return jsxs10(Fragment6,{children:[jsxs10(MantineAppShell2.Navbar,{id:"navbar",className:Navbar_default.navbar,children:[props.logo&&jsx28(MantineAppShell2.Section,{px:"sm",py:"xs",children:jsx28(UnstyledButton3,{className:Navbar_default.logoButton,onClick:props.navbarToggle,"aria-expanded":opened,"aria-controls":"navbar",children:props.logo})}),jsx28(ScrollArea2,{px:"sm",py:"xs",h:"100%",children:jsxs10(MantineAppShell2.Section,{grow:!0,children:[props.spotlightEnabled&&jsx28(NavbarLink,{to:"#",active:!1,onClick:spotlight.open,icon:jsx28(IconSearch,{size:"1.2rem"}),label:"Search",opened}),props.spotlightEnabled&&jsx28(Spotlight2,{}),!props.resourceTypeSearchDisabled&&jsx28(MantineAppShell2.Section,{mb:"sm",children:jsx28(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",maxValues:0,onChange:newValue=>navigateResourceType(newValue)},window.location.pathname)}),props.menus?.map(menu=>jsxs10(Fragment5,{children:[opened?jsx28(Text5,{className:Navbar_default.menuTitle,children:menu.title}):jsx28(Space,{h:41}),menu.links?.map(link=>jsx28(NavbarLink,{to:link.href,active:link.href===activeLink?.href,onClick:e=>onLinkClick2(e,link.href),icon:link.icon,label:link.label??"",opened},link.href))]},`menu-${menu.title}`)),props.displayAddBookmark&&jsx28(Button2,{variant:"subtle",size:"xs",mt:"xl",leftSection:jsx28(IconPlus,{size:"0.75rem"}),onClick:()=>setBookmarkDialogVisible(!0),children:"Add Bookmark"})]})}),props.userMenuEnabled&&jsxs10(MantineAppShell2.Section,{px:"sm",py:"xs",children:[jsx28(Tooltip,{label:"Toggle navbar",position:"right",transitionProps:{duration:0},children:jsx28(UnstyledButton3,{className:Navbar_default.toggleButton,"aria-label":"Toggle navbar",onClick:props.navbarToggle,"aria-expanded":opened,"aria-controls":"navbar",children:jsx28(IconLayoutSidebar,{})})}),jsxs10(Menu3,{width:260,shadow:"xl",position:"top-start",transitionProps:{transition:"fade-up"},opened:userMenuOpened,onClose:()=>setUserMenuOpened(!1),children:[jsx28(Menu3.Target,{children:jsxs10(UnstyledButton3,{className:Navbar_default.link,"aria-label":"User menu","data-active":userMenuOpened||void 0,onClick:()=>setUserMenuOpened(o=>!o),children:[jsx28(ResourceAvatar,{value:profile,radius:"xl",size:18}),opened&&jsx28("span",{children:formatHumanName5(profile?.name?.[0])})]})}),jsx28(Menu3.Dropdown,{children:jsx28(HeaderDropdown,{version:props.version})})]})]})]}),props.pathname&&props.searchParams&&jsx28(BookmarkDialog,{pathname:props.pathname,searchParams:props.searchParams,visible:bookmarkDialogVisible,onOk:()=>setBookmarkDialogVisible(!1),onCancel:()=>setBookmarkDialogVisible(!1)})]})}function NavbarLink(props){let{to,icon,label,onClick,active}=props;return props.opened?jsxs10(MedplumLink,{to,onClick,className:Navbar_default.link,"data-active":active||void 0,children:[icon,jsx28("span",{children:label})]}):jsx28(Tooltip,{label,position:"right",transitionProps:{duration:0},children:jsx28(MedplumLink,{to,onClick,className:Navbar_default.link,"data-active":active||void 0,children:icon})})}function getActiveLink(currentPathname,currentSearchParams,menus){if(!currentPathname||!currentSearchParams||!menus)return;let bestLink,bestScore=0;for(let menu of menus)if(menu.links)for(let link of menu.links){let score=getLinkScore(currentPathname,currentSearchParams,link.href);score>bestScore&&(bestScore=score,bestLink=link)}return bestLink}function getLinkScore(currentPathname,currentSearchParams,linkHref){let linkUrl=new URL(linkHref,"https://example.com");if(currentPathname!==linkUrl.pathname)return 0;let ignoredParams=["_count","_offset"];for(let[key,value]of linkUrl.searchParams.entries())if(!ignoredParams.includes(key)&¤tSearchParams.get(key)!==value)return 0;let count=1;for(let[key,value]of currentSearchParams.entries())ignoredParams.includes(key)||linkUrl.searchParams.get(key)===value&&count++;return count}import{jsx as jsx29,jsxs as jsxs11}from"react/jsx-runtime";var OPEN_WIDTH=250,CLOSED_WIDTH=70;function AppShell(props){let[navbarOpen,setNavbarOpen]=useState12(localStorage.navbarOpen==="true"),[layoutVersion]=useState12(props.layoutVersion??localStorage.appShellLayoutVersion??"v1"),medplum=useMedplum5(),profile=useMedplumProfile4();function setNavbarOpenWrapper(open){localStorage.navbarOpen=open.toString(),setNavbarOpen(open)}function closeNavbar(){setNavbarOpenWrapper(!1)}function toggleNavbar(){setNavbarOpenWrapper(!navbarOpen)}if(medplum.isLoading())return jsx29(Loading,{});let headerProp,navbarProp,headerComponent,navbarComponent;return layoutVersion==="v2"?(headerProp={height:0},navbarProp={width:navbarOpen?OPEN_WIDTH:CLOSED_WIDTH,breakpoint:0,collapsed:{desktop:!profile,mobile:!profile}},headerComponent=void 0,navbarComponent=profile?jsx29(Navbar,{logo:props.logo,pathname:props.pathname,searchParams:props.searchParams,menus:props.menus,navbarToggle:toggleNavbar,closeNavbar,displayAddBookmark:props.displayAddBookmark,resourceTypeSearchDisabled:!0,opened:navbarOpen,spotlightEnabled:!0,userMenuEnabled:!0,version:props.version}):void 0):(headerProp={height:60},navbarProp={width:OPEN_WIDTH,breakpoint:"sm",collapsed:{desktop:!profile||!navbarOpen,mobile:!profile||!navbarOpen}},headerComponent=profile&&jsx29(Header,{pathname:props.pathname,searchParams:props.searchParams,headerSearchDisabled:props.headerSearchDisabled,logo:props.logo,version:props.version,navbarOpen,navbarToggle:toggleNavbar,notifications:props.notifications}),navbarComponent=profile&&navbarOpen?jsx29(Navbar,{pathname:props.pathname,searchParams:props.searchParams,menus:props.menus,navbarToggle:toggleNavbar,closeNavbar,displayAddBookmark:props.displayAddBookmark,resourceTypeSearchDisabled:props.resourceTypeSearchDisabled}):void 0),jsxs11(MantineAppShell3,{header:headerProp,navbar:navbarProp,padding:0,children:[headerComponent,navbarComponent,jsx29(MantineAppShell3.Main,{className:AppShell_default.main,children:jsx29(ErrorBoundary,{children:jsx29(Suspense,{fallback:jsx29(Loading,{}),children:props.children})})})]})}import{getPathDisplayName,isPopulated as isPopulated2}from"@medplum/core";import{Anchor as Anchor2}from"@mantine/core";import{ContentType as ContentType2}from"@medplum/core";import{useCachedBinaryUrl as useCachedBinaryUrl2}from"@medplum/react-hooks";import{Button as Button3}from"@mantine/core";import{useEffect as useEffect3,useRef as useRef3,useState as useState13}from"react";import{Fragment as Fragment7,jsx as jsx30,jsxs as jsxs12}from"react/jsx-runtime";var CCDA_VIEWER_URL="https://ccda.medplum.com",BASE_VALIDATION_URL="https://ccda-validator.medplum.com/";function CcdaDisplay(props){let{url}=props,[shouldSend,setShouldSend]=useState13(!1),iframeRef=useRef3(null),[validationResult,setValidationResult]=useState13(),[validating,setValidating]=useState13(!1);useEffect3(()=>{url&&shouldSend&&iframeRef.current&&(sendCommand(iframeRef.current,{command:"loadCcdaXml",value:url}).catch(console.error),setShouldSend(!1))},[url,shouldSend]);let validateCcda=async()=>{if(url)try{setValidating(!0);let ccdaContent=await(await fetch(url)).text(),formData=new FormData;formData.append("ccdaFile",new Blob([ccdaContent],{type:"text/xml"}),"ccda.xml");let validationUrl=`${BASE_VALIDATION_URL}referenceccdaservice/?validationObjective=C-CDA_IG_Plus_Vocab&referenceFileName=No%20scenario%20File&curesUpdate=true&severityLevel=WARNING`,validationResponse=await fetch(validationUrl,{method:"POST",body:formData,credentials:"omit",redirect:"manual"});if(!validationResponse.ok)throw new Error(`Validation failed: ${validationResponse.status} ${validationResponse.statusText}`);let validationResult2=await validationResponse.json();setValidationResult(validationResult2)}catch(error){setValidationResult(void 0),console.error("CCDA validation error:",error)}finally{setValidating(!1)}},downloadResults=()=>{if(!validationResult)return;let resultsJson=JSON.stringify(validationResult,null,2);exportJsonFile(resultsJson,"ccda-validation-results")},getErrorCount=()=>validationResult?validationResult.resultsMetaData.resultMetaData.filter(item=>item?.type.includes("Error")).reduce((sum,item)=>sum+(item.count||0),0):0;return url?jsxs12("div",{"data-testid":"ccda-iframe",style:{maxWidth:props.maxWidth},children:[jsx30("div",{style:{minHeight:400},children:jsx30("iframe",{title:"C-CDA Viewer",width:"100%",height:"400",ref:iframeRef,src:CCDA_VIEWER_URL,allowFullScreen:!0,frameBorder:0,seamless:!0,onLoad:()=>setShouldSend(!0)})}),jsxs12("div",{style:{marginTop:"10px",marginBottom:"10px",display:"flex",alignItems:"center"},children:[jsx30(Button3,{type:"button",onClick:validateCcda,disabled:validating,children:validating?"Validating...":"Validate"}),validationResult&&jsxs12(Fragment7,{children:[jsxs12("div",{style:{marginLeft:"15px"},children:[jsx30("strong",{children:"Validation Results:"})," ",getErrorCount()," errors found"]}),jsx30(Button3,{type:"button",onClick:downloadResults,color:"green",style:{marginLeft:"auto"},children:"Download Full Results"})]})]})]}):null}import{jsx as jsx31,jsxs as jsxs13}from"react/jsx-runtime";function AttachmentDisplay(props){let{contentType,url:uncachedUrl,title}=props.value??{},url=useCachedBinaryUrl2(uncachedUrl);return url?jsxs13("div",{"data-testid":"attachment-display",children:[contentType?.startsWith("image/")&&jsx31("img",{"data-testid":"attachment-image",style:{maxWidth:props.maxWidth},src:url,alt:title}),contentType?.startsWith("video/")&&jsx31("video",{"data-testid":"attachment-video",style:{maxWidth:props.maxWidth},controls:!0,children:jsx31("source",{type:contentType,src:url})}),(contentType?.startsWith("text/")||contentType==="application/json"||contentType==="application/pdf")&&jsx31("div",{"data-testid":"attachment-iframe",style:{maxWidth:props.maxWidth,minHeight:400},children:jsx31("iframe",{title:"Attachment",width:"100%",height:"400",src:url+"#navpanes=0",allowFullScreen:!0,frameBorder:0,seamless:!0})}),contentType===ContentType2.CDA_XML&&jsx31(CcdaDisplay,{url}),jsx31("div",{"data-testid":"download-link",style:{padding:"2px 16px 16px 16px"},children:jsx31(Anchor2,{href:uncachedUrl,"data-testid":"attachment-details",target:"_blank",rel:"noopener noreferrer",download:getDownloadName(title),children:title||"Download"})})]}):null}function getDownloadName(title){return title?.includes(".")?title:void 0}function r(e){var t,f,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f)}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}var clsx_default=clsx;var DescriptionList_default={root:"DescriptionList_root",compact:"DescriptionList_compact"};import{Fragment as Fragment8,jsx as jsx32,jsxs as jsxs14}from"react/jsx-runtime";function DescriptionList(props){let{children,compact}=props;return jsx32("dl",{className:clsx_default(DescriptionList_default.root,{[DescriptionList_default.compact]:compact}),children})}function DescriptionListEntry(props){return jsxs14(Fragment8,{children:[jsx32("dt",{children:props.term}),jsx32("dd",{children:props.children})]})}import{Fragment as Fragment9,jsx as jsx33}from"react/jsx-runtime";function AttachmentArrayDisplay(props){let attachmentElements=props.values?.map((v,index)=>jsx33("div",{children:jsx33(AttachmentDisplay,{value:v,maxWidth:props.maxWidth})},"attatchment-"+index)),content;if(props.includeDescriptionListEntry){if(props.property===void 0)throw new Error("props.property is required when includeDescriptionListEntry is true");if(!isPopulated2(props.path))throw new Error("props.path is required when includeDescriptionListEntry is true");let key=props.path.split(".").pop();content=jsx33(DescriptionListEntry,{term:getPathDisplayName(key),children:attachmentElements})}else content=jsx33(Fragment9,{children:attachmentElements});return content}import{ActionIcon}from"@mantine/core";import{useRef as useRef5,useState as useState14}from"react";import{normalizeOperationOutcome}from"@medplum/core";import{useMedplum as useMedplum6}from"@medplum/react-hooks";import{useRef as useRef4}from"react";import{Fragment as Fragment10,jsx as jsx34,jsxs as jsxs15}from"react/jsx-runtime";function AttachmentButton(props){let medplum=useMedplum6(),fileInputRef=useRef4(null);function onClick(e){killEvent(e),fileInputRef.current?.click()}function onFileChange(e){killEvent(e);let files=e.target.files;files&&Array.from(files).forEach(processFile)}function processFile(file){!file||!file.name||(props.onUploadStart&&props.onUploadStart(),medplum.createAttachment({data:file,contentType:file.type||"application/octet-stream",filename:file.name,securityContext:props.securityContext,onProgress:props.onUploadProgress}).then(attachment=>props.onUpload(attachment)).catch(err=>{props.onUploadError&&props.onUploadError(normalizeOperationOutcome(err))}))}return jsxs15(Fragment10,{children:[jsx34("input",{disabled:props.disabled,type:"file","data-testid":"upload-file-input",style:{display:"none"},ref:fileInputRef,onChange:e=>onFileChange(e)}),props.children({onClick,disabled:props.disabled})]})}import{jsx as jsx35,jsxs as jsxs16}from"react/jsx-runtime";function AttachmentArrayInput(props){let[values,setValues]=useState14(props.defaultValue??[]),valuesRef=useRef5(values);valuesRef.current=values;function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}return jsxs16("table",{style:{width:"100%"},children:[jsxs16("colgroup",{children:[jsx35("col",{width:"97%"}),jsx35("col",{width:"3%"})]}),jsxs16("tbody",{children:[values.map((v,index)=>jsxs16("tr",{children:[jsx35("td",{children:jsx35(AttachmentDisplay,{value:v,maxWidth:200})}),jsx35("td",{children:jsx35(ActionIcon,{disabled:props.disabled,title:"Remove",variant:"subtle",size:"sm",color:"gray",onClick:e=>{killEvent(e);let copy=values.slice();copy.splice(index,1),setValuesWrapper(copy)},children:jsx35(IconCircleMinus,{})})})]},`${index}-${values.length}`)),jsxs16("tr",{children:[jsx35("td",{}),jsx35("td",{children:jsx35(AttachmentButton,{disabled:props.disabled,onUpload:attachment=>{setValuesWrapper([...valuesRef.current,attachment])},children:props2=>jsx35(ActionIcon,{...props2,title:"Add",variant:"subtle",size:"sm",color:props2.disabled?"gray":"green",children:jsx35(IconCloudUpload,{})})})})]})]})]})}import{Button as Button4}from"@mantine/core";import{useState as useState15}from"react";import{Fragment as Fragment11,jsx as jsx36,jsxs as jsxs17}from"react/jsx-runtime";function AttachmentInput(props){let[value,setValue]=useState15(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return value?jsxs17(Fragment11,{children:[jsx36(AttachmentDisplay,{value,maxWidth:200}),jsx36(Button4,{disabled:props.disabled,onClick:e=>{killEvent(e),setValueWrapper(void 0)},children:"Remove"})]}):jsx36(AttachmentButton,{disabled:props.disabled,securityContext:props.securityContext,onUpload:setValueWrapper,children:props2=>jsx36(Button4,{...props2,children:"Upload..."})})}import{Alert as Alert2,Center as Center2,Group as Group8,Stack as Stack3,Text as Text6,TextInput as TextInput4,Title}from"@mantine/core";import{normalizeErrorString as normalizeErrorString4}from"@medplum/core";import{useState as useState16}from"react";import{jsx as jsx37,jsxs as jsxs18}from"react/jsx-runtime";function Logo(props){let overrideUrl=import.meta.env.MEDPLUM_LOGO_URL;return overrideUrl?jsx37("img",{src:overrideUrl,alt:"Logo",style:{maxHeight:props.size}}):jsxs18("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 180 180",style:{width:props.size,height:props.size},children:[jsx37("title",{children:"Medplum Logo"}),jsx37("path",{fill:props.fill??"#9c36b5",d:"M84 56c-3-15-15-24-23-28l5-10c8 2 14 8 20 14 0-12 1-16 5-21 8-9 13-9 41-9 0 7 1 18-3 24-7 9-16 7-41 8 5 8 7 14 8 22 36-24 74-7 74 39 0 42-40 83-80 83s-80-41-80-83c0-46 38-63 74-39Zm-3 43H65c-4 0-7 3-7 7v4c0 4 3 7 7 7h16v16c0 4 3 7 7 7h4c4 0 7-3 7-7v-16h16c4 0 7-3 7-7v-4c0-4-3-7-7-7H99V83c0-4-3-7-7-7h-4c-4 0-7 3-7 7z"})]})}import{jsx as jsx38,jsxs as jsxs19}from"react/jsx-runtime";function MfaForm(props){let[errorMessage,setErrorMessage]=useState16();return jsx38(Form,{onSubmit:formData=>{setErrorMessage(void 0),props.onSubmit(formData)?.catch(err=>setErrorMessage(normalizeErrorString4(err)))},children:jsxs19(Stack3,{children:[jsxs19(Center2,{style:{flexDirection:"column"},children:[jsx38(Logo,{size:32}),jsx38(Title,{children:props.title})]}),errorMessage&&jsx38(Alert2,{icon:jsx38(IconAlertCircle,{size:16}),title:"Error",color:"red",children:errorMessage}),props.qrCodeUrl&&jsxs19(Stack3,{align:"center",children:[jsx38(Text6,{children:"Scan this QR code with your authenticator app."}),jsx38("img",{src:props.qrCodeUrl,alt:"Multi Factor Auth QR Code"})]}),jsx38(Stack3,{children:jsx38(TextInput4,{name:"token",label:"MFA code",autoComplete:"one-time-code",required:!0,autoFocus:!0})}),jsx38(Group8,{justify:"flex-end",mt:"xl",children:jsx38(SubmitButton,{children:props.buttonText})})]})})}import{normalizeOperationOutcome as normalizeOperationOutcome4}from"@medplum/core";import{useMedplum as useMedplum10}from"@medplum/react-hooks";import{useEffect as useEffect6,useState as useState20}from"react";import{Container as MantineContainer}from"@mantine/core";var Container_default={root:"Container_root"};import{jsx as jsx39}from"react/jsx-runtime";function Container(props){let{children,...others}=props;return jsx39(MantineContainer,{className:Container_default.root,...others,children})}import{Paper}from"@mantine/core";var Panel_default={paper:"Panel_paper",fill:"Panel_fill"};import{jsx as jsx40}from"react/jsx-runtime";function Panel(props){let{width,fill,className,children,...rest}=props,style=width?{maxWidth:width}:void 0;return jsx40(Paper,{className:clsx_default(Panel_default.paper,fill&&Panel_default.fill,className),style,shadow:"sm",radius:"sm",withBorder:!0,...rest,children})}import{jsx as jsx41}from"react/jsx-runtime";function Document(props){let{children,...others}=props;return jsx41(Container,{children:jsx41(Panel,{...others,children})})}import{Anchor as Anchor3,Center as Center3,Group as Group9,Stack as Stack4,Text as Text7,TextInput as TextInput5,Title as Title2}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome2}from"@medplum/core";import{useMedplum as useMedplum7}from"@medplum/react-hooks";import{useState as useState17}from"react";function getErrorsForInput(outcome,expression){return outcome?.issue?.filter(issue=>isExpressionMatch(issue.expression?.[0],expression))?.map(issue=>issue.details?.text)?.join(`
|
|
128
|
-
`)}function getIssuesForExpression(outcome,expression){return outcome?.issue?.filter(issue=>isExpressionMatch(issue.expression?.[0],expression))}var ARRAY_INDEX_REGEX=/\[\d+\]/;function isExpressionMatch(expr1,expr2){let isExpr1Indexed=typeof expr1=="string"&&ARRAY_INDEX_REGEX.test(expr1),isExpr2Indexed=typeof expr2=="string"&&ARRAY_INDEX_REGEX.test(expr2);if(isExpr1Indexed!==isExpr2Indexed&&(expr1=expr1?.replace(ARRAY_INDEX_REGEX,""),expr2=expr2?.replace(ARRAY_INDEX_REGEX,"")),expr1===expr2)return!0;if(!expr1||!expr2)return!1;let dot1=expr1.indexOf(".");if(dot1>=0&&expr1.substring(dot1+1)===expr2)return!0;let dot2=expr2.indexOf(".");return dot2>=0&&expr2.substring(dot2+1)===expr1}import{jsx as jsx42,jsxs as jsxs20}from"react/jsx-runtime";function NewProjectForm(props){let medplum=useMedplum7(),[outcome,setOutcome]=useState17();return jsxs20(Form,{onSubmit:async formData=>{try{props.handleAuthResponse(await medplum.startNewProject({login:props.login,projectName:formData.projectName}))}catch(err){setOutcome(normalizeOperationOutcome2(err))}},children:[jsxs20(Center3,{style:{flexDirection:"column"},children:[jsx42(Logo,{size:32}),jsx42(Title2,{children:"Create project"})]}),jsxs20(Stack4,{gap:"xl",children:[jsx42(TextInput5,{name:"projectName",label:"Project Name",placeholder:"My Project",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"projectName")}),jsxs20(Text7,{c:"dimmed",size:"xs",children:["By clicking submit you agree to the Medplum"," ",jsx42(Anchor3,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx42(Anchor3,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]})]}),jsx42(Group9,{justify:"flex-end",mt:"xl",wrap:"nowrap",children:jsx42(SubmitButton,{children:"Create project"})})]})}import{Anchor as Anchor4,Center as Center4,Checkbox,Divider,Group as Group10,PasswordInput,Stack as Stack5,Text as Text8,TextInput as TextInput6}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome3}from"@medplum/core";import{useMedplum as useMedplum9}from"@medplum/react-hooks";import{useEffect as useEffect5,useState as useState19}from"react";import{useMedplum as useMedplum8}from"@medplum/react-hooks";import{useEffect as useEffect4,useRef as useRef6,useState as useState18}from"react";function createScriptTag(src,onload){let head=document.getElementsByTagName("head")[0],script=document.createElement("script");script.async=!0,script.src=src,script.onload=onload??null,head.appendChild(script)}import{jsx as jsx43}from"react/jsx-runtime";function GoogleButton(props){let medplum=useMedplum8(),{googleClientId,handleGoogleCredential}=props,parentRef=useRef6(null),[scriptLoaded,setScriptLoaded]=useState18(typeof google<"u"),[initialized,setInitialized]=useState18(!1),[buttonRendered,setButtonRendered]=useState18(!1);return useEffect4(()=>{if(typeof google>"u"){createScriptTag("https://accounts.google.com/gsi/client",()=>setScriptLoaded(!0));return}initialized||(google.accounts.id.initialize({client_id:googleClientId,callback:handleGoogleCredential}),setInitialized(!0)),parentRef.current&&!buttonRendered&&(google.accounts.id.renderButton(parentRef.current,{}),setButtonRendered(!0))},[medplum,googleClientId,initialized,scriptLoaded,parentRef,buttonRendered,handleGoogleCredential]),googleClientId?jsx43("div",{ref:parentRef}):null}import{locationUtils as locationUtils3}from"@medplum/core";function getGoogleClientId(clientId){if(clientId)return clientId;let origin=locationUtils3.getOrigin();if(origin&&("undefined"?.split(",")??[]).includes(origin))return"__GOOGLE_CLIENT_ID__"}import{Alert as Alert3}from"@mantine/core";import{operationOutcomeIssueToString}from"@medplum/core";import{jsx as jsx44}from"react/jsx-runtime";function OperationOutcomeAlert(props){let issues=props.outcome?.issue||props.issues;return!issues||issues.length===0?null:jsx44(Alert3,{icon:jsx44(IconAlertCircle,{size:16}),color:"red",children:issues.map(issue=>jsx44("div",{"data-testid":"text-field-error",children:operationOutcomeIssueToString(issue)},issue.details?.text))})}function initRecaptcha(siteKey){typeof grecaptcha>"u"&&createScriptTag("https://www.google.com/recaptcha/api.js?render="+siteKey)}function getRecaptcha(siteKey){return new Promise((resolve,reject)=>{grecaptcha.ready(async()=>{try{resolve(await grecaptcha.execute(siteKey,{action:"submit"}))}catch(err){reject(err)}})})}import{Fragment as Fragment12,jsx as jsx45,jsxs as jsxs21}from"react/jsx-runtime";function NewUserForm(props){let googleClientId=getGoogleClientId(props.googleClientId),recaptchaSiteKey=props.recaptchaSiteKey,medplum=useMedplum9(),[outcome,setOutcome]=useState19(),issues=getIssuesForExpression(outcome,void 0);return useEffect5(()=>{recaptchaSiteKey&&initRecaptcha(recaptchaSiteKey)},[recaptchaSiteKey]),jsxs21(Form,{onSubmit:async formData=>{setOutcome(void 0);try{let recaptchaToken="";recaptchaSiteKey&&(recaptchaToken=await getRecaptcha(recaptchaSiteKey)),props.handleAuthResponse(await medplum.startNewUser({projectId:props.projectId,clientId:props.clientId,firstName:formData.firstName,lastName:formData.lastName,email:formData.email,password:formData.password,remember:formData.remember==="true",recaptchaSiteKey,recaptchaToken}))}catch(err){setOutcome(normalizeOperationOutcome3(err))}},children:[jsx45(Center4,{style:{flexDirection:"column"},children:props.children}),jsx45(OperationOutcomeAlert,{issues}),googleClientId&&jsxs21(Fragment12,{children:[jsx45(Group10,{justify:"center",p:"xl",style:{height:70},children:jsx45(GoogleButton,{googleClientId,handleGoogleCredential:async response=>{try{props.handleAuthResponse(await medplum.startGoogleLogin({googleClientId:response.clientId,googleCredential:response.credential,projectId:props.projectId,createUser:!0}))}catch(err){setOutcome(normalizeOperationOutcome3(err))}}})}),jsx45(Divider,{label:"or",labelPosition:"center",my:"lg"})]}),jsxs21(Stack5,{gap:"xl",children:[jsx45(TextInput6,{name:"firstName",type:"text",label:"First name",placeholder:"First name",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"firstName")}),jsx45(TextInput6,{name:"lastName",type:"text",label:"Last name",placeholder:"Last name",required:!0,error:getErrorsForInput(outcome,"lastName")}),jsx45(TextInput6,{name:"email",type:"email",label:"Email",placeholder:"name@domain.com",required:!0,error:getErrorsForInput(outcome,"email")}),jsx45(PasswordInput,{name:"password",label:"Password",autoComplete:"off",required:!0,error:getErrorsForInput(outcome,"password")}),jsxs21(Text8,{c:"dimmed",size:"xs",children:["By clicking submit you agree to the Medplum"," ",jsx45(Anchor4,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx45(Anchor4,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]}),jsxs21(Text8,{c:"dimmed",size:"xs",children:["This site is protected by reCAPTCHA and the Google"," ",jsx45(Anchor4,{href:"https://policies.google.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx45(Anchor4,{href:"https://policies.google.com/terms",children:"Terms\xA0of\xA0Service"})," apply."]})]}),jsxs21(Group10,{justify:"space-between",mt:"xl",wrap:"nowrap",children:[jsx45(Checkbox,{name:"remember",label:"Remember me",size:"xs"}),jsx45(SubmitButton,{children:"Create account"})]})]})}import{jsx as jsx46,jsxs as jsxs22}from"react/jsx-runtime";function RegisterForm(props){let{type,projectId,clientId,googleClientId,recaptchaSiteKey,onSuccess}=props,medplum=useMedplum10(),[login,setLogin]=useState20(),[outcome,setOutcome]=useState20();useEffect6(()=>{type==="patient"&&login&&medplum.startNewPatient({login,projectId}).then(response=>medplum.processCode(response.code)).then(()=>onSuccess()).catch(err=>setOutcome(normalizeOperationOutcome4(err)))},[medplum,type,projectId,login,onSuccess]);function handleAuthResponse(response){response.code?medplum.processCode(response.code).then(()=>onSuccess()).catch(console.log):response.login&&setLogin(response.login)}return jsxs22(Document,{width:450,children:[outcome&&jsx46("pre",{children:JSON.stringify(outcome,null,2)}),!login&&jsx46(NewUserForm,{projectId,clientId,googleClientId,recaptchaSiteKey,handleAuthResponse,children:props.children}),login&&type==="project"&&jsx46(NewProjectForm,{login,handleAuthResponse})]})}import{showNotification as showNotification3}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString5}from"@medplum/core";import{useMedplum as useMedplum14}from"@medplum/react-hooks";import{useCallback as useCallback6,useEffect as useEffect7,useRef as useRef7,useState as useState23}from"react";import{Anchor as Anchor5,Button as Button5,Center as Center5,Checkbox as Checkbox2,Divider as Divider2,Flex,Group as Group11,PasswordInput as PasswordInput2,Stack as Stack6,Text as Text9,TextInput as TextInput7}from"@mantine/core";import{locationUtils as locationUtils4,normalizeOperationOutcome as normalizeOperationOutcome5}from"@medplum/core";import{useMedplum as useMedplum11}from"@medplum/react-hooks";import{useCallback as useCallback5,useState as useState21}from"react";var AuthenticationForm_default={userNotice:"AuthenticationForm_userNotice"};import{Fragment as Fragment13,jsx as jsx47,jsxs as jsxs23}from"react/jsx-runtime";function AuthenticationForm(props){let[email,setEmail]=useState21();return email?jsx47(PasswordForm,{email,resetEmail:()=>setEmail(void 0),...props}):jsx47(EmailForm,{setEmail,...props})}function EmailForm(props){let{setEmail,onRegister,handleAuthResponse,children,disableEmailAuth,...baseLoginRequest}=props,medplum=useMedplum11(),googleClientId=!props.disableGoogleAuth&&getGoogleClientId(props.googleClientId),[outcome,setOutcome]=useState21(),issues=getIssuesForExpression(outcome,void 0),isExternalAuth=useCallback5(async authMethod=>{if(!authMethod.authorizeUrl)return!1;let state=JSON.stringify({...await medplum.ensureCodeChallenge(baseLoginRequest),domain:authMethod.domain}),url=new URL(authMethod.authorizeUrl);return url.searchParams.set("state",state),locationUtils4.assign(url.toString()),!0},[medplum,baseLoginRequest]),handleSubmit=useCallback5(async formData=>{let authMethod=await medplum.post("auth/method",{email:formData.email});await isExternalAuth(authMethod)||setEmail(formData.email)},[medplum,isExternalAuth,setEmail]),handleGoogleCredential=useCallback5(async response=>{try{let authResponse=await medplum.startGoogleLogin({...baseLoginRequest,googleCredential:response.credential});await isExternalAuth(authResponse)||handleAuthResponse(authResponse)}catch(err){setOutcome(normalizeOperationOutcome5(err))}},[medplum,baseLoginRequest,isExternalAuth,handleAuthResponse]);return jsxs23(Form,{onSubmit:handleSubmit,children:[jsx47(Center5,{style:{flexDirection:"column"},children}),jsx47(OperationOutcomeAlert,{issues}),googleClientId&&jsxs23(Fragment13,{children:[jsx47(Group11,{justify:"center",p:"xl",style:{height:70},children:jsx47(GoogleButton,{googleClientId,handleGoogleCredential})}),!disableEmailAuth&&jsx47(Divider2,{label:"or",labelPosition:"center",my:"lg"})]}),!disableEmailAuth&&jsx47(TextInput7,{name:"email",type:"email",label:"Email",placeholder:"name@domain.com",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"email"),"data-testid":"auth.email"}),jsxs23(Group11,{justify:"space-between",mt:"xl",gap:0,wrap:"nowrap",children:[jsx47("div",{children:onRegister&&jsx47(Anchor5,{component:"button",type:"button",c:"dimmed",onClick:onRegister,size:"xs","data-dashlane-ignore":"true","data-lp-ignore":"true","data-no-autofill":"true","data-form-type":"navigation",children:"Register"})}),!disableEmailAuth&&jsx47(SubmitButton,{children:"Next"})]})]})}function PasswordForm(props){let{onForgotPassword,handleAuthResponse,children,...baseLoginRequest}=props,medplum=useMedplum11(),[outcome,setOutcome]=useState21(),issues=getIssuesForExpression(outcome,void 0),handleSubmit=useCallback5(formData=>{medplum.startLogin({...baseLoginRequest,password:formData.password,remember:formData.remember==="on"}).then(handleAuthResponse).catch(err=>setOutcome(normalizeOperationOutcome5(err)))},[medplum,baseLoginRequest,handleAuthResponse]);return jsxs23(Form,{onSubmit:handleSubmit,children:[jsx47(Center5,{style:{flexDirection:"column"},children}),jsx47(OperationOutcomeAlert,{issues}),jsxs23(Stack6,{gap:"sm",children:[jsx47(PasswordInput2,{name:"password",label:"Password",autoComplete:"off",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"password"),"data-testid":"auth.password"}),jsxs23(Flex,{className:AuthenticationForm_default.userNotice,justify:"space-between",align:"center",px:"xs",bdrs:"sm",children:[jsxs23(Text9,{size:"xs",children:["Logging in as ",jsx47("em",{children:props.email})]}),jsx47(Button5,{variant:"transparent",onClick:props.resetEmail,size:"compact-xs",children:"Change"})]})]}),jsxs23(Group11,{justify:"space-between",mt:"xl",gap:0,wrap:"nowrap",children:[onForgotPassword&&jsx47(Anchor5,{component:"button",type:"button",c:"dimmed",onClick:onForgotPassword,size:"xs",children:"Forgot password"}),jsx47(Checkbox2,{id:"remember",name:"remember",label:"Remember me",size:"xs",style:{lineHeight:1}}),jsx47(SubmitButton,{children:"Sign in"})]})]})}import{Avatar as Avatar3,Combobox as Combobox2,Flex as Flex2,Group as Group12,Stack as Stack7,Text as Text10,TextInput as TextInput8,Title as Title3,useCombobox as useCombobox2}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome6}from"@medplum/core";import{useMedplum as useMedplum12}from"@medplum/react-hooks";import{useState as useState22}from"react";import{jsx as jsx48,jsxs as jsxs24}from"react/jsx-runtime";function ChooseProfileForm(props){let medplum=useMedplum12(),combobox=useCombobox2(),[search,setSearch]=useState22(""),[outcome,setOutcome]=useState22();function filterDisplay(display){return!!display?.toLowerCase()?.includes(search.toLowerCase())}function filterMembership(membership){return filterDisplay(membership.profile?.display)||filterDisplay(membership.project?.display)}function handleValueSelect(membershipId){medplum.post("auth/profile",{login:props.login,profile:membershipId}).then(props.handleAuthResponse).catch(err=>setOutcome(normalizeOperationOutcome6(err)))}let options=props.memberships.filter(filterMembership).slice(0,10).map(item=>jsx48(Combobox2.Option,{value:item.id,children:jsx48(SelectOption,{...item})},item.id));return jsxs24(Stack7,{children:[jsxs24(Flex2,{gap:"md",mb:"md",justify:"center",align:"center",direction:"column",wrap:"nowrap",children:[jsx48(Logo,{size:32}),jsx48(Title3,{order:3,children:"Choose profile"})]}),jsx48(OperationOutcomeAlert,{outcome}),jsxs24(Combobox2,{store:combobox,onOptionSubmit:handleValueSelect,children:[jsx48(Combobox2.EventsTarget,{children:jsx48(TextInput8,{placeholder:"Search",value:search,onChange:event=>{setSearch(event.currentTarget.value),combobox.updateSelectedOptionIndex()}})}),jsx48("div",{children:jsx48(Combobox2.Options,{children:options.length>0?options:jsx48(Combobox2.Empty,{children:"Nothing found..."})})})]})]})}function getMembershipLabel(membership){return membership.identifier?.find(i=>i.system==="https://medplum.com/identifier/label")?.value}function SelectOption(membership){let label=getMembershipLabel(membership);return jsxs24(Group12,{children:[jsx48(Avatar3,{radius:"xl"}),jsxs24("div",{children:[jsx48(Text10,{fz:"sm",fw:500,children:membership.profile?.display}),jsxs24(Text10,{fz:"xs",opacity:.6,children:[membership.project?.display," ",label?` - ${label}`:""]})]})]})}import{Center as Center6,Checkbox as Checkbox3,Group as Group13,Stack as Stack8,Title as Title4}from"@mantine/core";import{useMedplum as useMedplum13}from"@medplum/react-hooks";import{Fragment as Fragment14}from"react/jsx-runtime";import{jsx as jsx49,jsxs as jsxs25}from"react/jsx-runtime";var openConditionScope=/^patient\/Condition\.(?:\*|c?r?u?d?s?)$/,encounterDiagnosis="?category=http://terminology.hl7.org/CodeSystem/condition-category|encounter-diagnosis",problemListItem="?category=http://terminology.hl7.org/CodeSystem/condition-category|problem-list-item",healthConcern="?category=http://hl7.org/fhir/us/core/CodeSystem/condition-category|health-concern",openObservationScope=/^patient\/Observation\.(?:\*|c?r?u?d?s?)$/,clinicalTest="?category=http://hl7.org/fhir/us/core/CodeSystem/us-core-observation-category|clinical-test",laboratory="?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory",socialHistory="?category=http://terminology.hl7.org/CodeSystem/observation-category|social-history",sdoh="?category=http://hl7.org/fhir/us/core/CodeSystem/us-core-category|sdoh",survey="?category=http://terminology.hl7.org/CodeSystem/observation-category|survey",vitalSigns="?category=http://terminology.hl7.org/CodeSystem/observation-category|vital-signs";function ChooseScopeForm(props){let medplum=useMedplum13();return jsx49(Form,{onSubmit:formData=>{medplum.post("auth/scope",{login:props.login,scope:Object.keys(formData).join(" ")}).then(props.handleAuthResponse).catch(console.log)},children:jsxs25(Stack8,{children:[jsxs25(Center6,{style:{flexDirection:"column"},children:[jsx49(Logo,{size:32}),jsx49(Title4,{children:"Choose scope"})]}),jsx49(Stack8,{children:(props.scope??"openid").split(" ").map(scopeName=>{let additionalScopes;return openConditionScope.test(scopeName)?additionalScopes=[scopeName+encounterDiagnosis,scopeName+problemListItem,scopeName+healthConcern]:openObservationScope.test(scopeName)&&(additionalScopes=[scopeName+clinicalTest,scopeName+laboratory,scopeName+socialHistory,scopeName+sdoh,scopeName+survey,scopeName+vitalSigns]),jsxs25(Fragment14,{children:[jsx49(Checkbox3,{id:scopeName,name:scopeName,label:scopeName,defaultChecked:!0},scopeName),additionalScopes?.map(scope=>jsx49(Checkbox3,{id:scope,name:scope,label:scope},scope))]},scopeName+"_group")})}),jsx49(Group13,{justify:"flex-end",mt:"xl",children:jsx49(SubmitButton,{children:"Set scope"})})]})})}import{jsx as jsx50}from"react/jsx-runtime";function SignInForm(props){let{login:loginCode,chooseScopes,onSuccess,onForgotPassword,onRegister,onCode,...baseLoginRequest}=props,medplum=useMedplum14(),[login,setLogin]=useState23(),loginRequested=useRef7(!1),[mfaEnrollRequired,setMfaEnrollRequired]=useState23(!1),[enrollQrCode,setEnrollQrCode]=useState23(),[mfaRequired,setMfaRequired]=useState23(!1),[memberships,setMemberships]=useState23(),handleCode=useCallback6(code=>{onCode?onCode(code):medplum.processCode(code).then(()=>{onSuccess&&onSuccess()}).catch(err=>showNotification3({color:"red",message:normalizeErrorString5(err)}))},[medplum,onCode,onSuccess]),handleAuthResponse=useCallback6(response=>{setMfaEnrollRequired(!!response.mfaEnrollRequired),setEnrollQrCode(response.enrollQrCode),setMfaRequired(!!response.mfaRequired),response.login&&setLogin(response.login),response.memberships&&setMemberships(response.memberships),response.code&&(chooseScopes?setMemberships(void 0):handleCode(response.code))},[chooseScopes,handleCode]),handleScopeResponse=useCallback6(response=>{handleCode(response.code)},[handleCode]);return useEffect7(()=>{loginCode&&!loginRequested.current&&!login&&(loginRequested.current=!0,medplum.get("auth/login/"+loginCode).then(handleAuthResponse).catch(err=>showNotification3({color:"red",message:normalizeErrorString5(err)})))},[medplum,loginCode,loginRequested,login,handleAuthResponse]),jsx50(Document,{width:450,px:"sm",py:"md",children:login?mfaEnrollRequired&&enrollQrCode?jsx50(MfaForm,{title:"Enroll in MFA",buttonText:"Enroll",qrCodeUrl:enrollQrCode,onSubmit:async fields=>{let res=await medplum.post("auth/mfa/login-enroll",{login,token:fields.token});handleAuthResponse(res)}}):mfaRequired?jsx50(MfaForm,{title:"Enter MFA code",buttonText:"Submit code",onSubmit:async fields=>{let res=await medplum.post("auth/mfa/verify",{login,token:fields.token});handleAuthResponse(res)}}):memberships?jsx50(ChooseProfileForm,{login,memberships,handleAuthResponse}):props.projectId==="new"?jsx50(NewProjectForm,{login,handleAuthResponse}):props.chooseScopes?jsx50(ChooseScopeForm,{login,scope:props.scope,handleAuthResponse:handleScopeResponse}):jsx50("div",{children:"Success"}):jsx50(AuthenticationForm,{onForgotPassword,onRegister,handleAuthResponse,disableGoogleAuth:props.disableGoogleAuth,disableEmailAuth:props.disableEmailAuth,...baseLoginRequest,children:props.children})})}import{buildElementsContext as buildElementsContext2,getPathDisplayName as getPathDisplayName3,isEmpty as isEmpty2,tryGetDataType}from"@medplum/core";import{useContext as useContext6,useMemo as useMemo6}from"react";import{ActionIcon as ActionIcon2,CopyButton,Flex as Flex3,Tooltip as Tooltip2}from"@mantine/core";import{PropertyType,formatDateTime,formatPeriod,formatTiming,isEmpty}from"@medplum/core";import{useState as useState26}from"react";import{formatCodeableConcept}from"@medplum/core";import{Fragment as Fragment15,jsx as jsx51}from"react/jsx-runtime";function CodeableConceptDisplay(props){return jsx51(Fragment15,{children:formatCodeableConcept(props.value)})}import{formatCoding}from"@medplum/core";import{Fragment as Fragment16,jsx as jsx52}from"react/jsx-runtime";function CodingDisplay(props){return jsx52(Fragment16,{children:formatCoding(props.value)})}import{Fragment as Fragment17,jsx as jsx53}from"react/jsx-runtime";function ContactPointDisplay(props){let contactPoint=props.value;if(!contactPoint)return null;let builder=[];return contactPoint.value&&builder.push(contactPoint.value),(contactPoint.use||contactPoint.system)&&(builder.push(" ["),contactPoint.use&&builder.push(contactPoint.use),contactPoint.use&&contactPoint.system&&builder.push(" "),contactPoint.system&&builder.push(contactPoint.system),builder.push("]")),jsx53(Fragment17,{children:builder.join("").trim()})}import{Fragment as Fragment18,jsx as jsx54,jsxs as jsxs26}from"react/jsx-runtime";function ContactDetailDisplay(props){let contactDetail=props.value;return contactDetail?jsxs26(Fragment18,{children:[contactDetail.name,contactDetail.name&&": ",contactDetail.telecom?.map(telecom=>jsx54(ContactPointDisplay,{value:telecom},`telecom-${contactDetail.name}-${telecom.value}`))]}):null}import{getDataType,isPopulated as isPopulated3,isProfileLoaded,tryGetProfile}from"@medplum/core";import{useMedplum as useMedplum15}from"@medplum/react-hooks";import{useContext as useContext3,useEffect as useEffect8,useMemo as useMemo3,useState as useState24}from"react";import{getTypedPropertyValue,getTypedPropertyValueWithSchema}from"@medplum/core";function getValueAndType(context,path,profileUrl){let typedResult=getTypedPropertyValue(context,path,{profileUrl});return typedResult?Array.isArray(typedResult)?[typedResult.map(e=>e.value),typedResult[0].type]:[typedResult.value,typedResult.type]:[void 0,"undefined"]}function getValueAndTypeFromElement(typedValue,path,element){let typedResult=getTypedPropertyValueWithSchema(typedValue,path,element);return typedResult?Array.isArray(typedResult)?[typedResult.map(e=>e.value),typedResult[0].type]:[typedResult.value,typedResult.type]:[void 0,"undefined"]}import{jsx as jsx55}from"react/jsx-runtime";function ExtensionDisplay(props){let{elementDefinitionType}=props,medplum=useMedplum15(),ctx=useContext3(ElementsContext),[typeSchema,setTypeSchema]=useState24(getDataType("Extension")),profileUrl=useMemo3(()=>{if(isPopulated3(elementDefinitionType?.profile))return elementDefinitionType.profile[0]},[elementDefinitionType]),[loadingProfile,setLoadingProfile]=useState24(profileUrl!==void 0);if(useEffect8(()=>{profileUrl&&(setLoadingProfile(!0),medplum.requestProfileSchema(profileUrl).then(()=>{let profile=tryGetProfile(profileUrl);setLoadingProfile(!1),profile&&setTypeSchema(profile)}).catch(reason=>{setLoadingProfile(!1),console.warn(reason)}))},[medplum,profileUrl]),profileUrl&&(loadingProfile||!isProfileLoaded(profileUrl)))return jsx55("div",{children:"Loading..."});if(typeSchema.elements["value[x]"]?.max!==0){let[propertyValue,propertyType]=getValueAndType({type:"Extension",value:props.value},"value[x]",profileUrl??ctx.profileUrl);return jsx55(ResourcePropertyDisplay,{propertyType,value:propertyValue})}return jsx55(BackboneElementDisplay,{path:props.path,value:{type:typeSchema.type,value:props.value},compact:props.compact,ignoreMissingValues:props.ignoreMissingValues,link:props.link,profileUrl})}import{jsxs as jsxs27}from"react/jsx-runtime";function IdentifierDisplay(props){return jsxs27("div",{children:[props.value?.system,": ",props.value?.value]})}import{formatMoney}from"@medplum/core";import{Fragment as Fragment19,jsx as jsx56}from"react/jsx-runtime";function MoneyDisplay(props){return jsx56(Fragment19,{children:formatMoney(props.value)})}import{formatQuantity}from"@medplum/core";import{Fragment as Fragment20,jsx as jsx57}from"react/jsx-runtime";function QuantityDisplay(props){return jsx57(Fragment20,{children:formatQuantity(props.value)})}import{formatRange}from"@medplum/core";import{Fragment as Fragment21,jsx as jsx58}from"react/jsx-runtime";function RangeDisplay(props){return jsx58(Fragment21,{children:formatRange(props.value)})}import{Fragment as Fragment22,jsx as jsx59,jsxs as jsxs28}from"react/jsx-runtime";function RatioDisplay(props){let value=props.value;return value?jsxs28(Fragment22,{children:[jsx59(QuantityDisplay,{value:value.numerator}),"\xA0/\xA0",jsx59(QuantityDisplay,{value:value.denominator})]}):null}import{stringify}from"@medplum/core";import{Fragment as Fragment23,jsx as jsx60}from"react/jsx-runtime";function ReferenceDisplay(props){if(!props.value)return null;let displayString=props.value.display||props.value.reference||stringify(props.value);return props.link!==!1&&props.value.reference?jsx60(MedplumLink,{to:props.value,children:displayString}):jsx60(Fragment23,{children:displayString})}import{Group as Group14,Text as Text11}from"@mantine/core";import{getPathDisplayName as getPathDisplayName2,isPopulated as isPopulated6}from"@medplum/core";import{useMedplum as useMedplum16}from"@medplum/react-hooks";import{useContext as useContext5,useEffect as useEffect9,useMemo as useMemo5,useState as useState25}from"react";import{getValueSliceName,isPopulated as isPopulated4,isSliceDefinitionWithTypes,tryGetProfile as tryGetProfile2}from"@medplum/core";function assignValuesIntoSlices(values,slices,slicing,profileUrl){if(!isPopulated4(slicing?.slices))return[values];let slicedValues=new Array(slices.length+1);for(let i=0;i<slicedValues.length;i++)slicedValues[i]=[];for(let value of values){let sliceName=getValueSliceName(value,slices,slicing.discriminator,profileUrl),sliceIndex=sliceName?slices.findIndex(slice=>slice.name===sliceName):-1;sliceIndex===-1&&(sliceIndex=slices.length),slicedValues[sliceIndex].push(value)}return slicedValues}async function prepareSlices({medplum,property}){return new Promise((resolve,reject)=>{if(!property.slicing){resolve([]);return}let supportedSlices=[],profileUrls=[],promises=[];for(let slice of property.slicing.slices){if(!isSliceDefinitionWithTypes(slice)){console.debug("Unsupported slice definition",slice);continue}let profileUrl;isPopulated4(slice.elements)||(profileUrl=slice.type[0]?.profile?.[0]),supportedSlices.push(slice),profileUrls.push(profileUrl),profileUrl&&promises.push(medplum.requestProfileSchema(profileUrl))}Promise.all(promises).then(()=>{for(let i=0;i<supportedSlices.length;i++){let slice=supportedSlices[i],profileUrl=profileUrls[i];if(profileUrl){let typeSchema=tryGetProfile2(profileUrl);slice.typeSchema=typeSchema}}resolve(supportedSlices)}).catch(reject)})}import{buildElementsContext,isPopulated as isPopulated5}from"@medplum/core";import{useContext as useContext4,useMemo as useMemo4}from"react";import{jsx as jsx61}from"react/jsx-runtime";function maybeWrapWithContext(ContextProvider,contextValue,contents){return contextValue!==void 0?jsx61(ContextProvider,{value:contextValue,children:contents}):contents}import{Fragment as Fragment24,jsx as jsx62}from"react/jsx-runtime";function SliceDisplay(props){let{slice,property}=props,sliceElements=slice.typeSchema?.elements??slice.elements,parentContext=useContext4(ElementsContext),contextValue=useMemo4(()=>{if(isPopulated5(sliceElements))return buildElementsContext({parentContext,elements:sliceElements,path:props.path,profileUrl:slice.typeSchema?.url})},[parentContext,props.path,slice.typeSchema?.url,sliceElements]);return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx62(Fragment24,{children:props.value.map((value,valueIndex)=>jsx62("div",{children:jsx62(ResourcePropertyDisplay,{property,path:props.path,arrayElement:!0,elementDefinitionType:slice.type[0],propertyType:slice.type[0].code,value,ignoreMissingValues:props.ignoreMissingValues,link:props.link})},`${valueIndex}-${props.value.length}`))}))}import{Fragment as Fragment25,jsx as jsx63,jsxs as jsxs29}from"react/jsx-runtime";var MAX_ARRAY_SIZE=50;function ResourceArrayDisplay(props){let{property,propertyType}=props,medplum=useMedplum16(),values=useMemo5(()=>Array.isArray(props.values)?props.values:[],[props.values]),[loading,setLoading]=useState25(!0),[slices,setSlices]=useState25([]),[slicedValues,setSlicedValues]=useState25(()=>[values]),[valuesLength,setValuesLength]=useState25(0),ctx=useContext5(ElementsContext);if(useEffect9(()=>{prepareSlices({medplum,property}).then(slices2=>{setValuesLength(values.length),setSlices(slices2);let limitedValues=values.slice(0,MAX_ARRAY_SIZE),slicedValues2=assignValuesIntoSlices(limitedValues,slices2,property.slicing,ctx.profileUrl);setSlicedValues(slicedValues2),setLoading(!1)}).catch(reason=>{console.error(reason),setLoading(!1)})},[medplum,property,ctx.profileUrl,setSlicedValues,values]),loading)return jsx63("div",{children:"Loading..."});let nonSliceContent;if(property.type[0]?.code!=="Extension"){let nonSliceValues=slicedValues[slices.length],nonSliceElements=nonSliceValues.map((value,valueIndex)=>jsx63("div",{children:jsx63(ResourcePropertyDisplay,{path:props.path,arrayElement:!0,property,propertyType,value,ignoreMissingValues:props.ignoreMissingValues,link:props.link})},`${valueIndex}-${nonSliceValues.length}`));if(props.includeDescriptionListEntry){if(!isPopulated6(props.path))throw new Error("props.path is required when includeDescriptionListEntry is true");let key=props.path.split(".").pop();nonSliceContent=jsx63(DescriptionListEntry,{term:getPathDisplayName2(key),children:nonSliceElements})}else nonSliceContent=jsx63(Fragment25,{children:nonSliceElements})}return jsxs29(Fragment25,{children:[slices.map((slice,sliceIndex)=>{if(!props.path)throw Error(`Displaying a resource property with slices of type ${props.propertyType} requires path`);let sliceDisplay=jsx63(SliceDisplay,{path:props.path,slice,property,value:slicedValues[sliceIndex],ignoreMissingValues:props.ignoreMissingValues,link:props.link},slice.name);return props.includeDescriptionListEntry&&(sliceDisplay=jsx63(DescriptionListEntry,{term:getPathDisplayName2(slice.name),children:sliceDisplay},slice.name)),sliceDisplay}),nonSliceContent,valuesLength>MAX_ARRAY_SIZE&&jsx63(Group14,{justify:"right",children:jsxs29(Text11,{children:["... ",valuesLength," total values"]})})]})}import{Fragment as Fragment26,jsx as jsx64,jsxs as jsxs30}from"react/jsx-runtime";function ResourcePropertyDisplay(props){let{property,propertyType,value}=props;if(property?.path?.endsWith(".id"))return jsxs30(Flex3,{gap:3,align:"center",children:[value,!isEmpty(value)&&jsx64(CopyButton,{value,timeout:2e3,children:({copied,copy})=>jsx64(Tooltip2,{label:copied?"Copied":"Copy",withArrow:!0,position:"right",children:jsx64(ActionIcon2,{variant:"subtle",color:copied?"teal":"gray",onClick:copy,children:copied?jsx64(IconCheck,{size:"1rem"}):jsx64(IconCopy,{size:"1rem"})})})})]});if(property&&(property.isArray||property.max>1)&&!props.arrayElement)return propertyType===PropertyType.Attachment?jsx64(AttachmentArrayDisplay,{values:value,maxWidth:props.maxWidth,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,property,path:props.path}):jsx64(ResourceArrayDisplay,{path:props.path,property,propertyType,values:value,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,ignoreMissingValues:props.ignoreMissingValues,link:props.link});switch(propertyType){case PropertyType.boolean:return jsx64(Fragment26,{children:value===void 0?"":(!!value).toString()});case PropertyType.SystemString:case PropertyType.string:return props.property?.path?.toLowerCase().includes("secret")?jsx64(SecretFieldDisplay,{value}):jsx64("div",{style:{whiteSpace:"pre-wrap"},children:value});case PropertyType.code:case PropertyType.date:case PropertyType.decimal:case PropertyType.id:case PropertyType.integer:case PropertyType.positiveInt:case PropertyType.unsignedInt:case PropertyType.uri:case PropertyType.url:case PropertyType.xhtml:return jsx64(Fragment26,{children:value});case PropertyType.canonical:return jsx64(ReferenceDisplay,{value:{reference:value},link:props.link});case PropertyType.dateTime:case PropertyType.instant:return jsx64(Fragment26,{children:formatDateTime(value)});case PropertyType.markdown:return jsx64("pre",{children:value});case PropertyType.Address:return jsx64(AddressDisplay,{value});case PropertyType.Annotation:return jsx64(Fragment26,{children:value?.text});case PropertyType.Attachment:return jsx64(AttachmentDisplay,{value,maxWidth:props.maxWidth});case PropertyType.CodeableConcept:return jsx64(CodeableConceptDisplay,{value});case PropertyType.Coding:return jsx64(CodingDisplay,{value});case PropertyType.ContactDetail:return jsx64(ContactDetailDisplay,{value});case PropertyType.ContactPoint:return jsx64(ContactPointDisplay,{value});case PropertyType.HumanName:return jsx64(HumanNameDisplay,{value});case PropertyType.Identifier:return jsx64(IdentifierDisplay,{value});case PropertyType.Money:return jsx64(MoneyDisplay,{value});case PropertyType.Period:return jsx64(Fragment26,{children:formatPeriod(value)});case PropertyType.Quantity:case PropertyType.Duration:return jsx64(QuantityDisplay,{value});case PropertyType.Range:return jsx64(RangeDisplay,{value});case PropertyType.Ratio:return jsx64(RatioDisplay,{value});case PropertyType.Reference:return jsx64(ReferenceDisplay,{value,link:props.link});case PropertyType.Timing:return jsx64(Fragment26,{children:formatTiming(value)});case PropertyType.Dosage:case PropertyType.UsageContext:if(!props.path)throw Error(`Displaying property of type ${props.propertyType} requires path`);return jsx64(BackboneElementDisplay,{path:props.path,value:{type:propertyType,value},compact:!0,ignoreMissingValues:props.ignoreMissingValues});case PropertyType.Extension:if(!props.path)throw Error(`Displaying property of type ${props.propertyType} requires path`);return jsx64(ExtensionDisplay,{path:props.path,value,compact:!0,ignoreMissingValues:props.ignoreMissingValues,elementDefinitionType:props.elementDefinitionType});default:if(!property)throw Error(`Displaying property of type ${props.propertyType} requires element schema`);if(!props.path)throw Error(`Displaying property of type ${props.propertyType} requires path`);return jsx64(BackboneElementDisplay,{path:props.path,value:{type:property.type[0].code,value},compact:!0,ignoreMissingValues:props.ignoreMissingValues})}}function SecretFieldDisplay(props){let[isVisible,setIsVisible]=useState26(!1),secretValue=props.value??"",hasValue=!isEmpty(secretValue),MASK="\u2022".repeat(8);return jsxs30(Flex3,{gap:3,align:"center",children:[isVisible?jsx64("div",{style:{whiteSpace:"pre-wrap"},children:secretValue}):jsx64("div",{style:{whiteSpace:"pre-wrap"},"aria-hidden":"true",children:hasValue?MASK:""}),hasValue&&jsxs30(Fragment26,{children:[jsx64(CopyButton,{value:props.value,timeout:2e3,children:({copied,copy})=>jsx64(Tooltip2,{label:copied?"Copied":"Copy secret",withArrow:!0,position:"right",children:jsx64(ActionIcon2,{variant:"subtle",color:copied?"teal":"gray",onClick:copy,"aria-label":copied?"Copied":"Copy secret",children:copied?jsx64(IconCheck,{size:"1rem"}):jsx64(IconCopy,{size:"1rem"})})})}),jsx64(Tooltip2,{label:isVisible?"Hide secret":"Show secret",withArrow:!0,position:"right",children:jsx64(ActionIcon2,{variant:"subtle",color:"gray",onClick:()=>setIsVisible(!isVisible),"aria-label":isVisible?"Hide secret":"Show secret",children:isVisible?jsx64(IconEyeOff,{size:"1rem"}):jsx64(IconEye,{size:"1rem"})})})]})]})}import{jsx as jsx65,jsxs as jsxs31}from"react/jsx-runtime";var EXTENSION_KEYS2=["extension","modifierExtension"],IGNORED_PROPERTIES2=DEFAULT_IGNORED_PROPERTIES.filter(prop=>!EXTENSION_KEYS2.includes(prop));function BackboneElementDisplay(props){let typedValue=props.value,{value,type:typeName}=typedValue,parentElementsContext=useContext6(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo6(()=>tryGetDataType(typeName,profileUrl),[profileUrl,typeName]),newElementsContext=useMemo6(()=>{if(typeSchema)return buildElementsContext2({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);if(isEmpty2(value))return null;if(!typeSchema)return jsxs31("div",{children:[typeName,"\xA0not implemented"]});if(typeof value=="object"&&"name"in value&&Object.keys(value).length===1&&typeof value.name=="string")return jsx65("div",{children:value.name});let elementsContext=newElementsContext??parentElementsContext;return maybeWrapWithContext(ElementsContext.Provider,newElementsContext,jsx65(DescriptionList,{compact:props.compact,children:Object.entries(elementsContext.elements).map(([key,property])=>{if(EXTENSION_KEYS2.includes(key)&&isEmpty2(property.slicing?.slices))return null;if(IGNORED_PROPERTIES2.includes(key))return null;if(DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key)&&property.path.split(".").length===2||key.includes("."))return null;let[propertyValue,propertyType]=getValueAndType(typedValue,key,elementsContext.profileUrl);if((props.ignoreMissingValues||property.max===0)&&isEmpty2(propertyValue)||props.path.endsWith(".extension")&&(key==="url"||key==="id"))return null;let isArrayProperty=property.max>1||property.isArray,resourcePropertyDisplay=jsx65(ResourcePropertyDisplay,{property,propertyType,path:props.path+"."+key,value:propertyValue,ignoreMissingValues:props.ignoreMissingValues,includeArrayDescriptionListEntry:isArrayProperty,link:props.link},key);return isArrayProperty?resourcePropertyDisplay:jsx65(DescriptionListEntry,{term:getPathDisplayName3(key),children:resourcePropertyDisplay},key)})}))}import{Box as Box5}from"@mantine/core";import{buildElementsContext as buildElementsContext4,tryGetDataType as tryGetDataType2}from"@medplum/core";import{useContext as useContext23,useMemo as useMemo22,useState as useState47}from"react";import{Stack as Stack12}from"@mantine/core";import{getPathDisplayName as getPathDisplayName5}from"@medplum/core";import{useContext as useContext22,useMemo as useMemo21,useState as useState46}from"react";import{Group as Group15,Input as Input2}from"@mantine/core";import{useContext as useContext7}from"react";var FormSection_default={dimmed:"FormSection_dimmed",preserveBreaks:"FormSection_preserveBreaks"};import{Tooltip as Tooltip3}from"@mantine/core";import{jsx as jsx66}from"react/jsx-runtime";var READ_ONLY_TOOLTIP_TEXT="Read Only";function maybeWrapWithTooltip(tooltipText,children){return tooltipText?jsx66(Tooltip3.Floating,{label:tooltipText,children}):children}import{jsx as jsx67,jsxs as jsxs32}from"react/jsx-runtime";function CheckboxFormSection(props){let{debugMode}=useContext7(ElementsContext),label;return debugMode&&props.fhirPath?label=`${props.title} - ${props.fhirPath}`:label=props.title,maybeWrapWithTooltip(props?.readonly?READ_ONLY_TOOLTIP_TEXT:void 0,jsxs32(Group15,{wrap:"nowrap","data-testid":props.testId,children:[jsx67("div",{children:props.children}),jsx67("div",{children:jsx67(Input2.Wrapper,{id:props.htmlFor,label,classNames:{label:props?.readonly?FormSection_default.dimmed:void 0},description:props.description,withAsterisk:props.withAsterisk,children:null})})]}))}import{Input as Input3}from"@mantine/core";import{useContext as useContext8}from"react";import{jsx as jsx68}from"react/jsx-runtime";function FormSection(props){let{debugMode}=useContext8(ElementsContext),label;return debugMode&&props.fhirPath?label=`${props.title} - ${props.fhirPath}`:label=props.title,maybeWrapWithTooltip(props?.readonly?READ_ONLY_TOOLTIP_TEXT:void 0,jsx68(Input3.Wrapper,{id:props.htmlFor,label,classNames:{label:clsx_default({[FormSection_default.dimmed]:props?.readonly},FormSection_default.preserveBreaks)},description:props.description,withAsterisk:props.withAsterisk,error:getErrorsForInput(props.outcome,props.errorExpression??props.htmlFor),"data-testid":props.testId,children:props.children}))}import{capitalize,isEmpty as isEmpty3}from"@medplum/core";function setPropertyValue(obj,key,propName,elementDefinition,value){let types=elementDefinition.type;if(types.length>1)for(let type of types){let compoundKey=key.replace("[x]",capitalize(type.code));compoundKey in obj&&delete obj[compoundKey]}return isEmpty3(value)?obj[propName]=void 0:obj[propName]=value,obj}function isSupportedProfileStructureDefinition(profile){return!!profile&&!isEmpty3(profile.url)&&!isEmpty3(profile.name)}import{Checkbox as Checkbox4,Group as Group29,NativeSelect as NativeSelect9,Textarea as Textarea2,TextInput as TextInput17}from"@mantine/core";import{applyDefaultValuesToElement,capitalize as capitalize2,getPathDifference,HTTP_HL7_ORG,isComplexTypeCode,isEmpty as isEmpty6,isPopulated as isPopulated11,PropertyType as PropertyType2}from"@medplum/core";import{useContext as useContext21,useMemo as useMemo20,useState as useState45}from"react";import{useState as useState27}from"react";import{jsx as jsx69}from"react/jsx-runtime";function CodeableConceptInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,outcome:_outcome,path:_path,valuePath:_valuePath,...rest}=props,[value,setValue]=useState27(defaultValue2);function handleChange(newValues){let newConcept=valueSetElementToCodeableConcept(newValues);setValue(newConcept),onChange&&onChange(newConcept)}return jsx69(ValueSetAutocomplete,{defaultValue:value&&codeableConceptToValueSetElement(value),onChange:handleChange,withHelpText:withHelpText??!0,...rest})}function codeableConceptToValueSetElement(concept){return concept.coding?.map(c=>({system:c.system,code:c.code,display:c.display}))}function valueSetElementToCodeableConcept(elements){if(elements.length!==0)return{coding:elements.map(e=>({system:e.system,code:e.code,display:e.display}))}}import{useState as useState28}from"react";import{jsx as jsx70}from"react/jsx-runtime";function CodingInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,response,...rest}=props,[value,setValue]=useState28(response?.answer?.[0]?.valueCoding??defaultValue2);function handleChange(newValues){let newValue=newValues[0],newConcept=newValue&&valueSetElementToCoding(newValue);setValue(newConcept),onChange&&onChange(newConcept)}return jsx70(ValueSetAutocomplete,{defaultValue:value?codingToValueSetElement(value):void 0,maxValues:1,onChange:handleChange,withHelpText:withHelpText??!0,...rest})}function codingToValueSetElement(coding){return{system:coding.system,code:coding.code,display:coding.display}}function valueSetElementToCoding(element){return{system:element.system,code:element.code,display:element.display}}import{Group as Group17,TextInput as TextInput10}from"@mantine/core";import{useContext as useContext10,useMemo as useMemo8,useRef as useRef9,useState as useState30}from"react";import{Group as Group16,NativeSelect as NativeSelect3,TextInput as TextInput9}from"@mantine/core";import{useContext as useContext9,useMemo as useMemo7,useRef as useRef8,useState as useState29}from"react";import{jsx as jsx71,jsxs as jsxs33}from"react/jsx-runtime";function ContactPointInput(props){let{path,outcome}=props,{elementsByPath,getExtendedProps}=useContext9(ElementsContext),[contactPoint,setContactPoint]=useState29(props.defaultValue),ref=useRef8(contactPoint);ref.current=contactPoint;let[systemElement,useElement,valueElement]=useMemo7(()=>["system","use","value"].map(field=>elementsByPath[path+"."+field]),[elementsByPath,path]),[systemProps,useProps9,valueProps]=useMemo7(()=>["system","use","value"].map(field=>getExtendedProps(path+"."+field)),[getExtendedProps,path]);function setContactPointWrapper(newValue){newValue&&Object.keys(newValue).length===0&&(newValue=void 0),setContactPoint(newValue),props.onChange&&props.onChange(newValue)}function setSystem(system){let newValue={...ref.current,system};system||delete newValue.system,setContactPointWrapper(newValue)}function setUse(use){let newValue={...ref.current,use};use||delete newValue.use,setContactPointWrapper(newValue)}function setValue(value){let newValue={...ref.current,value};value||delete newValue.value,setContactPointWrapper(newValue)}let errorPath=props.valuePath??path;return jsxs33(Group16,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx71(NativeSelect3,{disabled:props.disabled||systemProps?.readonly,"data-testid":"system",defaultValue:contactPoint?.system,required:(systemElement?.min??0)>0,onChange:e=>setSystem(e.currentTarget.value),data:["","email","phone","fax","pager","sms","other"],error:getErrorsForInput(outcome,errorPath+".system")}),jsx71(NativeSelect3,{disabled:props.disabled||useProps9?.readonly,"data-testid":"use",defaultValue:contactPoint?.use,required:(useElement?.min??0)>0,onChange:e=>setUse(e.currentTarget.value),data:["","home","work","temp","old","mobile"],error:getErrorsForInput(outcome,errorPath+".use")}),jsx71(TextInput9,{disabled:props.disabled||valueProps?.readonly,placeholder:"Value",defaultValue:contactPoint?.value,required:(valueElement?.min??0)>0,onChange:e=>setValue(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".value")})]})}import{jsx as jsx72,jsxs as jsxs34}from"react/jsx-runtime";function ContactDetailInput(props){let[contactDetail,setContactDetail]=useState30(props.defaultValue),ref=useRef9(contactDetail);ref.current=contactDetail;let{getExtendedProps}=useContext10(ElementsContext),[nameProps,telecomProps]=useMemo8(()=>["name","telecom"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setContactDetailWrapper(newValue){setContactDetail(newValue),props.onChange&&props.onChange(newValue)}function setName(name){let newValue={...ref.current,name};name||delete newValue.name,setContactDetailWrapper(newValue)}function setTelecom(telecom){let newValue={...ref.current,telecom:telecom&&[telecom]};telecom||delete newValue.telecom,setContactDetailWrapper(newValue)}return jsxs34(Group17,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx72(TextInput10,{disabled:props.disabled||nameProps?.readonly,"data-testid":props.name+"-name",name:props.name+"-name",placeholder:"Name",style:{width:180},defaultValue:contactDetail?.name,onChange:e=>setName(e.currentTarget.value)}),jsx72(ContactPointInput,{disabled:props.disabled||telecomProps?.readonly,name:props.name+"-telecom",path:props.path+".telecom",defaultValue:contactDetail?.telecom?.[0],onChange:setTelecom,outcome:props.outcome})]})}import{TextInput as TextInput11}from"@mantine/core";import{isValidDate}from"@medplum/core";function convertIsoToLocal(isoString){if(!isoString)return"";let date=new Date(isoString);return isValidDate(date)?date.toLocaleDateString("sv")+"T"+date.toLocaleTimeString("sv"):""}function convertLocalToIso(localString){if(!localString)return"";let date=new Date(localString);return isValidDate(date)?date.toISOString():""}import{jsx as jsx73}from"react/jsx-runtime";function DateTimeInput(props){return jsx73(TextInput11,{id:props.name,name:props.name,label:props.label,"data-autofocus":props.autoFocus,"data-testid":props["data-testid"]??props.name,placeholder:props.placeholder,required:props.required,disabled:props.disabled,type:getInputType(),step:1,defaultValue:convertIsoToLocal(props.defaultValue),autoFocus:props.autoFocus,error:getErrorsForInput(props.outcome,props.name),onChange:e=>{if(props.onChange){let newValue=e.currentTarget.value;props.onChange(convertLocalToIso(newValue))}}})}function getInputType(){return"datetime-local"}import{isPopulated as isPopulated7,isProfileLoaded as isProfileLoaded2}from"@medplum/core";import{useMedplum as useMedplum17}from"@medplum/react-hooks";import{useEffect as useEffect10,useMemo as useMemo9,useState as useState31}from"react";import{jsx as jsx74}from"react/jsx-runtime";function ExtensionInput(props){let{propertyType}=props,medplum=useMedplum17(),profileUrl=useMemo9(()=>{if(isPopulated7(propertyType.profile))return propertyType.profile[0]},[propertyType]),[loadingProfile,setLoadingProfile]=useState31(profileUrl!==void 0);return useEffect10(()=>{profileUrl&&(setLoadingProfile(!0),medplum.requestProfileSchema(profileUrl).then(()=>setLoadingProfile(!1)).catch(reason=>{setLoadingProfile(!1),console.warn(reason)}))},[medplum,profileUrl]),profileUrl&&(loadingProfile||!isProfileLoaded2(profileUrl))?jsx74("div",{children:"Loading..."}):jsx74(BackboneElementInput,{profileUrl,path:props.path,typeName:"Extension",defaultValue:props.defaultValue,onChange:props.onChange})}import{Group as Group18,NativeSelect as NativeSelect4,TextInput as TextInput12}from"@mantine/core";import{useContext as useContext11,useMemo as useMemo10,useState as useState32}from"react";import{jsx as jsx75,jsxs as jsxs35}from"react/jsx-runtime";function HumanNameInput(props){let{outcome,path}=props,[value,setValue]=useState32(props.defaultValue),{getExtendedProps}=useContext11(ElementsContext),[useProps9,prefixProps,givenProps,familyProps,suffixProps]=useMemo10(()=>["use","prefix","given","family","suffix"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}function setUse(use){setValueWrapper({...value,use:use||void 0})}function setPrefix(prefix){setValueWrapper({...value,prefix:prefix?prefix.split(" "):void 0})}function setGiven(given){setValueWrapper({...value,given:given?given.split(" "):void 0})}function setFamily(family){setValueWrapper({...value,family:family||void 0})}function setSuffix(suffix){setValueWrapper({...value,suffix:suffix?suffix.split(" "):void 0})}let errorPath=props.valuePath??path;return jsxs35(Group18,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx75(NativeSelect4,{disabled:props.disabled||useProps9?.readonly,defaultValue:value?.use,name:props.name+"-use","data-testid":"use",onChange:e=>setUse(e.currentTarget.value),data:["","temp","old","usual","official","nickname","anonymous","maiden"],error:getErrorsForInput(outcome,errorPath+".use")}),jsx75(TextInput12,{disabled:props.disabled||prefixProps?.readonly,placeholder:"Prefix",name:props.name+"-prefix",defaultValue:value?.prefix?.join(" "),onChange:e=>setPrefix(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".prefix")}),jsx75(TextInput12,{disabled:props.disabled||givenProps?.readonly,placeholder:"Given",name:props.name+"-given",defaultValue:value?.given?.join(" "),onChange:e=>setGiven(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".given")}),jsx75(TextInput12,{disabled:props.disabled||familyProps?.readonly,name:props.name+"-family",placeholder:"Family",defaultValue:value?.family,onChange:e=>setFamily(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".family")}),jsx75(TextInput12,{disabled:props.disabled||suffixProps?.readonly,placeholder:"Suffix",name:props.name+"-suffix",defaultValue:value?.suffix?.join(" "),onChange:e=>setSuffix(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".suffix")})]})}import{Group as Group19,TextInput as TextInput13}from"@mantine/core";import{useContext as useContext12,useMemo as useMemo11,useState as useState33}from"react";import{jsx as jsx76,jsxs as jsxs36}from"react/jsx-runtime";function IdentifierInput(props){let[value,setValue]=useState33(props.defaultValue),{elementsByPath,getExtendedProps}=useContext12(ElementsContext),[systemElement,valueElement]=useMemo11(()=>["system","value"].map(field=>elementsByPath[props.path+"."+field]),[elementsByPath,props.path]),[systemProps,valueProps]=useMemo11(()=>["system","value"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let errorPath=props.valuePath??props.path;return jsxs36(Group19,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx76(TextInput13,{disabled:props.disabled||systemProps?.readonly,placeholder:"System",required:(systemElement?.min??0)>0,defaultValue:value?.system,onChange:e=>setValueWrapper({...value,system:e.currentTarget.value}),error:getErrorsForInput(props.outcome,errorPath+".system")}),jsx76(TextInput13,{disabled:props.disabled||valueProps?.readonly,placeholder:"Value",required:(valueElement?.min??0)>0,defaultValue:value?.value,onChange:e=>setValueWrapper({...value,value:e.currentTarget.value}),error:getErrorsForInput(props.outcome,errorPath+".value")})]})}import{NativeSelect as NativeSelect5,TextInput as TextInput14}from"@mantine/core";import{useCallback as useCallback7,useContext as useContext13,useMemo as useMemo12,useState as useState34}from"react";import{jsx as jsx77}from"react/jsx-runtime";var data=["USD","EUR","CAD","GBP","AUD"];function MoneyInput(props){let{onChange}=props,[value,setValue]=useState34(props.defaultValue),{getExtendedProps}=useContext13(ElementsContext),[currencyProps,valueProps]=useMemo12(()=>["currency","value"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]),setValueWrapper=useCallback7(newValue=>{setValue(newValue),onChange&&onChange(newValue)},[onChange]),handleCurrencyChange=useCallback7(e=>{setValueWrapper({...value,currency:e.currentTarget.value})},[value,setValueWrapper]),handleValueChange=useCallback7(e=>{setValueWrapper({...value,value:e.currentTarget.valueAsNumber})},[value,setValueWrapper]),select=jsx77(NativeSelect5,{disabled:props.disabled||currencyProps?.readonly,defaultValue:value?.currency,data,styles:{input:{fontWeight:500,borderTopLeftRadius:0,borderBottomLeftRadius:0,width:92}},onChange:handleCurrencyChange});return jsx77(TextInput14,{disabled:props.disabled||valueProps?.readonly,type:"number",name:props.name,label:props.label,placeholder:props.placeholder??"Value",defaultValue:value?.value?.toString()??"USD",leftSection:jsx77(IconCurrencyDollar,{size:14}),rightSection:select,rightSectionWidth:92,onChange:handleValueChange})}import{Group as Group20}from"@mantine/core";import{useContext as useContext14,useMemo as useMemo13,useState as useState35}from"react";import{jsx as jsx78,jsxs as jsxs37}from"react/jsx-runtime";function PeriodInput(props){let[value,setValue]=useState35(props.defaultValue),{getExtendedProps}=useContext14(ElementsContext),[startProps,endProps]=useMemo13(()=>["start","end"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs37(Group20,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx78(DateTimeInput,{disabled:props.disabled||startProps?.readonly,name:props.name+".start",placeholder:"Start",defaultValue:value?.start,onChange:newValue=>setValueWrapper({...value,start:newValue})}),jsx78(DateTimeInput,{disabled:props.disabled||endProps?.readonly,name:props.name+".end",placeholder:"End",defaultValue:value?.end,onChange:newValue=>setValueWrapper({...value,end:newValue})})]})}import{Group as Group21,NativeSelect as NativeSelect6,TextInput as TextInput15}from"@mantine/core";import{useContext as useContext15,useMemo as useMemo14,useState as useState36}from"react";import{jsx as jsx79,jsxs as jsxs38}from"react/jsx-runtime";function QuantityInput(props){let[value,setValue]=useState36(props.defaultValue),{getExtendedProps}=useContext15(ElementsContext),[comparatorProps,valueProps,unitProps]=useMemo14(()=>["comparator","value","unit"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs38(Group21,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx79(NativeSelect6,{disabled:props.disabled||comparatorProps?.readonly,style:{width:80},"data-testid":props.name+"-comparator",defaultValue:value?.comparator,data:["","<","<=",">=",">"],onChange:e=>setValueWrapper({...value,comparator:e.currentTarget.value})}),jsx79(TextInput15,{disabled:props.disabled||valueProps?.readonly,id:props.name,name:props.name,required:props.required,"data-autofocus":props.autoFocus,"data-testid":props.name+"-value",type:"number",placeholder:"Value",defaultValue:value?.value,autoFocus:props.autoFocus,step:"any",onWheel:e=>{props.disableWheel&&e.currentTarget.blur()},onChange:e=>{setValueWrapper({...value,value:tryParseNumber(e.currentTarget.value)})}}),jsx79(TextInput15,{disabled:props.disabled||unitProps?.readonly,placeholder:"Unit","data-testid":props.name+"-unit",defaultValue:value?.unit,onChange:e=>setValueWrapper({...value,unit:e.currentTarget.value})})]})}function tryParseNumber(str){if(str)return Number.parseFloat(str)}import{Group as Group22}from"@mantine/core";import{useContext as useContext16,useMemo as useMemo15,useState as useState37}from"react";import{jsx as jsx80,jsxs as jsxs39}from"react/jsx-runtime";function RangeInput(props){let[value,setValue]=useState37(props.defaultValue),{getExtendedProps}=useContext16(ElementsContext),[lowProps,highProps]=useMemo15(()=>["low","high"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs39(Group22,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx80(QuantityInput,{path:props.path+".low",disabled:props.disabled||lowProps?.readonly,name:props.name+"-low",defaultValue:value?.low,onChange:v=>setValueWrapper({...value,low:v})}),jsx80(QuantityInput,{path:props.path+".high",disabled:props.disabled||highProps?.readonly,name:props.name+"-high",defaultValue:value?.high,onChange:v=>setValueWrapper({...value,high:v})})]})}import{Group as Group23}from"@mantine/core";import{useContext as useContext17,useMemo as useMemo16,useState as useState38}from"react";import{jsx as jsx81,jsxs as jsxs40}from"react/jsx-runtime";function RatioInput(props){let[value,setValue]=useState38(props.defaultValue),{getExtendedProps}=useContext17(ElementsContext),[numeratorProps,denominatorProps]=useMemo16(()=>["numerator","denominator"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs40(Group23,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81(QuantityInput,{path:props.path+".numerator",disabled:props.disabled||numeratorProps?.readonly,name:props.name+"-numerator",defaultValue:value?.numerator,onChange:v=>setValueWrapper({...value,numerator:v})}),jsx81(QuantityInput,{path:props.path+".denominator",disabled:props.disabled||denominatorProps?.readonly,name:props.name+"-denominator",defaultValue:value?.denominator,onChange:v=>setValueWrapper({...value,denominator:v})})]})}import{Group as Group25,NativeSelect as NativeSelect7}from"@mantine/core";import{LRUCache,ReadablePromise,createReference as createReference2,isEmpty as isEmpty4,isPopulated as isPopulated9,tryGetProfile as tryGetProfile3}from"@medplum/core";import{useMedplum as useMedplum19}from"@medplum/react-hooks";import{useCallback as useCallback9,useEffect as useEffect11,useMemo as useMemo17,useRef as useRef10,useState as useState40}from"react";import{Group as Group24,Text as Text12}from"@mantine/core";import{getDisplayString as getDisplayString3,getReferenceString as getReferenceString3,isPopulated as isPopulated8}from"@medplum/core";import{useMedplum as useMedplum18,useResource as useResource2}from"@medplum/react-hooks";import{forwardRef as forwardRef4,useCallback as useCallback8,useState as useState39}from"react";import{jsx as jsx82,jsxs as jsxs41}from"react/jsx-runtime";var SEARCH_CODES={Device:"device-name",Observation:"code",Subscription:"criteria",User:"email:contains"},NAME_RESOURCE_TYPES=["AccessPolicy","Account","ActivityDefinition","Bot","CapabilityStatement","CareTeam","ClientApplication","CodeSystem","CompartmentDefinition","ConceptMap","EffectEvidenceSynthesis","Endpoint","EventDefinition","Evidence","EvidenceVariable","ExampleScenario","GraphDefinition","Group","HealthcareService","ImplementationGuide","InsurancePlan","Library","Location","Measure","MedicinalProduct","MessageDefinition","NamingSystem","OperationDefinition","Organization","Patient","Person","PlanDefinition","Practitioner","Project","Questionnaire","RelatedPerson","ResearchDefinition","ResearchElementDefinition","ResearchStudy","RiskEvidenceSynthesis","SearchParameter","StructureDefinition","StructureMap","TerminologyCapabilities","TestScript","UserConfiguration","ValueSet"];function toOption3(resource){return{value:getReferenceString3(resource)??"",label:getDisplayString3(resource),resource}}function ResourceInput(props){let medplum=useMedplum18(),{resourceType,searchCriteria}=props,[outcome,setOutcome]=useState39(),defaultValue2=useResource2(props.defaultValue,setOutcome),ItemComponent3=props.itemComponent??DefaultItemComponent2,onChange=props.onChange,loadValues=useCallback8(async(input,signal)=>{let searchCode=getSearchParamForResourceType(resourceType),searchParams=new URLSearchParams({[searchCode]:input??"",_count:"10",...searchCriteria});return await medplum.searchResources(resourceType,searchParams,{signal})},[medplum,resourceType,searchCriteria]),handleChange=useCallback8(newResources=>{onChange&&onChange(newResources[0])},[onChange]);return isPopulated8(props.defaultValue)&&!outcome&&!defaultValue2?null:jsx82(AsyncAutocomplete,{disabled:props.disabled,name:props.name,label:props.label,error:props.error,required:props.required,itemComponent:ItemComponent3,defaultValue:defaultValue2,placeholder:props.placeholder,maxValues:1,toOption:toOption3,loadOptions:loadValues,onChange:handleChange,clearable:!0})}var DefaultItemComponent2=forwardRef4(({label,resource,active:_active,...others},ref)=>jsx82("div",{ref,...others,children:jsxs41(Group24,{wrap:"nowrap",children:[jsx82(ResourceAvatar,{value:resource}),jsxs41("div",{children:[jsx82(Text12,{children:label}),jsx82(Text12,{size:"xs",c:"dimmed",children:resource.birthDate||resource.id})]})]})}));function getSearchParamForResourceType(resourceType){return SEARCH_CODES[resourceType]??(NAME_RESOURCE_TYPES.includes(resourceType)?"name":"_id")}import{Fragment as Fragment27,jsx as jsx83,jsxs as jsxs42}from"react/jsx-runtime";function ReferenceInput(props){let{onChange}=props,medplum=useMedplum19(),[value,setValue]=useState40(props.defaultValue),[targetTypes,setTargetTypes]=useState40(()=>createTargetTypes(props.targetTypes)),[targetType,setTargetType]=useState40(()=>getInitialTargetType(props.defaultValue,targetTypes)),promiseCache=useRef10(new LRUCache),searchCriteria=useMemo17(()=>targetType?.type==="profile"?{...props.searchCriteria,_profile:targetType.value}:props.searchCriteria,[props.searchCriteria,targetType]);useEffect11(()=>{let anyToFetch=!1,newTargetTypePromises=targetTypes?.map(tt=>{if(!shouldFetchResourceType(tt))return Promise.resolve(tt);anyToFetch=!0;let cacheKey=tt.value,cached=promiseCache.current.get(cacheKey);if(cached)return cached;let promise=fetchResourceTypeOfProfile(medplum,tt.value).then(profile=>{let newTargetType={...tt};return profile?isPopulated9(profile.type)?(newTargetType.resourceType=profile.type,newTargetType.name=profile.name,newTargetType.title=profile.title):(console.error(`StructureDefinition.type missing for ${tt.value}`),newTargetType.error="StructureDefinition.type missing"):(console.error(`StructureDefinition not found for ${tt.value}`),newTargetType.error="StructureDefinition not found"),newTargetType}).catch(reason=>(console.error(reason),{...tt,error:reason})),readablePromise=new ReadablePromise(promise);return promiseCache.current.set(cacheKey,readablePromise),readablePromise});!newTargetTypePromises||!anyToFetch||Promise.all(newTargetTypePromises).then(newTargetTypes=>{if(setTargetTypes(newTargetTypes),!targetType)return;let index=newTargetTypes.findIndex(tt=>tt.value===targetType.value||tt.resourceType===targetType.resourceType);if(index===-1){console.debug(`defaultValue had unexpected resourceType: ${targetType.resourceType}`);return}setTargetType(newTargetTypes[index])}).catch(console.error)},[medplum,targetType,targetTypes]);let setValueHelper=useCallback9(item=>{let newValue=item?createReference2(item):void 0;setValue(newValue),onChange&&onChange(newValue)},[onChange]),typeSelectOptions=useMemo17(()=>targetTypes?targetTypes.map(tt=>({value:tt.value,label:tt.type==="profile"?tt.title??tt.name??tt.resourceType??tt.value:tt.value})):[],[targetTypes]);return jsxs42(Fragment27,{children:[props.name&&jsx83("input",{type:"hidden",name:props.name,value:value?.reference??""}),jsxs42(Group25,{gap:"xs",grow:!0,wrap:"nowrap",children:[targetTypes&&targetTypes.length>1&&jsx83(NativeSelect7,{name:props.name+"-resourceType",disabled:props.disabled,"data-autofocus":props.autoFocus,"data-testid":"reference-input-resource-type-select",defaultValue:targetType?.resourceType,autoFocus:props.autoFocus,onChange:e=>{let newValue=e.currentTarget.value,newTargetType=targetTypes.find(tt=>tt.value===newValue);setTargetType(newTargetType)},data:typeSelectOptions}),!targetTypes&&jsx83(ResourceTypeInput,{disabled:props.disabled,autoFocus:props.autoFocus,testId:"reference-input-resource-type-input",defaultValue:targetType?.resourceType,onChange:newResourceType=>{setTargetType(newResourceType?{type:"resourceType",value:newResourceType,resourceType:newResourceType}:void 0)},name:props.name+"-resourceType",placeholder:"Resource Type"}),jsx83(ResourceInput,{resourceType:targetType?.resourceType,name:props.name+"-id",required:props.required,placeholder:props.placeholder,defaultValue:value,searchCriteria,onChange:setValueHelper,disabled:props.disabled})]})]})}function createTargetTypes(resourceTypesAndProfileUrls){if(!resourceTypesAndProfileUrls||resourceTypesAndProfileUrls.length===0||resourceTypesAndProfileUrls.length===1&&resourceTypesAndProfileUrls[0]==="Resource")return;let results=[];for(let value of resourceTypesAndProfileUrls)value.includes("/")?results.push({type:"profile",value}):results.push({type:"resourceType",value,resourceType:value});return results}function getInitialTargetType(defaultValue2,targetTypes){let defaultValueResourceType=defaultValue2?.reference?.split("/")[0];if(defaultValueResourceType){let targetType=targetTypes?.find(tt=>tt.resourceType===defaultValueResourceType);return targetType||{type:"resourceType",value:defaultValueResourceType,resourceType:defaultValueResourceType}}if(targetTypes&&targetTypes.length>0)return targetTypes[0]}async function fetchResourceTypeOfProfile(medplum,profileUrl){let profile=tryGetProfile3(profileUrl);if(profile)return{type:profile.type,name:profile.name,title:profile.title};let query=`{
|
|
127
|
+
}`.replaceAll(/\s+/g," ")}function getResourcesFromResponse2(response){let resources=[];return response.data.Patients1&&resources.push(...response.data.Patients1),response.data.Patients2&&resources.push(...response.data.Patients2),response.data.ServiceRequestList&&resources.push(...response.data.ServiceRequestList),dedupeResources2(resources)}function dedupeResources2(resources){let ids=new Set,result=[];for(let resource of resources)ids.has(resource.id)||(ids.add(resource.id),result.push(resource));return result}function resourcesToActions(resources,navigate){let patientActions=[],serviceRequestActions=[];for(let resource of resources)resource.resourceType==="Patient"?patientActions.push({id:resource.id,label:resource.name?formatHumanName4(resource.name[0]):resource.id,description:resource.birthDate,onClick:()=>navigate(`/Patient/${resource.id}`)}):resource.resourceType==="ServiceRequest"&&serviceRequestActions.push({id:resource.id,label:resource.id,description:resource.subject?.display,onClick:()=>navigate(`/ServiceRequest/${resource.id}`)});let result=[];return patientActions.length>0&&result.push({group:"Patients",actions:patientActions}),serviceRequestActions.length>0&&result.push({group:"Service Requests",actions:serviceRequestActions}),result}import{Fragment as Fragment6,jsx as jsx28,jsxs as jsxs10}from"react/jsx-runtime";function Navbar(props){let navigate=useMedplumNavigate4(),profile=useMedplumProfile3(),activeLink=getActiveLink(props.pathname,props.searchParams,props.menus),[userMenuOpened,setUserMenuOpened]=useState11(!1),[bookmarkDialogVisible,setBookmarkDialogVisible]=useState11(!1);function onLinkClick2(e,to){e.stopPropagation(),e.preventDefault(),navigate(to),window.innerWidth<768&&props.closeNavbar()}function navigateResourceType(resourceType){resourceType&&navigate(`/${resourceType}`)}let opened=props.opened??!0;return jsxs10(Fragment6,{children:[jsxs10(MantineAppShell2.Navbar,{id:"navbar",className:Navbar_default.navbar,children:[props.logo&&jsx28(MantineAppShell2.Section,{px:"sm",pt:"xs",children:jsx28(UnstyledButton3,{className:Navbar_default.logoButton,onClick:props.navbarToggle,"aria-expanded":opened,"aria-controls":"navbar",children:props.logo})}),jsx28(ScrollArea2,{px:"sm",pb:"xs",h:"100%",children:jsxs10(MantineAppShell2.Section,{grow:!0,children:[props.spotlightEnabled&&jsx28(NavbarLink,{to:"#",active:!1,onClick:spotlight.open,icon:jsx28(IconSearch,{size:"1.2rem"}),label:"Search",opened}),props.spotlightEnabled&&jsx28(Spotlight2,{}),!props.resourceTypeSearchDisabled&&jsx28(MantineAppShell2.Section,{mb:"sm",children:jsx28(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",maxValues:0,onChange:newValue=>navigateResourceType(newValue)},window.location.pathname)}),props.menus?.map(menu=>jsxs10(Fragment5,{children:[menu.title&&opened&&jsx28(Text5,{className:Navbar_default.menuTitle,children:menu.title}),menu.title&&!opened&&jsx28(Space,{h:41}),menu.links?.map(link=>jsx28(NavbarLink,{to:link.href,active:link.href===activeLink?.href,onClick:e=>onLinkClick2(e,link.href),icon:link.icon,label:link.label??"",opened},link.href))]},`menu-${menu.title}`)),props.displayAddBookmark&&jsx28(Button2,{variant:"subtle",size:"xs",mt:"xl",leftSection:jsx28(IconPlus,{size:"0.75rem"}),onClick:()=>setBookmarkDialogVisible(!0),children:"Add Bookmark"})]})}),props.userMenuEnabled&&jsxs10(MantineAppShell2.Section,{px:"sm",py:"xs",children:[jsx28(Tooltip,{label:"Toggle navbar",position:"right",transitionProps:{duration:0},children:jsx28(UnstyledButton3,{className:Navbar_default.toggleButton,"aria-label":"Toggle navbar",onClick:props.navbarToggle,"aria-expanded":opened,"aria-controls":"navbar",children:jsx28(IconLayoutSidebar,{})})}),jsx28(Divider,{my:"xs"}),jsxs10(Menu3,{width:260,shadow:"xl",position:"top-start",transitionProps:{transition:"fade-up"},opened:userMenuOpened,onClose:()=>setUserMenuOpened(!1),children:[jsx28(Menu3.Target,{children:jsxs10(UnstyledButton3,{className:Navbar_default.link,"aria-label":"User menu","data-active":userMenuOpened||void 0,onClick:()=>setUserMenuOpened(o=>!o),bd:"1px 0 0 0 solid var(--mantine-color-gray-200)",children:[jsx28(ResourceAvatar,{value:profile,radius:"xl",size:18}),opened&&jsx28("span",{children:formatHumanName5(profile?.name?.[0])})]})}),jsx28(Menu3.Dropdown,{children:jsx28(HeaderDropdown,{version:props.version})})]})]})]}),props.pathname&&props.searchParams&&jsx28(BookmarkDialog,{pathname:props.pathname,searchParams:props.searchParams,visible:bookmarkDialogVisible,onOk:()=>setBookmarkDialogVisible(!1),onCancel:()=>setBookmarkDialogVisible(!1)})]})}function NavbarLink(props){let{to,icon,label,onClick,active}=props;return props.opened?jsxs10(MedplumLink,{to,onClick,className:Navbar_default.link,"data-active":active||void 0,children:[icon,jsx28("span",{children:label})]}):jsx28(Tooltip,{label,position:"right",transitionProps:{duration:0},children:jsx28(MedplumLink,{to,onClick,className:Navbar_default.link,"data-active":active||void 0,children:icon})})}function getActiveLink(currentPathname,currentSearchParams,menus){if(!currentPathname||!currentSearchParams||!menus)return;let bestLink,bestScore=0;for(let menu of menus)if(menu.links)for(let link of menu.links){let score=getLinkScore(currentPathname,currentSearchParams,link.href);score>bestScore&&(bestScore=score,bestLink=link)}return bestLink}function getLinkScore(currentPathname,currentSearchParams,linkHref){let linkUrl=new URL(linkHref,"https://example.com");if(currentPathname!==linkUrl.pathname)return 0;let ignoredParams=["_count","_offset"];for(let[key,value]of linkUrl.searchParams.entries())if(!ignoredParams.includes(key)&¤tSearchParams.get(key)!==value)return 0;let count=1;for(let[key,value]of currentSearchParams.entries())ignoredParams.includes(key)||linkUrl.searchParams.get(key)===value&&count++;return count}import{jsx as jsx29,jsxs as jsxs11}from"react/jsx-runtime";var OPEN_WIDTH=250,CLOSED_WIDTH=70;function AppShell(props){let[navbarOpen,setNavbarOpen]=useState12(localStorage.navbarOpen==="true"),[layoutVersion]=useState12(props.layoutVersion??localStorage.appShellLayoutVersion??"v1"),medplum=useMedplum5(),profile=useMedplumProfile4();function setNavbarOpenWrapper(open){localStorage.navbarOpen=open.toString(),setNavbarOpen(open)}function closeNavbar(){setNavbarOpenWrapper(!1)}function toggleNavbar(){setNavbarOpenWrapper(!navbarOpen)}if(medplum.isLoading())return jsx29(Loading,{});let headerProp,navbarProp,headerComponent,navbarComponent;return layoutVersion==="v2"?(headerProp={height:0},navbarProp={width:navbarOpen?OPEN_WIDTH:CLOSED_WIDTH,breakpoint:0,collapsed:{desktop:!profile,mobile:!profile}},headerComponent=void 0,navbarComponent=profile?jsx29(Navbar,{logo:props.logo,pathname:props.pathname,searchParams:props.searchParams,menus:props.menus,navbarToggle:toggleNavbar,closeNavbar,displayAddBookmark:props.displayAddBookmark,resourceTypeSearchDisabled:!0,opened:navbarOpen,spotlightEnabled:!0,userMenuEnabled:!0,version:props.version}):void 0):(headerProp={height:60},navbarProp={width:OPEN_WIDTH,breakpoint:"sm",collapsed:{desktop:!profile||!navbarOpen,mobile:!profile||!navbarOpen}},headerComponent=profile&&jsx29(Header,{pathname:props.pathname,searchParams:props.searchParams,headerSearchDisabled:props.headerSearchDisabled,logo:props.logo,version:props.version,navbarOpen,navbarToggle:toggleNavbar,notifications:props.notifications}),navbarComponent=profile&&navbarOpen?jsx29(Navbar,{pathname:props.pathname,searchParams:props.searchParams,menus:props.menus,navbarToggle:toggleNavbar,closeNavbar,displayAddBookmark:props.displayAddBookmark,resourceTypeSearchDisabled:props.resourceTypeSearchDisabled}):void 0),jsxs11(MantineAppShell3,{header:headerProp,navbar:navbarProp,padding:0,children:[headerComponent,navbarComponent,jsx29(MantineAppShell3.Main,{className:AppShell_default.main,children:jsx29(ErrorBoundary,{children:jsx29(Suspense,{fallback:jsx29(Loading,{}),children:props.children})})})]})}import{getPathDisplayName,isPopulated as isPopulated2}from"@medplum/core";import{Anchor as Anchor2}from"@mantine/core";import{ContentType as ContentType2}from"@medplum/core";import{useCachedBinaryUrl as useCachedBinaryUrl2}from"@medplum/react-hooks";import{Button as Button3}from"@mantine/core";import{useEffect as useEffect3,useRef as useRef3,useState as useState13}from"react";import{Fragment as Fragment7,jsx as jsx30,jsxs as jsxs12}from"react/jsx-runtime";var CCDA_VIEWER_URL="https://ccda.medplum.com",BASE_VALIDATION_URL="https://ccda-validator.medplum.com/";function CcdaDisplay(props){let{url}=props,[shouldSend,setShouldSend]=useState13(!1),iframeRef=useRef3(null),[validationResult,setValidationResult]=useState13(),[validating,setValidating]=useState13(!1);useEffect3(()=>{url&&shouldSend&&iframeRef.current&&(sendCommand(iframeRef.current,{command:"loadCcdaXml",value:url}).catch(console.error),setShouldSend(!1))},[url,shouldSend]);let validateCcda=async()=>{if(url)try{setValidating(!0);let ccdaContent=await(await fetch(url)).text(),formData=new FormData;formData.append("ccdaFile",new Blob([ccdaContent],{type:"text/xml"}),"ccda.xml");let validationUrl=`${BASE_VALIDATION_URL}referenceccdaservice/?validationObjective=C-CDA_IG_Plus_Vocab&referenceFileName=No%20scenario%20File&curesUpdate=true&severityLevel=WARNING`,validationResponse=await fetch(validationUrl,{method:"POST",body:formData,credentials:"omit",redirect:"manual"});if(!validationResponse.ok)throw new Error(`Validation failed: ${validationResponse.status} ${validationResponse.statusText}`);let validationResult2=await validationResponse.json();setValidationResult(validationResult2)}catch(error){setValidationResult(void 0),console.error("CCDA validation error:",error)}finally{setValidating(!1)}},downloadResults=()=>{if(!validationResult)return;let resultsJson=JSON.stringify(validationResult,null,2);exportJsonFile(resultsJson,"ccda-validation-results")},getErrorCount=()=>validationResult?validationResult.resultsMetaData.resultMetaData.filter(item=>item?.type.includes("Error")).reduce((sum,item)=>sum+(item.count||0),0):0;return url?jsxs12("div",{"data-testid":"ccda-iframe",style:{maxWidth:props.maxWidth},children:[jsx30("div",{style:{minHeight:400},children:jsx30("iframe",{title:"C-CDA Viewer",width:"100%",height:"400",ref:iframeRef,src:CCDA_VIEWER_URL,allowFullScreen:!0,frameBorder:0,seamless:!0,onLoad:()=>setShouldSend(!0)})}),jsxs12("div",{style:{marginTop:"10px",marginBottom:"10px",display:"flex",alignItems:"center"},children:[jsx30(Button3,{type:"button",onClick:validateCcda,disabled:validating,children:validating?"Validating...":"Validate"}),validationResult&&jsxs12(Fragment7,{children:[jsxs12("div",{style:{marginLeft:"15px"},children:[jsx30("strong",{children:"Validation Results:"})," ",getErrorCount()," errors found"]}),jsx30(Button3,{type:"button",onClick:downloadResults,color:"green",style:{marginLeft:"auto"},children:"Download Full Results"})]})]})]}):null}import{jsx as jsx31,jsxs as jsxs13}from"react/jsx-runtime";function AttachmentDisplay(props){let{contentType,url:uncachedUrl,title}=props.value??{},url=useCachedBinaryUrl2(uncachedUrl);return url?jsxs13("div",{"data-testid":"attachment-display",children:[contentType?.startsWith("image/")&&jsx31("img",{"data-testid":"attachment-image",style:{maxWidth:props.maxWidth},src:url,alt:title}),contentType?.startsWith("video/")&&jsx31("video",{"data-testid":"attachment-video",style:{maxWidth:props.maxWidth},controls:!0,children:jsx31("source",{type:contentType,src:url})}),(contentType?.startsWith("text/")||contentType==="application/json"||contentType==="application/pdf")&&jsx31("div",{"data-testid":"attachment-iframe",style:{maxWidth:props.maxWidth,minHeight:400},children:jsx31("iframe",{title:"Attachment",width:"100%",height:"400",src:url+"#navpanes=0",allowFullScreen:!0,frameBorder:0,seamless:!0})}),contentType===ContentType2.CDA_XML&&jsx31(CcdaDisplay,{url}),jsx31("div",{"data-testid":"download-link",style:{padding:"2px 16px 16px 16px"},children:jsx31(Anchor2,{href:uncachedUrl,"data-testid":"attachment-details",target:"_blank",rel:"noopener noreferrer",download:getDownloadName(title),children:title||"Download"})})]}):null}function getDownloadName(title){return title?.includes(".")?title:void 0}function r(e){var t,f,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f)}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}var clsx_default=clsx;var DescriptionList_default={root:"DescriptionList_root",compact:"DescriptionList_compact"};import{Fragment as Fragment8,jsx as jsx32,jsxs as jsxs14}from"react/jsx-runtime";function DescriptionList(props){let{children,compact}=props;return jsx32("dl",{className:clsx_default(DescriptionList_default.root,{[DescriptionList_default.compact]:compact}),children})}function DescriptionListEntry(props){return jsxs14(Fragment8,{children:[jsx32("dt",{children:props.term}),jsx32("dd",{children:props.children})]})}import{Fragment as Fragment9,jsx as jsx33}from"react/jsx-runtime";function AttachmentArrayDisplay(props){let attachmentElements=props.values?.map((v,index)=>jsx33("div",{children:jsx33(AttachmentDisplay,{value:v,maxWidth:props.maxWidth})},"attatchment-"+index)),content;if(props.includeDescriptionListEntry){if(props.property===void 0)throw new Error("props.property is required when includeDescriptionListEntry is true");if(!isPopulated2(props.path))throw new Error("props.path is required when includeDescriptionListEntry is true");let key=props.path.split(".").pop();content=jsx33(DescriptionListEntry,{term:getPathDisplayName(key),children:attachmentElements})}else content=jsx33(Fragment9,{children:attachmentElements});return content}import{ActionIcon}from"@mantine/core";import{useRef as useRef5,useState as useState14}from"react";import{normalizeOperationOutcome}from"@medplum/core";import{useMedplum as useMedplum6}from"@medplum/react-hooks";import{useRef as useRef4}from"react";import{Fragment as Fragment10,jsx as jsx34,jsxs as jsxs15}from"react/jsx-runtime";function AttachmentButton(props){let medplum=useMedplum6(),fileInputRef=useRef4(null);function onClick(e){killEvent(e),fileInputRef.current?.click()}function onFileChange(e){killEvent(e);let files=e.target.files;files&&Array.from(files).forEach(processFile)}function processFile(file){!file||!file.name||(props.onUploadStart&&props.onUploadStart(),medplum.createAttachment({data:file,contentType:file.type||"application/octet-stream",filename:file.name,securityContext:props.securityContext,onProgress:props.onUploadProgress}).then(attachment=>props.onUpload(attachment)).catch(err=>{props.onUploadError&&props.onUploadError(normalizeOperationOutcome(err))}))}return jsxs15(Fragment10,{children:[jsx34("input",{disabled:props.disabled,type:"file","data-testid":"upload-file-input",style:{display:"none"},ref:fileInputRef,onChange:e=>onFileChange(e)}),props.children({onClick,disabled:props.disabled})]})}import{jsx as jsx35,jsxs as jsxs16}from"react/jsx-runtime";function AttachmentArrayInput(props){let[values,setValues]=useState14(props.defaultValue??[]),valuesRef=useRef5(values);valuesRef.current=values;function setValuesWrapper(newValues){setValues(newValues),props.onChange&&props.onChange(newValues)}return jsxs16("table",{style:{width:"100%"},children:[jsxs16("colgroup",{children:[jsx35("col",{width:"97%"}),jsx35("col",{width:"3%"})]}),jsxs16("tbody",{children:[values.map((v,index)=>jsxs16("tr",{children:[jsx35("td",{children:jsx35(AttachmentDisplay,{value:v,maxWidth:200})}),jsx35("td",{children:jsx35(ActionIcon,{disabled:props.disabled,title:"Remove",variant:"subtle",size:"sm",color:"gray",onClick:e=>{killEvent(e);let copy=values.slice();copy.splice(index,1),setValuesWrapper(copy)},children:jsx35(IconCircleMinus,{})})})]},`${index}-${values.length}`)),jsxs16("tr",{children:[jsx35("td",{}),jsx35("td",{children:jsx35(AttachmentButton,{disabled:props.disabled,onUpload:attachment=>{setValuesWrapper([...valuesRef.current,attachment])},children:props2=>jsx35(ActionIcon,{...props2,title:"Add",variant:"subtle",size:"sm",color:props2.disabled?"gray":"green",children:jsx35(IconCloudUpload,{})})})})]})]})]})}import{Button as Button4}from"@mantine/core";import{useState as useState15}from"react";import{Fragment as Fragment11,jsx as jsx36,jsxs as jsxs17}from"react/jsx-runtime";function AttachmentInput(props){let[value,setValue]=useState15(props.defaultValue);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return value?jsxs17(Fragment11,{children:[jsx36(AttachmentDisplay,{value,maxWidth:200}),jsx36(Button4,{disabled:props.disabled,onClick:e=>{killEvent(e),setValueWrapper(void 0)},children:"Remove"})]}):jsx36(AttachmentButton,{disabled:props.disabled,securityContext:props.securityContext,onUpload:setValueWrapper,children:props2=>jsx36(Button4,{...props2,children:"Upload..."})})}import{Alert as Alert2,Center as Center2,Image as Image2,Stack as Stack3,Text as Text6,TextInput as TextInput4,Title}from"@mantine/core";import{normalizeErrorString as normalizeErrorString4}from"@medplum/core";import{useState as useState16}from"react";import{jsx as jsx37,jsxs as jsxs18}from"react/jsx-runtime";function Logo(props){let overrideUrl=import.meta.env.MEDPLUM_LOGO_URL;return overrideUrl?jsx37("img",{src:overrideUrl,alt:"Logo",style:{maxHeight:props.size}}):jsxs18("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 180 180",style:{width:props.size,height:props.size},children:[jsx37("title",{children:"Medplum Logo"}),jsx37("path",{fill:props.fill??"#9c36b5",d:"M84 56c-3-15-15-24-23-28l5-10c8 2 14 8 20 14 0-12 1-16 5-21 8-9 13-9 41-9 0 7 1 18-3 24-7 9-16 7-41 8 5 8 7 14 8 22 36-24 74-7 74 39 0 42-40 83-80 83s-80-41-80-83c0-46 38-63 74-39Zm-3 43H65c-4 0-7 3-7 7v4c0 4 3 7 7 7h16v16c0 4 3 7 7 7h4c4 0 7-3 7-7v-16h16c4 0 7-3 7-7v-4c0-4-3-7-7-7H99V83c0-4-3-7-7-7h-4c-4 0-7 3-7 7z"})]})}import{jsx as jsx38,jsxs as jsxs19}from"react/jsx-runtime";function MfaForm(props){let[errorMessage,setErrorMessage]=useState16();return jsxs19(Form,{onSubmit:formData=>{setErrorMessage(void 0),props.onSubmit(formData)?.catch(err=>setErrorMessage(normalizeErrorString4(err)))},children:[jsxs19(Center2,{style:{flexDirection:"column"},children:[jsx38(Logo,{size:32}),jsx38(Title,{order:3,py:"lg",children:props.title}),!props.qrCodeUrl&&props.description&&jsx38(Text6,{c:"dimmed",mb:"lg",mt:"-lg",children:props.description})]}),errorMessage&&jsx38(Alert2,{icon:jsx38(IconAlertCircle,{size:16}),title:"Error",color:"red",mb:"lg",children:errorMessage}),props.qrCodeUrl&&jsx38(Center2,{children:jsxs19(Stack3,{mb:"xl",children:[props.description&&jsx38(Text6,{c:"dimmed",mb:"md",mt:"-lg",ta:"center",children:props.description}),jsx38(Image2,{src:props.qrCodeUrl,alt:"Multi Factor Auth QR Code",w:"60%",mx:"auto",radius:"md",p:"xs",bg:"var(--mantine-color-white)",style:{border:"1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-4))"}})]})}),jsx38(Stack3,{gap:"sm",children:jsx38(TextInput4,{name:"token",label:"MFA code",autoComplete:"one-time-code",required:!0,autoFocus:!0})}),jsx38(Stack3,{gap:"xs",pt:"md",children:jsx38(SubmitButton,{fullWidth:!0,children:props.buttonText})})]})}import{normalizeOperationOutcome as normalizeOperationOutcome4}from"@medplum/core";import{useMedplum as useMedplum9}from"@medplum/react-hooks";import{useEffect as useEffect6,useState as useState20}from"react";import{Container as MantineContainer}from"@mantine/core";var Container_default={root:"Container_root"};import{jsx as jsx39}from"react/jsx-runtime";function Container(props){let{children,...others}=props;return jsx39(MantineContainer,{className:Container_default.root,...others,children})}import{Paper}from"@mantine/core";var Panel_default={paper:"Panel_paper",fill:"Panel_fill"};import{jsx as jsx40}from"react/jsx-runtime";function Panel(props){let{width,fill,className,children,...rest}=props,style=width?{maxWidth:width}:void 0;return jsx40(Paper,{className:clsx_default(Panel_default.paper,fill&&Panel_default.fill,className),style,shadow:"sm",radius:"sm",withBorder:!0,...rest,children})}import{jsx as jsx41}from"react/jsx-runtime";function Document(props){let{children,...others}=props;return jsx41(Container,{children:jsx41(Panel,{...others,children})})}import{Alert as Alert3}from"@mantine/core";import{operationOutcomeIssueToString}from"@medplum/core";import{jsx as jsx42}from"react/jsx-runtime";function OperationOutcomeAlert(props){let{outcome,issues:issuesProp,...spacingProps}=props,issues=outcome?.issue||issuesProp;return!issues||issues.length===0?null:jsx42(Alert3,{icon:jsx42(IconAlertCircle,{size:16}),color:"red",...spacingProps,children:issues.map(issue=>jsx42("div",{"data-testid":"text-field-error",children:operationOutcomeIssueToString(issue)},issue.details?.text))})}function getErrorsForInput(outcome,expression){return outcome?.issue?.filter(issue=>isExpressionMatch(issue.expression?.[0],expression))?.map(issue=>issue.details?.text)?.join(`
|
|
128
|
+
`)}function getIssuesForExpression(outcome,expression){return outcome?.issue?.filter(issue=>isExpressionMatch(issue.expression?.[0],expression))}var ARRAY_INDEX_REGEX=/\[\d+\]/;function isExpressionMatch(expr1,expr2){let isExpr1Indexed=typeof expr1=="string"&&ARRAY_INDEX_REGEX.test(expr1),isExpr2Indexed=typeof expr2=="string"&&ARRAY_INDEX_REGEX.test(expr2);if(isExpr1Indexed!==isExpr2Indexed&&(expr1=expr1?.replace(ARRAY_INDEX_REGEX,""),expr2=expr2?.replace(ARRAY_INDEX_REGEX,"")),expr1===expr2)return!0;if(!expr1||!expr2)return!1;let dot1=expr1.indexOf(".");if(dot1>=0&&expr1.substring(dot1+1)===expr2)return!0;let dot2=expr2.indexOf(".");return dot2>=0&&expr2.substring(dot2+1)===expr1}import{Anchor as Anchor3,Center as Center3,Stack as Stack4,Text as Text7,TextInput as TextInput5,Title as Title2}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome2}from"@medplum/core";import{useMedplum as useMedplum7}from"@medplum/react-hooks";import{useState as useState17}from"react";import{jsx as jsx43,jsxs as jsxs20}from"react/jsx-runtime";function NewProjectForm(props){let medplum=useMedplum7(),[outcome,setOutcome]=useState17(),issues=getIssuesForExpression(outcome,void 0);return jsxs20(Form,{onSubmit:async formData=>{try{props.handleAuthResponse(await medplum.startNewProject({login:props.login,projectName:formData.projectName}))}catch(err){setOutcome(normalizeOperationOutcome2(err))}},children:[jsxs20(Center3,{style:{flexDirection:"column"},children:[jsx43(Logo,{size:32}),jsx43(Title2,{order:3,py:"lg",children:"Create a new project"})]}),jsx43(OperationOutcomeAlert,{issues,mb:"lg"}),jsx43(Stack4,{gap:"sm",children:jsx43(TextInput5,{name:"projectName",label:"Project Name",placeholder:"My Project",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"projectName")})}),jsxs20(Stack4,{gap:"xs",mt:"md",children:[jsx43(SubmitButton,{fullWidth:!0,children:"Create Project"}),jsxs20(Text7,{c:"dimmed",size:"xs",pt:"lg",ta:"center",children:['By clicking "Create Project" you agree to the Medplum'," ",jsx43(Anchor3,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx43(Anchor3,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]})]})]})}import{Anchor as Anchor4,Box as Box6,Center as Center4,Checkbox,Divider as Divider2,PasswordInput,Stack as Stack5,Text as Text8,TextInput as TextInput6}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome3}from"@medplum/core";import{useMedplum as useMedplum8}from"@medplum/react-hooks";import{useEffect as useEffect5,useState as useState19}from"react";import{Box as Box5}from"@mantine/core";import{useEffect as useEffect4,useRef as useRef6,useState as useState18}from"react";function createScriptTag(src,onload){let head=document.getElementsByTagName("head")[0],script=document.createElement("script");script.async=!0,script.src=src,script.onload=onload??null,head.appendChild(script)}import{jsx as jsx44}from"react/jsx-runtime";function GoogleButton(props){let{googleClientId,handleGoogleCredential}=props,parentRef=useRef6(null),[scriptLoaded,setScriptLoaded]=useState18(typeof google<"u"),initializedRef=useRef6(!1),buttonRenderedRef=useRef6(!1);return useEffect4(()=>{if(typeof google>"u"){createScriptTag("https://accounts.google.com/gsi/client",()=>setScriptLoaded(!0));return}initializedRef.current||(google.accounts.id.initialize({client_id:googleClientId,callback:handleGoogleCredential}),initializedRef.current=!0),parentRef.current&&!buttonRenderedRef.current&&(google.accounts.id.renderButton(parentRef.current,{type:"standard",logo_alignment:"center",width:parentRef.current.clientWidth}),buttonRenderedRef.current=!0)},[googleClientId,scriptLoaded,handleGoogleCredential]),googleClientId?jsx44(Box5,{ref:parentRef,w:"100%",h:40,display:"flex",style:{justifyContent:"center"}}):null}import{locationUtils as locationUtils3}from"@medplum/core";function getGoogleClientId(clientId){if(clientId)return clientId;let origin=locationUtils3.getOrigin();if(origin&&("undefined"?.split(",")??[]).includes(origin))return"__GOOGLE_CLIENT_ID__"}function initRecaptcha(siteKey){typeof grecaptcha>"u"&&createScriptTag("https://www.google.com/recaptcha/api.js?render="+siteKey)}function getRecaptcha(siteKey){return new Promise((resolve,reject)=>{grecaptcha.ready(async()=>{try{resolve(await grecaptcha.execute(siteKey,{action:"submit"}))}catch(err){reject(err)}})})}import{Fragment as Fragment12,jsx as jsx45,jsxs as jsxs21}from"react/jsx-runtime";function NewUserForm(props){let googleClientId=getGoogleClientId(props.googleClientId),recaptchaSiteKey=props.recaptchaSiteKey,medplum=useMedplum8(),[outcome,setOutcome]=useState19(),issues=getIssuesForExpression(outcome,void 0);return useEffect5(()=>{recaptchaSiteKey&&initRecaptcha(recaptchaSiteKey)},[recaptchaSiteKey]),jsxs21(Form,{onSubmit:async formData=>{setOutcome(void 0);try{let recaptchaToken="";recaptchaSiteKey&&(recaptchaToken=await getRecaptcha(recaptchaSiteKey)),props.handleAuthResponse(await medplum.startNewUser({projectId:props.projectId,clientId:props.clientId,firstName:formData.firstName,lastName:formData.lastName,email:formData.email,password:formData.password,remember:formData.remember==="true",recaptchaSiteKey,recaptchaToken}))}catch(err){setOutcome(normalizeOperationOutcome3(err))}},children:[jsx45(Center4,{style:{flexDirection:"column"},children:props.children}),jsx45(OperationOutcomeAlert,{issues,mb:"lg"}),googleClientId&&jsxs21(Fragment12,{children:[jsx45(Box6,{style:{minHeight:40},children:jsx45(GoogleButton,{googleClientId,handleGoogleCredential:async response=>{try{props.handleAuthResponse(await medplum.startGoogleLogin({googleClientId:response.clientId,googleCredential:response.credential,projectId:props.projectId,createUser:!0}))}catch(err){setOutcome(normalizeOperationOutcome3(err))}}})}),jsx45(Divider2,{label:"or",labelPosition:"center",my:"lg"})]}),jsxs21(Stack5,{gap:"sm",children:[jsx45(TextInput6,{name:"firstName",type:"text",label:"First name",placeholder:"First name",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"firstName")}),jsx45(TextInput6,{name:"lastName",type:"text",label:"Last name",placeholder:"Last name",required:!0,error:getErrorsForInput(outcome,"lastName")}),jsx45(TextInput6,{name:"email",type:"email",label:"Email",placeholder:"name@domain.com",required:!0,error:getErrorsForInput(outcome,"email")}),jsx45(PasswordInput,{name:"password",label:"Password",autoComplete:"off",required:!0,error:getErrorsForInput(outcome,"password")})]}),jsxs21(Stack5,{gap:"xs",children:[jsx45(Checkbox,{id:"remember",name:"remember",label:"Remember me",size:"xs",style:{lineHeight:1},pt:"md",pb:"xs"}),jsx45(SubmitButton,{fullWidth:!0,children:"Register Account"}),jsxs21(Text8,{c:"dimmed",size:"xs",pt:"lg",ta:"center",children:['By clicking "Register Account" you agree to the Medplum'," ",jsx45(Anchor4,{href:"https://www.medplum.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx45(Anchor4,{href:"https://www.medplum.com/terms",children:"Terms\xA0of\xA0Service"}),"."]}),jsxs21(Text8,{c:"dimmed",size:"xs",ta:"center",children:["This site is protected by reCAPTCHA and the Google"," ",jsx45(Anchor4,{href:"https://policies.google.com/privacy",children:"Privacy\xA0Policy"})," and ",jsx45(Anchor4,{href:"https://policies.google.com/terms",children:"Terms\xA0of\xA0Service"})," apply."]})]})]})}import{jsx as jsx46,jsxs as jsxs22}from"react/jsx-runtime";function RegisterForm(props){let{type,projectId,clientId,googleClientId,recaptchaSiteKey,onSuccess}=props,medplum=useMedplum9(),[login,setLogin]=useState20(),[outcome,setOutcome]=useState20();useEffect6(()=>{type==="patient"&&login&&medplum.startNewPatient({login,projectId}).then(response=>medplum.processCode(response.code)).then(()=>onSuccess()).catch(err=>setOutcome(normalizeOperationOutcome4(err)))},[medplum,type,projectId,login,onSuccess]);function handleAuthResponse(response){response.code?medplum.processCode(response.code).then(()=>onSuccess()).catch(err=>setOutcome(normalizeOperationOutcome4(err))):response.login&&setLogin(response.login)}let issues=getIssuesForExpression(outcome,void 0);return jsxs22(Document,{width:400,px:"xl",py:"xl",bdrs:"md",children:[jsx46(OperationOutcomeAlert,{issues,mb:"lg"}),!login&&jsx46(NewUserForm,{projectId,clientId,googleClientId,recaptchaSiteKey,handleAuthResponse,children:props.children}),login&&type==="project"&&jsx46(NewProjectForm,{login,handleAuthResponse})]})}import{showNotification as showNotification3}from"@mantine/notifications";import{normalizeErrorString as normalizeErrorString5}from"@medplum/core";import{useMedplum as useMedplum13}from"@medplum/react-hooks";import{useCallback as useCallback6,useEffect as useEffect7,useRef as useRef7,useState as useState23}from"react";import{ActionIcon as ActionIcon2,Anchor as Anchor5,Box as Box7,Center as Center5,Checkbox as Checkbox2,Divider as Divider3,PasswordInput as PasswordInput2,Stack as Stack6,Text as Text9,TextInput as TextInput7}from"@mantine/core";import{locationUtils as locationUtils4,normalizeOperationOutcome as normalizeOperationOutcome5}from"@medplum/core";import{useMedplum as useMedplum10}from"@medplum/react-hooks";import{useCallback as useCallback5,useState as useState21}from"react";import{Fragment as Fragment13,jsx as jsx47,jsxs as jsxs23}from"react/jsx-runtime";function AuthenticationForm(props){let[email,setEmail]=useState21();return email?jsx47(PasswordForm,{email,resetEmail:()=>setEmail(void 0),...props}):jsx47(EmailForm,{setEmail,...props})}function EmailForm(props){let{setEmail,onRegister,handleAuthResponse,children,disableEmailAuth,...baseLoginRequest}=props,medplum=useMedplum10(),googleClientId=!props.disableGoogleAuth&&getGoogleClientId(props.googleClientId),[outcome,setOutcome]=useState21(),issues=getIssuesForExpression(outcome,void 0),isExternalAuth=useCallback5(async authMethod=>{if(!authMethod.authorizeUrl)return!1;let state=JSON.stringify({...await medplum.ensureCodeChallenge(baseLoginRequest),domain:authMethod.domain}),url=new URL(authMethod.authorizeUrl);return url.searchParams.set("state",state),locationUtils4.assign(url.toString()),!0},[medplum,baseLoginRequest]),handleSubmit=useCallback5(async formData=>{let authMethod=await medplum.post("auth/method",{email:formData.email});await isExternalAuth(authMethod)||setEmail(formData.email)},[medplum,isExternalAuth,setEmail]),handleGoogleCredential=useCallback5(async response=>{try{let authResponse=await medplum.startGoogleLogin({...baseLoginRequest,googleCredential:response.credential});await isExternalAuth(authResponse)||handleAuthResponse(authResponse)}catch(err){setOutcome(normalizeOperationOutcome5(err))}},[medplum,baseLoginRequest,isExternalAuth,handleAuthResponse]);return jsxs23(Form,{onSubmit:handleSubmit,children:[jsx47(Center5,{style:{flexDirection:"column"},children}),jsx47(OperationOutcomeAlert,{issues,mb:"lg"}),googleClientId&&jsxs23(Fragment13,{children:[jsx47(Box7,{style:{minHeight:40},children:jsx47(GoogleButton,{googleClientId,handleGoogleCredential})}),!disableEmailAuth&&jsx47(Divider3,{label:"or",labelPosition:"center",my:"lg"})]}),!disableEmailAuth&&jsx47(TextInput7,{name:"email",type:"email",label:"Email",mb:"md",placeholder:"name@domain.com",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"email"),"data-testid":"auth.email"}),jsxs23(Stack6,{gap:"xs",children:[!disableEmailAuth&&jsx47(SubmitButton,{fullWidth:!0,children:"Continue"}),onRegister&&jsxs23(Text9,{size:"sm",mt:"lg",c:"dimmed",style:{textAlign:"center"},"data-dashlane-ignore":"true","data-lp-ignore":"true","data-no-autofill":"true","data-form-type":"navigation",children:["Don\u2019t have an account? ",jsx47(Anchor5,{onClick:onRegister,children:"Register"})]})]})]})}function PasswordForm(props){let{onForgotPassword,handleAuthResponse,children,...baseLoginRequest}=props,medplum=useMedplum10(),[outcome,setOutcome]=useState21(),issues=getIssuesForExpression(outcome,void 0),handleSubmit=useCallback5(formData=>{medplum.startLogin({...baseLoginRequest,password:formData.password,remember:formData.remember==="on"}).then(handleAuthResponse).catch(err=>setOutcome(normalizeOperationOutcome5(err)))},[medplum,baseLoginRequest,handleAuthResponse]);return jsxs23(Form,{onSubmit:handleSubmit,children:[jsx47(Center5,{style:{flexDirection:"column"},children}),jsx47(OperationOutcomeAlert,{issues,mb:"lg"}),jsxs23(Stack6,{gap:"sm",children:[jsx47(TextInput7,{label:"Email",value:props.email,disabled:!0,rightSectionWidth:36,rightSection:jsx47(ActionIcon2,{variant:"subtle",color:"gray",onClick:props.resetEmail,"aria-label":"Change email",children:jsx47(IconPencil,{size:"1rem",stroke:1.5})})}),jsx47(PasswordInput2,{name:"password",label:"Password",autoComplete:"off",required:!0,autoFocus:!0,error:getErrorsForInput(outcome,"password"),"data-testid":"auth.password"})]}),jsxs23(Stack6,{gap:"xs",children:[jsx47(Checkbox2,{id:"remember",name:"remember",label:"Remember me",size:"xs",style:{lineHeight:1},pt:"md",pb:"xs"}),jsx47(SubmitButton,{children:"Sign In"}),onForgotPassword&&jsx47(Text9,{size:"sm",mt:"lg",c:"dimmed",style:{textAlign:"center"},"data-dashlane-ignore":"true","data-lp-ignore":"true","data-no-autofill":"true","data-form-type":"navigation",children:jsx47(Anchor5,{onClick:onForgotPassword,children:"Reset Password"})})]})]})}import{Box as Box8,Combobox as Combobox2,Flex,Group as Group8,Stack as Stack7,Text as Text10,TextInput as TextInput8,Title as Title3,useCombobox as useCombobox2}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome6}from"@medplum/core";import{useMedplum as useMedplum11}from"@medplum/react-hooks";import{useState as useState22}from"react";var ChooseProfileForm_default={option:"ChooseProfileForm_option",iconBox:"ChooseProfileForm_iconBox"};import{jsx as jsx48,jsxs as jsxs24}from"react/jsx-runtime";function ChooseProfileForm(props){let medplum=useMedplum11(),combobox=useCombobox2(),[search,setSearch]=useState22(""),[outcome,setOutcome]=useState22();function filterDisplay(display){return!!display?.toLowerCase()?.includes(search.toLowerCase())}function filterMembership(membership){return filterDisplay(membership.profile?.display)||filterDisplay(membership.project?.display)}function handleValueSelect(membershipId){medplum.post("auth/profile",{login:props.login,profile:membershipId}).then(props.handleAuthResponse).catch(err=>setOutcome(normalizeOperationOutcome6(err)))}let options=props.memberships.filter(filterMembership).slice(0,10).map(item=>jsx48(Combobox2.Option,{value:item.id,className:ChooseProfileForm_default.option,children:jsx48(SelectOption,{...item})},item.id));return jsxs24(Stack7,{gap:"0",children:[jsxs24(Flex,{justify:"center",align:"center",direction:"column",wrap:"nowrap",children:[jsx48(Logo,{size:32}),jsx48(Title3,{order:3,py:"lg",children:"Choose a Project"})]}),jsx48(OperationOutcomeAlert,{outcome,mb:"lg"}),jsxs24(Combobox2,{store:combobox,onOptionSubmit:handleValueSelect,children:[jsx48(Combobox2.EventsTarget,{children:jsx48(TextInput8,{placeholder:"Search",value:search,mb:"md",leftSection:jsx48(IconSearch,{size:16}),onChange:event=>{setSearch(event.currentTarget.value),combobox.updateSelectedOptionIndex()}})}),jsx48("div",{children:jsx48(Combobox2.Options,{style:{marginLeft:"-10px",marginRight:"-10px",marginBottom:"-10px"},children:options.length>0?options:jsx48(Combobox2.Empty,{children:"Nothing found..."})})})]})]})}function getMembershipLabel(membership){return membership.identifier?.find(i=>i.system==="https://medplum.com/identifier/label")?.value}function SelectOption(membership){let label=getMembershipLabel(membership);return jsxs24(Group8,{gap:"xs",align:"center",children:[jsx48(Box8,{className:ChooseProfileForm_default.iconBox,children:jsx48(IconBriefcase,{size:16,stroke:2})}),jsxs24("div",{children:[jsxs24(Text10,{size:"sm",fw:500,children:[membership.project?.display," ",label?` - ${label}`:""]}),jsx48(Text10,{size:"xs",c:"dimmed",children:membership.profile?.display})]})]})}import{Center as Center6,Checkbox as Checkbox3,Group as Group9,Stack as Stack8,Title as Title4}from"@mantine/core";import{useMedplum as useMedplum12}from"@medplum/react-hooks";import{Fragment as Fragment14}from"react/jsx-runtime";import{jsx as jsx49,jsxs as jsxs25}from"react/jsx-runtime";var openConditionScope=/^patient\/Condition\.(?:\*|c?r?u?d?s?)$/,encounterDiagnosis="?category=http://terminology.hl7.org/CodeSystem/condition-category|encounter-diagnosis",problemListItem="?category=http://terminology.hl7.org/CodeSystem/condition-category|problem-list-item",healthConcern="?category=http://hl7.org/fhir/us/core/CodeSystem/condition-category|health-concern",openObservationScope=/^patient\/Observation\.(?:\*|c?r?u?d?s?)$/,clinicalTest="?category=http://hl7.org/fhir/us/core/CodeSystem/us-core-observation-category|clinical-test",laboratory="?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory",socialHistory="?category=http://terminology.hl7.org/CodeSystem/observation-category|social-history",sdoh="?category=http://hl7.org/fhir/us/core/CodeSystem/us-core-category|sdoh",survey="?category=http://terminology.hl7.org/CodeSystem/observation-category|survey",vitalSigns="?category=http://terminology.hl7.org/CodeSystem/observation-category|vital-signs";function ChooseScopeForm(props){let medplum=useMedplum12();return jsx49(Form,{onSubmit:formData=>{medplum.post("auth/scope",{login:props.login,scope:Object.keys(formData).join(" ")}).then(props.handleAuthResponse).catch(console.log)},children:jsxs25(Stack8,{children:[jsxs25(Center6,{style:{flexDirection:"column"},children:[jsx49(Logo,{size:32}),jsx49(Title4,{children:"Choose scope"})]}),jsx49(Stack8,{children:(props.scope??"openid").split(" ").map(scopeName=>{let additionalScopes;return openConditionScope.test(scopeName)?additionalScopes=[scopeName+encounterDiagnosis,scopeName+problemListItem,scopeName+healthConcern]:openObservationScope.test(scopeName)&&(additionalScopes=[scopeName+clinicalTest,scopeName+laboratory,scopeName+socialHistory,scopeName+sdoh,scopeName+survey,scopeName+vitalSigns]),jsxs25(Fragment14,{children:[jsx49(Checkbox3,{id:scopeName,name:scopeName,label:scopeName,defaultChecked:!0},scopeName),additionalScopes?.map(scope=>jsx49(Checkbox3,{id:scope,name:scope,label:scope},scope))]},scopeName+"_group")})}),jsx49(Group9,{justify:"flex-end",mt:"xl",children:jsx49(SubmitButton,{children:"Set scope"})})]})})}import{jsx as jsx50}from"react/jsx-runtime";function SignInForm(props){let{login:loginCode,chooseScopes,onSuccess,onForgotPassword,onRegister,onCode,...baseLoginRequest}=props,medplum=useMedplum13(),[login,setLogin]=useState23(),loginRequested=useRef7(!1),[mfaEnrollRequired,setMfaEnrollRequired]=useState23(!1),[enrollQrCode,setEnrollQrCode]=useState23(),[mfaRequired,setMfaRequired]=useState23(!1),[memberships,setMemberships]=useState23(),handleCode=useCallback6(code=>{onCode?onCode(code):medplum.processCode(code).then(()=>{onSuccess&&onSuccess()}).catch(err=>showNotification3({color:"red",message:normalizeErrorString5(err)}))},[medplum,onCode,onSuccess]),handleAuthResponse=useCallback6(response=>{setMfaEnrollRequired(!!response.mfaEnrollRequired),setEnrollQrCode(response.enrollQrCode),setMfaRequired(!!response.mfaRequired),response.login&&setLogin(response.login),response.memberships&&setMemberships(response.memberships),response.code&&(chooseScopes?setMemberships(void 0):handleCode(response.code))},[chooseScopes,handleCode]),handleScopeResponse=useCallback6(response=>{handleCode(response.code)},[handleCode]);return useEffect7(()=>{loginCode&&!loginRequested.current&&!login&&(loginRequested.current=!0,medplum.get("auth/login/"+loginCode).then(handleAuthResponse).catch(err=>showNotification3({color:"red",message:normalizeErrorString5(err)})))},[medplum,loginCode,loginRequested,login,handleAuthResponse]),jsx50(Document,{width:400,px:"xl",py:"xl",bdrs:"md",children:login?mfaEnrollRequired&&enrollQrCode?jsx50(MfaForm,{title:"Enroll in MFA",description:"Scan this QR code with your authenticator app.",buttonText:"Enroll",qrCodeUrl:enrollQrCode,onSubmit:async fields=>{let res=await medplum.post("auth/mfa/login-enroll",{login,token:fields.token});handleAuthResponse(res)}}):mfaRequired?jsx50(MfaForm,{title:"Enter MFA code",description:"Enter the code from your authenticator app.",buttonText:"Submit Code",onSubmit:async fields=>{let res=await medplum.post("auth/mfa/verify",{login,token:fields.token});handleAuthResponse(res)}}):memberships?jsx50(ChooseProfileForm,{login,memberships,handleAuthResponse}):props.projectId==="new"?jsx50(NewProjectForm,{login,handleAuthResponse}):props.chooseScopes?jsx50(ChooseScopeForm,{login,scope:props.scope,handleAuthResponse:handleScopeResponse}):jsx50("div",{children:"Success"}):jsx50(AuthenticationForm,{onForgotPassword,onRegister,handleAuthResponse,disableGoogleAuth:props.disableGoogleAuth,disableEmailAuth:props.disableEmailAuth,...baseLoginRequest,children:props.children})})}import{buildElementsContext as buildElementsContext2,getPathDisplayName as getPathDisplayName3,isEmpty as isEmpty2,tryGetDataType}from"@medplum/core";import{useContext as useContext6,useMemo as useMemo6}from"react";import{ActionIcon as ActionIcon3,CopyButton,Flex as Flex2,Tooltip as Tooltip2}from"@mantine/core";import{PropertyType,formatDateTime,formatPeriod,formatTiming,isEmpty}from"@medplum/core";import{useState as useState26}from"react";import{formatCodeableConcept}from"@medplum/core";import{Fragment as Fragment15,jsx as jsx51}from"react/jsx-runtime";function CodeableConceptDisplay(props){return jsx51(Fragment15,{children:formatCodeableConcept(props.value)})}import{formatCoding}from"@medplum/core";import{Fragment as Fragment16,jsx as jsx52}from"react/jsx-runtime";function CodingDisplay(props){return jsx52(Fragment16,{children:formatCoding(props.value)})}import{Fragment as Fragment17,jsx as jsx53}from"react/jsx-runtime";function ContactPointDisplay(props){let contactPoint=props.value;if(!contactPoint)return null;let builder=[];return contactPoint.value&&builder.push(contactPoint.value),(contactPoint.use||contactPoint.system)&&(builder.push(" ["),contactPoint.use&&builder.push(contactPoint.use),contactPoint.use&&contactPoint.system&&builder.push(" "),contactPoint.system&&builder.push(contactPoint.system),builder.push("]")),jsx53(Fragment17,{children:builder.join("").trim()})}import{Fragment as Fragment18,jsx as jsx54,jsxs as jsxs26}from"react/jsx-runtime";function ContactDetailDisplay(props){let contactDetail=props.value;return contactDetail?jsxs26(Fragment18,{children:[contactDetail.name,contactDetail.name&&": ",contactDetail.telecom?.map(telecom=>jsx54(ContactPointDisplay,{value:telecom},`telecom-${contactDetail.name}-${telecom.value}`))]}):null}import{getDataType,isPopulated as isPopulated3,isProfileLoaded,tryGetProfile}from"@medplum/core";import{useMedplum as useMedplum14}from"@medplum/react-hooks";import{useContext as useContext3,useEffect as useEffect8,useMemo as useMemo3,useState as useState24}from"react";import{getTypedPropertyValue,getTypedPropertyValueWithSchema}from"@medplum/core";function getValueAndType(context,path,profileUrl){let typedResult=getTypedPropertyValue(context,path,{profileUrl});return typedResult?Array.isArray(typedResult)?[typedResult.map(e=>e.value),typedResult[0].type]:[typedResult.value,typedResult.type]:[void 0,"undefined"]}function getValueAndTypeFromElement(typedValue,path,element){let typedResult=getTypedPropertyValueWithSchema(typedValue,path,element);return typedResult?Array.isArray(typedResult)?[typedResult.map(e=>e.value),typedResult[0].type]:[typedResult.value,typedResult.type]:[void 0,"undefined"]}import{jsx as jsx55}from"react/jsx-runtime";function ExtensionDisplay(props){let{elementDefinitionType}=props,medplum=useMedplum14(),ctx=useContext3(ElementsContext),[typeSchema,setTypeSchema]=useState24(getDataType("Extension")),profileUrl=useMemo3(()=>{if(isPopulated3(elementDefinitionType?.profile))return elementDefinitionType.profile[0]},[elementDefinitionType]),[loadingProfile,setLoadingProfile]=useState24(profileUrl!==void 0);if(useEffect8(()=>{profileUrl&&(setLoadingProfile(!0),medplum.requestProfileSchema(profileUrl).then(()=>{let profile=tryGetProfile(profileUrl);setLoadingProfile(!1),profile&&setTypeSchema(profile)}).catch(reason=>{setLoadingProfile(!1),console.warn(reason)}))},[medplum,profileUrl]),profileUrl&&(loadingProfile||!isProfileLoaded(profileUrl)))return jsx55("div",{children:"Loading..."});if(typeSchema.elements["value[x]"]?.max!==0){let[propertyValue,propertyType]=getValueAndType({type:"Extension",value:props.value},"value[x]",profileUrl??ctx.profileUrl);return jsx55(ResourcePropertyDisplay,{propertyType,value:propertyValue})}return jsx55(BackboneElementDisplay,{path:props.path,value:{type:typeSchema.type,value:props.value},compact:props.compact,ignoreMissingValues:props.ignoreMissingValues,link:props.link,profileUrl})}import{jsxs as jsxs27}from"react/jsx-runtime";function IdentifierDisplay(props){return jsxs27("div",{children:[props.value?.system,": ",props.value?.value]})}import{formatMoney}from"@medplum/core";import{Fragment as Fragment19,jsx as jsx56}from"react/jsx-runtime";function MoneyDisplay(props){return jsx56(Fragment19,{children:formatMoney(props.value)})}import{formatQuantity}from"@medplum/core";import{Fragment as Fragment20,jsx as jsx57}from"react/jsx-runtime";function QuantityDisplay(props){return jsx57(Fragment20,{children:formatQuantity(props.value)})}import{formatRange}from"@medplum/core";import{Fragment as Fragment21,jsx as jsx58}from"react/jsx-runtime";function RangeDisplay(props){return jsx58(Fragment21,{children:formatRange(props.value)})}import{Fragment as Fragment22,jsx as jsx59,jsxs as jsxs28}from"react/jsx-runtime";function RatioDisplay(props){let value=props.value;return value?jsxs28(Fragment22,{children:[jsx59(QuantityDisplay,{value:value.numerator}),"\xA0/\xA0",jsx59(QuantityDisplay,{value:value.denominator})]}):null}import{stringify}from"@medplum/core";import{Fragment as Fragment23,jsx as jsx60}from"react/jsx-runtime";function ReferenceDisplay(props){if(!props.value)return null;let displayString=props.value.display||props.value.reference||stringify(props.value);return props.link!==!1&&props.value.reference?jsx60(MedplumLink,{to:props.value,children:displayString}):jsx60(Fragment23,{children:displayString})}import{Group as Group10,Text as Text11}from"@mantine/core";import{getPathDisplayName as getPathDisplayName2,isPopulated as isPopulated6}from"@medplum/core";import{useMedplum as useMedplum15}from"@medplum/react-hooks";import{useContext as useContext5,useEffect as useEffect9,useMemo as useMemo5,useState as useState25}from"react";import{getValueSliceName,isPopulated as isPopulated4,isSliceDefinitionWithTypes,tryGetProfile as tryGetProfile2}from"@medplum/core";function assignValuesIntoSlices(values,slices,slicing,profileUrl){if(!isPopulated4(slicing?.slices))return[values];let slicedValues=new Array(slices.length+1);for(let i=0;i<slicedValues.length;i++)slicedValues[i]=[];for(let value of values){let sliceName=getValueSliceName(value,slices,slicing.discriminator,profileUrl),sliceIndex=sliceName?slices.findIndex(slice=>slice.name===sliceName):-1;sliceIndex===-1&&(sliceIndex=slices.length),slicedValues[sliceIndex].push(value)}return slicedValues}async function prepareSlices({medplum,property}){return new Promise((resolve,reject)=>{if(!property.slicing){resolve([]);return}let supportedSlices=[],profileUrls=[],promises=[];for(let slice of property.slicing.slices){if(!isSliceDefinitionWithTypes(slice)){console.debug("Unsupported slice definition",slice);continue}let profileUrl;isPopulated4(slice.elements)||(profileUrl=slice.type[0]?.profile?.[0]),supportedSlices.push(slice),profileUrls.push(profileUrl),profileUrl&&promises.push(medplum.requestProfileSchema(profileUrl))}Promise.all(promises).then(()=>{for(let i=0;i<supportedSlices.length;i++){let slice=supportedSlices[i],profileUrl=profileUrls[i];if(profileUrl){let typeSchema=tryGetProfile2(profileUrl);slice.typeSchema=typeSchema}}resolve(supportedSlices)}).catch(reject)})}import{buildElementsContext,isPopulated as isPopulated5}from"@medplum/core";import{useContext as useContext4,useMemo as useMemo4}from"react";import{jsx as jsx61}from"react/jsx-runtime";function maybeWrapWithContext(ContextProvider,contextValue,contents){return contextValue!==void 0?jsx61(ContextProvider,{value:contextValue,children:contents}):contents}import{Fragment as Fragment24,jsx as jsx62}from"react/jsx-runtime";function SliceDisplay(props){let{slice,property}=props,sliceElements=slice.typeSchema?.elements??slice.elements,parentContext=useContext4(ElementsContext),contextValue=useMemo4(()=>{if(isPopulated5(sliceElements))return buildElementsContext({parentContext,elements:sliceElements,path:props.path,profileUrl:slice.typeSchema?.url})},[parentContext,props.path,slice.typeSchema?.url,sliceElements]);return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx62(Fragment24,{children:props.value.map((value,valueIndex)=>jsx62("div",{children:jsx62(ResourcePropertyDisplay,{property,path:props.path,arrayElement:!0,elementDefinitionType:slice.type[0],propertyType:slice.type[0].code,value,ignoreMissingValues:props.ignoreMissingValues,link:props.link})},`${valueIndex}-${props.value.length}`))}))}import{Fragment as Fragment25,jsx as jsx63,jsxs as jsxs29}from"react/jsx-runtime";var MAX_ARRAY_SIZE=50;function ResourceArrayDisplay(props){let{property,propertyType}=props,medplum=useMedplum15(),values=useMemo5(()=>Array.isArray(props.values)?props.values:[],[props.values]),[loading,setLoading]=useState25(!0),[slices,setSlices]=useState25([]),[slicedValues,setSlicedValues]=useState25(()=>[values]),[valuesLength,setValuesLength]=useState25(0),ctx=useContext5(ElementsContext);if(useEffect9(()=>{prepareSlices({medplum,property}).then(slices2=>{setValuesLength(values.length),setSlices(slices2);let limitedValues=values.slice(0,MAX_ARRAY_SIZE),slicedValues2=assignValuesIntoSlices(limitedValues,slices2,property.slicing,ctx.profileUrl);setSlicedValues(slicedValues2),setLoading(!1)}).catch(reason=>{console.error(reason),setLoading(!1)})},[medplum,property,ctx.profileUrl,setSlicedValues,values]),loading)return jsx63("div",{children:"Loading..."});let nonSliceContent;if(property.type[0]?.code!=="Extension"){let nonSliceValues=slicedValues[slices.length],nonSliceElements=nonSliceValues.map((value,valueIndex)=>jsx63("div",{children:jsx63(ResourcePropertyDisplay,{path:props.path,arrayElement:!0,property,propertyType,value,ignoreMissingValues:props.ignoreMissingValues,link:props.link})},`${valueIndex}-${nonSliceValues.length}`));if(props.includeDescriptionListEntry){if(!isPopulated6(props.path))throw new Error("props.path is required when includeDescriptionListEntry is true");let key=props.path.split(".").pop();nonSliceContent=jsx63(DescriptionListEntry,{term:getPathDisplayName2(key),children:nonSliceElements})}else nonSliceContent=jsx63(Fragment25,{children:nonSliceElements})}return jsxs29(Fragment25,{children:[slices.map((slice,sliceIndex)=>{if(!props.path)throw new Error(`Displaying a resource property with slices of type ${props.propertyType} requires path`);let sliceDisplay=jsx63(SliceDisplay,{path:props.path,slice,property,value:slicedValues[sliceIndex],ignoreMissingValues:props.ignoreMissingValues,link:props.link},slice.name);return props.includeDescriptionListEntry&&(sliceDisplay=jsx63(DescriptionListEntry,{term:getPathDisplayName2(slice.name),children:sliceDisplay},slice.name)),sliceDisplay}),nonSliceContent,valuesLength>MAX_ARRAY_SIZE&&jsx63(Group10,{justify:"right",children:jsxs29(Text11,{children:["... ",valuesLength," total values"]})})]})}import{Fragment as Fragment26,jsx as jsx64,jsxs as jsxs30}from"react/jsx-runtime";function ResourcePropertyDisplay(props){let{property,propertyType,value}=props;if(property?.path?.endsWith(".id"))return jsxs30(Flex2,{gap:3,align:"center",children:[value,!isEmpty(value)&&jsx64(CopyButton,{value,timeout:2e3,children:({copied,copy})=>jsx64(Tooltip2,{label:copied?"Copied":"Copy",withArrow:!0,position:"right",children:jsx64(ActionIcon3,{variant:"subtle",color:copied?"teal":"gray",onClick:copy,children:copied?jsx64(IconCheck,{size:"1rem"}):jsx64(IconCopy,{size:"1rem"})})})})]});if(property&&(property.isArray||property.max>1)&&!props.arrayElement)return propertyType===PropertyType.Attachment?jsx64(AttachmentArrayDisplay,{values:value,maxWidth:props.maxWidth,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,property,path:props.path}):jsx64(ResourceArrayDisplay,{path:props.path,property,propertyType,values:value,includeDescriptionListEntry:props.includeArrayDescriptionListEntry,ignoreMissingValues:props.ignoreMissingValues,link:props.link});switch(propertyType){case PropertyType.boolean:return jsx64(Fragment26,{children:value===void 0?"":(!!value).toString()});case PropertyType.SystemString:case PropertyType.string:return props.property?.path?.toLowerCase().includes("secret")?jsx64(SecretFieldDisplay,{value}):jsx64("div",{style:{whiteSpace:"pre-wrap"},children:value});case PropertyType.code:case PropertyType.date:case PropertyType.decimal:case PropertyType.id:case PropertyType.integer:case PropertyType.positiveInt:case PropertyType.unsignedInt:case PropertyType.uri:case PropertyType.url:case PropertyType.xhtml:return jsx64(Fragment26,{children:value});case PropertyType.canonical:return jsx64(ReferenceDisplay,{value:{reference:value},link:props.link});case PropertyType.dateTime:case PropertyType.instant:return jsx64(Fragment26,{children:formatDateTime(value)});case PropertyType.markdown:return jsx64("pre",{children:value});case PropertyType.Address:return jsx64(AddressDisplay,{value});case PropertyType.Annotation:return jsx64(Fragment26,{children:value?.text});case PropertyType.Attachment:return jsx64(AttachmentDisplay,{value,maxWidth:props.maxWidth});case PropertyType.CodeableConcept:return jsx64(CodeableConceptDisplay,{value});case PropertyType.Coding:return jsx64(CodingDisplay,{value});case PropertyType.ContactDetail:return jsx64(ContactDetailDisplay,{value});case PropertyType.ContactPoint:return jsx64(ContactPointDisplay,{value});case PropertyType.HumanName:return jsx64(HumanNameDisplay,{value});case PropertyType.Identifier:return jsx64(IdentifierDisplay,{value});case PropertyType.Money:return jsx64(MoneyDisplay,{value});case PropertyType.Period:return jsx64(Fragment26,{children:formatPeriod(value)});case PropertyType.Quantity:case PropertyType.Duration:return jsx64(QuantityDisplay,{value});case PropertyType.Range:return jsx64(RangeDisplay,{value});case PropertyType.Ratio:return jsx64(RatioDisplay,{value});case PropertyType.Reference:return jsx64(ReferenceDisplay,{value,link:props.link});case PropertyType.Timing:return jsx64(Fragment26,{children:formatTiming(value)});case PropertyType.Dosage:case PropertyType.UsageContext:if(!props.path)throw new Error(`Displaying property of type ${props.propertyType} requires path`);return jsx64(BackboneElementDisplay,{path:props.path,value:{type:propertyType,value},compact:!0,ignoreMissingValues:props.ignoreMissingValues});case PropertyType.Extension:if(!props.path)throw new Error(`Displaying property of type ${props.propertyType} requires path`);return jsx64(ExtensionDisplay,{path:props.path,value,compact:!0,ignoreMissingValues:props.ignoreMissingValues,elementDefinitionType:props.elementDefinitionType});default:if(!property)throw new Error(`Displaying property of type ${props.propertyType} requires element schema`);if(!props.path)throw new Error(`Displaying property of type ${props.propertyType} requires path`);return jsx64(BackboneElementDisplay,{path:props.path,value:{type:property.type[0].code,value},compact:!0,ignoreMissingValues:props.ignoreMissingValues})}}function SecretFieldDisplay(props){let[isVisible,setIsVisible]=useState26(!1),secretValue=props.value??"",hasValue=!isEmpty(secretValue),MASK="\u2022".repeat(8);return jsxs30(Flex2,{gap:3,align:"center",children:[isVisible?jsx64("div",{style:{whiteSpace:"pre-wrap"},children:secretValue}):jsx64("div",{style:{whiteSpace:"pre-wrap"},"aria-hidden":"true",children:hasValue?MASK:""}),hasValue&&jsxs30(Fragment26,{children:[jsx64(CopyButton,{value:props.value,timeout:2e3,children:({copied,copy})=>jsx64(Tooltip2,{label:copied?"Copied":"Copy secret",withArrow:!0,position:"right",children:jsx64(ActionIcon3,{variant:"subtle",color:copied?"teal":"gray",onClick:copy,"aria-label":copied?"Copied":"Copy secret",children:copied?jsx64(IconCheck,{size:"1rem"}):jsx64(IconCopy,{size:"1rem"})})})}),jsx64(Tooltip2,{label:isVisible?"Hide secret":"Show secret",withArrow:!0,position:"right",children:jsx64(ActionIcon3,{variant:"subtle",color:"gray",onClick:()=>setIsVisible(!isVisible),"aria-label":isVisible?"Hide secret":"Show secret",children:isVisible?jsx64(IconEyeOff,{size:"1rem"}):jsx64(IconEye,{size:"1rem"})})})]})]})}import{jsx as jsx65,jsxs as jsxs31}from"react/jsx-runtime";var EXTENSION_KEYS2=["extension","modifierExtension"],IGNORED_PROPERTIES2=DEFAULT_IGNORED_PROPERTIES.filter(prop=>!EXTENSION_KEYS2.includes(prop));function BackboneElementDisplay(props){let typedValue=props.value,{value,type:typeName}=typedValue,parentElementsContext=useContext6(ElementsContext),profileUrl=props.profileUrl??parentElementsContext?.profileUrl,typeSchema=useMemo6(()=>tryGetDataType(typeName,profileUrl),[profileUrl,typeName]),newElementsContext=useMemo6(()=>{if(typeSchema)return buildElementsContext2({parentContext:parentElementsContext,elements:typeSchema.elements,path:props.path,profileUrl:typeSchema.url,accessPolicyResource:props.accessPolicyResource})},[typeSchema,parentElementsContext,props.path,props.accessPolicyResource]);if(isEmpty2(value))return null;if(!typeSchema)return jsxs31("div",{children:[typeName,"\xA0not implemented"]});if(typeof value=="object"&&"name"in value&&Object.keys(value).length===1&&typeof value.name=="string")return jsx65("div",{children:value.name});let elementsContext=newElementsContext??parentElementsContext;return maybeWrapWithContext(ElementsContext.Provider,newElementsContext,jsx65(DescriptionList,{compact:props.compact,children:Object.entries(elementsContext.elements).map(([key,property])=>{if(EXTENSION_KEYS2.includes(key)&&isEmpty2(property.slicing?.slices))return null;if(IGNORED_PROPERTIES2.includes(key))return null;if(DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key)&&property.path.split(".").length===2||key.includes("."))return null;let[propertyValue,propertyType]=getValueAndType(typedValue,key,elementsContext.profileUrl);if((props.ignoreMissingValues||property.max===0)&&isEmpty2(propertyValue)||props.path.endsWith(".extension")&&(key==="url"||key==="id"))return null;let isArrayProperty=property.max>1||property.isArray,resourcePropertyDisplay=jsx65(ResourcePropertyDisplay,{property,propertyType,path:props.path+"."+key,value:propertyValue,ignoreMissingValues:props.ignoreMissingValues,includeArrayDescriptionListEntry:isArrayProperty,link:props.link},key);return isArrayProperty?resourcePropertyDisplay:jsx65(DescriptionListEntry,{term:getPathDisplayName3(key),children:resourcePropertyDisplay},key)})}))}import{Box as Box9}from"@mantine/core";import{buildElementsContext as buildElementsContext4,tryGetDataType as tryGetDataType2}from"@medplum/core";import{useContext as useContext23,useMemo as useMemo22,useState as useState47}from"react";import{Stack as Stack12}from"@mantine/core";import{getPathDisplayName as getPathDisplayName5}from"@medplum/core";import{useContext as useContext22,useMemo as useMemo21,useState as useState46}from"react";import{Group as Group11,Input as Input2}from"@mantine/core";import{useContext as useContext7}from"react";var FormSection_default={dimmed:"FormSection_dimmed",preserveBreaks:"FormSection_preserveBreaks"};import{Tooltip as Tooltip3}from"@mantine/core";import{jsx as jsx66}from"react/jsx-runtime";var READ_ONLY_TOOLTIP_TEXT="Read Only";function maybeWrapWithTooltip(tooltipText,children){return tooltipText?jsx66(Tooltip3.Floating,{label:tooltipText,children}):children}import{jsx as jsx67,jsxs as jsxs32}from"react/jsx-runtime";function CheckboxFormSection(props){let{debugMode}=useContext7(ElementsContext),label;return debugMode&&props.fhirPath?label=`${props.title} - ${props.fhirPath}`:label=props.title,maybeWrapWithTooltip(props?.readonly?READ_ONLY_TOOLTIP_TEXT:void 0,jsxs32(Group11,{wrap:"nowrap","data-testid":props.testId,children:[jsx67("div",{children:props.children}),jsx67("div",{children:jsx67(Input2.Wrapper,{id:props.htmlFor,label,classNames:{label:props?.readonly?FormSection_default.dimmed:void 0},description:props.description,withAsterisk:props.withAsterisk,children:null})})]}))}import{Input as Input3}from"@mantine/core";import{useContext as useContext8}from"react";import{jsx as jsx68}from"react/jsx-runtime";function FormSection(props){let{debugMode}=useContext8(ElementsContext),label;return debugMode&&props.fhirPath?label=`${props.title} - ${props.fhirPath}`:label=props.title,maybeWrapWithTooltip(props?.readonly?READ_ONLY_TOOLTIP_TEXT:void 0,jsx68(Input3.Wrapper,{id:props.htmlFor,label,classNames:{label:clsx_default({[FormSection_default.dimmed]:props?.readonly},FormSection_default.preserveBreaks)},description:props.description,withAsterisk:props.withAsterisk,error:getErrorsForInput(props.outcome,props.errorExpression??props.htmlFor),"data-testid":props.testId,children:props.children}))}import{capitalize,isEmpty as isEmpty3}from"@medplum/core";function setPropertyValue(obj,key,propName,elementDefinition,value){let types=elementDefinition.type;if(types.length>1)for(let type of types){let compoundKey=key.replace("[x]",capitalize(type.code));compoundKey in obj&&delete obj[compoundKey]}return isEmpty3(value)?obj[propName]=void 0:obj[propName]=value,obj}function isSupportedProfileStructureDefinition(profile){return!!profile&&!isEmpty3(profile.url)&&!isEmpty3(profile.name)}import{Checkbox as Checkbox4,Group as Group25,NativeSelect as NativeSelect9,Textarea as Textarea2,TextInput as TextInput17}from"@mantine/core";import{applyDefaultValuesToElement,capitalize as capitalize2,getPathDifference,HTTP_HL7_ORG,isComplexTypeCode,isEmpty as isEmpty6,isPopulated as isPopulated11,PropertyType as PropertyType2}from"@medplum/core";import{useContext as useContext21,useMemo as useMemo20,useState as useState45}from"react";import{useState as useState27}from"react";import{jsx as jsx69}from"react/jsx-runtime";function CodeableConceptInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,outcome:_outcome,path:_path,valuePath:_valuePath,...rest}=props,[value,setValue]=useState27(defaultValue2);function handleChange(newValues){let newConcept=valueSetElementToCodeableConcept(newValues);setValue(newConcept),onChange&&onChange(newConcept)}return jsx69(ValueSetAutocomplete,{defaultValue:value&&codeableConceptToValueSetElement(value),onChange:handleChange,withHelpText:withHelpText??!0,...rest})}function codeableConceptToValueSetElement(concept){return concept.coding?.map(c=>({system:c.system,code:c.code,display:c.display}))}function valueSetElementToCodeableConcept(elements){if(elements.length!==0)return{coding:elements.map(e=>({system:e.system,code:e.code,display:e.display}))}}import{useState as useState28}from"react";import{jsx as jsx70}from"react/jsx-runtime";function CodingInput(props){let{defaultValue:defaultValue2,onChange,withHelpText,response,...rest}=props,[value,setValue]=useState28(response?.answer?.[0]?.valueCoding??defaultValue2);function handleChange(newValues){let newValue=newValues[0],newConcept=newValue&&valueSetElementToCoding(newValue);setValue(newConcept),onChange&&onChange(newConcept)}return jsx70(ValueSetAutocomplete,{defaultValue:value?codingToValueSetElement(value):void 0,maxValues:1,onChange:handleChange,withHelpText:withHelpText??!0,...rest})}function codingToValueSetElement(coding){return{system:coding.system,code:coding.code,display:coding.display}}function valueSetElementToCoding(element){return{system:element.system,code:element.code,display:element.display}}import{Group as Group13,TextInput as TextInput10}from"@mantine/core";import{useContext as useContext10,useMemo as useMemo8,useRef as useRef9,useState as useState30}from"react";import{Group as Group12,NativeSelect as NativeSelect3,TextInput as TextInput9}from"@mantine/core";import{useContext as useContext9,useMemo as useMemo7,useRef as useRef8,useState as useState29}from"react";import{jsx as jsx71,jsxs as jsxs33}from"react/jsx-runtime";function ContactPointInput(props){let{path,outcome}=props,{elementsByPath,getExtendedProps}=useContext9(ElementsContext),[contactPoint,setContactPoint]=useState29(props.defaultValue),ref=useRef8(contactPoint);ref.current=contactPoint;let[systemElement,useElement,valueElement]=useMemo7(()=>["system","use","value"].map(field=>elementsByPath[path+"."+field]),[elementsByPath,path]),[systemProps,useProps9,valueProps]=useMemo7(()=>["system","use","value"].map(field=>getExtendedProps(path+"."+field)),[getExtendedProps,path]);function setContactPointWrapper(newValue){newValue&&Object.keys(newValue).length===0&&(newValue=void 0),setContactPoint(newValue),props.onChange&&props.onChange(newValue)}function setSystem(system){let newValue={...ref.current,system};system||delete newValue.system,setContactPointWrapper(newValue)}function setUse(use){let newValue={...ref.current,use};use||delete newValue.use,setContactPointWrapper(newValue)}function setValue(value){let newValue={...ref.current,value};value||delete newValue.value,setContactPointWrapper(newValue)}let errorPath=props.valuePath??path;return jsxs33(Group12,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx71(NativeSelect3,{disabled:props.disabled||systemProps?.readonly,"data-testid":"system",defaultValue:contactPoint?.system,required:(systemElement?.min??0)>0,onChange:e=>setSystem(e.currentTarget.value),data:["","email","phone","fax","pager","sms","other"],error:getErrorsForInput(outcome,errorPath+".system")}),jsx71(NativeSelect3,{disabled:props.disabled||useProps9?.readonly,"data-testid":"use",defaultValue:contactPoint?.use,required:(useElement?.min??0)>0,onChange:e=>setUse(e.currentTarget.value),data:["","home","work","temp","old","mobile"],error:getErrorsForInput(outcome,errorPath+".use")}),jsx71(TextInput9,{disabled:props.disabled||valueProps?.readonly,placeholder:"Value",defaultValue:contactPoint?.value,required:(valueElement?.min??0)>0,onChange:e=>setValue(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".value")})]})}import{jsx as jsx72,jsxs as jsxs34}from"react/jsx-runtime";function ContactDetailInput(props){let[contactDetail,setContactDetail]=useState30(props.defaultValue),ref=useRef9(contactDetail);ref.current=contactDetail;let{getExtendedProps}=useContext10(ElementsContext),[nameProps,telecomProps]=useMemo8(()=>["name","telecom"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setContactDetailWrapper(newValue){setContactDetail(newValue),props.onChange&&props.onChange(newValue)}function setName(name){let newValue={...ref.current,name};name||delete newValue.name,setContactDetailWrapper(newValue)}function setTelecom(telecom){let newValue={...ref.current,telecom:telecom&&[telecom]};telecom||delete newValue.telecom,setContactDetailWrapper(newValue)}return jsxs34(Group13,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx72(TextInput10,{disabled:props.disabled||nameProps?.readonly,"data-testid":props.name+"-name",name:props.name+"-name",placeholder:"Name",style:{width:180},defaultValue:contactDetail?.name,onChange:e=>setName(e.currentTarget.value)}),jsx72(ContactPointInput,{disabled:props.disabled||telecomProps?.readonly,name:props.name+"-telecom",path:props.path+".telecom",defaultValue:contactDetail?.telecom?.[0],onChange:setTelecom,outcome:props.outcome})]})}import{TextInput as TextInput11}from"@mantine/core";import{isValidDate}from"@medplum/core";function convertIsoToLocal(isoString){if(!isoString)return"";let date=new Date(isoString);return isValidDate(date)?date.toLocaleDateString("sv")+"T"+date.toLocaleTimeString("sv"):""}function convertLocalToIso(localString){if(!localString)return"";let date=new Date(localString);return isValidDate(date)?date.toISOString():""}import{jsx as jsx73}from"react/jsx-runtime";function DateTimeInput(props){return jsx73(TextInput11,{id:props.name,name:props.name,label:props.label,"data-autofocus":props.autoFocus,"data-testid":props["data-testid"]??props.name,placeholder:props.placeholder,required:props.required,disabled:props.disabled,type:getInputType(),step:1,defaultValue:convertIsoToLocal(props.defaultValue),autoFocus:props.autoFocus,error:getErrorsForInput(props.outcome,props.name),onChange:e=>{if(props.onChange){let newValue=e.currentTarget.value;props.onChange(convertLocalToIso(newValue))}}})}function getInputType(){return"datetime-local"}import{isPopulated as isPopulated7,isProfileLoaded as isProfileLoaded2}from"@medplum/core";import{useMedplum as useMedplum16}from"@medplum/react-hooks";import{useEffect as useEffect10,useMemo as useMemo9,useState as useState31}from"react";import{jsx as jsx74}from"react/jsx-runtime";function ExtensionInput(props){let{propertyType}=props,medplum=useMedplum16(),profileUrl=useMemo9(()=>{if(isPopulated7(propertyType.profile))return propertyType.profile[0]},[propertyType]),[loadingProfile,setLoadingProfile]=useState31(profileUrl!==void 0);return useEffect10(()=>{profileUrl&&(setLoadingProfile(!0),medplum.requestProfileSchema(profileUrl).then(()=>setLoadingProfile(!1)).catch(reason=>{setLoadingProfile(!1),console.warn(reason)}))},[medplum,profileUrl]),profileUrl&&(loadingProfile||!isProfileLoaded2(profileUrl))?jsx74("div",{children:"Loading..."}):jsx74(BackboneElementInput,{profileUrl,path:props.path,typeName:"Extension",defaultValue:props.defaultValue,onChange:props.onChange})}import{Group as Group14,NativeSelect as NativeSelect4,TextInput as TextInput12}from"@mantine/core";import{useContext as useContext11,useMemo as useMemo10,useState as useState32}from"react";import{jsx as jsx75,jsxs as jsxs35}from"react/jsx-runtime";function HumanNameInput(props){let{outcome,path}=props,[value,setValue]=useState32(props.defaultValue),{getExtendedProps}=useContext11(ElementsContext),[useProps9,prefixProps,givenProps,familyProps,suffixProps]=useMemo10(()=>["use","prefix","given","family","suffix"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}function setUse(use){setValueWrapper({...value,use:use||void 0})}function setPrefix(prefix){setValueWrapper({...value,prefix:prefix?prefix.split(" "):void 0})}function setGiven(given){setValueWrapper({...value,given:given?given.split(" "):void 0})}function setFamily(family){setValueWrapper({...value,family:family||void 0})}function setSuffix(suffix){setValueWrapper({...value,suffix:suffix?suffix.split(" "):void 0})}let errorPath=props.valuePath??path;return jsxs35(Group14,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx75(NativeSelect4,{disabled:props.disabled||useProps9?.readonly,defaultValue:value?.use,name:props.name+"-use","data-testid":"use",onChange:e=>setUse(e.currentTarget.value),data:["","temp","old","usual","official","nickname","anonymous","maiden"],error:getErrorsForInput(outcome,errorPath+".use")}),jsx75(TextInput12,{disabled:props.disabled||prefixProps?.readonly,placeholder:"Prefix",name:props.name+"-prefix",defaultValue:value?.prefix?.join(" "),onChange:e=>setPrefix(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".prefix")}),jsx75(TextInput12,{disabled:props.disabled||givenProps?.readonly,placeholder:"Given",name:props.name+"-given",defaultValue:value?.given?.join(" "),onChange:e=>setGiven(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".given")}),jsx75(TextInput12,{disabled:props.disabled||familyProps?.readonly,name:props.name+"-family",placeholder:"Family",defaultValue:value?.family,onChange:e=>setFamily(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".family")}),jsx75(TextInput12,{disabled:props.disabled||suffixProps?.readonly,placeholder:"Suffix",name:props.name+"-suffix",defaultValue:value?.suffix?.join(" "),onChange:e=>setSuffix(e.currentTarget.value),error:getErrorsForInput(outcome,errorPath+".suffix")})]})}import{Group as Group15,TextInput as TextInput13}from"@mantine/core";import{useContext as useContext12,useMemo as useMemo11,useState as useState33}from"react";import{jsx as jsx76,jsxs as jsxs36}from"react/jsx-runtime";function IdentifierInput(props){let[value,setValue]=useState33(props.defaultValue),{elementsByPath,getExtendedProps}=useContext12(ElementsContext),[systemElement,valueElement]=useMemo11(()=>["system","value"].map(field=>elementsByPath[props.path+"."+field]),[elementsByPath,props.path]),[systemProps,valueProps]=useMemo11(()=>["system","value"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}let errorPath=props.valuePath??props.path;return jsxs36(Group15,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx76(TextInput13,{disabled:props.disabled||systemProps?.readonly,placeholder:"System",required:(systemElement?.min??0)>0,defaultValue:value?.system,onChange:e=>setValueWrapper({...value,system:e.currentTarget.value}),error:getErrorsForInput(props.outcome,errorPath+".system")}),jsx76(TextInput13,{disabled:props.disabled||valueProps?.readonly,placeholder:"Value",required:(valueElement?.min??0)>0,defaultValue:value?.value,onChange:e=>setValueWrapper({...value,value:e.currentTarget.value}),error:getErrorsForInput(props.outcome,errorPath+".value")})]})}import{NativeSelect as NativeSelect5,TextInput as TextInput14}from"@mantine/core";import{useCallback as useCallback7,useContext as useContext13,useMemo as useMemo12,useState as useState34}from"react";import{jsx as jsx77}from"react/jsx-runtime";var data=["USD","EUR","CAD","GBP","AUD"];function MoneyInput(props){let{onChange}=props,[value,setValue]=useState34(props.defaultValue),{getExtendedProps}=useContext13(ElementsContext),[currencyProps,valueProps]=useMemo12(()=>["currency","value"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]),setValueWrapper=useCallback7(newValue=>{setValue(newValue),onChange&&onChange(newValue)},[onChange]),handleCurrencyChange=useCallback7(e=>{setValueWrapper({...value,currency:e.currentTarget.value})},[value,setValueWrapper]),handleValueChange=useCallback7(e=>{setValueWrapper({...value,value:e.currentTarget.valueAsNumber})},[value,setValueWrapper]),select=jsx77(NativeSelect5,{disabled:props.disabled||currencyProps?.readonly,defaultValue:value?.currency,data,styles:{input:{fontWeight:500,borderTopLeftRadius:0,borderBottomLeftRadius:0,width:92}},onChange:handleCurrencyChange});return jsx77(TextInput14,{disabled:props.disabled||valueProps?.readonly,type:"number",name:props.name,label:props.label,placeholder:props.placeholder??"Value",defaultValue:value?.value?.toString()??"USD",leftSection:jsx77(IconCurrencyDollar,{size:14}),rightSection:select,rightSectionWidth:92,onChange:handleValueChange})}import{Group as Group16}from"@mantine/core";import{useContext as useContext14,useMemo as useMemo13,useState as useState35}from"react";import{jsx as jsx78,jsxs as jsxs37}from"react/jsx-runtime";function PeriodInput(props){let[value,setValue]=useState35(props.defaultValue),{getExtendedProps}=useContext14(ElementsContext),[startProps,endProps]=useMemo13(()=>["start","end"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs37(Group16,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx78(DateTimeInput,{disabled:props.disabled||startProps?.readonly,name:props.name+".start",placeholder:"Start",defaultValue:value?.start,onChange:newValue=>setValueWrapper({...value,start:newValue})}),jsx78(DateTimeInput,{disabled:props.disabled||endProps?.readonly,name:props.name+".end",placeholder:"End",defaultValue:value?.end,onChange:newValue=>setValueWrapper({...value,end:newValue})})]})}import{Group as Group17,NativeSelect as NativeSelect6,TextInput as TextInput15}from"@mantine/core";import{useContext as useContext15,useMemo as useMemo14,useState as useState36}from"react";import{jsx as jsx79,jsxs as jsxs38}from"react/jsx-runtime";function QuantityInput(props){let[value,setValue]=useState36(props.defaultValue),{getExtendedProps}=useContext15(ElementsContext),[comparatorProps,valueProps,unitProps]=useMemo14(()=>["comparator","value","unit"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs38(Group17,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx79(NativeSelect6,{disabled:props.disabled||comparatorProps?.readonly,style:{width:80},"data-testid":props.name+"-comparator",defaultValue:value?.comparator,data:["","<","<=",">=",">"],onChange:e=>setValueWrapper({...value,comparator:e.currentTarget.value})}),jsx79(TextInput15,{disabled:props.disabled||valueProps?.readonly,id:props.name,name:props.name,required:props.required,"data-autofocus":props.autoFocus,"data-testid":props.name+"-value",type:"number",placeholder:"Value",defaultValue:value?.value,autoFocus:props.autoFocus,step:"any",onWheel:e=>{props.disableWheel&&e.currentTarget.blur()},onChange:e=>{setValueWrapper({...value,value:tryParseNumber(e.currentTarget.value)})}}),jsx79(TextInput15,{disabled:props.disabled||unitProps?.readonly,placeholder:"Unit","data-testid":props.name+"-unit",defaultValue:value?.unit,onChange:e=>setValueWrapper({...value,unit:e.currentTarget.value})})]})}function tryParseNumber(str){if(str)return Number.parseFloat(str)}import{Group as Group18}from"@mantine/core";import{useContext as useContext16,useMemo as useMemo15,useState as useState37}from"react";import{jsx as jsx80,jsxs as jsxs39}from"react/jsx-runtime";function RangeInput(props){let[value,setValue]=useState37(props.defaultValue),{getExtendedProps}=useContext16(ElementsContext),[lowProps,highProps]=useMemo15(()=>["low","high"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs39(Group18,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx80(QuantityInput,{path:props.path+".low",disabled:props.disabled||lowProps?.readonly,name:props.name+"-low",defaultValue:value?.low,onChange:v=>setValueWrapper({...value,low:v})}),jsx80(QuantityInput,{path:props.path+".high",disabled:props.disabled||highProps?.readonly,name:props.name+"-high",defaultValue:value?.high,onChange:v=>setValueWrapper({...value,high:v})})]})}import{Group as Group19}from"@mantine/core";import{useContext as useContext17,useMemo as useMemo16,useState as useState38}from"react";import{jsx as jsx81,jsxs as jsxs40}from"react/jsx-runtime";function RatioInput(props){let[value,setValue]=useState38(props.defaultValue),{getExtendedProps}=useContext17(ElementsContext),[numeratorProps,denominatorProps]=useMemo16(()=>["numerator","denominator"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]);function setValueWrapper(newValue){setValue(newValue),props.onChange&&props.onChange(newValue)}return jsxs40(Group19,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx81(QuantityInput,{path:props.path+".numerator",disabled:props.disabled||numeratorProps?.readonly,name:props.name+"-numerator",defaultValue:value?.numerator,onChange:v=>setValueWrapper({...value,numerator:v})}),jsx81(QuantityInput,{path:props.path+".denominator",disabled:props.disabled||denominatorProps?.readonly,name:props.name+"-denominator",defaultValue:value?.denominator,onChange:v=>setValueWrapper({...value,denominator:v})})]})}import{Group as Group21,NativeSelect as NativeSelect7}from"@mantine/core";import{LRUCache,ReadablePromise,createReference as createReference2,isEmpty as isEmpty4,isPopulated as isPopulated9,tryGetProfile as tryGetProfile3}from"@medplum/core";import{useMedplum as useMedplum18}from"@medplum/react-hooks";import{useCallback as useCallback9,useEffect as useEffect11,useMemo as useMemo17,useRef as useRef10,useState as useState40}from"react";import{Group as Group20,Text as Text12}from"@mantine/core";import{getDisplayString as getDisplayString3,getReferenceString as getReferenceString3,isPopulated as isPopulated8}from"@medplum/core";import{useMedplum as useMedplum17,useResource as useResource2}from"@medplum/react-hooks";import{forwardRef as forwardRef4,useCallback as useCallback8,useState as useState39}from"react";import{jsx as jsx82,jsxs as jsxs41}from"react/jsx-runtime";var SEARCH_CODES={Device:"device-name",Observation:"code",Subscription:"criteria",User:"email:contains"},NAME_RESOURCE_TYPES=["AccessPolicy","Account","ActivityDefinition","Bot","CapabilityStatement","CareTeam","ClientApplication","CodeSystem","CompartmentDefinition","ConceptMap","EffectEvidenceSynthesis","Endpoint","EventDefinition","Evidence","EvidenceVariable","ExampleScenario","GraphDefinition","Group","HealthcareService","ImplementationGuide","InsurancePlan","Library","Location","Measure","MedicinalProduct","MessageDefinition","NamingSystem","OperationDefinition","Organization","Patient","Person","PlanDefinition","Practitioner","Project","Questionnaire","RelatedPerson","ResearchDefinition","ResearchElementDefinition","ResearchStudy","RiskEvidenceSynthesis","SearchParameter","StructureDefinition","StructureMap","TerminologyCapabilities","TestScript","UserConfiguration","ValueSet"];function toOption3(resource){return{value:getReferenceString3(resource)??"",label:getDisplayString3(resource),resource}}function ResourceInput(props){let medplum=useMedplum17(),{resourceType,searchCriteria}=props,[outcome,setOutcome]=useState39(),defaultValue2=useResource2(props.defaultValue,setOutcome),ItemComponent3=props.itemComponent??DefaultItemComponent2,onChange=props.onChange,loadValues=useCallback8(async(input,signal)=>{let searchCode=getSearchParamForResourceType(resourceType),searchParams=new URLSearchParams({[searchCode]:input??"",_count:"10",...searchCriteria});return await medplum.searchResources(resourceType,searchParams,{signal})},[medplum,resourceType,searchCriteria]),handleChange=useCallback8(newResources=>{onChange&&onChange(newResources[0])},[onChange]);return isPopulated8(props.defaultValue)&&!outcome&&!defaultValue2?null:jsx82(AsyncAutocomplete,{disabled:props.disabled,name:props.name,label:props.label,error:props.error,required:props.required,itemComponent:ItemComponent3,defaultValue:defaultValue2,placeholder:props.placeholder,maxValues:1,toOption:toOption3,loadOptions:loadValues,onChange:handleChange,clearable:!0})}var DefaultItemComponent2=forwardRef4(({label,resource,active:_active,...others},ref)=>jsx82("div",{ref,...others,children:jsxs41(Group20,{wrap:"nowrap",children:[jsx82(ResourceAvatar,{value:resource}),jsxs41("div",{children:[jsx82(Text12,{children:label}),jsx82(Text12,{size:"xs",c:"dimmed",children:resource.birthDate||resource.id})]})]})}));function getSearchParamForResourceType(resourceType){return SEARCH_CODES[resourceType]??(NAME_RESOURCE_TYPES.includes(resourceType)?"name":"_id")}import{Fragment as Fragment27,jsx as jsx83,jsxs as jsxs42}from"react/jsx-runtime";function ReferenceInput(props){let{onChange}=props,medplum=useMedplum18(),[value,setValue]=useState40(props.defaultValue),[targetTypes,setTargetTypes]=useState40(()=>createTargetTypes(props.targetTypes)),[targetType,setTargetType]=useState40(()=>getInitialTargetType(props.defaultValue,targetTypes)),promiseCache=useRef10(new LRUCache),searchCriteria=useMemo17(()=>targetType?.type==="profile"?{...props.searchCriteria,_profile:targetType.value}:props.searchCriteria,[props.searchCriteria,targetType]);useEffect11(()=>{let anyToFetch=!1,newTargetTypePromises=targetTypes?.map(tt=>{if(!shouldFetchResourceType(tt))return Promise.resolve(tt);anyToFetch=!0;let cacheKey=tt.value,cached=promiseCache.current.get(cacheKey);if(cached)return cached;let promise=fetchResourceTypeOfProfile(medplum,tt.value).then(profile=>{let newTargetType={...tt};return profile?isPopulated9(profile.type)?(newTargetType.resourceType=profile.type,newTargetType.name=profile.name,newTargetType.title=profile.title):(console.error(`StructureDefinition.type missing for ${tt.value}`),newTargetType.error="StructureDefinition.type missing"):(console.error(`StructureDefinition not found for ${tt.value}`),newTargetType.error="StructureDefinition not found"),newTargetType}).catch(reason=>(console.error(reason),{...tt,error:reason})),readablePromise=new ReadablePromise(promise);return promiseCache.current.set(cacheKey,readablePromise),readablePromise});!newTargetTypePromises||!anyToFetch||Promise.all(newTargetTypePromises).then(newTargetTypes=>{if(setTargetTypes(newTargetTypes),!targetType)return;let index=newTargetTypes.findIndex(tt=>tt.value===targetType.value||tt.resourceType===targetType.resourceType);if(index===-1){console.debug(`defaultValue had unexpected resourceType: ${targetType.resourceType}`);return}setTargetType(newTargetTypes[index])}).catch(console.error)},[medplum,targetType,targetTypes]);let setValueHelper=useCallback9(item=>{let newValue=item?createReference2(item):void 0;setValue(newValue),onChange&&onChange(newValue)},[onChange]),typeSelectOptions=useMemo17(()=>targetTypes?targetTypes.map(tt=>({value:tt.value,label:tt.type==="profile"?tt.title??tt.name??tt.resourceType??tt.value:tt.value})):[],[targetTypes]);return jsxs42(Fragment27,{children:[props.name&&jsx83("input",{type:"hidden",name:props.name,value:value?.reference??""}),jsxs42(Group21,{gap:"xs",grow:!0,wrap:"nowrap",children:[targetTypes&&targetTypes.length>1&&jsx83(NativeSelect7,{name:props.name+"-resourceType",disabled:props.disabled,"data-autofocus":props.autoFocus,"data-testid":"reference-input-resource-type-select",defaultValue:targetType?.resourceType,autoFocus:props.autoFocus,onChange:e=>{let newValue=e.currentTarget.value,newTargetType=targetTypes.find(tt=>tt.value===newValue);setTargetType(newTargetType)},data:typeSelectOptions}),!targetTypes&&jsx83(ResourceTypeInput,{disabled:props.disabled,autoFocus:props.autoFocus,testId:"reference-input-resource-type-input",defaultValue:targetType?.resourceType,onChange:newResourceType=>{setTargetType(newResourceType?{type:"resourceType",value:newResourceType,resourceType:newResourceType}:void 0)},name:props.name+"-resourceType",placeholder:"Resource Type"}),jsx83(ResourceInput,{resourceType:targetType?.resourceType,name:props.name+"-id",required:props.required,placeholder:props.placeholder,defaultValue:value,searchCriteria,onChange:setValueHelper,disabled:props.disabled})]})]})}function createTargetTypes(resourceTypesAndProfileUrls){if(!resourceTypesAndProfileUrls||resourceTypesAndProfileUrls.length===0||resourceTypesAndProfileUrls.length===1&&resourceTypesAndProfileUrls[0]==="Resource")return;let results=[];for(let value of resourceTypesAndProfileUrls)value.includes("/")?results.push({type:"profile",value}):results.push({type:"resourceType",value,resourceType:value});return results}function getInitialTargetType(defaultValue2,targetTypes){let defaultValueResourceType=defaultValue2?.reference?.split("/")[0];if(defaultValueResourceType){let targetType=targetTypes?.find(tt=>tt.resourceType===defaultValueResourceType);return targetType||{type:"resourceType",value:defaultValueResourceType,resourceType:defaultValueResourceType}}if(targetTypes&&targetTypes.length>0)return targetTypes[0]}async function fetchResourceTypeOfProfile(medplum,profileUrl){let profile=tryGetProfile3(profileUrl);if(profile)return{type:profile.type,name:profile.name,title:profile.title};let query=`{
|
|
129
129
|
StructureDefinitionList(url: "${profileUrl}", _sort: "_lastUpdated", _count: 1) {
|
|
130
130
|
type,
|
|
131
131
|
name,
|
|
132
132
|
title,
|
|
133
133
|
}
|
|
134
|
-
}`.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 Group27,Stack as Stack10,Text as Text14}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useMedplum as useMedplum20}from"@medplum/react-hooks";import{useContext as useContext19,useEffect as useEffect12,useState as useState42}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group26,Stack as Stack9,Text as Text13}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 useState41}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon3,Button as Button6}from"@mantine/core";import{jsx as jsx84}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx84(Button6,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx84(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx84(ActionIcon3,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx84(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon4}from"@mantine/core";import{jsx as jsx85}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx85(ActionIcon4,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx85(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx86,jsxs as jsxs43}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState41(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,jsx86(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx86(Text13,{c:"dimmed",children:"(empty)"}):jsxs43(Stack9,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs43(Group26,{wrap:"nowrap",children:[jsx86("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx86(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&&jsx86(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&&jsx86(Group26,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx86(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx87,jsxs as jsxs44}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum20(),[loading,setLoading]=useState42(!0),[slices,setSlices]=useState42([]),[defaultValue2]=useState42(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState42(()=>[defaultValue2]),ctx=useContext19(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect12(()=>{prepareSlices({medplum,property}).then(slices2=>{setSlices(slices2);let slicedValues2=assignValuesIntoSlices(defaultValue2,slices2,property.slicing,ctx.profileUrl);addPlaceholderValues(slicedValues2,slices2),setSlicedValues(slicedValues2),setLoading(!1)}).catch(reason=>{console.error(reason),setLoading(!1)})},[medplum,property,defaultValue2,ctx.profileUrl,setSlicedValues]);function setValuesWrapper(newValues,sliceIndex){let newSlicedValues=[...slicedValues];if(newSlicedValues[sliceIndex]=newValues,setSlicedValues(newSlicedValues),props.onChange){let cleaned=newSlicedValues.flat().filter(val=>val!==void 0);props.onChange(cleaned)}}if(loading)return jsx87("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 jsxs44(Stack10,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx87(Text14,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx87(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)=>jsxs44(Group27,{wrap:"nowrap",style:{flexGrow:1},children:[jsx87("div",{style:{flexGrow:1},children:jsx87(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&&jsx87(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&&jsx87(Group27,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx87(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newNonSliceValues=[...nonSliceValues];newNonSliceValues.push(void 0),setValuesWrapper(newNonSliceValues,nonSliceIndex)},testId:"nonsliced-add"})})]})}function addPlaceholderValues(slicedValues,slices){for(let sliceIndex=0;sliceIndex<slices.length;sliceIndex++){let slice=slices[sliceIndex],sliceValues=slicedValues[sliceIndex];for(;sliceValues.length<slice.min;)sliceValues.push(void 0)}}import{ActionIcon as ActionIcon5,Flex as Flex4,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification4}from"@mantine/notifications";import{useRef as useRef11,useState as useState43}from"react";import{jsx as jsx88,jsxs as jsxs45}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState43(!1),clipboard=useClipboard(),ref=useRef11(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs45(Flex4,{gap:"xs",children:[jsx88(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx88(ActionIcon5,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification4({color:"green",message:"Copied"})},children:jsx88(IconCopy,{})})]})}import{Button as Button7,Chip,Group as Group28,Modal as Modal3,NativeSelect as NativeSelect8,Stack as Stack11,Switch,TextInput as TextInput16}from"@mantine/core";import{formatTiming as formatTiming2}from"@medplum/core";import{useContext as useContext20,useMemo as useMemo19,useRef as useRef12,useState as useState44}from"react";import{Fragment as Fragment28,jsx as jsx89,jsxs as jsxs46}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState44(props.defaultValue),[open,setOpen]=useState44(!props.disabled&&(props.defaultModalOpen??!1)),valueRef=useRef12(value);return valueRef.current=value,jsxs46(Fragment28,{children:[jsxs46(Group28,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx89("span",{children:formatTiming2(valueRef.current)||"No repeat"}),jsx89(Button7,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx89(TimingEditorDialog,{path:props.path,visible:open,defaultValue:valueRef.current,onOk:newValue=>{props.onChange&&props.onChange(newValue),setValue(newValue),setOpen(!1)},onCancel:()=>setOpen(!1)})]})}var defaultValue={repeat:{period:1,periodUnit:"d"}};function TimingEditorDialog(props){let[value,setValue]=useState44(props.defaultValue||defaultValue),{getExtendedProps}=useContext20(ElementsContext),[eventProps,repeatProps,repeatPeriodProps,repeatPeriodUnitProps,repeatDayOfWeekProps]=useMemo19(()=>["event","repeat","repeat.period","repeat.periodUnit","repeat.dayOfWeek"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]),valueRef=useRef12(value);valueRef.current=value;function setStart(newStart){setValue({...valueRef.current,event:[newStart]})}function setRepeat(repeat){setValue({...valueRef.current,repeat})}function setPeriod(newPeriod){setRepeat({...valueRef.current?.repeat,period:newPeriod})}function setPeriodUnit(newPeriodUnit){setRepeat({...valueRef.current?.repeat,periodUnit:newPeriodUnit})}function setDaysOfWeek(newDaysOfWeek){setRepeat({...valueRef.current?.repeat,dayOfWeek:newDaysOfWeek})}return jsx89(Modal3,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs46(Stack11,{children:[jsx89(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx89(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx89(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs46(Fragment28,{children:[jsx89(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs46(Group28,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx89(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)}),jsx89(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"&&jsx89(FormSection,{title:"Repeat on",children:jsx89(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,children:jsx89(Group28,{justify:"space-between",mt:"md",gap:"xs",children:daysOfWeek.map(day=>jsx89(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,children:day.charAt(0).toUpperCase()},day))})})})]}),jsx89(Group28,{justify:"flex-end",children:jsx89(Button7,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx90,jsxs as jsxs47}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 jsx90(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx90(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx90(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx90(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]=useState45(initialPropertyType);return jsxs47(Group29,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx90(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}))}),jsx90(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 jsx90("div",{children:"Property type not specified "});function getComplexInputProps(){return{name,defaultValue:defaultValue2,onChange,outcome,path,valuePath,disabled:readOnly}}function getPrimitiveInputProps(){let error=getErrorsForInput(props.outcome,valuePath??path);return{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,error,disabled:readOnly}}switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.string:case PropertyType2.time:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"?jsx90(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx90(TextInput17,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx90(TextInput17,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx90(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx90(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 jsx90(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx90(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:case PropertyType2.xhtml:return jsx90(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx90(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx90(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx90(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx90(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx90(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx90(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx90(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx90(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx90(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx90(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx90(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx90(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx90(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx90(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx90(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx90(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx90(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx90(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 jsx91}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState46(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 jsx91(Stack12,{style:{flexGrow:1},"data-testid":props.testId,children:elementsToRender.map(([key,element])=>{let[propertyValue,propertyType]=getValueAndTypeFromElement(typedValue,key,element),required=element.min!==void 0&&element.min>0,valuePath=props.valuePath?props.valuePath+"."+key:void 0,resourcePropertyInput=jsx91(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"?jsx91(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx91(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 jsx92,jsxs as jsxs48}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState47(()=>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 jsxs48("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx92(Box5,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:jsx92(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}import{Button as Button8,Group as Group30}from"@mantine/core";import{useMemo as useMemo23,useState as useState48}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 jsx93,jsxs as jsxs49}from"react/jsx-runtime";function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState48(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 jsxs49("div",{children:[jsxs49(Group30,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx93("p",{style:{flex:1},children:getMonthString(month)}),jsxs49(Group30,{justify:"flex-end",gap:"xs",children:[jsx93(Button8,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx93(Button8,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs49("table",{className:CalendarInput_default.table,children:[jsx93("thead",{children:jsxs49("tr",{children:[jsx93("th",{children:"SUN"}),jsx93("th",{children:"MON"}),jsx93("th",{children:"TUE"}),jsx93("th",{children:"WED"}),jsx93("th",{children:"THU"}),jsx93("th",{children:"FRI"}),jsx93("th",{children:"SAT"})]})}),jsx93("tbody",{children:grid.map((week,weekIndex)=>jsx93("tr",{children:week.map((day,dayIndex)=>jsx93("td",{children:day&&jsx93(Button8,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,slots){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d.getTime()),available:isDayAvailable(d,slots)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,slots){for(let slot of slots){let slotStart=new Date(slot.start);if(slotStart.getFullYear()===day.getFullYear()&&slotStart.getMonth()===day.getMonth()&&slotStart.getDate()===day.getDate())return!0}return!1}import{ActionIcon as ActionIcon6,Group as Group31,LoadingOverlay,Paper as Paper2,ScrollArea as ScrollArea3,Skeleton,Stack as Stack13,Text as Text15,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 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",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble",chatBubbleNameRight:"BaseChat_chatBubbleNameRight"};import{jsx as jsx94,jsxs as jsxs50}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=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);loading||(initialLoadRef.current=!1);let profileRefStr=useMemo24(()=>profile?getReferenceString4(medplum.getProfile()):"",[profile,medplum]),searchMessages=useCallback10(async()=>{setLoading(!0);let searchParams=new URLSearchParams(query);searchParams.append("_sort","-sent"),searchParams.append("sent:missing","false");let searchResult=await medplum.searchResources("Communication",searchParams,{cache:"no-cache"});upsertCommunications(communicationsRef.current,searchResult,setCommunications),setLoading(!1)},[medplum,setCommunications,query]);useEffect13(()=>{searchMessages().catch(err=>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]);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&&jsx94(Title5,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx94("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs50(Stack13,{align:"stretch",mt:"lg",children:[jsxs50(Group31,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(Skeleton,{height:38,circle:!0,ml:"md"}),jsx94(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs50(Group31,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx94(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs50(Group31,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(Skeleton,{height:38,circle:!0,ml:"md"}),jsx94(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs50(ScrollArea3,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx94(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 jsxs50(Stack13,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx94(Text15,{fz:"xs",ta:"center",children:currCommTime}),c.sender?.reference===profileRefStr?jsxs50(Group31,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(ChatBubble,{alignment:"right",communication:c,showDelivered}),jsx94(ResourceAvatar,{radius:"xl",color:"orange",value:c.sender,mb:showDelivered?void 0:"sm"})]}):jsxs50(Group31,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),jsx94(ChatBubble,{alignment:"left",communication:c})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsx94("div",{className:BaseChat_default.chatInputContainer,children:jsx94(Form,{onSubmit:sendMessageInternal,children:jsx94(TextInput18,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",rightSectionWidth:42,disabled:inputDisabled,rightSection:inputDisabled?void 0:jsx94(ActionIcon6,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx94(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 jsxs50("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsxs50(Text15,{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",jsx94(Text15,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),jsx94("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx94("div",{className:BaseChat_default.chatBubble,children:content})}),showDelivered&&jsxs50("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs50("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx94("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx94("div",{style:{position:"relative"},children:jsx94(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx94("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx94("div",{className:BaseChat_default.chatBubble,children:jsx94(Skeleton,{height:14,width:parentWidth*.5,radius:"l"})})})]})}import{ActionIcon as ActionIcon7}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 Fragment29,jsx as jsx95,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(Fragment29,{children:[opened&&jsx95("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx95("div",{className:ChatModal_default.iconContainer,children:jsx95(ActionIcon7,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx95(IconChevronDown,{size:"1.625rem"})})}):jsx95("div",{className:ChatModal_default.iconContainer,children:jsx95(ActionIcon7,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx95(IconChevronUp,{size:"1.625rem"})})})]}):null}import{createReference as createReference3,formatCodeableConcept as formatCodeableConcept2,getReferenceString as getReferenceString5}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 jsx96}from"react/jsx-runtime";function ThreadChat(props){let{thread,title,onMessageSent,inputDisabled,excludeHeader,onError}=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=>{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?jsx96(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{ActionIcon as ActionIcon9,Button as Button10,Center as Center7,Group as Group35,Loader as Loader3,ScrollArea as ScrollArea4,TextInput as TextInput19}from"@mantine/core";import{showNotification as showNotification6,updateNotification}from"@mantine/notifications";import{createReference as createReference4,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useMedplum as useMedplum26,useResource as useResource7}from"@medplum/react-hooks";import{useCallback as useCallback12,useEffect as useEffect19,useRef as useRef14,useState as useState57}from"react";import{Group as Group33,List,Stack as Stack15,Text as Text17,Title as Title6}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime2,formatObservationValue,isReference as isReference2}from"@medplum/core";import{useMedplum as useMedplum23,useResource as useResource5}from"@medplum/react-hooks";import{useEffect as useEffect16,useState as useState53}from"react";import{Blockquote,Stack as Stack14}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx97}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx97(Stack14,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx97(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 Group32}from"@mantine/core";import{Text as Text16}from"@mantine/core";import{getDisplayString as getDisplayString5,isOk,normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useResource as useResource4}from"@medplum/react-hooks";import{useState as useState52}from"react";import{jsx as jsx98}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState52(),resource=useResource4(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString7(outcome)}]`;else if(resource)text=getDisplayString5(resource);else return null;return link?jsx98(MedplumLink,{to:value,...rest,children:text}):jsx98(Text16,{component:"span",...rest,children:text})}import{jsx as jsx99,jsxs as jsxs52}from"react/jsx-runtime";function ResourceBadge(props){return jsxs52(Group32,{gap:"xs",children:[jsx99(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx99(ResourceName,{value:props.value,link:props.link})]})}import{Badge}from"@mantine/core";import{jsx as jsx100}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 jsx100(Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment30,jsx as jsx101,jsxs as jsxs53}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum23(),diagnosticReport=useResource5(props.value),[specimens,setSpecimens]=useState53();if(useEffect16(()=>{diagnosticReport?.specimen&&Promise.allSettled(diagnosticReport.specimen.map(ref=>medplum.readReference(ref))).then(outcomes=>outcomes.filter(outcome=>outcome.status==="fulfilled").map(outcome=>outcome.value)).then(setSpecimens).catch(console.error)},[medplum,diagnosticReport]),!diagnosticReport)return null;let specimenNotes=specimens?.flatMap(spec=>spec.note||[])||[];if(diagnosticReport.presentedForm&&diagnosticReport.presentedForm.length>0){let pf=diagnosticReport.presentedForm[0];pf.contentType?.startsWith("text/plain")&&pf.data&&specimenNotes.push({text:window.atob(pf.data)})}return jsxs53(Stack15,{children:[jsx101(Title6,{children:"Diagnostic Report"}),jsx101(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx101(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx101(NoteDisplay,{value:specimenNotes})]})}function DiagnosticReportHeader({value,hideSubject=!1}){return jsxs53(Group33,{mt:"md",gap:30,children:[value.subject&&!hideSubject&&jsxs53("div",{children:[jsx101(Text17,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx101(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs53("div",{children:[jsx101(Text17,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx101(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs53("div",{children:[jsx101(Text17,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx101(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs53("div",{children:[jsx101(Text17,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx101(Text17,{children:formatDateTime2(value.issued)})]}),value.status&&jsxs53("div",{children:[jsx101(Text17,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx101(StatusBadge,{status:value.status})]})]})}function SpecimenInfo(specimens){return jsxs53(Stack15,{gap:"xs",children:[jsx101(Title6,{order:2,size:"h6",children:"Specimens"}),jsx101(List,{type:"ordered",children:specimens?.map(specimen=>jsx101(List.Item,{ml:"sm",children:jsxs53(Group33,{gap:20,children:[jsxs53(Group33,{gap:5,children:[jsx101(Text17,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs53(Group33,{gap:5,children:[jsx101(Text17,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs53("table",{className:DiagnosticReportDisplay_default.table,children:[jsx101("thead",{children:jsxs53("tr",{children:[jsx101("th",{children:"Test"}),jsx101("th",{children:"Value"}),jsx101("th",{children:"Reference Range"}),jsx101("th",{children:"Interpretation"}),jsx101("th",{children:"Category"}),jsx101("th",{children:"Performer"}),jsx101("th",{children:"Status"})]})}),jsx101("tbody",{children:jsx101(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx101(Fragment30,{children:props.value?.map(observation=>jsx101(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference2(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource5(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs53(Fragment30,{children:[jsxs53("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx101("td",{rowSpan:displayNotes?2:1,children:jsx101(MedplumLink,{to:observation,children:jsx101(CodeableConceptDisplay,{value:observation.code})})}),jsx101("td",{children:jsx101(ObservationValueDisplay,{value:observation})}),jsx101("td",{children:jsx101(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx101("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx101(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx101("td",{children:observation.category&&observation.category.length>0&&jsx101(Fragment30,{children:observation.category.map(concept=>jsx101("div",{children:jsx101(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx101("td",{children:observation.performer?.map(performer=>jsx101(ReferenceDisplay,{value:performer},performer.reference))}),jsx101("td",{children:observation.status&&jsx101(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx101(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx101("tr",{children:jsx101("td",{colSpan:6,children:jsx101(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx101(Fragment30,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx101(Fragment30,{children:range.text}):jsx101(RangeDisplay,{value:range}):null}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;return code==="AA"||code==="LL"||code==="HH"||code==="A"}var import_rfc6902=__toESM(require_rfc6902(),1);import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize3,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum24}from"@medplum/react-hooks";import{useEffect as useEffect17,useMemo as useMemo26,useState as useState55}from"react";import{Button as Button9,Table}from"@mantine/core";import{useState as useState54}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment31,jsx as jsx102,jsxs as jsxs54}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState54(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx102(Fragment31,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx102(Fragment31,{children:jsxs54(Table.Tr,{children:[jsx102(Table.Td,{children:name}),jsx102(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx102(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx102(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx102(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs54(Table.Tr,{children:[jsx102(Table.Td,{children:name}),jsx102(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx102(Button9,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx103,jsxs as jsxs55}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum24(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState55(!1);useEffect17(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo26(()=>{if(!schemaLoaded)return null;let typedOriginal=[toTypedValue(original)],typedRevised=[toTypedValue(revised)],result=[],patch=mergePatchOperations((0,import_rfc6902.createPatch)(original,revised));for(let op of patch){let path=op.path,fhirPath=jsonPathToFhirPath(path),property=tryGetElementDefinition(original.resourceType,fhirPath),originalValue=op.op==="add"?void 0:evalFhirPathTyped(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:evalFhirPathTyped(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${capitalize3(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?jsxs55(Table2,{className:ResourceDiffTable_default.root,children:[jsx103(Table2.Thead,{children:jsxs55(Table2.Tr,{children:[jsx103(Table2.Th,{}),jsx103(Table2.Th,{children:"Before"}),jsx103(Table2.Th,{children:"After"})]})}),jsx103(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx103(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 useMedplum25,useResource as useResource6}from"@medplum/react-hooks";import{useEffect as useEffect18,useMemo as useMemo27,useState as useState56}from"react";import{jsx as jsx104}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum25(),accessPolicy=medplum.getAccessPolicy(),value=useResource6(props.value),[schemaLoaded,setSchemaLoaded]=useState56(!1);useEffect18(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{tryGetProfile4(profileUrl)?setSchemaLoaded(!0):console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)});else{let schemaName=value.resourceType;medplum.requestSchema(schemaName).then(()=>{setSchemaLoaded(!0)}).catch(console.error)}},[medplum,profileUrl,value]);let accessPolicyResource=useMemo27(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx104(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon8,Group as Group34,Menu as Menu4,Text as Text18}from"@mantine/core";import{formatDateTime as formatDateTime3,getReferenceString as getReferenceString6}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx105,jsxs as jsxs56}from"react/jsx-runtime";function Timeline(props){return jsx105(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 jsxs56(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs56(Group34,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx105(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs56("div",{style:{flex:1},children:[jsx105(Text18,{size:"sm",children:jsx105(ResourceName,{c:"dark",fw:500,value:author,link:!0})}),jsxs56(Text18,{size:"xs",children:[jsx105(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime3(dateTime)}),jsx105(Text18,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx105(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs56(Menu4,{position:"bottom-end",shadow:"md",width:200,children:[jsx105(Menu4.Target,{children:jsx105(ActionIcon8,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString6(props.resource)}`,children:jsx105(IconDots,{})})}),popupMenuItems]})]}),jsx105(ErrorBoundary,{children:jsx105("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 jsx106,jsxs as jsxs57}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum26(),sender=medplum.getProfile(),inputRef=useRef14(null),resource=useResource7(props.value),[history,setHistory]=useState57(),[items,setItems]=useState57([]),[countToShow,setCountToShow]=useState57(10),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef14(items);itemsRef.current=items;let sortAndSetItems=useCallback12(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback12(batchResponse=>{let newItems=[];for(let settledResult of batchResponse){if(settledResult.status!=="fulfilled")continue;let bundle=settledResult.value;if(bundle.type==="history"&&setHistory(bundle),bundle.entry)for(let entry of bundle.entry)newItems.push(entry.resource)}sortAndSetItems(newItems)},[sortAndSetItems]),addResource=useCallback12(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback12(()=>{let resourceType,id;"resourceType"in props.value?(resourceType=props.value.resourceType,id=props.value.id):[resourceType,id]=props.value.reference?.split("/"),loadTimelineResources(medplum,resourceType,id).then(handleBatchResponse).catch(console.error)},[medplum,props.value,loadTimelineResources,handleBatchResponse]);useEffect19(()=>loadTimeline(),[loadTimeline]);function createComment(contentString){!resource||!props.createCommunication||medplum.createResource(props.createCommunication(resource,sender,contentString)).then(result=>addResource(result)).catch(console.error)}function createMedia(attachment){!resource||!props.createMedia||medplum.createResource(props.createMedia(resource,sender,attachment)).then(result=>addResource(result)).then(()=>updateNotification({id:"upload-notification",color:"teal",title:"Upload complete",message:"",icon:jsx106(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString8(reason),icon:jsx106(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification6({id:"upload-notification",loading:!0,title:"Initializing upload...",message:"Please wait...",autoClose:!1,withCloseButton:!1})}function onUploadProgress(e){updateNotification({id:"upload-notification",loading:!0,title:"Uploading...",message:getProgressMessage(e),autoClose:!1,withCloseButton:!1})}function onUploadError(outcome){updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString8(outcome),icon:jsx106(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return jsx106(Center7,{style:{width:"100%",height:"100%"},children:jsx106(Loader3,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return jsxs57(Timeline,{children:[props.createCommunication&&jsx106(Panel,{children:jsx106(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs57(Group35,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx106(ResourceAvatar,{value:sender}),jsx106(TextInput19,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx106(ActionIcon9,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx106(IconMessage,{size:16})}),jsx106(AttachmentButton,{securityContext:createReference4(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx106(ActionIcon9,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx106(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 jsx106(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx106(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx106(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx106(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx106(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx106(TimelineItem,{resource:item,padding:!0,children:jsx106(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&jsx106(Group35,{justify:"center",pb:"lg",children:jsx106(Button10,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx106(TimelineItem,{resource,padding:!0,...rest,children:jsx106(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs57(TimelineItem,{resource,padding:!0,...rest,children:[jsx106("h3",{children:"Created"}),jsx106(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 jsx106(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx106("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 jsx106(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx106(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx106(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx106(ScrollArea4,{children:jsx106("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx106(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx106(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 jsx107}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx107(ResourceTimeline,{value:resource,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`;return Promise.allSettled([medplum.readHistory(resourceType,id),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count:100})])},...rest})}import{createReference as createReference5}from"@medplum/core";import{jsx as jsx108}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx108(ResourceTimeline,{value:encounter,loadTimelineResources:async(medplum,_resourceType,id)=>Promise.allSettled([medplum.readHistory("Encounter",id),medplum.search("Communication","encounter=Encounter/"+id),medplum.search("Media","encounter=Encounter/"+id)]),createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",encounter:createReference5(resource),subject:resource.subject,sender:createReference5(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference5(resource),subject:resource.subject,operator:createReference5(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button15,Loader as Loader5,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome8}from"@medplum/core";import{useMedplum as useMedplum28}from"@medplum/react-hooks";import{memo,useEffect as useEffect23,useRef as useRef18,useState as useState62}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx109}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 jsx109(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon11,Button as Button14,Center as Center8,Group as Group38,Loader as Loader4,Menu as Menu6,Pagination,Table as Table3,Text as Text20,UnstyledButton as UnstyledButton4}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome7}from"@medplum/core";import{useMedplum as useMedplum27}from"@medplum/react-hooks";import{useCallback as useCallback13,useEffect as useEffect22,useRef as useRef17,useState as useState61}from"react";import{Box as Box6,Button as Button11,Modal as Modal4,Text as Text19}from"@mantine/core";import{jsx as jsx110,jsxs as jsxs58}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs58(Modal4,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs58(Box6,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx110(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx110(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx110(Text19,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx110(Button11,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button12,Group as Group36,Modal as Modal5,MultiSelect,Stack as Stack16}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify2}from"@medplum/core";import{useEffect as useEffect20,useMemo as useMemo28,useRef as useRef15,useState as useState58}from"react";import{capitalize as capitalize4,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime4,Operator}from"@medplum/core";import{Fragment as Fragment32,jsx as jsx111}from"react/jsx-runtime";var searchParamToOperators={string:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],fulltext:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],token:[Operator.EQUALS,Operator.NOT],reference:[Operator.EQUALS,Operator.NOT],numeric:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],quantity:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],date:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],datetime:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],uri:[Operator.EQUALS,Operator.NOT,Operator.ABOVE,Operator.BELOW]},operatorNames={eq:"equals",ne:"not equals",gt:"greater than",lt:"less than",ge:"greater than or equals",le:"less than or equals",sa:"starts after",eb:"ends before",ap:"approximately",sw:"starts with",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",present:"present",identifier:"identifier",iterate:"iterate"};function setFilters(definition,filters){return{...definition,filters,offset:0,name:void 0}}function clearFilters(definition){return setFilters(definition,[])}function clearFiltersOnField(definition,code){return setFilters(definition,(definition.filters??[]).filter(f=>f.code!==code))}function addFilter(definition,field,op,value,opt_clear){opt_clear&&(definition=clearFiltersOnField(definition,field));let nextFilters=[];return definition.filters&&nextFilters.push(...definition.filters),nextFilters.push({code:field,operator:op,value:value??""}),setFilters(definition,nextFilters)}function addField(definition,field){if(definition.fields?.includes(field))return definition;let newFields=[];return definition.fields&&newFields.push(...definition.fields),newFields.push(field),{...definition,fields:newFields,name:void 0}}function deleteFilter(definition,index){if(!definition.filters)return definition;let newFilters=[...definition.filters];return newFilters.splice(index,1),{...definition,filters:newFilters,name:void 0}}function addYesterdayFilter(definition,field){return addDayFilter(definition,field,-1)}function addTodayFilter(definition,field){return addDayFilter(definition,field,0)}function addTomorrowFilter(definition,field){return addDayFilter(definition,field,1)}function addDayFilter(definition,field,delta){let startTime=new Date;startTime.setDate(startTime.getDate()+delta),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setDate(endTime.getDate()+1),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addNext24HoursFilter(definition,field){let now=new Date,endTime=new Date(now.getTime()+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,Operator.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.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(capitalize4).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?jsx111(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children:resource.id}):key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?formatDateTime4(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?jsx111(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:jsx111(Fragment32,{children:value.map((v,index)=>jsx111(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx112,jsxs as jsxs59}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef15(!1),[state,setState]=useState58({search:JSON.parse(stringify2(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState58(!1);useEffect20(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo28(()=>{if(!props.visible)return[];let resourceType=props.search.resourceType,typeSchema=getDataType2(resourceType),searchParams=getSearchParameters(resourceType);return sortStringArray(getFieldsList(typeSchema,searchParams)).map(field=>({value:field,label:buildFieldNameString(field)}))},[props.visible,props.search.resourceType]);function handleChange(newFields){setState({search:{...state.search,fields:newFields}})}return jsx112(Modal5,{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:jsx112("div",{"data-testid":"overlay-child"})},children:jsxs59(Stack16,{children:[jsx112(MultiSelect,{style:{width:550},placeholder:"Select fields to display",data:allFields,value:state.search.fields??[],onChange:handleChange,onDropdownOpen:()=>setIsDropdownOpen(!0),onDropdownClose:()=>setIsDropdownOpen(!1),maxDropdownHeight:"250px",clearButtonProps:{"aria-label":"Clear selection"},clearable:!0,searchable:!0}),jsx112(Group36,{justify:"flex-end",children:jsx112(Button12,{onClick:()=>props.onOk(state.search),children:"OK"})})]})})}function getFieldsList(typeSchema,searchParams){let result=[],keys=new Set,names=new Set;for(let key of Object.keys(typeSchema.elements))result.push(key),keys.add(key.toLowerCase()),names.add(buildFieldNameString(key));if(searchParams)for(let code of Object.keys(searchParams)){let name=buildFieldNameString(code);!keys.has(code)&&!names.has(name)&&(result.push(code),keys.add(code),names.add(name))}return result}import{ActionIcon as ActionIcon10,Group as Group37,Modal as Modal6,NativeSelect as NativeSelect10}from"@mantine/core";import{Operator as Operator2,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect21,useRef as useRef16,useState as useState59}from"react";import{Checkbox as Checkbox5,TextInput as TextInput20}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx113}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 jsx113(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 jsx113(Checkbox5,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType.DATE:return jsx113(TextInput20,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.DATETIME:return jsx113(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx113(TextInput20,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.QUANTITY:return jsx113(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx113(TextInput20,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value),placeholder:"Search value"})}}function tryParseQuantity(value){if(value){let[valueString,systemString,unitString]=value.split("|");if(valueString)return{value:Number.parseFloat(valueString),system:systemString,unit:unitString}}}import{jsx as jsx114,jsxs as jsxs60}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState59(deepClone2(props.search)),searchRef=useRef16(search);searchRef.current=search,useEffect21(()=>{setSearch(deepClone2(props.search))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}let resourceType=props.search.resourceType,searchParams=getSearchParameters2(resourceType)??{},filters=search.filters||[];return jsx114(Modal6,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs60(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs60("div",{children:[jsxs60("table",{children:[jsxs60("colgroup",{children:[jsx114("col",{style:{width:200}}),jsx114("col",{style:{width:200}}),jsx114("col",{style:{width:380}}),jsx114("col",{style:{width:40}})]}),jsx114("thead",{children:jsxs60("tr",{children:[jsx114("th",{children:"Field"}),jsx114("th",{children:"Operation"}),jsx114("th",{children:"Value"}),jsx114("th",{})]})}),jsx114("tbody",{children:filters.map((filter,index)=>jsx114(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`))})]}),jsx114(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx114(Group37,{justify:"flex-end",mt:"xl",children:jsx114(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value,valueRef=useRef16(value);valueRef.current=value;function setFilterCode(newCode){valueRef.current.code=newCode,valueRef.current.operator=Operator2.EQUALS,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterOperator(newOperator){valueRef.current.operator=newOperator,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterValue(newFilterValue){valueRef.current.value=newFilterValue,props.onChange(valueRef.current)}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return jsxs60("tr",{children:[jsx114("td",{children:jsx114(NativeSelect10,{"data-testid":`${props.id}-filter-field`,defaultValue:props.value.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...Object.keys(props.searchParams).map(param=>({value:param,label:buildFieldNameString(param)}))]})}),jsx114("td",{children:operators&&jsx114(NativeSelect10,{"data-testid":`${props.id}-filter-operation`,defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]},`${props.id}-filter-value-${props.value.code}`)}),jsx114("td",{children:searchParam&&value.operator&&jsx114(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}`)}),jsx114("td",{children:props.onDelete&&jsx114(ActionIcon10,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx114(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button13,Grid,Modal as Modal7}from"@mantine/core";import{useState as useState60}from"react";import{jsx as jsx115,jsxs as jsxs61}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState60(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx115(Modal7,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx115(Form,{onSubmit:onOk,children:jsxs61(Grid,{children:[jsx115(Grid.Col,{span:10,children:jsx115(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx115(Grid.Col,{span:2,children:jsx115(Button13,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime5,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator3,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment33,jsx as jsx116}from"react/jsx-runtime";function SearchFilterValueDisplay(props){let{resourceType,filter}=props,searchParam=globalSchema.types[resourceType].searchParams?.[filter.code];if(searchParam){if(searchParam.type==="reference"&&(filter.operator===Operator3.EQUALS||filter.operator===Operator3.NOT_EQUALS))return jsx116(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx116(Fragment33,{children:formatDateTime5(filter.value)})}return jsx116(Fragment33,{children:filter.value})}import{Menu as Menu5}from"@mantine/core";import{Operator as Operator4}from"@medplum/core";import{Fragment as Fragment34,jsx as jsx117,jsxs as jsxs62}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?jsx117(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx117(Menu5.Dropdown,{children:props.searchParams.map(searchParam=>jsx117(Menu5.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx117(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx117(NumericFilterSubMenu,{...props});case"reference":return jsx117(ReferenceFilterSubMenu,{...props});case"string":return jsx117(TextFilterSubMenu,{...props});case"token":case"uri":return jsx117(TokenFilterSubMenu,{...props});default:return jsxs62(Fragment34,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs62(Menu5.Dropdown,{children:[jsx117(Menu5.Item,{leftSection:jsx117(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx117(Menu5.Item,{leftSection:jsx117(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.ENDS_BEFORE),children:"Before..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.STARTS_AFTER),children:"After..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Between..."}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx117(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs62(Menu5.Dropdown,{children:[jsx117(Menu5.Item,{leftSection:jsx117(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx117(Menu5.Item,{leftSection:jsx117(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN),children:"Greater than..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN),children:"Less than..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx117(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs62(Menu5.Dropdown,{children:[jsx117(Menu5.Item,{leftSection:jsx117(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx117(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs62(Menu5.Dropdown,{children:[jsx117(Menu5.Item,{leftSection:jsx117(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx117(Menu5.Item,{leftSection:jsx117(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.CONTAINS),children:"Contains..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Does not contain..."}),jsx117(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs62(Menu5.Dropdown,{children:[jsx117(Menu5.Item,{leftSection:jsx117(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx117(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs62(Fragment34,{children:[jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx117(Menu5.Item,{leftSection:jsx117(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconX,{size:14}),onClick:()=>props.onClear(searchParam),children:"Clear filters"})]})}function getPaginationControlProps(controlName){switch(controlName){case"next":return{"aria-label":"Next page"};case"previous":return{"aria-label":"Previous page"};case"first":return{"aria-label":"First page"};case"last":return{"aria-label":"Last page"};default:return{}}}var SearchControl_default={root:"SearchControl_root",table:"SearchControl_table",tr:"SearchControl_tr",th:"SearchControl_th",control:"SearchControl_control",icon:"SearchControl_icon"};import{getElementDefinition,getSearchParameter,getSearchParameterDetails as getSearchParameterDetails4,getSearchParameters as getSearchParameters3}from"@medplum/core";function getFieldDefinitions(search){let resourceType=search.resourceType,fields=[];for(let name of search.fields||["id","_lastUpdated"])fields.push(getFieldDefinition(resourceType,name));return fields}function getFieldDefinition(resourceType,name){if(name==="_lastUpdated")return{name:"_lastUpdated",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_lastUpdated",name:"_lastUpdated",type:"date",expression:"Resource.meta.lastUpdated"}]};if(name==="meta.versionId")return{name:"meta.versionId",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_versionId",name:"_versionId",type:"token",expression:"Resource.meta.versionId"}]};let exactElementDefinition=getElementDefinition(resourceType,name),exactSearchParam=getSearchParameter(resourceType,name.toLowerCase());if(exactElementDefinition&&exactSearchParam)return{name,elementDefinition:exactElementDefinition,searchParams:[exactSearchParam]};if(exactElementDefinition){let allSearchParams=getSearchParameters3(resourceType),searchParams;if(allSearchParams){let pathRegex=new RegExp(`${resourceType}\\.${name.replaceAll("[x]","")}([^\\w-]|$)`);searchParams=Object.values(allSearchParams).filter(p=>!!p.expression&&pathRegex.test(p?.expression)),searchParams.length===0&&(searchParams=void 0)}return{name,elementDefinition:exactElementDefinition,searchParams}}if(exactSearchParam){let details=getSearchParameterDetails4(resourceType,exactSearchParam);return{name,elementDefinition:details.elementDefinitions?.[0],searchParams:[exactSearchParam]}}return{name}}import{Fragment as Fragment35,jsx as jsx118,jsxs as jsxs63}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=useMedplum27(),[outcome,setOutcome]=useState61(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState61(search);deepEquals(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState61({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef17(state);stateRef.current=state;let total=memoizedSearch.total??"accurate",loadResults=useCallback13(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,formatSearchQuery({...memoizedSearch,total,fields:void 0}),options)).then(response=>{setState({...stateRef.current,searchResponse:response}),onLoad&&onLoad(new SearchLoadEvent(response))}).catch(reason=>{setState({...stateRef.current,searchResponse:void 0}),setOutcome(normalizeOperationOutcome7(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback13(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect22(()=>{loadResults()},[loadResults]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...stateRef.current.selected};checked?newSelected[id]=!0:delete newSelected[id],setState({...stateRef.current,selected:newSelected})}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},searchResponse=stateRef.current.searchResponse;checked&&searchResponse?.entry&&searchResponse.entry.forEach(entry=>{entry.resource?.id&&(newSelected[entry.resource.id]=!0)}),setState({...stateRef.current,selected:newSelected})}function isAllSelected(){let state2=stateRef.current;if(!state2.searchResponse?.entry||state2.searchResponse.entry.length===0)return!1;for(let e of state2.searchResponse.entry)if(e.resource?.id&&!state2.selected[e.resource.id])return!1;return!0}function emitSearchChange(newSearch){props.onChange&&props.onChange(new SearchChangeEvent(newSearch))}function handleRowClick(e,resource){if(isCheckboxCell(e.target)||e.button===2)return;killEvent(e);let isAux=isAuxClick(e);!isAux&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),isAux&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e))}function isExportPassed(){return!!(props.onExport??props.onExportCsv??props.onExportTransactionBundle)}if(outcome)return jsx118(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx118(Center8,{style:{width:"100%",height:"100%"},children:jsx118(Loader4,{})});let checkboxColumn=props.checkboxesEnabled,fields=getFieldDefinitions(memoizedSearch),resourceType=memoizedSearch.resourceType,lastResult=state.searchResponse,resources=lastResult?.entry?.map(e=>e.resource),buttonVariant="subtle",buttonColor="gray",iconSize=16,isMobile=window.innerWidth<768;return jsxs63("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs63(Group38,{justify:"space-between",mb:"xl",children:[jsxs63(Group38,{gap:2,children:[jsx118(Button14,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx118(Button14,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx118(Button14,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx118(Button14,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx118(Button14,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx118(Button14,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs63(Group38,{gap:2,children:[lastResult&&jsxs63(Text20,{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()}`]}),jsx118(ActionIcon11,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx118(IconRefresh,{size:iconSize})})]})]}),jsxs63(Table3,{className:SearchControl_default.table,children:[jsxs63(Table3.Thead,{children:[jsxs63(Table3.Tr,{children:[checkboxColumn&&jsx118(Table3.Th,{children:jsx118("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx118(Table3.Th,{children:jsxs63(Menu6,{shadow:"md",width:240,position:"bottom-end",children:[jsx118(Menu6.Target,{children:jsx118(UnstyledButton4,{className:SearchControl_default.control,p:2,children:jsxs63(Group38,{justify:"space-between",wrap:"nowrap",children:[jsx118(Text20,{fw:500,children:buildFieldNameString(field.name)}),jsx118(Center8,{className:SearchControl_default.icon,children:jsx118(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx118(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&&jsxs63(Table3.Tr,{children:[checkboxColumn&&jsx118(Table3.Th,{}),fields.map(field=>jsx118(Table3.Th,{children:field.searchParams&&jsx118(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),jsx118(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs63(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx118(Table3.Td,{children:jsx118("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=>jsx118(Table3.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&jsx118(Container,{children:jsx118(Center8,{style:{height:150},children:jsx118(Text20,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx118(Center8,{m:"md",p:"md",children:jsx118(Pagination,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),jsx118(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}`),jsx118(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}`),jsx118(SearchExportDialog,{visible:stateRef.current.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx118(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?jsx118("span",{children:"no filters"}):jsx118(Fragment35,{children:filters.map(filter=>jsxs63("div",{children:[getOpString(filter.operator),"\xA0",jsx118(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 jsx119,jsxs as jsxs64}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum28(),[schemaLoaded,setSchemaLoaded]=useState62(!1),[outcome,setOutcome]=useState62(),{query,fields}=props,[response,setResponse]=useState62(),[selected,setSelected]=useState62({}),responseRef=useRef18(response);responseRef.current=response;let selectedRef=useRef18({});selectedRef.current=selected,useEffect23(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome8(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selectedRef.current};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=responseRef.current?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=responseRef.current?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selectedRef.current[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if(useEffect23(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx119(Loader5,{});let checkboxColumn=props.checkboxesEnabled;return jsxs64("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs64(Table4,{children:[jsx119(Table4.Thead,{children:jsxs64(Table4.Tr,{children:[checkboxColumn&&jsx119(Table4.Th,{children:jsx119("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx119(Table4.Th,{children:field.name},field.name))]})}),jsx119(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs64(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx119(Table4.Td,{children:jsx119("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=>jsx119(Table4.Td,{children:jsx119(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx119("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx119("div",{"data-testid":"search-error",children:jsx119("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx119(Button15,{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 jsx120}from"react/jsx-runtime";function InfoBar(props){return jsx120(ScrollArea5,{children:jsx120("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx120("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx120("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx120("div",{className:InfoBar_default.value,children:props.children})};import{Anchor as Anchor6,Tabs}from"@mantine/core";import{isString,locationUtils as locationUtils5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate5}from"@medplum/react-hooks";import{useState as useState63}from"react";var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};import{jsx as jsx121,jsxs as jsxs65}from"react/jsx-runtime";function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=useMedplumNavigate5(),[currentTab,setCurrentTab]=useState63(()=>{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 jsxs65(Tabs,{value:currentTab.toLowerCase(),onChange:onTabChange,...rest,children:[jsx121(Tabs.List,{className:LinkTabs_default.list,children:tabs.map(t=>jsx121(Tabs.Tab,{value:t.value,children:jsx121(Anchor6,{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 Box8,SimpleGrid}from"@mantine/core";import{useResource as useResource8,useSearchOne}from"@medplum/react-hooks";import{Box as Box7,Flex as Flex5,Group as Group39,Paper as Paper3,RingProgress,Text as Text21,Title as Title7}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept4}from"@medplum/core";import{Fragment as Fragment36,jsx as jsx122,jsxs as jsxs66}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx122(Paper3,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs66(Group39,{children:[group.measureScore&&jsx122(MeasureScore,{group}),!group.measureScore&&jsx122(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs66(Fragment36,{children:[jsx122(Text21,{fz:"md",fw:500,mb:8,children:measure.title}),jsx122(Text21,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept4(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept4(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs66(Box7,{children:[jsx122(Title7,{order:3,children:"Not Applicable"}),jsx122(Text21,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs66(Box7,{children:[jsx122(Title7,{order:3,children:"Insufficient Data"}),jsx122(Text21,{children:`Numerator: ${numeratorCount}`}),jsx122(Text21,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx122(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx122(Flex5,{justify:"center",children:jsxs66(Text21,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx122(Fragment36,{children:unit==="%"?jsx122(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx122(Flex5,{justify:"center",children:jsx122(Text21,{fw:700,fz:18,children:jsx122(QuantityDisplay,{value:group.measureScore})})})}):jsx122(Flex5,{h:120,align:"center",children:jsx122(Title7,{order:3,children:jsx122(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 jsx123,jsxs as jsxs67}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource8(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs67(Box8,{children:[measure&&jsx123(MeasureTitle,{measure}),jsx123(SimpleGrid,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx123(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon12,Indicator,Tooltip as Tooltip4}from"@mantine/core";import{useMedplum as useMedplum29,useSubscription as useSubscription2}from"@medplum/react-hooks";import{useCallback as useCallback14,useEffect as useEffect24,useState as useState64}from"react";import{jsx as jsx124}from"react/jsx-runtime";function NotificationIcon(props){let medplum=useMedplum29(),{resourceType,countCriteria,subscriptionCriteria}=props,[unreadCount,setUnreadCount]=useState64(0),updateCount=useCallback14(cache=>{medplum.search(resourceType,countCriteria,{cache}).then(result2=>setUnreadCount(result2.total)).catch(console.error)},[medplum,resourceType,countCriteria]);useEffect24(()=>{updateCount("default")},[updateCount]),useSubscription2(subscriptionCriteria,()=>{updateCount("reload")});let result=props.iconComponent;return props.onClick&&(result=jsx124(ActionIcon12,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=jsx124(Tooltip4,{label:props.tooltip,children:result})),unreadCount>0&&(result=jsx124(Indicator,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}import{Group as Group40,SegmentedControl as SegmentedControl2,Stack as Stack17}from"@mantine/core";import{notifications}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString9,resolveId}from"@medplum/core";import{useMedplum as useMedplum30}from"@medplum/react-hooks";import{useCallback as useCallback15}from"react";import{jsx as jsx125,jsxs as jsxs68}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=useMedplum30(),{patient}=props,handleSubmit=useCallback15(async data2=>{let patientId=resolveId(patient),format=data2.format,{operation,type,contentType,extension}=formats[format],url=medplum.fhirUrl("Patient",patientId,operation),params={};type&&(params.type=type),data2.author&&(params.author={reference:data2.author}),data2.authoredOn&&(params.authoredOn=convertLocalToIso(data2.authoredOn)),data2.startDate&&(params.start=data2.startDate),data2.endDate&&(params.end=data2.endDate),notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,loading:!0,message:"Exporting...",autoClose:!1,withCloseButton:!1});try{let response=await medplum.post(url,params,void 0,{cache:"no-cache",headers:{Accept:contentType}}),fileName=`Patient-export-${patientId}-${new Date().toISOString().replaceAll(":","-")}.${extension}`;saveData(response,fileName,contentType),notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"green",message:"Done",icon:jsx125(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString9(err),icon:jsx125(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient]);return jsx125(Form,{onSubmit:handleSubmit,children:jsxs68(Stack17,{children:[jsx125(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx125(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})}),jsx125(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx125(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx125(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx125(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx125(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:jsx125(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx125(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:jsx125(DateTimeInput,{name:"endDate",placeholder:"End date"})}),jsx125(Group40,{justify:"right",children:jsx125(SubmitButton,{children:"Request Export"})})]})})}function saveData(data2,fileName,contentType){let content=typeof data2=="string"?data2:JSON.stringify(data2,null,2),blob=new Blob([content],{type:contentType}),url=window.URL.createObjectURL(blob),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=url,a.download=fileName,a.click(),window.URL.revokeObjectURL(url)}import{calculateAgeString}from"@medplum/core";import{useResource as useResource9}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment37,jsx as jsx126,jsxs as jsxs69}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource9(props.patient);return patient?jsxs69(InfoBar,{children:[jsx126(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:"Name"}),jsx126(InfoBar.Value,{children:jsx126(MedplumLink,{to:patient,fw:500,children:patient.name?jsx126(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs69(Fragment37,{children:[jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:"DoB"}),jsx126(InfoBar.Value,{children:patient.birthDate})]}),jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:"Age"}),jsx126(InfoBar.Value,{children:calculateAgeString(patient.birthDate)})]})]}),patient.gender&&jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:"Gender"}),jsx126(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:"State"}),jsx126(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:identifier?.system}),jsx126(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Divider as Divider3,Flex as Flex12,Group as Group54,Stack as Stack24,Text as Text32,Tooltip as Tooltip6}from"@mantine/core";import{calculateAgeString as calculateAgeString2,formatAddress as formatAddress2,formatHumanName as formatHumanName6,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum37,useResource as useResource11}from"@medplum/react-hooks";import{useEffect as useEffect25,useState as useState76}from"react";import{Box as Box11,Flex as Flex6,Group as Group43,Modal as Modal8,Text as Text23}from"@mantine/core";import{useDisclosure}from"@mantine/hooks";import{getDisplayString as getDisplayString6}from"@medplum/core";import{useMedplum as useMedplum31}from"@medplum/react-hooks";import{useCallback as useCallback17,useMemo as useMemo29,useState as useState67}from"react";import{Group as Group41,Stack as Stack18,TextInput as TextInput21}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG2,addProfileToResource,createReference as createReference6}from"@medplum/core";import{useCallback as useCallback16,useState as useState65}from"react";import{jsx as jsx127,jsxs as jsxs70}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG2+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState65(allergy?.code),[clinicalStatus,setClinicalStatus]=useState65(allergy?.clinicalStatus),handleSubmit=useCallback16(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference6(patient),encounter:encounter?createReference6(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0},PATIENT_ALLERGY_PROFILE))},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx127(Form,{onSubmit:handleSubmit,children:jsxs70(Stack18,{children:[jsx127(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}),jsx127(TextInput21,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx127(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG2+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx127(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx127(Group41,{justify:"flex-end",gap:4,mt:"md",children:jsx127(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon13,Box as Box9,Collapse,Group as Group42,Text as Text22}from"@mantine/core";import{useState as useState66}from"react";var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title",addButton:"CollapsibleSection_addButton"};import{jsx as jsx128,jsxs as jsxs71}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState66(!1);return jsxs71(Box9,{className:CollapsibleSection_default.root,children:[jsxs71(Group42,{justify:"space-between",className:CollapsibleSection_default.header,children:[jsxs71(Group42,{gap:8,children:[jsx128(ActionIcon13,{variant:"subtle",onClick:()=>setCollapsed(c=>!c),"aria-label":collapsed?`Show ${title.toLowerCase()}`:`Hide ${title.toLowerCase()}`,className:CollapsibleSection_default.chevron,"data-collapsed":collapsed||void 0,size:"md",children:jsx128(IconChevronDown,{size:20})}),jsx128(Text22,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx128(ActionIcon13,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx128(IconPlus,{size:18})})]}),jsx128(Collapse,{in:!collapsed,children:jsx128(Box9,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}import{ActionIcon as ActionIcon14,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 jsx129,jsxs as jsxs72}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs72(Box10,{className:SummaryItem_default.item,onClick,children:[children,jsx129("div",{className:SummaryItem_default.gradient}),jsx129("div",{className:SummaryItem_default.container,children:jsx129(ActionIcon14,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx129(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment38,jsx as jsx130,jsxs as jsxs73}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum31(),{patient,encounter}=props,[allergies,setAllergies]=useState67(props.allergies),[opened,{open,close}]=useDisclosure(!1),[editAllergy,setEditAllergy]=useState67(),sortedAllergies=useMemo29(()=>[...allergies].sort((a,b)=>{let aStatus=a.clinicalStatus?.coding?.[0]?.code,bStatus=b.clinicalStatus?.coding?.[0]?.code;return aStatus==="active"&&bStatus!=="active"?-1:aStatus!=="active"&&bStatus==="active"?1:getDisplayString6(a).localeCompare(getDisplayString6(b))}),[allergies]),handleSubmit=useCallback17(async allergy=>{if(allergy.id){let updatedAllergy=await medplum.updateResource(allergy);setAllergies(allergies.map(a=>a.id===updatedAllergy.id?updatedAllergy:a))}else{let newAllergy=await medplum.createResource(allergy);setAllergies([...allergies,newAllergy])}setEditAllergy(void 0),close()},[medplum,allergies,close]);return jsxs73(Fragment38,{children:[jsx130(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx130(Box11,{children:jsx130(Flex6,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx130(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs73(Box11,{children:[jsx130(Text23,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString6(allergy)}),jsx130(Group43,{mt:2,gap:4,children:status&&jsx130(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx130(Text23,{children:"(none)"})}),jsx130(Modal8,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx130(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 Flex7,Group as Group44,Text as Text24}from"@mantine/core";import{formatDate}from"@medplum/core";import{useResource as useResource10}from"@medplum/react-hooks";var PatientSummary_default={panel:"PatientSummary_panel",patientSummaryBadge:"PatientSummary_patientSummaryBadge",patientSummaryAddButton:"PatientSummary_patientSummaryAddButton",patientSummaryHeader:"PatientSummary_patientSummaryHeader",patientSummaryCollapseIcon:"PatientSummary_patientSummaryCollapseIcon",collapsed:"PatientSummary_collapsed"};import{jsx as jsx131,jsxs as jsxs74}from"react/jsx-runtime";function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=useResource10(coverage),organizationResource=useResource10(organization),payorName="Unknown Payor";organizationResource&&"name"in organizationResource&&typeof organizationResource.name=="string"&&(payorName=organizationResource.name);let detailsText=`ID: ${coverageResource?.subscriberId??"N/A"}${formatClassInfo(coverageResource)?` \xB7 ${formatClassInfo(coverageResource)}`:""}`;return jsx131(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs74(Box12,{children:[jsx131(Text24,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx131(Text24,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs74(Group44,{mt:2,gap:4,children:[jsx131(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs74(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 jsx131(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx131(Flex7,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx131(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx131(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 Box13,Flex as Flex8,Group as Group45,Modal as Modal9,Text as Text25}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{formatDate as formatDate2,getDisplayString as getDisplayString7}from"@medplum/core";import{useState as useState68}from"react";import{Fragment as Fragment39,jsx as jsx132,jsxs as jsxs75}from"react/jsx-runtime";function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=useState68(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=useDisclosure2(!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 jsxs75(Fragment39,{children:[jsx132(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:jsxs75(Flex8,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>jsx132(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:jsxs75(Box13,{children:[jsx132(Text25,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(serviceRequest)}),jsxs75(Group45,{mt:2,gap:4,children:[serviceRequest.status&&jsx132(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),jsx132(Text25,{size:"xs",fw:500,c:"dimmed",children:formatDate2(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>jsx132(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:jsxs75(Box13,{children:[jsx132(Text25,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(report)}),jsxs75(Group45,{mt:2,gap:4,children:[report.status&&jsx132(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),jsx132(Text25,{size:"xs",fw:500,c:"dimmed",children:formatDate2(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&jsx132(Text25,{children:"(none)"})]})}),jsx132(Modal9,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&jsx132(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 Flex9,Group as Group47,Modal as Modal10,Text as Text26}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{getDisplayString as getDisplayString8}from"@medplum/core";import{useMedplum as useMedplum32}from"@medplum/react-hooks";import{useCallback as useCallback19,useState as useState70}from"react";import{Alert as Alert4,Group as Group46,Radio,Stack as Stack19}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG3,addProfileToResource as addProfileToResource2,createReference as createReference7}from"@medplum/core";import{useMedplumProfile as useMedplumProfile7}from"@medplum/react-hooks";import{useCallback as useCallback18,useState as useState69}from"react";import{jsx as jsx133,jsxs as jsxs76}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile7(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState69(medication?.medicationCodeableConcept),handleSubmit=useCallback18(formData=>{if(!me)throw new Error("Not signed in");onSubmit(addProfileToResource2({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&createReference7(encounter)),requester:medication?.requester??createReference7(me),medicationCodeableConcept:code,subject:createReference7(patient)},HTTP_HL7_ORG3+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx133(Form,{onSubmit:handleSubmit,children:jsxs76(Stack19,{children:[jsx133(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}),jsx133(Radio.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx133(Radio,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx133(Group46,{justify:"flex-end",gap:4,children:jsx133(SubmitButton,{children:"Save"})})]})}):jsx133(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment40,jsx as jsx134,jsxs as jsxs77}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum32(),[medicationRequests,setMedicationRequests]=useState70(props.medicationRequests),[editMedication,setEditMedication]=useState70(),[opened,{open,close}]=useDisclosure3(!1),handleSubmit=useCallback19(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m=>m.id===updatedMedication.id?updatedMedication:m))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs77(Fragment40,{children:[jsx134(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medicationRequests.length>0?jsx134(Flex9,{direction:"column",gap:8,children:medicationRequests.map(medication=>jsx134(SummaryItem,{onClick:()=>{setEditMedication(medication),open()},children:jsxs77(Box14,{children:[jsx134(Text26,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(medication)}),jsx134(Group47,{mt:2,gap:4,children:medication.status&&jsx134(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},medication.id))}):jsx134(Text26,{children:"(none)"})}),jsx134(Modal10,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx134(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 Group48,Text as Text27,Tooltip as Tooltip5}from"@mantine/core";import{jsx as jsx135,jsxs as jsxs78}from"react/jsx-runtime";var PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return jsx135(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx135(Box15,{className:PatientSummary_default.patientSummaryListItem,children:jsx135(Tooltip5,{label,position:"top-start",openDelay:650,children:jsxs78(Group48,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,jsx135(Text27,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};import{capitalize as capitalize5,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG4}from"@medplum/core";function getGenderIdentity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-ethnicity`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getGeneralPractitioner(patient){return patient.generalPractitioner?.[0]?.display}function formatPatientGenderDisplay(patient){let capitalizedGender=patient.gender?capitalize5(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 Flex10,Group as Group50,Modal as Modal11,Text as Text28}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{formatDate as formatDate3,getDisplayString as getDisplayString9}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback21,useState as useState72}from"react";import{Group as Group49,Stack as Stack20}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback20,useState as useState71}from"react";import{jsx as jsx136,jsxs as jsxs79}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState71(condition?.code),[clinicalStatus,setClinicalStatus]=useState71(condition?.clinicalStatus),handleSubmit=useCallback20(formData=>{let updatedCondition=addProfileToResource3({...condition,resourceType:"Condition",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:createReference8(patient),encounter:encounter&&createReference8(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG5+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx136(Form,{onSubmit:handleSubmit,children:jsxs79(Stack20,{children:[jsx136(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG5+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx136(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG5+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx136(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx136(Group49,{justify:"flex-end",gap:4,mt:"md",children:jsx136(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment41,jsx as jsx137,jsxs as jsxs80}from"react/jsx-runtime";function ProblemList(props){let medplum=useMedplum33(),{patient,encounter}=props,[problems,setProblems]=useState72(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=useState72(),[opened,{open,close}]=useDisclosure4(!1),handleSubmit=useCallback21(async condition=>{if(condition.id){let updatedCondition=await medplum.updateResource(condition);setProblems(problems.map(p=>p.id===updatedCondition.id?updatedCondition:p))}else{let newCondition=await medplum.createResource(condition);setProblems([newCondition,...problems])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs80(Fragment41,{children:[jsx137(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx137(Flex10,{direction:"column",gap:8,children:problems.map(problem=>jsx137(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs80(Box16,{children:[jsx137(Text28,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString9(problem)}),jsxs80(Group50,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx137(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx137(Text28,{size:"xs",fw:500,c:"dimmed",children:formatDate3(problem.onsetDateTime)})]})]})},problem.id))}):jsx137(Text28,{children:"(none)"})}),jsx137(Modal11,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx137(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 Flex11,Group as Group51,Modal as Modal12,Radio as Radio2,Stack as Stack21,Text as Text29,UnstyledButton as UnstyledButton5}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{createReference as createReference9,HTTP_HL7_ORG as HTTP_HL7_ORG6,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum34}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState73}from"react";import{Fragment as Fragment42,jsx as jsx138,jsxs as jsxs81}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=useMedplum34(),[sexualOrientation,setSexualOrientation]=useState73(props.sexualOrientation),[opened,{open,close}]=useDisclosure5(!1),[hoverIndex,setHoverIndex]=useState73(null),handleSubmit=useCallback22(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG6+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:createReference9(patient),encounter:encounter?createReference9(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:CodesToSystem[code],code:formData.sexualOrientation}],text:CodesToText[code]}}).then(newSexualOrientation=>{setSexualOrientation(newSexualOrientation),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs81(Fragment42,{children:[jsx138(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx138(Flex11,{direction:"column",gap:8,children:jsx138(Box17,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx138(UnstyledButton5,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx138(Box17,{pr:hoverIndex===0?24:0,children:jsx138(Text29,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx138(Text29,{children:"(none)"})}),jsx138(Modal12,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx138(Form,{onSubmit:handleSubmit,children:jsxs81(Stack21,{children:[jsx138(Radio2.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx138(Radio2,{value:code,label:text,my:"xs"},code))}),jsx138(Group51,{justify:"flex-end",gap:4,mt:"md",children:jsx138(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group52,Modal as Modal13,Radio as Radio3,Stack as Stack22,Text as Text30,UnstyledButton as UnstyledButton6}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG7,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference10,formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{useCallback as useCallback23,useState as useState74}from"react";import{Fragment as Fragment43,jsx as jsx139,jsxs as jsxs82}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=useMedplum35(),[smokingStatus,setSmokingStatus]=useState74(props.smokingStatus),[opened,{open,close}]=useDisclosure6(!1),handleSubmit=useCallback23(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG7+"/fhir/us/core/StructureDefinition/us-core-smokingstatus"]},status:"final",category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC2,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference10(props.patient),encounter:props.encounter?createReference10(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED2,version:SNOMED2+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return jsxs82(Fragment43,{children:[jsx139(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx139(UnstyledButton6,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx139(Text30,{children:formatCodeableConcept5(smokingStatus.valueCodeableConcept)})}):jsx139(Text30,{children:"(none)"})}),jsx139(Modal13,{opened,onClose:close,title:"Set Smoking Status",children:jsx139(Form,{onSubmit:handleSubmit,children:jsxs82(Stack22,{children:[jsx139(Radio3.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx139(Radio3,{value:code,label:text,my:"xs"},code))}),jsx139(Group52,{justify:"flex-end",gap:4,mt:"md",children:jsx139(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group53,Modal as Modal14,SimpleGrid as SimpleGrid2,Stack as Stack23,Text as Text31,Textarea as Textarea3,TextInput as TextInput22}from"@mantine/core";import{useDisclosure as useDisclosure7}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum36}from"@medplum/react-hooks";import{useCallback as useCallback24,useState as useState75}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference11}from"@medplum/core";function getObservationValue(obs,component){return component?obs.component?.find(c=>c.code?.coding?.[0].code===component)?.valueQuantity:obs.valueQuantity}function createObservation(patient,encounter,code,title,valueQuantity){if(isValidNumber(valueQuantity.value))return{...createBaseObservation(patient,encounter,code,title),valueQuantity}}function createCompoundObservation(patient,encounter,code,title,components){let component=components.filter(c=>isValidNumber(c.valueQuantity?.value));if(component.length!==0)return{...createBaseObservation(patient,encounter,code,title),component}}function createBaseObservation(patient,encounter,code,title){return{resourceType:"Observation",status:"preliminary",subject:createReference11(patient),encounter:encounter?createReference11(encounter):void 0,effectiveDateTime:new Date().toISOString(),category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"vital-signs",display:"Vital Signs"}]}],code:createLoincCode(code,title)}}function createLoincCode(code,display){return{coding:[{code,display,system:LOINC3}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!Number.isNaN(value)&&Number.isFinite(value)}import{Fragment as Fragment44,jsx as jsx140,jsxs as jsxs83}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=useMedplum36(),{patient,encounter}=props,[vitals,setVitals]=useState75(props.vitals),[opened,{open,close}]=useDisclosure7(!1),handleSubmit=useCallback24(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 jsxs83(Fragment44,{children:[jsx140(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx140(Stack23,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs83(Group53,{align:"center",children:[jsx140(Text31,{c:"dimmed",children:meta.short}),obs&&jsx140(Text31,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx140(Modal14,{opened,onClose:close,title:"Add Vitals",children:jsxs83(Form,{onSubmit:handleSubmit,children:[jsx140(SimpleGrid2,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx140(TextInput22,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx140(Textarea3,{name:"notes",label:"Notes"}),jsx140(Group53,{justify:"flex-end",gap:4,mt:"md",children:jsx140(SubmitButton,{children:"Save"})})]})})]})}import{Fragment as Fragment45,jsx as jsx141,jsxs as jsxs84}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum37(),{patient:propsPatient,onClickResource,onRequestLabs}=props,patient=useResource11(propsPatient),[medicalData,setMedicalData]=useState76(),[createdDate,setCreatedDate]=useState76();useEffect25(()=>{let ref=`Patient/${resolveId2(propsPatient)}`,searchMeta={_count:100,_sort:"-_lastUpdated"};Promise.all([medplum.searchResources("AllergyIntolerance",{patient:ref,...searchMeta}),medplum.searchResources("Condition",{patient:ref,...searchMeta}),medplum.searchResources("MedicationRequest",{subject:ref,...searchMeta}),medplum.searchResources("Observation",{subject:ref,...searchMeta}),medplum.searchResources("Appointment",{patient:ref,...searchMeta}),medplum.searchResources("Encounter",{subject:ref,...searchMeta}),medplum.searchResources("Coverage",{beneficiary:ref,...searchMeta}),medplum.searchResources("Immunization",{patient:ref,...searchMeta}),medplum.searchResources("Procedure",{subject:ref,...searchMeta}),medplum.searchResources("Device",{patient:ref,...searchMeta}),medplum.searchResources("Goal",{subject:ref,...searchMeta}),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]),useEffect25(()=>{patient?.id&&medplum.readHistory("Patient",patient.id).then(history=>{let lastUpdated=history.entry?.[history.entry.length-1]?.resource?.meta?.lastUpdated;setCreatedDate(typeof lastUpdated=="string"?lastUpdated:"")}).catch(()=>{})},[patient?.id,medplum]);let languageDisplay=patient?getPreferredLanguage(patient):void 0;return patient?jsxs84(Flex12,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs84(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs84(Group54,{align:"center",gap:"sm",p:16,children:[jsx141(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs84(Stack24,{gap:0,style:{flex:1,minWidth:0},children:[jsx141(Tooltip6,{label:formatHumanName6(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx141(Text32,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:formatHumanName6(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return jsxs84(Text32,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx141(Divider3,{})]}),jsx141(Stack24,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:medicalData&&jsxs84(Fragment45,{children:[jsxs84(Stack24,{gap:"xs",py:8,children:[jsx141(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${calculateAgeString2(patient.birthDate)})`:void 0,icon:jsx141(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),jsx141(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:jsx141(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),jsx141(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:jsx141(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),jsx141(PatientInfoItem,{patient,value:patient.address?.[0]?formatAddress2(patient.address[0]):void 0,icon:jsx141(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),jsx141(PatientInfoItem,{patient,value:languageDisplay,icon:jsx141(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),jsx141(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:jsx141(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add General Practitioner",label:"General Practitioner",onClickResource})]}),jsx141(Divider3,{}),jsx141(Insurance,{coverages:medicalData.coverages||[],onClickResource}),jsx141(Divider3,{}),jsx141(Allergies,{patient,allergies:medicalData.allergies,onClickResource}),jsx141(Divider3,{}),jsx141(ProblemList,{patient,problems:medicalData.problems,onClickResource}),jsx141(Divider3,{}),jsx141(Medications,{patient,medicationRequests:medicalData.medicationRequests,onClickResource}),jsx141(Divider3,{}),jsx141(Labs,{patient,serviceRequests:medicalData.serviceRequests,diagnosticReports:medicalData.diagnosticReports,onClickResource,onRequestLabs}),jsx141(Divider3,{}),jsx141(SexualOrientation,{patient,sexualOrientation:medicalData.sexualOrientation,onClickResource}),jsx141(Divider3,{}),jsx141(SmokingStatus,{patient,smokingStatus:medicalData.smokingStatus,onClickResource}),jsx141(Divider3,{}),jsx141(Vitals,{patient,vitals:medicalData.vitals,onClickResource}),jsx141(Divider3,{})]})})]}):null}import{createReference as createReference12}from"@medplum/core";import{useCallback as useCallback25}from"react";import{jsx as jsx142}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback25((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),medplum.search("Communication",{subject:ref,_count}),medplum.search("Device",{patient:ref,_count}),medplum.search("DeviceRequest",{patient:ref,_count}),medplum.search("DiagnosticReport",{subject:ref,_count}),medplum.search("Media",{subject:ref,_count}),medplum.search("ServiceRequest",{subject:ref,_count}),medplum.search("Task",{subject:ref,_count})])},[]);return jsx142(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference12(resource),sender:createReference12(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference12(resource),operator:createReference12(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor7,Box as Box18,Button as Button16,CloseButton,Flex as Flex13,Group as Group55,Loader as Loader6,NativeSelect as NativeSelect11,Paper as Paper4,Stack as Stack25,Text as Text33,TextInput as TextInput23}from"@mantine/core";import{getReferenceString as getReferenceString7}from"@medplum/core";import{useMedplum as useMedplum38,useResource as useResource12}from"@medplum/react-hooks";import{useEffect as useEffect26,useRef as useRef19,useState as useState77}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx143,jsxs as jsxs85}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum38(),defaultValue2=useResource12(props.value),[schemaLoaded,setSchemaLoaded]=useState77(!1),[selectedKey,setSelectedKey]=useState77(),[hoverKey,setHoverKey]=useState77(),[value,setValue]=useState77();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}let valueRef=useRef19(value);if(valueRef.current=value,useEffect26(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect26(()=>(setValue(ensurePlanDefinitionKeys(defaultValue2??{resourceType:"PlanDefinition",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]),!schemaLoaded||!value)return null;function changeProperty(property,newValue){setValue({...valueRef.current,[property]:newValue})}return jsx143("div",{children:jsxs85(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx143(TextInput23,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx143(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx143(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){let actionsRef=useRef19(props.actions);actionsRef.current=props.actions;function changeAction(changedAction){props.onChange(actionsRef.current.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...actionsRef.current,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(actionsRef.current.filter(i=>i!==removedAction))}return jsxs85(Stack25,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx143(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx143("div",{children:jsx143(Button16,{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 jsx143("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx143(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState77(),medplum=useMedplum38(),[loading,setLoading]=useState77(!1),[resource,setResource]=useState77(),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 useEffect26(()=>{(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?jsx143(Loader6,{}):jsxs85(Paper4,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs85(Flex13,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx143(TextInput23,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx143(CloseButton,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs85(Stack25,{gap:"xl",p:"md",children:[jsx143(Box18,{children:jsx143(TextInput23,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx143(Box18,{children:jsx143(NativeSelect11,{label:"Type of Action",value:actionType,onChange:e=>{let value=e.currentTarget.value==="standard"?void 0:e.currentTarget.value;setActionType(value),props.onChange({...props.action,definitionCanonical:value==="standard"?void 0:props.action.definitionCanonical})},data:[{value:"standard",label:"Standard task"},{value:"questionnaire",label:"Task with Questionnaire"},{value:"activitydefinition",label:"Task with Activity Definition"}]})}),actionType==="questionnaire"&&jsxs85(Stack25,{gap:0,children:[jsxs85(Group55,{gap:0,mb:"xs",children:[jsx143(Text33,{fw:600,children:"Select questionnaire"}),jsx143(Text33,{c:"red",children:"*"})]}),jsxs85(Text33,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx143(Anchor7,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx143(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&jsxs85(Stack25,{gap:0,children:[jsxs85(Group55,{gap:0,mb:"xs",children:[jsx143(Text33,{fw:600,children:"Select activity definition"}),jsx143(Text33,{c:"red",children:"*"})]}),jsxs85(Text33,{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"," ",jsx143(Anchor7,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx143(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return jsx143(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:getReferenceString7(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 Anchor8,Box as Box19,Group as Group57,NativeSelect as NativeSelect13,Space as Space2,Textarea as Textarea5,TextInput as TextInput25,Title as Title8}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{getQuestionnaireItemReferenceTargetTypes as getQuestionnaireItemReferenceTargetTypes2,isChoiceQuestion,QUESTIONNAIRE_ITEM_CONTROL_URL as QUESTIONNAIRE_ITEM_CONTROL_URL2,QuestionnaireItemType as QuestionnaireItemType2,setQuestionnaireItemReferenceTargetTypes,useMedplum as useMedplum40,useResource as useResource13}from"@medplum/react-hooks";import{useEffect as useEffect28,useRef as useRef20,useState as useState79}from"react";import{Checkbox as Checkbox6,Group as Group56,MultiSelect as MultiSelect2,NativeSelect as NativeSelect12,Radio as Radio4,Text as Text34,Textarea as Textarea4,TextInput as TextInput24}from"@mantine/core";import{capitalize as capitalize6,deepEquals as deepEquals2,formatCoding as formatCoding2,getElementDefinition as getElementDefinition2,getExtension as getExtension2,HTTP_HL7_ORG as HTTP_HL7_ORG8,stringify as stringify3,typedValueToString}from"@medplum/core";import{getItemAnswerOptionValue,getItemInitialValue,getNewMultiSelectValues,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,QUESTIONNAIRE_ITEM_CONTROL_URL,QuestionnaireItemType,useMedplum as useMedplum39}from"@medplum/react-hooks";import{useEffect as useEffect27,useState as useState78}from"react";import{Fragment as Fragment46,jsx as jsx144,jsxs as jsxs86}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){formState&&props.context&&formState.onChangeAnswer(props.context,props.item,newResponseAnswer)}let type=item.type;if(!type)return null;let name=item.linkId;if(!name)return null;let initial;item.initial&&item.initial.length>0?initial=item.initial[0]:item.answerOption&&item.answerOption.length>0&&(initial=item.answerOption.find(option=>option.initialSelected));let defaultValue2=getCurrentAnswer(response,props.index)??getItemInitialValue(initial),validationError=getExtension2(response,`${HTTP_HL7_ORG8}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx144("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx144(CheckboxFormSection,{title:props.item.text,htmlFor:props.item.linkId,children:jsx144(Checkbox6,{id:props.item.linkId,name:props.item.linkId,required:props.required??item.required,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueBoolean:e.currentTarget.checked}])})},props.item.linkId);break;case QuestionnaireItemType.decimal:formComponent=jsx144(TextInput24,{type:"number",step:"any",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueDecimal:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.integer:formComponent=jsx144(TextInput24,{type:"number",step:1,id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueInteger:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.date:formComponent=jsx144(TextInput24,{type:"date",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueDate:e.currentTarget.value}])});break;case QuestionnaireItemType.dateTime:formComponent=jsx144(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case QuestionnaireItemType.time:formComponent=jsx144(TextInput24,{type:"time",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueTime:e.currentTarget.value}])});break;case QuestionnaireItemType.string:case QuestionnaireItemType.url:formComponent=jsx144(TextInput24,{id:name,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=jsx144(Textarea4,{id:name,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=jsx144(Group56,{py:4,children:jsx144(AttachmentInput,{path:"",name,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case QuestionnaireItemType.reference:formComponent=jsx144(ReferenceInput,{name,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=jsx144(QuantityInput,{path:"",name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueQuantity:newValue}]),disableWheel:!0});break;case QuestionnaireItemType.choice:case QuestionnaireItemType.openChoice:isCheckboxChoice(item)?formComponent=jsx144(QuestionnaireCheckboxInput,{name,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):isDropdownChoice(item)||item.answerValueSet&&!isRadiobuttonChoice(item)?formComponent=jsx144(QuestionnaireDropdownInput,{name,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):formComponent=jsx144(QuestionnaireRadioButtonInput,{name,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)});break;default:return null}return jsxs86(Fragment46,{children:[formComponent,validationError?.valueString&&jsx144(Text34,{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 jsx144(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||isMultiSelectChoice(item);if(item.answerValueSet)return jsx144(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 jsx144(MultiSelect2,{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 jsx144(NativeSelect12,{id:name,name,required,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){onChangeAnswer([{}]);return}let option=item.answerOption[index-1],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize6(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])},defaultValue:formatCoding2(defaultValue2?.value)||defaultValue2?.value,data:data2})}}function getValueSetOptions(valueSetUrl,medplum){return valueSetUrl?medplum.valueSetExpand({url:valueSetUrl,count:MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS+1}).then(valueSet=>valueSet.expansion?.contains??[]):Promise.resolve([])}function useValueSetOptions(valueSetUrl){let medplum=useMedplum39(),[valueSetOptions,setValueSetOptions]=useState78([]),[isLoading,setIsLoading]=useState78(!1);return useEffect27(()=>{async function loadValueSet(){if(valueSetUrl){setIsLoading(!0);try{let options=await getValueSetOptions(valueSetUrl,medplum);setValueSetOptions(options)}catch(err){console.error("Error loading value set:",err)}finally{setIsLoading(!1)}}}loadValueSet().catch(console.error)},[valueSetUrl,medplum]),[valueSetOptions,isLoading]}function getOptionsFromValueSet(valueSetOptions,name){return valueSetOptions.map((option,i)=>{let optionName=`${name}-valueset-${i}`,optionValue={type:"Coding",value:{system:option.system,code:option.code,display:option.display}};return[optionName,optionValue]})}function QuestionnaireRadioButtonInput(props){let{name,item,required,initial,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition2("QuestionnaireItemAnswerOption","value[x]"),initialValue=getItemInitialValue(initial),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),options=[],defaultValue2;if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?(initialValue&&stringify3(optionValue)===stringify3(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return jsx144(Text34,{children:"Loading options..."});if(options.length===0)return jsx144(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs86(Fragment46,{children:[jsx144(Radio4.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+capitalize6(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>jsx144(Radio4,{id:optionName,value:optionName,py:4,required,label:jsx144(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)&&jsxs86(Text34,{size:"sm",c:"dimmed",mt:"xs",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function QuestionnaireCheckboxInput(props){let{name,item,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition2("QuestionnaireItemAnswerOption","value[x]"),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),initialSelectedValues=item.answerValueSet?(response?.answer?.map(a=>a.valueCoding)||[]).filter(c=>c!==void 0):getCurrentMultiSelectAnswer(response),[selectedValues,setSelectedValues]=useState78(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 jsx144(Text34,{children:"Loading options..."});if(options.length===0)return jsx144(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS),handleCheckboxChange=(optionValue,selected)=>{if(item.answerValueSet){let currentCodings=selectedValues,newCodings;selected?newCodings=[...currentCodings,optionValue.value]:newCodings=currentCodings.filter(c=>!deepEquals2(c,optionValue.value)),setSelectedValues(newCodings),newCodings.length===0?onChangeAnswer([{}]):onChangeAnswer(newCodings.map(coding=>({valueCoding:coding})))}else{let currentValues=selectedValues,optionValueStr=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"+capitalize6(optionValue.type),item);onChangeAnswer(values)}}};return jsxs86(Group56,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=typedValueToString(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>deepEquals2(coding,optionValue.value)):selectedValues.includes(optionValueStr);return jsx144(Checkbox6,{id:optionName,label:jsx144(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)&&jsxs86(Text34,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx144(TextInput24,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){return getItemAnswerOptionValue(response?.answer?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response?.answer;return results?results.map(a=>getItemAnswerOptionValue(a)).map(type=>formatCoding2(type?.value)||type?.value).filter(Boolean):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals2(option[1].value,defaultAnswer?.value))?.[0]}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"+capitalize6(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};import{Fragment as Fragment47,jsx as jsx145,jsxs as jsxs87}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum40(),defaultValue2=useResource13(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState79(!1),[value,setValue]=useState79(),[selectedKey,setSelectedKey]=useState79(),[hoverKey,setHoverKey]=useState79();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect28(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect28(()=>(setValue(ensureQuestionnaireKeys(defaultValue2??{resourceType:"Questionnaire",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]);let handleChange=(questionnaire,disableSubmit)=>{setValue(questionnaire),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire)};return!schemaLoaded||!value?null:jsx145("div",{children:jsxs87(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx145(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx145(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource2=isResourceType(props.item),isContainer=isResource2||item.type===QuestionnaireItemType2.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef20(props.item);itemRef.current=props.item;function onClick(e){killEvent(e),props.setSelectedKey(props.item.id)}function onHover(e){killEvent(e),props.setHoverKey(props.item.id)}function changeItem(changedItem){let curr=itemRef.current;props.onChange({...curr,item:curr.item?.map(i=>i.id===changedItem.id?changedItem:i)})}function addItem(addedItem,disableSubmit){props.onChange({...props.item,item:[...props.item.item??[],addedItem]},disableSubmit)}function removeItem(removedItem){props.onChange({...props.item,item:props.item.item?.filter(i=>i!==removedItem)})}function changeProperty(property,value){props.onChange({...itemRef.current,[property]:value})}function updateItem(updatedItem){props.onChange({...props.item,...updatedItem})}function toggleRepeatable(item2){props.onChange({...props.item,item:props.item.item?.map(i=>i===item2?{...i,repeats:!i.repeats}:i)})}function moveItem(itemIndex,delta){let updatedItems=reorderItems(props.item.item,itemIndex,delta);props.onChange({...props.item,item:updatedItems})}let className=clsx_default(QuestionnaireBuilder_default.section,{[QuestionnaireBuilder_default.editing]:editing,[QuestionnaireBuilder_default.hovering]:hovering&&!editing});return jsxs87("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx145("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs87(Fragment47,{children:[isResource2&&jsx145(TextInput25,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource2&&jsx145(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx145(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx145(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs87(Fragment47,{children:[resource.title&&jsx145(Title8,{children:resource.title}),item.text&&jsx145("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx145(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx145("div",{children:jsx145(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&&jsx145("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs87(Fragment47,{children:[jsx145(TextInput25,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx145(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"}]})]}):jsx145("div",{children:linkId})}),!isResource2&&jsx145(Box19,{className:QuestionnaireBuilder_default.movementActions,children:jsxs87(Box19,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx145(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx145(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs87("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs87(Fragment47,{children:[jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource2&&jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource2&&jsxs87(Fragment47,{children:[jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx145(Anchor8,{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 jsxs87("div",{children:[props.item.answerValueSet!==void 0?jsx145(TextInput25,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx145(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs87(Box19,{display:"flex",children:[jsx145(Anchor8,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),jsx145(Space2,{w:"lg"}),jsx145(Anchor8,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx145("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs87("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx145("div",{children:jsx145(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)}),jsx145("div",{children:jsx145(Anchor8,{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 jsxs87(Fragment47,{children:[targetTypes.map((targetType,index)=>jsxs87(Group57,{children:[jsx145(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx145(Anchor8,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx145(Anchor8,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId2=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId2(){return"id-"+nextId2++}function ensureQuestionnaireKeys(questionnaire){return{...questionnaire,id:questionnaire.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId2=Math.max(nextId2,Number.parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,Number.parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId2(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId2()}))}function createPage(){return{id:generateId2(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:QUESTIONNAIRE_ITEM_CONTROL_URL2,valueCodeableConcept:{coding:[{system:"http://hl7.org/fhir/questionnaire-item-control",code:"page"}]}}]}}function reorderItems(items,itemIndex,delta){let currentItems=items??[],newIndex=itemIndex+delta;if(newIndex<0||newIndex>=currentItems.length)return currentItems;let updatedItems=[...currentItems];return[updatedItems[itemIndex],updatedItems[newIndex]]=[updatedItems[newIndex],updatedItems[itemIndex]],updatedItems}import{Group as Group59,Stack as Stack28,Text as Text35,Title as Title10}from"@mantine/core";import{createReference as createReference14,getExtension as getExtension3,getReferenceString as getReferenceString8}from"@medplum/core";import{QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,useMedplum as useMedplum42,useQuestionnaireForm}from"@medplum/react-hooks";import{useCallback as useCallback26,useMemo as useMemo30,useRef as useRef22,useState as useState80}from"react";import{Button as Button17,Paper as Paper5}from"@mantine/core";import{createReference as createReference13,HTTP_HL7_ORG as HTTP_HL7_ORG9}from"@medplum/core";import{useMedplum as useMedplum41}from"@medplum/react-hooks";import{useEffect as useEffect29,useRef as useRef21}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){switch(type){case"image/svg+xml":return typeof encoderOptions!="object"&&(encoderOptions=void 0),`data:image/svg+xml;base64,${btoa(this.toSVG(encoderOptions))}`;default:return 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 jsx146,jsxs as jsxs88}from"react/jsx-runtime";function SignatureInput(props){let medplum=useMedplum41(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=useRef21(null),signaturePadRef=useRef21(null),onChangeRef=useRef21(onChange);return onChangeRef.current=onChange,useEffect29(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:HTTP_HL7_ORG9+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??createReference13(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]),jsxs88(Paper5,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[jsx146("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),jsx146(Button17,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:jsx146(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}import{Stack as Stack27}from"@mantine/core";import{isQuestionEnabled,QuestionnaireItemType as QuestionnaireItemType4}from"@medplum/react-hooks";import{Title as Title9}from"@mantine/core";import{jsx as jsx147,jsxs as jsxs89}from"react/jsx-runtime";function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return jsxs89("div",{children:[props.item.text&&jsx147(Title9,{order:3,mb:"md",children:props.item.text}),jsx147(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}import{Anchor as Anchor9}from"@mantine/core";import{Fragment as Fragment48,jsx as jsx148,jsxs as jsxs90}from"react/jsx-runtime";function QuestionnaireFormRepeatableGroup(props){return jsxs90(Fragment48,{children:[props.responseItems.map(response=>jsx148(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),jsx148(Anchor9,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}import{Anchor as Anchor10,Stack as Stack26}from"@mantine/core";import{QuestionnaireItemType as QuestionnaireItemType3}from"@medplum/react-hooks";import{jsx as jsx149,jsxs as jsxs91}from"react/jsx-runtime";function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,showAddButton=item.type!==QuestionnaireItemType3.choice&&item.type!==QuestionnaireItemType3.openChoice,answers=responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return jsxs91(FormSection,{htmlFor:props.item.linkId,title:props.item.text,withAsterisk:props.item.required,children:[jsx149(Stack26,{gap:"xs",children:answers?.map((_,index)=>jsx149(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&jsx149(Anchor10,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}import{jsx as jsx150}from"react/jsx-runtime";function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props;return jsx150(Stack27,{children:items.map((item,index)=>{if(!isQuestionEnabled(item,formState.questionnaireResponse))return null;if(item.type===QuestionnaireItemType4.display)return jsx150("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===QuestionnaireItemType4.group&&item.repeats?jsx150(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems},`repeating-group-${item.id}-${index}`):item.type===QuestionnaireItemType4.group?jsx150(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]},`group-${item.id}-${index}`):item.type===QuestionnaireItemType4.boolean?jsx150(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?jsx150(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):jsx150(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:jsx150(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}import{Button as Button18,Group as Group58,Stepper}from"@mantine/core";import{Fragment as Fragment49,jsx as jsx151,jsxs as jsxs92}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 jsxs92(Fragment49,{children:[jsx151(Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>jsx151(Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&jsxs92(Group58,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx151(Button18,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&jsx151(Button18,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&jsx151(SubmitButton,{children:submitButtonText??"Submit"})]})]})}import{Fragment as Fragment50,jsx as jsx152,jsxs as jsxs93}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum42(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=useState80(!1),propsRef=useRef22(props);propsRef.current=props;let onFormChange=useCallback26(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=useRef22(formState);formStateRef.current=formState;let isSignatureRequired=useMemo30(()=>formState.loading?!1:!!getExtension3(formState.questionnaire,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=useMemo30(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=useCallback26(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=createReference14(profile))}onSubmit({...response,questionnaire:questionnaire.url??getReferenceString8(questionnaire),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:jsxs93(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&jsx152(Title10,{children:formState.questionnaire.title}),formState.pagination?jsx152(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:jsx152(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):jsxs93(Fragment50,{children:[jsx152(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&jsxs93(Stack28,{mt:"md",gap:0,children:[jsx152(Text35,{size:"sm",fw:500,children:"Signature"}),jsx152(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&jsx152(Text35,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&jsx152(Group59,{justify:"flex-end",mt:"xl",gap:"xs",children:jsx152(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}import{Stack as Stack30}from"@mantine/core";import{useResource as useResource14}from"@medplum/react-hooks";import{Stack as Stack29,Text as Text36}from"@mantine/core";import{formatDate as formatDate4}from"@medplum/core";import{useMemo as useMemo31}from"react";import{Fragment as Fragment51,jsx as jsx153,jsxs as jsxs94}from"react/jsx-runtime";function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=useMemo31(()=>answer&&answer.length>0?jsx153(Fragment51,{children:answer.map((ans,index)=>jsx153(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?jsx153(Fragment51,{children:nestedAnswers.map((nestedAnswer,index)=>jsx153(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):jsx153(Text36,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return jsxs94(Stack29,{gap:0,pb:"xs",children:[jsx153(Text36,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return jsx153(Text36,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return jsx153(Text36,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return jsx153(Text36,{children:value});case"valueQuantity":return jsx153(QuantityDisplay,{value});case"valueString":return jsx153(Text36,{children:value});case"valueCoding":return jsx153(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return jsx153(RangeDisplay,{value});case"valueDateTime":return jsx153(Text36,{children:formatDate4(value)});case"valueBoolean":return jsx153(Text36,{children:value?"True":"False"});case"valueReference":return jsx153(Text36,{children:value.display??value.reference});default:return jsx153(Text36,{children:value.toString()})}}import{jsx as jsx154}from"react/jsx-runtime";function QuestionnaireResponseDisplay(props){let questionnaireResponse=useResource14(props.questionnaireResponse);return jsx154(Stack30,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>jsx154(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}import{ActionIcon as ActionIcon15,Divider as Divider4,Group as Group60,NativeSelect as NativeSelect14,Stack as Stack31,Text as Text37,TextInput as TextInput26}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect30,useState as useState81}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx155,jsxs as jsxs95}from"react/jsx-runtime";var intervalFilters=["gender","age","gestationalAge","context","appliesTo","category"],defaultProps5={definition:{resourceType:"ObservationDefinition",code:{text:""}},onSubmit:()=>{}};function ReferenceRangeEditor(props){props=Object.assign(defaultProps5,props);let defaultDefinition=props.definition,[intervalGroups,setIntervalGroups]=useState81([]),[groupId,setGroupId]=useState81(1),[intervalId,setIntervalId]=useState81(1);return useEffect30(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs95(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx155(Stack31,{children:intervalGroups.map(intervalGroup=>jsx155(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx155(ActionIcon15,{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(Group60,{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&¤tGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g=>g.id===groupId2);if(currentGroupIndex!==-1){let currentGroup={...groups[currentGroupIndex]};addedInterval={...addedInterval,...currentGroup.filters},currentGroup.intervals=[...currentGroup.intervals,addedInterval],groups[currentGroupIndex]=currentGroup}return groups})}function removeInterval(groupId2,removedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx155(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs95(Stack31,{gap:"lg",children:[jsx155(Group60,{justify:"flex-end",children:jsx155(ActionIcon15,{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(Divider4,{}),intervalGroup.intervals.map(interval=>jsxs95(Stack31,{gap:"xs",children:[jsxs95(Group60,{children:[jsx155(TextInput26,{"data-testid":`condition-${interval.id}`,defaultValue:interval.condition,label:"Condition: ",size:"sm",onChange:e=>{killEvent(e),props.onChange(intervalGroup.id,{...interval,condition:e.currentTarget.value.trim()})}},`condition-${interval.id}`),jsx155(ActionIcon15,{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(ActionIcon15,{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 jsxs95(Stack31,{style:{maxWidth:"50%"},children:[jsx155(Group60,{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})}}})}),jsxs95(Group60,{gap:"xs",children:[jsx155(Text37,{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 Button19,Grid as Grid2,Text as Text38}from"@mantine/core";import{formatDateTime as formatDateTime6,getReferenceString as getReferenceString9}from"@medplum/core";import{useMedplum as useMedplum43,useResource as useResource15}from"@medplum/react-hooks";import{Fragment as Fragment52,useEffect as useEffect31,useState as useState82}from"react";import{jsx as jsx156,jsxs as jsxs96}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum43(),requestGroup=useResource15(props.value),[startedLoading,setStartedLoading]=useState82(!1),[responseBundle,setResponseBundle]=useState82();if(useEffect31(()=>{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 jsxs96(Fragment52,{children:[jsx156(Grid2.Col,{span:1,p:"md",children:task?.status==="completed"?jsx156(IconCheckbox,{}):jsx156(IconSquare,{color:"gray"})}),jsxs96(Grid2.Col,{span:9,p:"xs",children:[jsx156(Text38,{fw:500,children:action.title}),action.description&&jsx156("div",{children:action.description}),jsxs96("div",{children:["Last edited by\xA0",jsx156(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime6(task?.meta?.lastUpdated)]}),jsxs96("div",{children:["Status: ",jsx156(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs96(Grid2.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx156(Button19,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx156(Button19,{onClick:()=>props.onEdit(task,taskInput,taskOutput),children:"Edit"})]})]},`action-${index}`)})});function buildBatchRequest(request){let batchEntries=[];if(request.action)for(let action of request.action)action.resource?.reference&&batchEntries.push({request:{method:"GET",url:action.resource.reference}});return{resourceType:"Bundle",type:"batch",entry:batchEntries}}function findBundleEntry(reference){for(let entry of responseBundle?.entry??[])if(entry.resource&&reference.reference===getReferenceString9(entry.resource))return entry.resource}}import{useMedplum as useMedplum44}from"@medplum/react-hooks";import{useEffect as useEffect32,useState as useState83}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 Fragment53,jsx as jsx157,jsxs as jsxs97}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum44(),[value,setValue]=useState83(props.history);if(useEffect32(()=>{!props.history&&props.resourceType&&props.id&&medplum.readHistory(props.resourceType,props.id).then(setValue).catch(console.log)},[medplum,props.history,props.resourceType,props.id]),!value)return 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)=>jsxs97("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs97(Fragment53,{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 Fragment54,jsx as jsx158,jsxs as jsxs98}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 jsxs98(Fragment54,{children:["...",jsx158("br",{}),props.delta.original.lines.length>0&&jsx158("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
|
|
134
|
+
}`.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 Stack10,Text as Text14}from"@mantine/core";import{getPathDisplayName as getPathDisplayName4}from"@medplum/core";import{useMedplum as useMedplum19}from"@medplum/react-hooks";import{useContext as useContext19,useEffect as useEffect12,useState as useState42}from"react";function getValuePath(elementPath,valuePath,arrayIndex){return valuePath===void 0?elementPath:arrayIndex===void 0?valuePath:`${valuePath}[${arrayIndex}]`}import{Group as Group22,Stack as Stack9,Text as Text13}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 useState41}from"react";var ResourceArrayInput_default={indented:"ResourceArrayInput_indented"};import{ActionIcon as ActionIcon4,Button as Button5}from"@mantine/core";import{jsx as jsx84}from"react/jsx-runtime";function ArrayAddButton({propertyDisplayName,onClick,testId}){let text=propertyDisplayName?`Add ${propertyDisplayName}`:"Add";return propertyDisplayName?jsx84(Button5,{title:text,size:"sm",color:"green.6",variant:"subtle","data-testid":testId,leftSection:jsx84(IconCirclePlus,{size:"1.25rem"}),onClick,children:text}):jsx84(ActionIcon4,{title:text,color:"green.6","data-testid":testId,onClick,children:jsx84(IconCirclePlus,{size:"1.25rem"})})}import{ActionIcon as ActionIcon5}from"@mantine/core";import{jsx as jsx85}from"react/jsx-runtime";function ArrayRemoveButton({propertyDisplayName,onClick,testId}){return jsx85(ActionIcon5,{title:propertyDisplayName?`Remove ${propertyDisplayName}`:"Remove",color:"red.5","data-testid":testId,variant:"subtle",onClick,children:jsx85(IconCircleMinus,{size:"1.25rem"})})}import{jsx as jsx86,jsxs as jsxs43}from"react/jsx-runtime";function SliceInput(props){let{slice,property}=props,[values,setValues]=useState41(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,jsx86(FormSection,{title:propertyDisplayName,description:slice.definition,withAsterisk:required,fhirPath:`${property.path}:${slice.name}`,testId:props.testId,readonly:props.property.readonly,children:showEmptyMessage?jsx86(Text13,{c:"dimmed",children:"(empty)"}):jsxs43(Stack9,{className:indentedStack?ResourceArrayInput_default.indented:void 0,children:[values.map((value,valueIndex)=>jsxs43(Group22,{wrap:"nowrap",children:[jsx86("div",{style:{flexGrow:1},"data-testid":props.testId&&`${props.testId}-elements-${valueIndex}`,children:jsx86(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&&jsx86(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&&jsx86(Group22,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx86(ArrayAddButton,{propertyDisplayName,onClick:e=>{killEvent(e);let newValues=[...values,void 0];setValuesWrapper(newValues)},testId:props.testId&&`${props.testId}-add`})})]})}))}import{jsx as jsx87,jsxs as jsxs44}from"react/jsx-runtime";function ResourceArrayInput(props){let{property}=props,medplum=useMedplum19(),[loading,setLoading]=useState42(!0),[slices,setSlices]=useState42([]),[defaultValue2]=useState42(()=>Array.isArray(props.defaultValue)?props.defaultValue:[]),[slicedValues,setSlicedValues]=useState42(()=>[defaultValue2]),ctx=useContext19(ElementsContext),propertyTypeCode=property.type[0]?.code;useEffect12(()=>{prepareSlices({medplum,property}).then(slices2=>{setSlices(slices2);let slicedValues2=assignValuesIntoSlices(defaultValue2,slices2,property.slicing,ctx.profileUrl);addPlaceholderValues(slicedValues2,slices2),setSlicedValues(slicedValues2),setLoading(!1)}).catch(reason=>{console.error(reason),setLoading(!1)})},[medplum,property,defaultValue2,ctx.profileUrl,setSlicedValues]);function setValuesWrapper(newValues,sliceIndex){let newSlicedValues=[...slicedValues];if(newSlicedValues[sliceIndex]=newValues,setSlicedValues(newSlicedValues),props.onChange){let cleaned=newSlicedValues.flat().filter(val=>val!==void 0);props.onChange(cleaned)}}if(loading)return jsx87("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 jsxs44(Stack10,{className:props.indent?ResourceArrayInput_default.indented:void 0,children:[showEmptyMessage&&jsx87(Text14,{c:"dimmed",children:"(empty)"}),slices.map((slice,sliceIndex)=>jsx87(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)=>jsxs44(Group23,{wrap:"nowrap",style:{flexGrow:1},children:[jsx87("div",{style:{flexGrow:1},children:jsx87(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&&jsx87(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&&jsx87(Group23,{wrap:"nowrap",style:{justifyContent:"flex-start"},children:jsx87(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 Flex3,Textarea}from"@mantine/core";import{useClipboard}from"@mantine/hooks";import{showNotification as showNotification4}from"@mantine/notifications";import{useRef as useRef11,useState as useState43}from"react";import{jsx as jsx88,jsxs as jsxs45}from"react/jsx-runtime";function SensitiveTextarea(props){let[revealed,setRevealed]=useState43(!1),clipboard=useClipboard(),ref=useRef11(null),styles={...props.styles};return revealed||(styles.input||(styles.input={}),styles.input.WebkitTextSecurity="disc"),jsxs45(Flex3,{gap:"xs",children:[jsx88(Textarea,{...props,styles:{...styles,root:{...styles.root??{},flexGrow:1}},ref,autosize:!0,minRows:1,onFocus:()=>setRevealed(!0),onBlur:()=>setRevealed(!1)}),jsx88(ActionIcon6,{title:"Copy secret",onClick:()=>{clipboard.copy(ref.current?.value),showNotification4({color:"green",message:"Copied"})},children:jsx88(IconCopy,{})})]})}import{Button as Button6,Chip,Group as Group24,Modal as Modal3,NativeSelect as NativeSelect8,Stack as Stack11,Switch,TextInput as TextInput16}from"@mantine/core";import{formatTiming as formatTiming2}from"@medplum/core";import{useContext as useContext20,useMemo as useMemo19,useRef as useRef12,useState as useState44}from"react";import{Fragment as Fragment28,jsx as jsx89,jsxs as jsxs46}from"react/jsx-runtime";var daysOfWeek=["sun","mon","tue","wed","thu","fri","sat"];function TimingInput(props){let[value,setValue]=useState44(props.defaultValue),[open,setOpen]=useState44(!props.disabled&&(props.defaultModalOpen??!1)),valueRef=useRef12(value);return valueRef.current=value,jsxs46(Fragment28,{children:[jsxs46(Group24,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx89("span",{children:formatTiming2(valueRef.current)||"No repeat"}),jsx89(Button6,{disabled:props.disabled,onClick:()=>setOpen(!0),children:"Edit"})]}),!props.disabled&&jsx89(TimingEditorDialog,{path:props.path,visible:open,defaultValue:valueRef.current,onOk:newValue=>{props.onChange&&props.onChange(newValue),setValue(newValue),setOpen(!1)},onCancel:()=>setOpen(!1)})]})}var defaultValue={repeat:{period:1,periodUnit:"d"}};function TimingEditorDialog(props){let[value,setValue]=useState44(props.defaultValue||defaultValue),{getExtendedProps}=useContext20(ElementsContext),[eventProps,repeatProps,repeatPeriodProps,repeatPeriodUnitProps,repeatDayOfWeekProps]=useMemo19(()=>["event","repeat","repeat.period","repeat.periodUnit","repeat.dayOfWeek"].map(field=>getExtendedProps(props.path+"."+field)),[getExtendedProps,props.path]),valueRef=useRef12(value);valueRef.current=value;function setStart(newStart){setValue({...valueRef.current,event:[newStart]})}function setRepeat(repeat){setValue({...valueRef.current,repeat})}function setPeriod(newPeriod){setRepeat({...valueRef.current?.repeat,period:newPeriod})}function setPeriodUnit(newPeriodUnit){setRepeat({...valueRef.current?.repeat,periodUnit:newPeriodUnit})}function setDaysOfWeek(newDaysOfWeek){setRepeat({...valueRef.current?.repeat,dayOfWeek:newDaysOfWeek})}return jsx89(Modal3,{title:"Timing",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:()=>props.onCancel(),children:jsxs46(Stack11,{children:[jsx89(FormSection,{title:"Starts on",htmlFor:"timing-dialog-start",children:jsx89(DateTimeInput,{disabled:eventProps?.readonly,name:"timing-dialog-start",onChange:newValue=>setStart(newValue)})}),jsx89(Switch,{disabled:repeatProps?.readonly,label:"Repeat",checked:!!value.repeat,onChange:e=>setRepeat(e.currentTarget.checked?defaultValue.repeat:void 0)}),value.repeat&&jsxs46(Fragment28,{children:[jsx89(FormSection,{title:"Repeat every",htmlFor:"timing-dialog-period",children:jsxs46(Group24,{gap:"xs",grow:!0,wrap:"nowrap",children:[jsx89(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)}),jsx89(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"&&jsx89(FormSection,{title:"Repeat on",children:jsx89(Chip.Group,{multiple:!0,onChange:setDaysOfWeek,children:jsx89(Group24,{justify:"space-between",mt:"md",gap:"xs",children:daysOfWeek.map(day=>jsx89(Chip,{value:day,size:"xs",radius:"xl",disabled:repeatDayOfWeekProps?.readonly,children:day.charAt(0).toUpperCase()},day))})})})]}),jsx89(Group24,{justify:"flex-end",children:jsx89(Button6,{onClick:()=>props.onOk(value),children:"OK"})})]})})}import{jsx as jsx90,jsxs as jsxs47}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 jsx90(AttachmentArrayInput,{name,defaultValue:defaultValue2,onChange,disabled:property.readonly});let indent=propertyTypes[0]?.code!==PropertyType2.Extension;return jsx90(ResourceArrayInput,{property,name,path:props.path,valuePath:props.valuePath,defaultValue:defaultValue2,indent,onChange,outcome:props.outcome})}else return propertyTypes.length>1?jsx90(ElementDefinitionInputSelector,{elementDefinitionTypes:propertyTypes,...props}):jsx90(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]=useState45(initialPropertyType);return jsxs47(Group25,{gap:"xs",grow:!0,wrap:"nowrap",align:"flex-start",children:[jsx90(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}))}),jsx90(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 jsx90("div",{children:"Property type not specified "});function getComplexInputProps(){return{name,defaultValue:defaultValue2,onChange,outcome,path,valuePath,disabled:readOnly}}function getPrimitiveInputProps(){let error=getErrorsForInput(props.outcome,valuePath??path);return{id:name,name,"data-testid":name,defaultValue:defaultValue2,required,error,disabled:readOnly}}switch(propertyType){case PropertyType2.SystemString:case PropertyType2.canonical:case PropertyType2.string:case PropertyType2.time:case PropertyType2.uri:case PropertyType2.url:return props.path==="Project.secret.value[x]"?jsx90(SensitiveTextarea,{...getPrimitiveInputProps(),onChange:e=>{props.onChange&&props.onChange(e.currentTarget.value)}}):jsx90(TextInput17,{...getPrimitiveInputProps(),onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.date:return jsx90(TextInput17,{...getPrimitiveInputProps(),type:"date",onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.dateTime:case PropertyType2.instant:return jsx90(DateTimeInput,{...getPrimitiveInputProps(),onChange,outcome});case PropertyType2.decimal:case PropertyType2.integer:case PropertyType2.positiveInt:case PropertyType2.unsignedInt:return jsx90(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 jsx90(CodeInput,{...getPrimitiveInputProps(),error:void 0,onChange,binding:binding?.valueSet,creatable:!0,maxValues:1});case PropertyType2.boolean:return jsx90(Checkbox4,{...getPrimitiveInputProps(),defaultChecked:!!defaultValue2,onChange:e=>{onChange&&onChange(e.currentTarget.checked)}});case PropertyType2.base64Binary:case PropertyType2.markdown:case PropertyType2.xhtml:return jsx90(Textarea2,{...getPrimitiveInputProps(),spellCheck:propertyType!==PropertyType2.base64Binary,onChange:e=>{onChange&&onChange(e.currentTarget.value)}});case PropertyType2.Address:return jsx90(AddressInput,{...getComplexInputProps()});case PropertyType2.Annotation:return jsx90(AnnotationInput,{...getComplexInputProps()});case PropertyType2.Attachment:return jsx90(AttachmentInput,{...getComplexInputProps()});case PropertyType2.CodeableConcept:return jsx90(CodeableConceptInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.Coding:return jsx90(CodingInput,{binding:binding?.valueSet,...getComplexInputProps()});case PropertyType2.ContactDetail:return jsx90(ContactDetailInput,{...getComplexInputProps()});case PropertyType2.ContactPoint:return jsx90(ContactPointInput,{...getComplexInputProps()});case PropertyType2.Extension:return jsx90(ExtensionInput,{...getComplexInputProps(),propertyType:props.elementDefinitionType});case PropertyType2.HumanName:return jsx90(HumanNameInput,{...getComplexInputProps()});case PropertyType2.Identifier:return jsx90(IdentifierInput,{...getComplexInputProps()});case PropertyType2.Money:return jsx90(MoneyInput,{...getComplexInputProps()});case PropertyType2.Period:return jsx90(PeriodInput,{...getComplexInputProps()});case PropertyType2.Duration:case PropertyType2.Quantity:return jsx90(QuantityInput,{...getComplexInputProps()});case PropertyType2.Range:return jsx90(RangeInput,{...getComplexInputProps()});case PropertyType2.Ratio:return jsx90(RatioInput,{...getComplexInputProps()});case PropertyType2.Reference:return jsx90(ReferenceInput,{...getComplexInputProps(),targetTypes:getTargetTypes(props.elementDefinitionType)});case PropertyType2.Timing:return jsx90(TimingInput,{...getComplexInputProps()});case PropertyType2.Dosage:case PropertyType2.UsageContext:default:return jsx90(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 jsx91}from"react/jsx-runtime";function ElementsInput(props){let[value,setValue]=useState46(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 jsx91(Stack12,{style:{flexGrow:1},"data-testid":props.testId,children:elementsToRender.map(([key,element])=>{let[propertyValue,propertyType]=getValueAndTypeFromElement(typedValue,key,element),required=element.min!==void 0&&element.min>0,valuePath=props.valuePath?props.valuePath+"."+key:void 0,resourcePropertyInput=jsx91(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"?jsx91(CheckboxFormSection,{title:getPathDisplayName5(key),description:element.description,htmlFor:key,fhirPath:element.path,withAsterisk:required,readonly:element.readonly,children:resourcePropertyInput},key):jsx91(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 jsx92,jsxs as jsxs48}from"react/jsx-runtime";function BackboneElementInput(props){let[defaultValue2]=useState47(()=>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 jsxs48("div",{children:[type,"\xA0not implemented"]});let isNested=parentElementsContext.path!=="";return maybeWrapWithContext(ElementsContext.Provider,contextValue,jsx92(Box9,{className:clsx_default({[BackboneElementInput_default.nested]:isNested}),children:jsx92(ElementsInput,{path:props.path,valuePath:props.valuePath,type,defaultValue:defaultValue2,onChange:props.onChange,outcome:props.outcome})}))}import{Button as Button7,Group as Group26}from"@mantine/core";import{useMemo as useMemo23,useState as useState48}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 jsx93,jsxs as jsxs49}from"react/jsx-runtime";function CalendarInput(props){let{onChangeMonth,onClick}=props,[month,setMonth]=useState48(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 jsxs49("div",{children:[jsxs49(Group26,{justify:"space-between",gap:"xs",grow:!0,wrap:"nowrap",children:[jsx93("p",{style:{flex:1},children:getMonthString(month)}),jsxs49(Group26,{justify:"flex-end",gap:"xs",children:[jsx93(Button7,{variant:"outline","aria-label":"Previous month",onClick:()=>moveMonth(-1),children:"<"}),jsx93(Button7,{variant:"outline","aria-label":"Next month",onClick:()=>moveMonth(1),children:">"})]})]}),jsxs49("table",{className:CalendarInput_default.table,children:[jsx93("thead",{children:jsxs49("tr",{children:[jsx93("th",{children:"SUN"}),jsx93("th",{children:"MON"}),jsx93("th",{children:"TUE"}),jsx93("th",{children:"WED"}),jsx93("th",{children:"THU"}),jsx93("th",{children:"FRI"}),jsx93("th",{children:"SAT"})]})}),jsx93("tbody",{children:grid.map((week,weekIndex)=>jsx93("tr",{children:week.map((day,dayIndex)=>jsx93("td",{children:day&&jsx93(Button7,{variant:"light",disabled:!day.available,onClick:()=>onClick(day.date),children:day.date.getDate()})},"day-"+dayIndex))},"week-"+weekIndex))})]})]})}function buildGrid(startDate,slots){let d=new Date(startDate.getFullYear(),startDate.getMonth()),grid=[],row=[];for(let i=0;i<d.getDay();i++)row.push(void 0);for(;d.getMonth()===startDate.getMonth();)row.push({date:new Date(d.getTime()),available:isDayAvailable(d,slots)}),d.getDay()===6&&(grid.push(row),row=[]),d.setDate(d.getDate()+1);if(d.getDay()!==0){for(let i=d.getDay();i<7;i++)row.push(void 0);grid.push(row)}return grid}function isDayAvailable(day,slots){for(let slot of slots){let slotStart=new Date(slot.start);if(slotStart.getFullYear()===day.getFullYear()&&slotStart.getMonth()===day.getMonth()&&slotStart.getDate()===day.getDate())return!0}return!1}import{ActionIcon as ActionIcon7,Group as Group27,LoadingOverlay,Paper as Paper2,ScrollArea as ScrollArea3,Skeleton,Stack as Stack13,Text as Text15,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 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",chatBubbleOuterWrap:"BaseChat_chatBubbleOuterWrap",chatBubbleRightAlignedInnerWrap:"BaseChat_chatBubbleRightAlignedInnerWrap",chatBubbleLeftAlignedInnerWrap:"BaseChat_chatBubbleLeftAlignedInnerWrap",chatBubble:"BaseChat_chatBubble",chatBubbleNameRight:"BaseChat_chatBubbleNameRight"};import{jsx as jsx94,jsxs as jsxs50}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]=useState49(medplum.getProfile()),[reconnecting,setReconnecting]=useState49(!1),[loading,setLoading]=useState49(!0);loading||(initialLoadRef.current=!1);let profileRefStr=useMemo24(()=>profile?getReferenceString4(medplum.getProfile()):"",[profile,medplum]),searchMessages=useCallback10(async()=>{setLoading(!0);let searchParams=new URLSearchParams(query);searchParams.append("_sort","-sent"),searchParams.append("sent:missing","false");let searchResult=await medplum.searchResources("Communication",searchParams,{cache:"no-cache"});upsertCommunications(communicationsRef.current,searchResult,setCommunications),setLoading(!1)},[medplum,setCommunications,query]);useEffect13(()=>{searchMessages().catch(err=>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]);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&&jsx94(Title5,{order:2,className:BaseChat_default.chatTitle,children:title}),jsx94("div",{className:BaseChat_default.chatBody,ref:parentRef,children:initialLoadRef.current?jsxs50(Stack13,{align:"stretch",mt:"lg",children:[jsxs50(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(Skeleton,{height:38,circle:!0,ml:"md"}),jsx94(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]}),jsxs50(Group27,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(ChatBubbleSkeleton,{alignment:"right",parentWidth:parentRect.width}),jsx94(Skeleton,{height:38,circle:!0,mr:"md"})]}),jsxs50(Group27,{justify:"flex-start",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(Skeleton,{height:38,circle:!0,ml:"md"}),jsx94(ChatBubbleSkeleton,{alignment:"left",parentWidth:parentRect.width})]})]},"skeleton-chat-messages"):jsxs50(ScrollArea3,{viewportRef:scrollAreaRef,className:BaseChat_default.chatScrollArea,h:parentRect.height,children:[jsx94(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 jsxs50(Stack13,{align:"stretch",children:[(!prevCommTime||currCommTime!==prevCommTime)&&jsx94(Text15,{fz:"xs",ta:"center",children:currCommTime}),c.sender?.reference===profileRefStr?jsxs50(Group27,{justify:"flex-end",align:"flex-end",gap:"xs",mb:"sm",children:[jsx94(ChatBubble,{alignment:"right",communication:c,showDelivered}),jsx94(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:[jsx94(ResourceAvatar,{radius:"xl",value:c.sender,mb:"sm"}),jsx94(ChatBubble,{alignment:"left",communication:c})]})]},`${c.id}--${c.meta?.versionId??"no-version"}`)})]})}),jsx94("div",{className:BaseChat_default.chatInputContainer,children:jsx94(Form,{onSubmit:sendMessageInternal,children:jsx94(TextInput18,{ref:inputRef,name:"message",placeholder:inputDisabled?"Replies are disabled":"Type a message...",radius:"xl",rightSectionWidth:42,disabled:inputDisabled,rightSection:inputDisabled?void 0:jsx94(ActionIcon7,{type:"submit",size:"1.5rem",radius:"xl",color:"blue",variant:"filled","aria-label":"Send message",children:jsx94(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 jsxs50("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsxs50(Text15,{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",jsx94(Text15,{span:!0,c:"dimmed",fz:"xs",children:Number.isNaN(sentTime.getTime())?"":sentTime.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})})]}),jsx94("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx94("div",{className:BaseChat_default.chatBubble,children:content})}),showDelivered&&jsxs50("div",{style:{textAlign:"right"},children:["Delivered ",seenTime.getHours(),":",seenTime.getMinutes().toString().length===1?"0":"",seenTime.getMinutes()]})]})}function ChatBubbleSkeleton(props){let{alignment,parentWidth}=props;return jsxs50("div",{className:BaseChat_default.chatBubbleOuterWrap,children:[jsx94("div",{className:BaseChat_default.chatBubbleName,"aria-label":"Placeholder sender name",children:jsx94("div",{style:{position:"relative"},children:jsx94(Skeleton,{height:14,width:"100px",radius:"l",ml:alignment==="left"?"sm":void 0,style:alignment==="right"?{position:"absolute",right:5,top:-15}:void 0})})}),jsx94("div",{className:alignment==="left"?BaseChat_default.chatBubbleLeftAlignedInnerWrap:BaseChat_default.chatBubbleRightAlignedInnerWrap,children:jsx94("div",{className:BaseChat_default.chatBubble,children:jsx94(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 Fragment29,jsx as jsx95,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(Fragment29,{children:[opened&&jsx95("div",{className:ChatModal_default.chatModalContainer,children}),opened?jsx95("div",{className:ChatModal_default.iconContainer,children:jsx95(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!1),"aria-label":"Close chat",children:jsx95(IconChevronDown,{size:"1.625rem"})})}):jsx95("div",{className:ChatModal_default.iconContainer,children:jsx95(ActionIcon8,{className:ChatModal_default.icon,color:"blue",size:"lg",radius:"xl",variant:"outline",onClick:()=>setOpened(!0),"aria-label":"Open chat",children:jsx95(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 useEffect15,useMemo as useMemo25,useState as useState51}from"react";import{jsx as jsx96}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]=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=>{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?jsx96(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{ActionIcon as ActionIcon10,Button as Button9,Center as Center7,Group as Group31,Loader as Loader3,ScrollArea as ScrollArea4,TextInput as TextInput19}from"@mantine/core";import{showNotification as showNotification6,updateNotification}from"@mantine/notifications";import{createReference as createReference4,normalizeErrorString as normalizeErrorString8}from"@medplum/core";import{useMedplum as useMedplum25,useResource as useResource7}from"@medplum/react-hooks";import{useCallback as useCallback12,useEffect as useEffect19,useRef as useRef14,useState as useState57}from"react";import{Group as Group29,List,Stack as Stack15,Text as Text17,Title as Title6}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept3,formatDateTime as formatDateTime2,formatObservationValue,isReference as isReference2}from"@medplum/core";import{useMedplum as useMedplum22,useResource as useResource5}from"@medplum/react-hooks";import{useEffect as useEffect16,useState as useState53}from"react";import{Blockquote,Stack as Stack14}from"@mantine/core";var NoteDisplay_default={noteBody:"NoteDisplay_noteBody",noteCite:"NoteDisplay_noteCite",noteRoot:"NoteDisplay_noteRoot"};import{jsx as jsx97}from"react/jsx-runtime";function NoteDisplay({value}){return value?jsx97(Stack14,{justify:"flex-start",gap:"xs",children:value.map(note=>note.text&&jsx97(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 Group28}from"@mantine/core";import{Text as Text16}from"@mantine/core";import{getDisplayString as getDisplayString5,isOk,normalizeErrorString as normalizeErrorString7}from"@medplum/core";import{useResource as useResource4}from"@medplum/react-hooks";import{useState as useState52}from"react";import{jsx as jsx98}from"react/jsx-runtime";function ResourceName(props){let{value,link,...rest}=props,[outcome,setOutcome]=useState52(),resource=useResource4(value,setOutcome),text;if(outcome&&!isOk(outcome))text=`[${normalizeErrorString7(outcome)}]`;else if(resource)text=getDisplayString5(resource);else return null;return link?jsx98(MedplumLink,{to:value,...rest,children:text}):jsx98(Text16,{component:"span",...rest,children:text})}import{jsx as jsx99,jsxs as jsxs52}from"react/jsx-runtime";function ResourceBadge(props){return jsxs52(Group28,{gap:"xs",children:[jsx99(ResourceAvatar,{size:24,radius:12,value:props.value,link:props.link}),jsx99(ResourceName,{value:props.value,link:props.link})]})}import{Badge}from"@mantine/core";import{jsx as jsx100}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 jsx100(Badge,{color:props.color||statusToColor[status],...badgeProps,children:status.replaceAll("-"," ")})}var DiagnosticReportDisplay_default={table:"DiagnosticReportDisplay_table",criticalRow:"DiagnosticReportDisplay_criticalRow",noteBody:"DiagnosticReportDisplay_noteBody",noteCite:"DiagnosticReportDisplay_noteCite",noteRoot:"DiagnosticReportDisplay_noteRoot"};import{Fragment as Fragment30,jsx as jsx101,jsxs as jsxs53}from"react/jsx-runtime";DiagnosticReportDisplay.defaultProps={hideObservationNotes:!1,hideSpecimenInfo:!1,hideSubject:!1};function DiagnosticReportDisplay(props){let medplum=useMedplum22(),diagnosticReport=useResource5(props.value),[specimens,setSpecimens]=useState53();if(useEffect16(()=>{diagnosticReport?.specimen&&Promise.allSettled(diagnosticReport.specimen.map(ref=>medplum.readReference(ref))).then(outcomes=>outcomes.filter(outcome=>outcome.status==="fulfilled").map(outcome=>outcome.value)).then(setSpecimens).catch(console.error)},[medplum,diagnosticReport]),!diagnosticReport)return null;let specimenNotes=specimens?.flatMap(spec=>spec.note||[])||[];if(diagnosticReport.presentedForm&&diagnosticReport.presentedForm.length>0){let pf=diagnosticReport.presentedForm[0];pf.contentType?.startsWith("text/plain")&&pf.data&&specimenNotes.push({text:window.atob(pf.data)})}return jsxs53(Stack15,{children:[jsx101(Title6,{children:"Diagnostic Report"}),jsx101(DiagnosticReportHeader,{value:diagnosticReport,hideSubject:props.hideSubject}),specimens&&!props.hideSpecimenInfo&&SpecimenInfo(specimens),diagnosticReport.result&&jsx101(ObservationTable,{hideObservationNotes:props.hideObservationNotes,value:diagnosticReport.result}),specimenNotes.length>0&&jsx101(NoteDisplay,{value:specimenNotes})]})}function DiagnosticReportHeader({value,hideSubject=!1}){return jsxs53(Group29,{mt:"md",gap:30,children:[value.subject&&!hideSubject&&jsxs53("div",{children:[jsx101(Text17,{size:"xs",tt:"uppercase",c:"dimmed",children:"Subject"}),jsx101(ResourceBadge,{value:value.subject,link:!0})]}),value.resultsInterpreter?.map(interpreter=>jsxs53("div",{children:[jsx101(Text17,{size:"xs",tt:"uppercase",c:"dimmed",children:"Interpreter"}),jsx101(ResourceBadge,{value:interpreter,link:!0})]},interpreter.reference)),value.performer?.map(performer=>jsxs53("div",{children:[jsx101(Text17,{size:"xs",tt:"uppercase",c:"dimmed",children:"Performer"}),jsx101(ResourceBadge,{value:performer,link:!0})]},performer.reference)),value.issued&&jsxs53("div",{children:[jsx101(Text17,{size:"xs",tt:"uppercase",c:"dimmed",children:"Issued"}),jsx101(Text17,{children:formatDateTime2(value.issued)})]}),value.status&&jsxs53("div",{children:[jsx101(Text17,{size:"xs",tt:"uppercase",c:"dimmed",children:"Status"}),jsx101(StatusBadge,{status:value.status})]})]})}function SpecimenInfo(specimens){return jsxs53(Stack15,{gap:"xs",children:[jsx101(Title6,{order:2,size:"h6",children:"Specimens"}),jsx101(List,{type:"ordered",children:specimens?.map(specimen=>jsx101(List.Item,{ml:"sm",children:jsxs53(Group29,{gap:20,children:[jsxs53(Group29,{gap:5,children:[jsx101(Text17,{fw:500,children:"Collected:"})," ",formatDateTime2(specimen.collection?.collectedDateTime)]}),jsxs53(Group29,{gap:5,children:[jsx101(Text17,{fw:500,children:"Received:"})," ",formatDateTime2(specimen.receivedTime)]})]})},`specimen-${specimen.id}`))})]})}function ObservationTable(props){return jsxs53("table",{className:DiagnosticReportDisplay_default.table,children:[jsx101("thead",{children:jsxs53("tr",{children:[jsx101("th",{children:"Test"}),jsx101("th",{children:"Value"}),jsx101("th",{children:"Reference Range"}),jsx101("th",{children:"Interpretation"}),jsx101("th",{children:"Category"}),jsx101("th",{children:"Performer"}),jsx101("th",{children:"Status"})]})}),jsx101("tbody",{children:jsx101(ObservationRowGroup,{value:props.value,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes})})]})}function ObservationRowGroup(props){return jsx101(Fragment30,{children:props.value?.map(observation=>jsx101(ObservationRow,{value:observation,ancestorIds:props.ancestorIds,hideObservationNotes:props.hideObservationNotes},`obs-${isReference2(observation)?observation.reference:observation.id}`))})}function ObservationRow(props){let observation=useResource5(props.value);if(!observation||props.ancestorIds?.includes(observation.id))return null;let displayNotes=!props.hideObservationNotes&&observation.note,critical=isCritical(observation);return jsxs53(Fragment30,{children:[jsxs53("tr",{className:clsx_default({[DiagnosticReportDisplay_default.criticalRow]:critical}),children:[jsx101("td",{rowSpan:displayNotes?2:1,children:jsx101(MedplumLink,{to:observation,children:jsx101(CodeableConceptDisplay,{value:observation.code})})}),jsx101("td",{children:jsx101(ObservationValueDisplay,{value:observation})}),jsx101("td",{children:jsx101(ReferenceRangeDisplay,{value:observation.referenceRange})}),jsx101("td",{children:observation.interpretation&&observation.interpretation.length>0&&jsx101(CodeableConceptDisplay,{value:observation.interpretation[0]})}),jsx101("td",{children:observation.category&&observation.category.length>0&&jsx101(Fragment30,{children:observation.category.map(concept=>jsx101("div",{children:jsx101(CodeableConceptDisplay,{value:concept})},`category-${formatCodeableConcept3(concept)}`))})}),jsx101("td",{children:observation.performer?.map(performer=>jsx101(ReferenceDisplay,{value:performer},performer.reference))}),jsx101("td",{children:observation.status&&jsx101(StatusBadge,{status:observation.status})})]}),observation.hasMember&&jsx101(ObservationRowGroup,{value:observation.hasMember,ancestorIds:props.ancestorIds?[...props.ancestorIds,observation.id]:[observation.id],hideObservationNotes:props.hideObservationNotes}),displayNotes&&jsx101("tr",{children:jsx101("td",{colSpan:6,children:jsx101(NoteDisplay,{value:observation.note})})})]})}function ObservationValueDisplay(props){let obs=props.value;return jsx101(Fragment30,{children:formatObservationValue(obs)})}function ReferenceRangeDisplay(props){let range=props.value&&props.value.length>0&&props.value[0];return range?range.text?jsx101(Fragment30,{children:range.text}):jsx101(RangeDisplay,{value:range}):null}function isCritical(observation){let code=observation.interpretation?.[0]?.coding?.[0]?.code;return code==="AA"||code==="LL"||code==="HH"||code==="A"}var import_rfc6902=__toESM(require_rfc6902(),1);import{Table as Table2}from"@mantine/core";import{arrayify,capitalize as capitalize3,evalFhirPathTyped,getSearchParameterDetails,toTypedValue}from"@medplum/core";import{useMedplum as useMedplum23}from"@medplum/react-hooks";import{useEffect as useEffect17,useMemo as useMemo26,useState as useState55}from"react";import{Button as Button8,Table}from"@mantine/core";import{useState as useState54}from"react";var ResourceDiffRow_default={removed:"ResourceDiffRow_removed",added:"ResourceDiffRow_added"};import{Fragment as Fragment31,jsx as jsx102,jsxs as jsxs54}from"react/jsx-runtime";function ResourceDiffRow(props){let{name,path,property,originalValue,revisedValue}=props,isAttachmentType=!!property?.type?.find(t=>t.code==="Attachment"),[isCollapsed,setIsCollapsed]=useState54(isAttachmentType),toggleCollapse=()=>setIsCollapsed(prev=>!prev);return jsx102(Fragment31,{children:isAttachmentType&&!isCollapsed||!isAttachmentType?jsx102(Fragment31,{children:jsxs54(Table.Tr,{children:[jsx102(Table.Td,{children:name}),jsx102(Table.Td,{className:ResourceDiffRow_default.removed,children:originalValue&&jsx102(ResourcePropertyDisplay,{path,property,propertyType:originalValue.type,value:originalValue.value,ignoreMissingValues:!0})}),jsx102(Table.Td,{className:ResourceDiffRow_default.added,children:revisedValue&&jsx102(ResourcePropertyDisplay,{path,property,propertyType:revisedValue.type,value:revisedValue.value,ignoreMissingValues:!0})})]})}):jsxs54(Table.Tr,{children:[jsx102(Table.Td,{children:name}),jsx102(Table.Td,{colSpan:2,style:{textAlign:"right"},children:jsx102(Button8,{onClick:toggleCollapse,variant:"light",children:"Expand"})})]})})}var ResourceDiffTable_default={root:"ResourceDiffTable_root",removed:"ResourceDiffTable_removed",added:"ResourceDiffTable_added"};import{jsx as jsx103,jsxs as jsxs55}from"react/jsx-runtime";function ResourceDiffTable(props){let medplum=useMedplum23(),{original,revised}=props,[schemaLoaded,setSchemaLoaded]=useState55(!1);useEffect17(()=>{medplum.requestSchema(props.original.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.original.resourceType]);let diffTable=useMemo26(()=>{if(!schemaLoaded)return null;let typedOriginal=[toTypedValue(original)],typedRevised=[toTypedValue(revised)],result=[],patch=mergePatchOperations((0,import_rfc6902.createPatch)(original,revised));for(let op of patch){let path=op.path,fhirPath=jsonPathToFhirPath(path),property=tryGetElementDefinition(original.resourceType,fhirPath),originalValue=op.op==="add"?void 0:evalFhirPathTyped(fhirPath,typedOriginal),revisedValue=op.op==="remove"?void 0:evalFhirPathTyped(fhirPath,typedRevised);result.push({key:`op-${op.op}-${op.path}`,name:`${capitalize3(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?jsxs55(Table2,{className:ResourceDiffTable_default.root,children:[jsx103(Table2.Thead,{children:jsxs55(Table2.Tr,{children:[jsx103(Table2.Th,{}),jsx103(Table2.Th,{children:"Before"}),jsx103(Table2.Th,{children:"After"})]})}),jsx103(Table2.Tbody,{children:diffTable.map(row=>{let{key,...rest}=row;return jsx103(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 useMedplum24,useResource as useResource6}from"@medplum/react-hooks";import{useEffect as useEffect18,useMemo as useMemo27,useState as useState56}from"react";import{jsx as jsx104}from"react/jsx-runtime";function ResourceTable(props){let{profileUrl}=props,medplum=useMedplum24(),accessPolicy=medplum.getAccessPolicy(),value=useResource6(props.value),[schemaLoaded,setSchemaLoaded]=useState56(!1);useEffect18(()=>{if(value)if(profileUrl)medplum.requestProfileSchema(profileUrl,{expandProfile:!0}).then(()=>{tryGetProfile4(profileUrl)?setSchemaLoaded(!0):console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)});else{let schemaName=value.resourceType;medplum.requestSchema(schemaName).then(()=>{setSchemaLoaded(!0)}).catch(console.error)}},[medplum,profileUrl,value]);let accessPolicyResource=useMemo27(()=>value&&satisfiedAccessPolicy(value,AccessPolicyInteraction.READ,accessPolicy),[accessPolicy,value]);return!schemaLoaded||!value?null:jsx104(BackboneElementDisplay,{path:value.resourceType,value:{type:value.resourceType,value:props.forceUseInput?props.value:value},profileUrl,ignoreMissingValues:props.ignoreMissingValues,accessPolicyResource})}import{ActionIcon as ActionIcon9,Group as Group30,Menu as Menu4,Text as Text18}from"@mantine/core";import{formatDateTime as formatDateTime3,getReferenceString as getReferenceString6}from"@medplum/core";var Timeline_default={item:"Timeline_item",itemPadding:"Timeline_itemPadding"};import{jsx as jsx105,jsxs as jsxs56}from"react/jsx-runtime";function Timeline(props){return jsx105(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 jsxs56(Panel,{"data-testid":"timeline-item",fill:!0,...others,children:[jsxs56(Group30,{justify:"space-between",gap:8,mx:"xs",my:"sm",children:[jsx105(ResourceAvatar,{value:author,link:!0,size:"md"}),jsxs56("div",{style:{flex:1},children:[jsx105(Text18,{size:"sm",children:jsx105(ResourceName,{c:"dark",fw:500,value:author,link:!0})}),jsxs56(Text18,{size:"xs",children:[jsx105(MedplumLink,{c:"dimmed",to:props.resource,children:formatDateTime3(dateTime)}),jsx105(Text18,{component:"span",c:"dimmed",mx:8,children:"\xB7"}),jsx105(MedplumLink,{c:"dimmed",to:props.resource,children:props.resource.resourceType})]})]}),popupMenuItems&&jsxs56(Menu4,{position:"bottom-end",shadow:"md",width:200,children:[jsx105(Menu4.Target,{children:jsx105(ActionIcon9,{color:"gray",variant:"subtle",radius:"xl","aria-label":`Actions for ${getReferenceString6(props.resource)}`,children:jsx105(IconDots,{})})}),popupMenuItems]})]}),jsx105(ErrorBoundary,{children:jsx105("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 jsx106,jsxs as jsxs57}from"react/jsx-runtime";function ResourceTimeline(props){let medplum=useMedplum25(),sender=medplum.getProfile(),inputRef=useRef14(null),resource=useResource7(props.value),[history,setHistory]=useState57(),[items,setItems]=useState57([]),[countToShow,setCountToShow]=useState57(10),loadTimelineResources=props.loadTimelineResources,itemsRef=useRef14(items);itemsRef.current=items;let sortAndSetItems=useCallback12(newItems=>{sortByDateAndPriority(newItems,resource),newItems.reverse(),setItems(newItems)},[resource]),handleBatchResponse=useCallback12(batchResponse=>{let newItems=[];for(let settledResult of batchResponse){if(settledResult.status!=="fulfilled")continue;let bundle=settledResult.value;if(bundle.type==="history"&&setHistory(bundle),bundle.entry)for(let entry of bundle.entry)newItems.push(entry.resource)}sortAndSetItems(newItems)},[sortAndSetItems]),addResource=useCallback12(resource2=>sortAndSetItems([...itemsRef.current,resource2]),[sortAndSetItems]),loadTimeline=useCallback12(()=>{let resourceType,id;"resourceType"in props.value?(resourceType=props.value.resourceType,id=props.value.id):[resourceType,id]=props.value.reference?.split("/"),loadTimelineResources(medplum,resourceType,id).then(handleBatchResponse).catch(console.error)},[medplum,props.value,loadTimelineResources,handleBatchResponse]);useEffect19(()=>loadTimeline(),[loadTimeline]);function createComment(contentString){!resource||!props.createCommunication||medplum.createResource(props.createCommunication(resource,sender,contentString)).then(result=>addResource(result)).catch(console.error)}function createMedia(attachment){!resource||!props.createMedia||medplum.createResource(props.createMedia(resource,sender,attachment)).then(result=>addResource(result)).then(()=>updateNotification({id:"upload-notification",color:"teal",title:"Upload complete",message:"",icon:jsx106(IconCheck,{size:16}),autoClose:2e3})).catch(reason=>updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString8(reason),icon:jsx106(IconFileAlert,{size:16}),autoClose:2e3}))}function onUploadStart(){showNotification6({id:"upload-notification",loading:!0,title:"Initializing upload...",message:"Please wait...",autoClose:!1,withCloseButton:!1})}function onUploadProgress(e){updateNotification({id:"upload-notification",loading:!0,title:"Uploading...",message:getProgressMessage(e),autoClose:!1,withCloseButton:!1})}function onUploadError(outcome){updateNotification({id:"upload-notification",color:"red",title:"Upload error",message:normalizeErrorString8(outcome),icon:jsx106(IconFileAlert,{size:16}),autoClose:2e3})}if(!resource)return jsx106(Center7,{style:{width:"100%",height:"100%"},children:jsx106(Loader3,{})});let itemsToShow=items.filter(item=>item).slice(0,countToShow);return jsxs57(Timeline,{children:[props.createCommunication&&jsx106(Panel,{children:jsx106(Form,{testid:"timeline-form",onSubmit:formData=>{createComment(formData.text);let input=inputRef.current;input&&(input.value="",input.focus())},children:jsxs57(Group31,{gap:"xs",wrap:"nowrap",style:{width:"100%"},children:[jsx106(ResourceAvatar,{value:sender}),jsx106(TextInput19,{name:"text",ref:inputRef,placeholder:"Add comment",style:{width:"100%",maxWidth:300}}),jsx106(ActionIcon10,{type:"submit",radius:"xl",color:"blue",variant:"filled",children:jsx106(IconMessage,{size:16})}),jsx106(AttachmentButton,{securityContext:createReference4(resource),onUpload:createMedia,onUploadStart,onUploadProgress,onUploadError,children:props2=>jsx106(ActionIcon10,{...props2,radius:"xl",color:"blue",variant:"filled",children:jsx106(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 jsx106(HistoryTimelineItem,{history,resource:item,popupMenuItems:menu},key);switch(item.resourceType){case"AuditEvent":return jsx106(AuditEventTimelineItem,{resource:item,popupMenuItems:menu},key);case"Communication":return jsx106(CommunicationTimelineItem,{resource:item,popupMenuItems:menu},key);case"DiagnosticReport":return jsx106(DiagnosticReportTimelineItem,{resource:item,popupMenuItems:menu},key);case"Media":return jsx106(MediaTimelineItem,{resource:item,popupMenuItems:menu},key);default:return jsx106(TimelineItem,{resource:item,padding:!0,children:jsx106(ResourceTable,{value:item,ignoreMissingValues:!0})},key)}}),countToShow<items.length&&jsx106(Group31,{justify:"center",pb:"lg",children:jsx106(Button9,{onClick:()=>setCountToShow(countToShow+10),children:"Show More"})})]})}function HistoryTimelineItem(props){let{history,resource,...rest}=props,previous=getPrevious(history,resource);return previous?jsx106(TimelineItem,{resource,padding:!0,...rest,children:jsx106(ResourceDiffTable,{original:previous,revised:props.resource})}):jsxs57(TimelineItem,{resource,padding:!0,...rest,children:[jsx106("h3",{children:"Created"}),jsx106(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 jsx106(TimelineItem,{resource:props.resource,profile:props.resource.sender,dateTime:props.resource.sent,padding:!0,className,popupMenuItems:props.popupMenuItems,children:jsx106("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 jsx106(TimelineItem,{resource:props.resource,padding:!!padding,popupMenuItems:props.popupMenuItems,children:jsx106(AttachmentDisplay,{value:props.resource.content})})}function AuditEventTimelineItem(props){return jsx106(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx106(ScrollArea4,{children:jsx106("pre",{children:props.resource.outcomeDesc})})})}function DiagnosticReportTimelineItem(props){return jsx106(TimelineItem,{resource:props.resource,padding:!0,popupMenuItems:props.popupMenuItems,children:jsx106(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 jsx107}from"react/jsx-runtime";function DefaultResourceTimeline(props){let{resource,...rest}=props;return jsx107(ResourceTimeline,{value:resource,loadTimelineResources:async(medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`;return Promise.allSettled([medplum.readHistory(resourceType,id),medplum.search("Task",{_filter:`based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`,_count:100})])},...rest})}import{createReference as createReference5}from"@medplum/core";import{jsx as jsx108}from"react/jsx-runtime";function EncounterTimeline(props){let{encounter,...rest}=props;return jsx108(ResourceTimeline,{value:encounter,loadTimelineResources:async(medplum,_resourceType,id)=>Promise.allSettled([medplum.readHistory("Encounter",id),medplum.search("Communication","encounter=Encounter/"+id),medplum.search("Media","encounter=Encounter/"+id)]),createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",encounter:createReference5(resource),subject:resource.subject,sender:createReference5(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",encounter:createReference5(resource),subject:resource.subject,operator:createReference5(operator),issued:new Date().toISOString(),content}),...rest})}import{Button as Button14,Loader as Loader5,Table as Table4}from"@mantine/core";import{normalizeOperationOutcome as normalizeOperationOutcome8}from"@medplum/core";import{useMedplum as useMedplum27}from"@medplum/react-hooks";import{memo,useEffect as useEffect23,useRef as useRef18,useState as useState62}from"react";import{evalFhirPath}from"@medplum/core";import{jsx as jsx109}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 jsx109(ResourcePropertyDisplay,{value:value[0]||"",propertyType:props.propertyType})}import{ActionIcon as ActionIcon12,Button as Button13,Center as Center8,Group as Group34,Loader as Loader4,Menu as Menu6,Pagination,Table as Table3,Text as Text20,UnstyledButton as UnstyledButton4}from"@mantine/core";import{DEFAULT_SEARCH_COUNT as DEFAULT_SEARCH_COUNT2,deepEquals,formatSearchQuery,isDataTypeLoaded,normalizeOperationOutcome as normalizeOperationOutcome7}from"@medplum/core";import{useMedplum as useMedplum26}from"@medplum/react-hooks";import{useCallback as useCallback13,useEffect as useEffect22,useRef as useRef17,useState as useState61}from"react";import{Box as Box10,Button as Button10,Modal as Modal4,Text as Text19}from"@mantine/core";import{jsx as jsx110,jsxs as jsxs58}from"react/jsx-runtime";function SearchExportDialog(props){return jsxs58(Modal4,{title:"Export",closeButtonProps:{"aria-label":"Close"},opened:props.visible,onClose:props.onCancel,children:[jsxs58(Box10,{display:"flex",style:{justifyContent:"space-between"},children:[props.exportCsv&&jsx110(ExportButton,{text:"CSV",exportLogic:props.exportCsv,onCancel:props.onCancel}),props.exportTransactionBundle&&jsx110(ExportButton,{text:"Transaction Bundle",exportLogic:props.exportTransactionBundle,onCancel:props.onCancel})]}),jsx110(Text19,{style:{marginTop:"10px",marginLeft:"2px"},children:"Limited to 1000 records"})]})}function ExportButton(props){return jsx110(Button10,{onClick:()=>{props.exportLogic(),props.onCancel()},children:`Export as ${props.text}`})}import{Button as Button11,Group as Group32,Modal as Modal5,MultiSelect,Stack as Stack16}from"@mantine/core";import{getDataType as getDataType2,getSearchParameters,sortStringArray,stringify as stringify2}from"@medplum/core";import{useEffect as useEffect20,useMemo as useMemo28,useRef as useRef15,useState as useState58}from"react";import{capitalize as capitalize4,DEFAULT_SEARCH_COUNT,evalFhirPathTyped as evalFhirPathTyped2,formatDateTime as formatDateTime4,Operator}from"@medplum/core";import{Fragment as Fragment32,jsx as jsx111}from"react/jsx-runtime";var searchParamToOperators={string:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],fulltext:[Operator.EQUALS,Operator.NOT,Operator.CONTAINS,Operator.EXACT],token:[Operator.EQUALS,Operator.NOT],reference:[Operator.EQUALS,Operator.NOT],numeric:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],quantity:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS],date:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],datetime:[Operator.EQUALS,Operator.NOT_EQUALS,Operator.GREATER_THAN,Operator.LESS_THAN,Operator.GREATER_THAN_OR_EQUALS,Operator.LESS_THAN_OR_EQUALS,Operator.STARTS_AFTER,Operator.ENDS_BEFORE,Operator.APPROXIMATELY],uri:[Operator.EQUALS,Operator.NOT,Operator.ABOVE,Operator.BELOW]},operatorNames={eq:"equals",ne:"not equals",gt:"greater than",lt:"less than",ge:"greater than or equals",le:"less than or equals",sa:"starts after",eb:"ends before",ap:"approximately",sw:"starts with",contains:"contains",exact:"exact",text:"text",not:"not",above:"above",below:"below",in:"in","not-in":"not in","of-type":"of type",missing:"missing",present:"present",identifier:"identifier",iterate:"iterate"};function setFilters(definition,filters){return{...definition,filters,offset:0,name:void 0}}function clearFilters(definition){return setFilters(definition,[])}function clearFiltersOnField(definition,code){return setFilters(definition,(definition.filters??[]).filter(f=>f.code!==code))}function addFilter(definition,field,op,value,opt_clear){opt_clear&&(definition=clearFiltersOnField(definition,field));let nextFilters=[];return definition.filters&&nextFilters.push(...definition.filters),nextFilters.push({code:field,operator:op,value:value??""}),setFilters(definition,nextFilters)}function addField(definition,field){if(definition.fields?.includes(field))return definition;let newFields=[];return definition.fields&&newFields.push(...definition.fields),newFields.push(field),{...definition,fields:newFields,name:void 0}}function deleteFilter(definition,index){if(!definition.filters)return definition;let newFilters=[...definition.filters];return newFilters.splice(index,1),{...definition,filters:newFilters,name:void 0}}function addYesterdayFilter(definition,field){return addDayFilter(definition,field,-1)}function addTodayFilter(definition,field){return addDayFilter(definition,field,0)}function addTomorrowFilter(definition,field){return addDayFilter(definition,field,1)}function addDayFilter(definition,field,delta){let startTime=new Date;startTime.setDate(startTime.getDate()+delta),startTime.setHours(0,0,0,0);let endTime=new Date(startTime.getTime());return endTime.setDate(endTime.getDate()+1),endTime.setTime(endTime.getTime()-1),addDateFilterBetween(definition,field,startTime,endTime)}function addNext24HoursFilter(definition,field){let now=new Date,endTime=new Date(now.getTime()+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,Operator.GREATER_THAN_OR_EQUALS,d1),definition=addDateFilterImpl(definition,field,Operator.LESS_THAN_OR_EQUALS,d2),definition}function addDateFilterImpl(definition,field,op,value){return addFilter(definition,field,op,value.toISOString())}function addMissingFilter(definition,field,value=!0){return addFilter(definition,field,Operator.MISSING,value.toString())}function setOffset(definition,offset){return definition.offset===offset?definition:{...definition,offset,name:void 0}}function setPage(definition,page){let count=definition.count??DEFAULT_SEARCH_COUNT,newOffset=(page-1)*count;return setOffset(definition,newOffset)}function setSort(definition,sort,desc){return sort===getSortField(definition)&&desc!==void 0&&desc===isSortDescending(definition)?definition:{...definition,sortRules:[{code:sort,descending:!!desc}],name:void 0}}function toggleSort(definition,key){let desc=!1;return getSortField(definition)===key&&(desc=!isSortDescending(definition)),setSort(definition,key,desc)}function getSortField(definition){let sortRules=definition.sortRules;if(!sortRules||sortRules.length===0)return;let field=sortRules[0].code;return field.startsWith("-")?field.substr(1):field}function isSortDescending(definition){let sortRules=definition.sortRules;return!sortRules||sortRules.length===0?!1:!!sortRules[0].descending}function getSearchOperators(searchParam){return searchParamToOperators[searchParam.type]}function getOpString(op){return operatorNames[op]??""}function buildFieldNameString(key){let tmp=key;return tmp.includes(".")&&(tmp=tmp.split(".").pop()),tmp==="versionId"?"Version ID":(tmp=tmp.replace("[x]",""),tmp=tmp.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(capitalize4).join(" "))}function renderValue(resource,field){let key=field.name;return key==="id"?jsx111(MedplumLink,{to:`/${resource.resourceType}/${resource.id}`,children:resource.id}):key==="meta.versionId"?resource.meta?.versionId:key==="_lastUpdated"?formatDateTime4(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?jsx111(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:jsx111(Fragment32,{children:value.map((v,index)=>jsx111(ResourcePropertyDisplay,{propertyType:v.type,value:v.value,maxWidth:200,ignoreMissingValues:!0,link:!1},`${index}-${value.length}`))})}import{jsx as jsx112,jsxs as jsxs59}from"react/jsx-runtime";function SearchFieldEditor(props){let wasDropdownOpen=useRef15(!1),[state,setState]=useState58({search:JSON.parse(stringify2(props.search))}),[isDropdownOpen,setIsDropdownOpen]=useState58(!1);useEffect20(()=>{setState({search:props.search})},[props.search]);let allFields=useMemo28(()=>{if(!props.visible)return[];let resourceType=props.search.resourceType,typeSchema=getDataType2(resourceType),searchParams=getSearchParameters(resourceType);return sortStringArray(getFieldsList(typeSchema,searchParams)).map(field=>({value:field,label:buildFieldNameString(field)}))},[props.visible,props.search.resourceType]);function handleChange(newFields){setState({search:{...state.search,fields:newFields}})}return jsx112(Modal5,{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:jsx112("div",{"data-testid":"overlay-child"})},children:jsxs59(Stack16,{children:[jsx112(MultiSelect,{style:{width:550},placeholder:"Select fields to display",data:allFields,value:state.search.fields??[],onChange:handleChange,onDropdownOpen:()=>setIsDropdownOpen(!0),onDropdownClose:()=>setIsDropdownOpen(!1),maxDropdownHeight:"250px",clearButtonProps:{"aria-label":"Clear selection"},clearable:!0,searchable:!0}),jsx112(Group32,{justify:"flex-end",children:jsx112(Button11,{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 ActionIcon11,Group as Group33,Modal as Modal6,NativeSelect as NativeSelect10}from"@mantine/core";import{Operator as Operator2,deepClone as deepClone2,getSearchParameters as getSearchParameters2}from"@medplum/core";import{useEffect as useEffect21,useRef as useRef16,useState as useState59}from"react";import{Checkbox as Checkbox5,TextInput as TextInput20}from"@mantine/core";import{getSearchParameterDetails as getSearchParameterDetails2,SearchParameterType}from"@medplum/core";import{jsx as jsx113}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 jsx113(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 jsx113(Checkbox5,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultChecked:props.defaultValue==="true",autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.checked.toString())});case SearchParameterType.DATE:return jsx113(TextInput20,{type:"date",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.DATETIME:return jsx113(DateTimeInput,{name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:props.onChange});case SearchParameterType.NUMBER:return jsx113(TextInput20,{type:"number",name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value)});case SearchParameterType.QUANTITY:return jsx113(QuantityInput,{name,path:"",defaultValue:tryParseQuantity(props.defaultValue),autoFocus:props.autoFocus,onChange:newQuantity=>{newQuantity?props.onChange(`${newQuantity.value}`):props.onChange("")}});default:return jsx113(TextInput20,{name,"data-autofocus":props.autoFocus,"data-testid":name,defaultValue:props.defaultValue,autoFocus:props.autoFocus,onChange:e=>props.onChange(e.currentTarget.value),placeholder:"Search value"})}}function tryParseQuantity(value){if(value){let[valueString,systemString,unitString]=value.split("|");if(valueString)return{value:Number.parseFloat(valueString),system:systemString,unit:unitString}}}import{jsx as jsx114,jsxs as jsxs60}from"react/jsx-runtime";function SearchFilterEditor(props){let[search,setSearch]=useState59(deepClone2(props.search)),searchRef=useRef16(search);searchRef.current=search,useEffect21(()=>{setSearch(deepClone2(props.search))},[props.search]);function onAddFilter(filter){setSearch(addFilter(searchRef.current,filter.code,filter.operator,filter.value))}let resourceType=props.search.resourceType,searchParams=getSearchParameters2(resourceType)??{},filters=search.filters||[];return jsx114(Modal6,{title:"Filters",closeButtonProps:{"aria-label":"Close"},size:900,opened:props.visible,onClose:props.onCancel,children:jsxs60(Form,{onSubmit:()=>props.onOk(searchRef.current),children:[jsxs60("div",{children:[jsxs60("table",{children:[jsxs60("colgroup",{children:[jsx114("col",{style:{width:200}}),jsx114("col",{style:{width:200}}),jsx114("col",{style:{width:380}}),jsx114("col",{style:{width:40}})]}),jsx114("thead",{children:jsxs60("tr",{children:[jsx114("th",{children:"Field"}),jsx114("th",{children:"Operation"}),jsx114("th",{children:"Value"}),jsx114("th",{})]})}),jsx114("tbody",{children:filters.map((filter,index)=>jsx114(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`))})]}),jsx114(ArrayAddButton,{propertyDisplayName:"Filter",onClick:()=>onAddFilter({})})]}),jsx114(Group33,{justify:"flex-end",mt:"xl",children:jsx114(SubmitButton,{children:"OK"})})]})})}function FilterRowInput(props){let value=props.value,valueRef=useRef16(value);valueRef.current=value;function setFilterCode(newCode){valueRef.current.code=newCode,valueRef.current.operator=Operator2.EQUALS,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterOperator(newOperator){valueRef.current.operator=newOperator,valueRef.current.value="",props.onChange(valueRef.current)}function setFilterValue(newFilterValue){valueRef.current.value=newFilterValue,props.onChange(valueRef.current)}let searchParam=props.searchParams[value.code],operators=searchParam&&getSearchOperators(searchParam);return jsxs60("tr",{children:[jsx114("td",{children:jsx114(NativeSelect10,{"data-testid":`${props.id}-filter-field`,defaultValue:props.value.code,onChange:e=>setFilterCode(e.currentTarget.value),data:["",...Object.keys(props.searchParams).map(param=>({value:param,label:buildFieldNameString(param)}))]})}),jsx114("td",{children:operators&&jsx114(NativeSelect10,{"data-testid":`${props.id}-filter-operation`,defaultValue:value.operator,onChange:e=>setFilterOperator(e.currentTarget.value),data:["",...operators.map(op=>({value:op,label:getOpString(op)}))]},`${props.id}-filter-value-${props.value.code}`)}),jsx114("td",{children:searchParam&&value.operator&&jsx114(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}`)}),jsx114("td",{children:props.onDelete&&jsx114(ActionIcon11,{variant:"outline",color:"red",radius:"xl","aria-label":"Delete filter",onClick:props.onDelete,children:jsx114(IconX,{style:{width:"70%",height:"70%"},stroke:1.5})})})]})}import{Button as Button12,Grid,Modal as Modal7}from"@mantine/core";import{useState as useState60}from"react";import{jsx as jsx115,jsxs as jsxs61}from"react/jsx-runtime";function SearchFilterValueDialog(props){let[value,setValue]=useState60(props.defaultValue??"");if(!props.searchParam||!props.filter)return null;function onOk(){props.onOk({...props.filter,value})}return jsx115(Modal7,{title:props.title,size:"xl",opened:props.visible,onClose:props.onCancel,children:jsx115(Form,{onSubmit:onOk,children:jsxs61(Grid,{children:[jsx115(Grid.Col,{span:10,children:jsx115(SearchFilterValueInput,{resourceType:props.resourceType,searchParam:props.searchParam,defaultValue:value,autoFocus:!0,onChange:setValue})}),jsx115(Grid.Col,{span:2,children:jsx115(Button12,{onClick:onOk,fullWidth:!0,children:"OK"})})]})})})}import{formatDateTime as formatDateTime5,getSearchParameterDetails as getSearchParameterDetails3,globalSchema,Operator as Operator3,SearchParameterType as SearchParameterType2}from"@medplum/core";import{Fragment as Fragment33,jsx as jsx116}from"react/jsx-runtime";function SearchFilterValueDisplay(props){let{resourceType,filter}=props,searchParam=globalSchema.types[resourceType].searchParams?.[filter.code];if(searchParam){if(searchParam.type==="reference"&&(filter.operator===Operator3.EQUALS||filter.operator===Operator3.NOT_EQUALS))return jsx116(ResourceName,{value:{reference:filter.value}});let searchParamDetails=getSearchParameterDetails3(resourceType,searchParam);if(filter.code==="_lastUpdated"||searchParamDetails.type===SearchParameterType2.DATETIME)return jsx116(Fragment33,{children:formatDateTime5(filter.value)})}return jsx116(Fragment33,{children:filter.value})}import{Menu as Menu5}from"@mantine/core";import{Operator as Operator4}from"@medplum/core";import{Fragment as Fragment34,jsx as jsx117,jsxs as jsxs62}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?jsx117(SearchParameterSubMenu,{search:props.search,searchParam:props.searchParams[0],onSort,onPrompt,onChange,onClear}):jsx117(Menu5.Dropdown,{children:props.searchParams.map(searchParam=>jsx117(Menu5.Item,{children:buildFieldNameString(searchParam.code)},searchParam.code))})}function SearchParameterSubMenu(props){switch(props.searchParam.type){case"date":return jsx117(DateFilterSubMenu,{...props});case"number":case"quantity":return jsx117(NumericFilterSubMenu,{...props});case"reference":return jsx117(ReferenceFilterSubMenu,{...props});case"string":return jsx117(TextFilterSubMenu,{...props});case"token":case"uri":return jsx117(TokenFilterSubMenu,{...props});default:return jsxs62(Fragment34,{children:["Unknown search param type: ",props.searchParam.type]})}}function DateFilterSubMenu(props){let{searchParam}=props,code=searchParam.code;return jsxs62(Menu5.Dropdown,{children:[jsx117(Menu5.Item,{leftSection:jsx117(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Oldest to Newest"}),jsx117(Menu5.Item,{leftSection:jsx117(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Newest to Oldest"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.ENDS_BEFORE),children:"Before..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.STARTS_AFTER),children:"After..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconBracketsContain,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Between..."}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addTomorrowFilter(props.search,code)),children:"Tomorrow"}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addTodayFilter(props.search,code)),children:"Today"}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addYesterdayFilter(props.search,code)),children:"Yesterday"}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addNext24HoursFilter(props.search,code)),children:"Next 24 Hours"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addNextMonthFilter(props.search,code)),children:"Next Month"}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addThisMonthFilter(props.search,code)),children:"This Month"}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addLastMonthFilter(props.search,code)),children:"Last Month"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconCalendar,{size:14}),onClick:()=>props.onChange(addYearToDateFilter(props.search,code)),children:"Year to date"}),jsx117(CommonMenuItems,{...props})]})}function NumericFilterSubMenu(props){let{searchParam}=props;return jsxs62(Menu5.Dropdown,{children:[jsx117(Menu5.Item,{leftSection:jsx117(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort Smallest to Largest"}),jsx117(Menu5.Item,{leftSection:jsx117(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Largest to Smallest"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT_EQUALS),children:"Does not equal..."}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconMathGreater,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN),children:"Greater than..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.GREATER_THAN_OR_EQUALS),children:"Greater than or equal to..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconMathLower,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN),children:"Less than..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconSettings,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.LESS_THAN_OR_EQUALS),children:"Less than or equal to..."}),jsx117(CommonMenuItems,{...props})]})}function ReferenceFilterSubMenu(props){let{searchParam}=props;return jsxs62(Menu5.Dropdown,{children:[jsx117(Menu5.Item,{leftSection:jsx117(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx117(CommonMenuItems,{...props})]})}function TextFilterSubMenu(props){let{searchParam}=props;return jsxs62(Menu5.Dropdown,{children:[jsx117(Menu5.Item,{leftSection:jsx117(IconSortAscending,{size:14}),onClick:()=>props.onSort(searchParam,!1),children:"Sort A to Z"}),jsx117(Menu5.Item,{leftSection:jsx117(IconSortDescending,{size:14}),onClick:()=>props.onSort(searchParam,!0),children:"Sort Z to A"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconBucket,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.CONTAINS),children:"Contains..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconBucketOff,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Does not contain..."}),jsx117(CommonMenuItems,{...props})]})}function TokenFilterSubMenu(props){let{searchParam}=props;return jsxs62(Menu5.Dropdown,{children:[jsx117(Menu5.Item,{leftSection:jsx117(IconEqual,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.EQUALS),children:"Equals..."}),jsx117(Menu5.Item,{leftSection:jsx117(IconEqualNot,{size:14}),onClick:()=>props.onPrompt(searchParam,Operator4.NOT),children:"Does not equal..."}),jsx117(CommonMenuItems,{...props})]})}function CommonMenuItems(props){let{searchParam}=props,code=searchParam.code;return jsxs62(Fragment34,{children:[jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconBleach,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code)),children:"Missing"}),jsx117(Menu5.Item,{leftSection:jsx117(IconBleachOff,{size:14}),onClick:()=>props.onChange(addMissingFilter(props.search,code,!1)),children:"Not missing"}),jsx117(Menu5.Divider,{}),jsx117(Menu5.Item,{leftSection:jsx117(IconX,{size:14}),onClick:()=>props.onClear(searchParam),children:"Clear filters"})]})}function getPaginationControlProps(controlName){switch(controlName){case"next":return{"aria-label":"Next page"};case"previous":return{"aria-label":"Previous page"};case"first":return{"aria-label":"First page"};case"last":return{"aria-label":"Last page"};default:return{}}}var SearchControl_default={root:"SearchControl_root",table:"SearchControl_table",tr:"SearchControl_tr",th:"SearchControl_th",control:"SearchControl_control",icon:"SearchControl_icon"};import{getElementDefinition,getSearchParameter,getSearchParameterDetails as getSearchParameterDetails4,getSearchParameters as getSearchParameters3}from"@medplum/core";function getFieldDefinitions(search){let resourceType=search.resourceType,fields=[];for(let name of search.fields||["id","_lastUpdated"])fields.push(getFieldDefinition(resourceType,name));return fields}function getFieldDefinition(resourceType,name){if(name==="_lastUpdated")return{name:"_lastUpdated",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_lastUpdated",name:"_lastUpdated",type:"date",expression:"Resource.meta.lastUpdated"}]};if(name==="meta.versionId")return{name:"meta.versionId",searchParams:[{resourceType:"SearchParameter",base:["Resource"],code:"_versionId",name:"_versionId",type:"token",expression:"Resource.meta.versionId"}]};let exactElementDefinition=getElementDefinition(resourceType,name),exactSearchParam=getSearchParameter(resourceType,name.toLowerCase());if(exactElementDefinition&&exactSearchParam)return{name,elementDefinition:exactElementDefinition,searchParams:[exactSearchParam]};if(exactElementDefinition){let allSearchParams=getSearchParameters3(resourceType),searchParams;if(allSearchParams){let pathRegex=new RegExp(`${resourceType}\\.${name.replaceAll("[x]","")}([^\\w-]|$)`);searchParams=Object.values(allSearchParams).filter(p=>!!p.expression&&pathRegex.test(p?.expression)),searchParams.length===0&&(searchParams=void 0)}return{name,elementDefinition:exactElementDefinition,searchParams}}if(exactSearchParam){let details=getSearchParameterDetails4(resourceType,exactSearchParam);return{name,elementDefinition:details.elementDefinitions?.[0],searchParams:[exactSearchParam]}}return{name}}import{Fragment as Fragment35,jsx as jsx118,jsxs as jsxs63}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=useMedplum26(),[outcome,setOutcome]=useState61(),{search,onLoad}=props,[memoizedSearch,setMemoizedSearch]=useState61(search);deepEquals(search,memoizedSearch)||setMemoizedSearch(search);let[state,setState]=useState61({selected:{},fieldEditorVisible:!1,filterEditorVisible:!1,exportDialogVisible:!1,filterDialogVisible:!1}),stateRef=useRef17(state);stateRef.current=state;let total=memoizedSearch.total??"accurate",loadResults=useCallback13(options=>{setOutcome(void 0),medplum.requestSchema(memoizedSearch.resourceType).then(()=>medplum.search(memoizedSearch.resourceType,formatSearchQuery({...memoizedSearch,total,fields:void 0}),options)).then(response=>{setState({...stateRef.current,searchResponse:response}),onLoad&&onLoad(new SearchLoadEvent(response))}).catch(reason=>{setState({...stateRef.current,searchResponse:void 0}),setOutcome(normalizeOperationOutcome7(reason))})},[medplum,memoizedSearch,total,onLoad]),refreshResults=useCallback13(()=>{setState({...stateRef.current,searchResponse:void 0}),loadResults({cache:"reload"})},[loadResults]);useEffect22(()=>{loadResults()},[loadResults]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...stateRef.current.selected};checked?newSelected[id]=!0:delete newSelected[id],setState({...stateRef.current,selected:newSelected})}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},searchResponse=stateRef.current.searchResponse;checked&&searchResponse?.entry&&searchResponse.entry.forEach(entry=>{entry.resource?.id&&(newSelected[entry.resource.id]=!0)}),setState({...stateRef.current,selected:newSelected})}function isAllSelected(){let state2=stateRef.current;if(!state2.searchResponse?.entry||state2.searchResponse.entry.length===0)return!1;for(let e of state2.searchResponse.entry)if(e.resource?.id&&!state2.selected[e.resource.id])return!1;return!0}function emitSearchChange(newSearch){props.onChange&&props.onChange(new SearchChangeEvent(newSearch))}function handleRowClick(e,resource){if(isCheckboxCell(e.target)||e.button===2)return;killEvent(e);let isAux=isAuxClick(e);!isAux&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),isAux&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e))}function isExportPassed(){return!!(props.onExport??props.onExportCsv??props.onExportTransactionBundle)}if(outcome)return jsx118(OperationOutcomeAlert,{outcome});if(!isDataTypeLoaded(memoizedSearch.resourceType))return jsx118(Center8,{style:{width:"100%",height:"100%"},children:jsx118(Loader4,{})});let checkboxColumn=props.checkboxesEnabled,fields=getFieldDefinitions(memoizedSearch),resourceType=memoizedSearch.resourceType,lastResult=state.searchResponse,resources=lastResult?.entry?.map(e=>e.resource),buttonVariant="subtle",buttonColor="gray",iconSize=16,isMobile=window.innerWidth<768;return jsxs63("div",{className:SearchControl_default.root,"data-testid":"search-control",children:[!props.hideToolbar&&jsxs63(Group34,{justify:"space-between",mb:"xl",children:[jsxs63(Group34,{gap:2,children:[jsx118(Button13,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconColumns,{size:iconSize}),onClick:()=>setState({...stateRef.current,fieldEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Fields"}),jsx118(Button13,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconFilter,{size:iconSize}),onClick:()=>setState({...stateRef.current,filterEditorVisible:!0,dialogOpenTime:Date.now()}),children:"Filters"}),props.onNew&&jsx118(Button13,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconFilePlus,{size:iconSize}),onClick:props.onNew,children:"New..."}),!isMobile&&isExportPassed()&&jsx118(Button13,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconTableExport,{size:iconSize}),onClick:props.onExport?props.onExport:()=>setState({...stateRef.current,exportDialogVisible:!0,dialogOpenTime:Date.now()}),children:"Export..."}),!isMobile&&props.onDelete&&jsx118(Button13,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconTrash,{size:iconSize}),onClick:()=>props.onDelete(Object.keys(state.selected)),children:"Delete..."}),!isMobile&&props.onBulk&&jsx118(Button13,{size:"compact-md",variant:buttonVariant,color:buttonColor,leftSection:jsx118(IconBoxMultiple,{size:iconSize}),onClick:()=>props.onBulk(Object.keys(state.selected)),children:"Bulk..."})]}),jsxs63(Group34,{gap:2,children:[lastResult&&jsxs63(Text20,{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()}`]}),jsx118(ActionIcon12,{variant:buttonVariant,color:buttonColor,title:"Refresh",onClick:refreshResults,children:jsx118(IconRefresh,{size:iconSize})})]})]}),jsxs63(Table3,{className:SearchControl_default.table,children:[jsxs63(Table3.Thead,{children:[jsxs63(Table3.Tr,{children:[checkboxColumn&&jsx118(Table3.Th,{children:jsx118("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx118(Table3.Th,{children:jsxs63(Menu6,{shadow:"md",width:240,position:"bottom-end",children:[jsx118(Menu6.Target,{children:jsx118(UnstyledButton4,{className:SearchControl_default.control,p:2,children:jsxs63(Group34,{justify:"space-between",wrap:"nowrap",children:[jsx118(Text20,{fw:500,children:buildFieldNameString(field.name)}),jsx118(Center8,{className:SearchControl_default.icon,children:jsx118(IconAdjustmentsHorizontal,{size:14,stroke:1.5})})]})})}),jsx118(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&&jsxs63(Table3.Tr,{children:[checkboxColumn&&jsx118(Table3.Th,{}),fields.map(field=>jsx118(Table3.Th,{children:field.searchParams&&jsx118(FilterDescription,{resourceType,searchParams:field.searchParams,filters:memoizedSearch.filters})},field.name))]})]}),jsx118(Table3.Tbody,{children:resources?.map(resource=>resource&&jsxs63(Table3.Tr,{className:SearchControl_default.tr,"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx118(Table3.Td,{children:jsx118("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=>jsx118(Table3.Td,{children:renderValue(resource,field)},field.name))]},resource.id))})]}),!resources?.length&&jsx118(Container,{children:jsx118(Center8,{style:{height:150},children:jsx118(Text20,{size:"xl",c:"dimmed",children:"No results"})})}),lastResult&&jsx118(Center8,{m:"md",p:"md",children:jsx118(Pagination,{value:getPage(memoizedSearch),total:getTotalPages(memoizedSearch,lastResult),onChange:newPage=>emitSearchChange(setPage(memoizedSearch,newPage)),getControlProps:getPaginationControlProps})}),jsx118(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}`),jsx118(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}`),jsx118(SearchExportDialog,{visible:stateRef.current.exportDialogVisible,exportCsv:props.onExportCsv,exportTransactionBundle:props.onExportTransactionBundle,onCancel:()=>{setState({...stateRef.current,exportDialogVisible:!1})}},`search-export-dialog-${state.dialogOpenTime}`),jsx118(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?jsx118("span",{children:"no filters"}):jsx118(Fragment35,{children:filters.map(filter=>jsxs63("div",{children:[getOpString(filter.operator),"\xA0",jsx118(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 jsx119,jsxs as jsxs64}from"react/jsx-runtime";function FhirPathTable(props){let medplum=useMedplum27(),[schemaLoaded,setSchemaLoaded]=useState62(!1),[outcome,setOutcome]=useState62(),{query,fields}=props,[response,setResponse]=useState62(),[selected,setSelected]=useState62({}),responseRef=useRef18(response);responseRef.current=response;let selectedRef=useRef18({});selectedRef.current=selected,useEffect23(()=>{setOutcome(void 0),medplum.graphql(query).then(setResponse).catch(err=>setOutcome(normalizeOperationOutcome8(err)))},[medplum,query]);function handleSingleCheckboxClick(e,id){e.stopPropagation();let checked=e.target.checked,newSelected={...selectedRef.current};checked?newSelected[id]=!0:delete newSelected[id],setSelected(newSelected)}function handleAllCheckboxClick(e){e.stopPropagation();let checked=e.target.checked,newSelected={},resources=responseRef.current?.data.ResourceList;checked&&resources&&resources.forEach(resource=>{resource.id&&(newSelected[resource.id]=!0)}),setSelected(newSelected)}function isAllSelected(){let resources=responseRef.current?.data.ResourceList;if(!resources||resources.length===0)return!1;for(let resource of resources)if(resource.id&&!selectedRef.current[resource.id])return!1;return!0}function handleRowClick(e,resource){isCheckboxCell(e.target)||(killEvent(e),e.button!==1&&props.onClick&&props.onClick(new SearchClickEvent(resource,e)),e.button===1&&props.onAuxClick&&props.onAuxClick(new SearchClickEvent(resource,e)))}if(useEffect23(()=>{medplum.requestSchema(props.resourceType).then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum,props.resourceType]),!schemaLoaded)return jsx119(Loader5,{});let checkboxColumn=props.checkboxesEnabled;return jsxs64("div",{onContextMenu:e=>killEvent(e),"data-testid":"search-control",children:[jsxs64(Table4,{children:[jsx119(Table4.Thead,{children:jsxs64(Table4.Tr,{children:[checkboxColumn&&jsx119(Table4.Th,{children:jsx119("input",{type:"checkbox",value:"checked","aria-label":"all-checkbox","data-testid":"all-checkbox",checked:isAllSelected(),onChange:e=>handleAllCheckboxClick(e)})}),fields.map(field=>jsx119(Table4.Th,{children:field.name},field.name))]})}),jsx119(Table4.Tbody,{children:response?.data.ResourceList.map(resource=>resource&&jsxs64(Table4.Tr,{"data-testid":"search-control-row",onClick:e=>handleRowClick(e,resource),onAuxClick:e=>handleRowClick(e,resource),children:[checkboxColumn&&jsx119(Table4.Td,{children:jsx119("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=>jsx119(Table4.Td,{children:jsx119(FhirPathDisplay,{propertyType:field.propertyType,path:field.fhirPath,resource})},field.name))]},resource.id))})]}),response?.data.ResourceList.length===0&&jsx119("div",{"data-testid":"empty-search",children:"No results"}),outcome&&jsx119("div",{"data-testid":"search-error",children:jsx119("pre",{style:{textAlign:"left"},children:JSON.stringify(outcome,void 0,2)})}),props.onBulk&&jsx119(Button14,{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 jsx120}from"react/jsx-runtime";function InfoBar(props){return jsx120(ScrollArea5,{children:jsx120("div",{className:InfoBar_default.root,children:props.children})})}InfoBar.Entry=function(props){return jsx120("div",{className:InfoBar_default.entry,children:props.children})};InfoBar.Key=function(props){return jsx120("div",{className:InfoBar_default.key,children:props.children})};InfoBar.Value=function(props){return jsx120("div",{className:InfoBar_default.value,children:props.children})};import{Anchor as Anchor6,Tabs}from"@mantine/core";import{isString,locationUtils as locationUtils5}from"@medplum/core";import{useMedplumNavigate as useMedplumNavigate5}from"@medplum/react-hooks";import{useState as useState63}from"react";var LinkTabs_default={list:"LinkTabs_list",link:"LinkTabs_link"};import{jsx as jsx121,jsxs as jsxs65}from"react/jsx-runtime";function LinkTabs(props){let{baseUrl,tabs:tabDefinitions,children,...rest}=props,tabs=normalizeTabDefinitions(tabDefinitions),navigate=useMedplumNavigate5(),[currentTab,setCurrentTab]=useState63(()=>{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 jsxs65(Tabs,{value:currentTab.toLowerCase(),onChange:onTabChange,...rest,children:[jsx121(Tabs.List,{className:LinkTabs_default.list,children:tabs.map(t=>jsx121(Tabs.Tab,{value:t.value,children:jsx121(Anchor6,{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 Box12,SimpleGrid}from"@mantine/core";import{useResource as useResource8,useSearchOne}from"@medplum/react-hooks";import{Box as Box11,Flex as Flex4,Group as Group35,Paper as Paper3,RingProgress,Text as Text21,Title as Title7}from"@mantine/core";import{formatCodeableConcept as formatCodeableConcept4}from"@medplum/core";import{Fragment as Fragment36,jsx as jsx122,jsxs as jsxs66}from"react/jsx-runtime";function MeasureReportGroupDisplay(props){let{group}=props;return jsx122(Paper3,{withBorder:!0,radius:"md",p:"xs",display:"flex",style:{alignItems:"center",justifyContent:"center"},children:jsxs66(Group35,{children:[group.measureScore&&jsx122(MeasureScore,{group}),!group.measureScore&&jsx122(MeasureReportPopulation,{group})]})})}function MeasureTitle(props){let{measure}=props;return jsxs66(Fragment36,{children:[jsx122(Text21,{fz:"md",fw:500,mb:8,children:measure.title}),jsx122(Text21,{fz:"xs",c:"dimmed",mb:8,children:measure.subtitle})]})}function MeasureReportPopulation(props){let{group}=props,populations=group.population,numerator=populations?.find(p=>formatCodeableConcept4(p.code)==="numerator"),denominator=populations?.find(p=>formatCodeableConcept4(p.code)==="denominator"),numeratorCount=numerator?.count,denominatorCount=denominator?.count;if(denominatorCount===0)return jsxs66(Box11,{children:[jsx122(Title7,{order:3,children:"Not Applicable"}),jsx122(Text21,{children:`Denominator: ${denominatorCount}`})]});if(numeratorCount===void 0||denominatorCount===void 0)return jsxs66(Box11,{children:[jsx122(Title7,{order:3,children:"Insufficient Data"}),jsx122(Text21,{children:`Numerator: ${numeratorCount}`}),jsx122(Text21,{children:`Denominator: ${denominatorCount}`})]});let value=numeratorCount/denominatorCount*100;return jsx122(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value,color:groupColor(value)}],label:jsx122(Flex4,{justify:"center",children:jsxs66(Text21,{fw:700,fz:18,children:[numeratorCount," / ",denominatorCount]})})})}function MeasureScore(props){let{group}=props,unit=group.measureScore?.unit??group.measureScore?.code;return jsx122(Fragment36,{children:unit==="%"?jsx122(RingProgress,{size:120,thickness:12,roundCaps:!0,sections:[{value:groupValue(group),color:groupColor(group?.measureScore?.value??0)}],label:jsx122(Flex4,{justify:"center",children:jsx122(Text21,{fw:700,fz:18,children:jsx122(QuantityDisplay,{value:group.measureScore})})})}):jsx122(Flex4,{h:120,align:"center",children:jsx122(Title7,{order:3,children:jsx122(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 jsx123,jsxs as jsxs67}from"react/jsx-runtime";function MeasureReportDisplay(props){let report=useResource8(props.measureReport),[measure]=useSearchOne("Measure",{url:report?.measure});return report?jsxs67(Box12,{children:[measure&&jsx123(MeasureTitle,{measure}),jsx123(SimpleGrid,{cols:{base:3,sm:1},spacing:{base:"md",sm:"sm"},children:report.group?.map((group,idx)=>jsx123(MeasureReportGroupDisplay,{group},group.id??idx))})]}):null}import{ActionIcon as ActionIcon13,Indicator,Tooltip as Tooltip4}from"@mantine/core";import{useMedplum as useMedplum28,useSubscription as useSubscription2}from"@medplum/react-hooks";import{useCallback as useCallback14,useEffect as useEffect24,useState as useState64}from"react";import{jsx as jsx124}from"react/jsx-runtime";function NotificationIcon(props){let medplum=useMedplum28(),{resourceType,countCriteria,subscriptionCriteria}=props,[unreadCount,setUnreadCount]=useState64(0),updateCount=useCallback14(cache=>{medplum.search(resourceType,countCriteria,{cache}).then(result2=>setUnreadCount(result2.total)).catch(console.error)},[medplum,resourceType,countCriteria]);useEffect24(()=>{updateCount("default")},[updateCount]),useSubscription2(subscriptionCriteria,()=>{updateCount("reload")});let result=props.iconComponent;return props.onClick&&(result=jsx124(ActionIcon13,{variant:"subtle",color:"gray",size:"lg","aria-label":props.label,onClick:props.onClick,children:result})),props.tooltip&&(result=jsx124(Tooltip4,{label:props.tooltip,children:result})),unreadCount>0&&(result=jsx124(Indicator,{inline:!0,label:unreadCount.toLocaleString(),size:16,offset:2,position:"bottom-end",color:"red",children:result})),result}import{Group as Group36,SegmentedControl as SegmentedControl2,Stack as Stack17}from"@mantine/core";import{notifications}from"@mantine/notifications";import{ContentType as ContentType3,normalizeErrorString as normalizeErrorString9,resolveId}from"@medplum/core";import{useMedplum as useMedplum29}from"@medplum/react-hooks";import{useCallback as useCallback15}from"react";import{jsx as jsx125,jsxs as jsxs68}from"react/jsx-runtime";var NOTIFICATION_ID="patient-export",NOTIFICATION_TITLE="Patient Export",formats={everything:{operation:"$everything",extension:"json",contentType:ContentType3.FHIR_JSON},summary:{operation:"$summary",extension:"json",contentType:ContentType3.FHIR_JSON},ccda:{operation:"$ccda-export",extension:"xml",contentType:ContentType3.CDA_XML},ccdaReferral:{operation:"$ccda-export",type:"referral",extension:"xml",contentType:ContentType3.CDA_XML}};function PatientExportForm(props){let medplum=useMedplum29(),{patient}=props,handleSubmit=useCallback15(async data2=>{let patientId=resolveId(patient),format=data2.format,{operation,type,contentType,extension}=formats[format],url=medplum.fhirUrl("Patient",patientId,operation),params={};type&&(params.type=type),data2.author&&(params.author={reference:data2.author}),data2.authoredOn&&(params.authoredOn=convertLocalToIso(data2.authoredOn)),data2.startDate&&(params.start=data2.startDate),data2.endDate&&(params.end=data2.endDate),notifications.show({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,loading:!0,message:"Exporting...",autoClose:!1,withCloseButton:!1});try{let response=await medplum.post(url,params,void 0,{cache:"no-cache",headers:{Accept:contentType}}),fileName=`Patient-export-${patientId}-${new Date().toISOString().replaceAll(":","-")}.${extension}`;saveData(response,fileName,contentType),notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"green",message:"Done",icon:jsx125(IconCheck,{size:"1rem"}),loading:!1,autoClose:!0,withCloseButton:!0})}catch(err){notifications.update({id:NOTIFICATION_ID,title:NOTIFICATION_TITLE,color:"red",message:normalizeErrorString9(err),icon:jsx125(IconX,{size:"1rem"}),loading:!1,autoClose:!1,withCloseButton:!0})}},[medplum,patient]);return jsx125(Form,{onSubmit:handleSubmit,children:jsxs68(Stack17,{children:[jsx125(FormSection,{title:"Export Format",description:"Required",withAsterisk:!0,children:jsx125(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})}),jsx125(FormSection,{title:"Author",description:"Optional author for composition. Default value is current user.",children:jsx125(ReferenceInput,{name:"author",placeholder:"Author",targetTypes:["Organization","Practitioner","PractitionerRole"]})}),jsx125(FormSection,{title:"Authored On",description:"Optional date for composition authored on. Default value is current date.",children:jsx125(DateTimeInput,{name:"authoredOn",placeholder:"Authored on"})}),jsx125(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:jsx125(DateTimeInput,{name:"startDate",placeholder:"Start date"})}),jsx125(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:jsx125(DateTimeInput,{name:"endDate",placeholder:"End date"})}),jsx125(Group36,{justify:"right",children:jsx125(SubmitButton,{children:"Request Export"})})]})})}function saveData(data2,fileName,contentType){let content=typeof data2=="string"?data2:JSON.stringify(data2,null,2),blob=new Blob([content],{type:contentType}),url=window.URL.createObjectURL(blob),a=document.createElement("a");document.body.appendChild(a),a.style.display="none",a.href=url,a.download=fileName,a.click(),window.URL.revokeObjectURL(url)}import{calculateAgeString}from"@medplum/core";import{useResource as useResource9}from"@medplum/react-hooks";function getDefaultColor(patient){if(patient.gender==="male")return"blue";if(patient.gender==="female")return"pink"}import{Fragment as Fragment37,jsx as jsx126,jsxs as jsxs69}from"react/jsx-runtime";function PatientHeader(props){let patient=useResource9(props.patient);return patient?jsxs69(InfoBar,{children:[jsx126(ResourceAvatar,{value:patient,size:"lg",color:getDefaultColor(patient)}),jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:"Name"}),jsx126(InfoBar.Value,{children:jsx126(MedplumLink,{to:patient,fw:500,children:patient.name?jsx126(HumanNameDisplay,{value:patient.name[0],options:{use:!1}}):"[blank]"})})]}),patient.birthDate&&jsxs69(Fragment37,{children:[jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:"DoB"}),jsx126(InfoBar.Value,{children:patient.birthDate})]}),jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:"Age"}),jsx126(InfoBar.Value,{children:calculateAgeString(patient.birthDate)})]})]}),patient.gender&&jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:"Gender"}),jsx126(InfoBar.Value,{children:patient.gender})]}),patient.address&&jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:"State"}),jsx126(InfoBar.Value,{children:patient.address[0]?.state})]}),patient.identifier?.map(identifier=>jsxs69(InfoBar.Entry,{children:[jsx126(InfoBar.Key,{children:identifier?.system}),jsx126(InfoBar.Value,{children:identifier?.value})]},`${identifier?.system}-${identifier?.value}`))]}):null}import{Divider as Divider4,Flex as Flex11,Group as Group50,Stack as Stack24,Text as Text32,Tooltip as Tooltip6}from"@mantine/core";import{calculateAgeString as calculateAgeString2,formatAddress as formatAddress2,formatHumanName as formatHumanName6,resolveId as resolveId2}from"@medplum/core";import{useMedplum as useMedplum36,useResource as useResource11}from"@medplum/react-hooks";import{useEffect as useEffect25,useState as useState76}from"react";import{Box as Box15,Flex as Flex5,Group as Group39,Modal as Modal8,Text as Text23}from"@mantine/core";import{useDisclosure}from"@mantine/hooks";import{getDisplayString as getDisplayString6}from"@medplum/core";import{useMedplum as useMedplum30}from"@medplum/react-hooks";import{useCallback as useCallback17,useMemo as useMemo29,useState as useState67}from"react";import{Group as Group37,Stack as Stack18,TextInput as TextInput21}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG2,addProfileToResource,createReference as createReference6}from"@medplum/core";import{useCallback as useCallback16,useState as useState65}from"react";import{jsx as jsx127,jsxs as jsxs70}from"react/jsx-runtime";var HTTP="http://",PATIENT_ALLERGY_PROFILE=HTTP_HL7_ORG2+"/fhir/us/core/StructureDefinition/us-core-allergyintolerance";function AllergyDialog(props){let{patient,encounter,allergy,onSubmit}=props,[code,setCode]=useState65(allergy?.code),[clinicalStatus,setClinicalStatus]=useState65(allergy?.clinicalStatus),handleSubmit=useCallback16(formData=>{onSubmit(addProfileToResource({...allergy,resourceType:"AllergyIntolerance",patient:createReference6(patient),encounter:encounter?createReference6(encounter):void 0,code,clinicalStatus,onsetDateTime:formData.onsetDateTime?formData.onsetDateTime:void 0,reaction:formData.reaction?[{manifestation:[{text:formData.reaction}]}]:void 0},PATIENT_ALLERGY_PROFILE))},[patient,encounter,allergy,code,clinicalStatus,onSubmit]);return jsx127(Form,{onSubmit:handleSubmit,children:jsxs70(Stack18,{children:[jsx127(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}),jsx127(TextInput21,{name:"reaction",label:"Reaction",defaultValue:allergy?.reaction?.[0]?.manifestation?.[0]?.text}),jsx127(CodeableConceptInput,{name:"clinicalStatus",label:"Clinical Status",path:"AllergyIntolerance.clinicalStatus",binding:HTTP_HL7_ORG2+"/fhir/ValueSet/allergyintolerance-clinical",maxValues:1,defaultValue:allergy?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx127(DateTimeInput,{name:"onsetDateTime",label:"Onset",defaultValue:allergy?.recordedDate}),jsx127(Group37,{justify:"flex-end",gap:4,mt:"md",children:jsx127(SubmitButton,{children:"Save"})})]})},allergy?.id)}import{ActionIcon as ActionIcon14,Box as Box13,Collapse,Group as Group38,Text as Text22}from"@mantine/core";import{useState as useState66}from"react";var CollapsibleSection_default={root:"CollapsibleSection_root",header:"CollapsibleSection_header",chevron:"CollapsibleSection_chevron",title:"CollapsibleSection_title",addButton:"CollapsibleSection_addButton"};import{jsx as jsx128,jsxs as jsxs71}from"react/jsx-runtime";function CollapsibleSection(props){let{title,children,onAdd}=props,[collapsed,setCollapsed]=useState66(!1);return jsxs71(Box13,{className:CollapsibleSection_default.root,children:[jsxs71(Group38,{justify:"space-between",className:CollapsibleSection_default.header,children:[jsxs71(Group38,{gap:8,children:[jsx128(ActionIcon14,{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:jsx128(IconChevronDown,{size:20})}),jsx128(Text22,{fz:"md",fw:800,onClick:()=>setCollapsed(c=>!c),className:CollapsibleSection_default.title,children:title})]}),onAdd&&jsx128(ActionIcon14,{role:"button","aria-label":"Add item",className:CollapsibleSection_default.addButton,variant:"subtle",onClick:e=>{killEvent(e),onAdd()},size:"md",children:jsx128(IconPlus,{size:18})})]}),jsx128(Collapse,{in:!collapsed,children:jsx128(Box13,{ml:"var(--mantine-spacing-xl)",mt:"xs",mb:"md",pl:4,children})})]})}import{ActionIcon as ActionIcon15,Box as Box14}from"@mantine/core";var SummaryItem_default={gradient:"SummaryItem_gradient",container:"SummaryItem_container",chevron:"SummaryItem_chevron",item:"SummaryItem_item",itemText:"SummaryItem_itemText"};import{jsx as jsx129,jsxs as jsxs72}from"react/jsx-runtime";function SummaryItem(props){let{children,onClick}=props;return jsxs72(Box14,{className:SummaryItem_default.item,onClick,children:[children,jsx129("div",{className:SummaryItem_default.gradient}),jsx129("div",{className:SummaryItem_default.container,children:jsx129(ActionIcon15,{className:SummaryItem_default.chevron,size:"md",variant:"transparent",tabIndex:-1,children:jsx129(IconChevronRight,{size:16,stroke:2.5})})})]})}import{Fragment as Fragment38,jsx as jsx130,jsxs as jsxs73}from"react/jsx-runtime";function Allergies(props){let medplum=useMedplum30(),{patient,encounter}=props,[allergies,setAllergies]=useState67(props.allergies),[opened,{open,close}]=useDisclosure(!1),[editAllergy,setEditAllergy]=useState67(),sortedAllergies=useMemo29(()=>[...allergies].sort((a,b)=>{let aStatus=a.clinicalStatus?.coding?.[0]?.code,bStatus=b.clinicalStatus?.coding?.[0]?.code;return aStatus==="active"&&bStatus!=="active"?-1:aStatus!=="active"&&bStatus==="active"?1:getDisplayString6(a).localeCompare(getDisplayString6(b))}),[allergies]),handleSubmit=useCallback17(async allergy=>{if(allergy.id){let updatedAllergy=await medplum.updateResource(allergy);setAllergies(allergies.map(a=>a.id===updatedAllergy.id?updatedAllergy:a))}else{let newAllergy=await medplum.createResource(allergy);setAllergies([...allergies,newAllergy])}setEditAllergy(void 0),close()},[medplum,allergies,close]);return jsxs73(Fragment38,{children:[jsx130(CollapsibleSection,{title:"Allergies",onAdd:()=>{setEditAllergy(void 0),open()},children:sortedAllergies.length>0?jsx130(Box15,{children:jsx130(Flex5,{direction:"column",gap:8,children:sortedAllergies.map(allergy=>{let status=allergy.clinicalStatus?.coding?.[0]?.code||"unknown";return jsx130(SummaryItem,{onClick:()=>{setEditAllergy(allergy),open()},children:jsxs73(Box15,{children:[jsx130(Text23,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString6(allergy)}),jsx130(Group39,{mt:2,gap:4,children:status&&jsx130(StatusBadge,{color:getClinicalStatusColor(status),variant:"light",status})})]})},allergy.id)})})}):jsx130(Text23,{children:"(none)"})}),jsx130(Modal8,{opened,onClose:close,title:editAllergy?"Edit Allergy":"Add Allergy",children:jsx130(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 Box16,Flex as Flex6,Group as Group40,Text as Text24}from"@mantine/core";import{formatDate}from"@medplum/core";import{useResource as useResource10}from"@medplum/react-hooks";var PatientSummary_default={panel:"PatientSummary_panel",patientSummaryBadge:"PatientSummary_patientSummaryBadge",patientSummaryAddButton:"PatientSummary_patientSummaryAddButton",patientSummaryHeader:"PatientSummary_patientSummaryHeader",patientSummaryCollapseIcon:"PatientSummary_patientSummaryCollapseIcon",collapsed:"PatientSummary_collapsed"};import{jsx as jsx131,jsxs as jsxs74}from"react/jsx-runtime";function CoverageItem(props){let{coverage,organization,onClickResource}=props,coverageResource=useResource10(coverage),organizationResource=useResource10(organization),payorName="Unknown Payor";organizationResource&&"name"in organizationResource&&typeof organizationResource.name=="string"&&(payorName=organizationResource.name);let detailsText=`ID: ${coverageResource?.subscriberId??"N/A"}${formatClassInfo(coverageResource)?` \xB7 ${formatClassInfo(coverageResource)}`:""}`;return jsx131(SummaryItem,{onClick:()=>{coverageResource&&onClickResource?.(coverageResource)},children:jsxs74(Box16,{children:[jsx131(Text24,{fw:500,className:PatientSummary_default.itemText,children:payorName}),jsx131(Text24,{fw:500,className:PatientSummary_default.itemText,children:detailsText}),jsxs74(Group40,{mt:2,gap:4,children:[jsx131(StatusBadge,{color:"green",variant:"light",status:"Active"}),jsxs74(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 jsx131(CollapsibleSection,{title:"Insurance",children:activeCoverages.length>0?jsx131(Flex6,{direction:"column",gap:8,children:activeCoverages.map(coverage=>jsx131(CoverageItem,{coverage,organization:coverage.payor?.[0],onClickResource},coverage.id))}):jsx131(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 Box17,Flex as Flex7,Group as Group41,Modal as Modal9,Text as Text25}from"@mantine/core";import{useDisclosure as useDisclosure2}from"@mantine/hooks";import{formatDate as formatDate2,getDisplayString as getDisplayString7}from"@medplum/core";import{useState as useState68}from"react";import{Fragment as Fragment39,jsx as jsx132,jsxs as jsxs75}from"react/jsx-runtime";function Labs(props){let{serviceRequests,diagnosticReports,onClickResource,onRequestLabs}=props,[selectedReport,setSelectedReport]=useState68(),[reportDialogOpened,{open:openReportDialog,close:closeReportDialog}]=useDisclosure2(!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 jsxs75(Fragment39,{children:[jsx132(CollapsibleSection,{title:"Labs",onAdd:()=>onRequestLabs?.(),children:jsxs75(Flex7,{direction:"column",gap:8,children:[filteredServiceRequests.map(serviceRequest=>jsx132(SummaryItem,{onClick:()=>onClickResource?.(serviceRequest),children:jsxs75(Box17,{children:[jsx132(Text25,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(serviceRequest)}),jsxs75(Group41,{mt:2,gap:4,children:[serviceRequest.status&&jsx132(StatusBadge,{color:getStatusColor(serviceRequest.status),variant:"light",status:serviceRequest.status}),jsx132(Text25,{size:"xs",fw:500,c:"dimmed",children:formatDate2(serviceRequest.authoredOn)})]})]})},serviceRequest.id)),filteredDiagnosticReports.map(report=>jsx132(SummaryItem,{onClick:()=>handleDiagnosticReportClick(report),children:jsxs75(Box17,{children:[jsx132(Text25,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString7(report)}),jsxs75(Group41,{mt:2,gap:4,children:[report.status&&jsx132(StatusBadge,{color:getStatusColor(report.status),variant:"light",status:report.status}),jsx132(Text25,{size:"xs",fw:500,c:"dimmed",children:formatDate2(report.issued)})]})]})},report.id)),filteredServiceRequests.length===0&&filteredDiagnosticReports.length===0&&jsx132(Text25,{children:"(none)"})]})}),jsx132(Modal9,{opened:reportDialogOpened,onClose:closeReportDialog,size:"80%",children:selectedReport&&jsx132(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 Box18,Flex as Flex8,Group as Group43,Modal as Modal10,Text as Text26}from"@mantine/core";import{useDisclosure as useDisclosure3}from"@mantine/hooks";import{getDisplayString as getDisplayString8}from"@medplum/core";import{useMedplum as useMedplum31}from"@medplum/react-hooks";import{useCallback as useCallback19,useState as useState70}from"react";import{Alert as Alert4,Group as Group42,Radio,Stack as Stack19}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG3,addProfileToResource as addProfileToResource2,createReference as createReference7}from"@medplum/core";import{useMedplumProfile as useMedplumProfile7}from"@medplum/react-hooks";import{useCallback as useCallback18,useState as useState69}from"react";import{jsx as jsx133,jsxs as jsxs76}from"react/jsx-runtime";var HTTP2="http://",statusValues=["active","stopped","on-hold","cancelled","completed","entered-in-error","draft","unknown"];function MedicationDialog(props){let me=useMedplumProfile7(),{patient,encounter,medication,onSubmit}=props,[code,setCode]=useState69(medication?.medicationCodeableConcept),handleSubmit=useCallback18(formData=>{if(!me)throw new Error("Not signed in");onSubmit(addProfileToResource2({...medication,resourceType:"MedicationRequest",status:formData.status,intent:medication?.intent??"order",encounter:medication?.encounter??(encounter&&createReference7(encounter)),requester:medication?.requester??createReference7(me),medicationCodeableConcept:code,subject:createReference7(patient)},HTTP_HL7_ORG3+"/fhir/us/core/StructureDefinition/us-core-medicationrequest"))},[me,onSubmit,medication,encounter,code,patient]);return me?jsx133(Form,{onSubmit:handleSubmit,children:jsxs76(Stack19,{children:[jsx133(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}),jsx133(Radio.Group,{name:"status",label:"Request Status",required:!0,defaultValue:medication?.status,children:statusValues.map(sv=>jsx133(Radio,{value:sv,label:sv,my:"xs",required:!0},sv))}),jsx133(Group42,{justify:"flex-end",gap:4,children:jsx133(SubmitButton,{children:"Save"})})]})}):jsx133(Alert4,{color:"red",children:"Not signed in"})}import{Fragment as Fragment40,jsx as jsx134,jsxs as jsxs77}from"react/jsx-runtime";function Medications(props){let medplum=useMedplum31(),[medicationRequests,setMedicationRequests]=useState70(props.medicationRequests),[editMedication,setEditMedication]=useState70(),[opened,{open,close}]=useDisclosure3(!1),handleSubmit=useCallback19(async medication=>{if(medication.id){let updatedMedication=await medplum.updateResource(medication);setMedicationRequests(medicationRequests.map(m=>m.id===updatedMedication.id?updatedMedication:m))}else{let newMedication=await medplum.createResource(medication);setMedicationRequests([newMedication,...medicationRequests])}setEditMedication(void 0),close()},[medplum,medicationRequests,close]);return jsxs77(Fragment40,{children:[jsx134(CollapsibleSection,{title:"Medications",onAdd:()=>{setEditMedication(void 0),open()},children:medicationRequests.length>0?jsx134(Flex8,{direction:"column",gap:8,children:medicationRequests.map(medication=>jsx134(SummaryItem,{onClick:()=>{setEditMedication(medication),open()},children:jsxs77(Box18,{children:[jsx134(Text26,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString8(medication)}),jsx134(Group43,{mt:2,gap:4,children:medication.status&&jsx134(StatusBadge,{color:getStatusColor2(medication.status),variant:"light",status:medication.status})})]})},medication.id))}):jsx134(Text26,{children:"(none)"})}),jsx134(Modal10,{opened,onClose:close,title:editMedication?"Edit Medication":"Add Medication",children:jsx134(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 Box19,Group as Group44,Text as Text27,Tooltip as Tooltip5}from"@mantine/core";import{jsx as jsx135,jsxs as jsxs78}from"react/jsx-runtime";var PatientInfoItem=props=>{let{patient,value,icon,placeholder,label,onClickResource}=props,displayText=value||placeholder;return jsx135(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:jsx135(Box19,{className:PatientSummary_default.patientSummaryListItem,children:jsx135(Tooltip5,{label,position:"top-start",openDelay:650,children:jsxs78(Group44,{gap:"sm",align:"center",ml:6,mr:2,style:{cursor:"pointer",flexWrap:"nowrap",minWidth:0},children:[icon,jsx135(Text27,{fz:"sm",fw:400,truncate:!0,c:value?"inherit":"var(--mantine-color-gray-6)",children:displayText})]})})})})};import{capitalize as capitalize5,getExtension,HTTP_HL7_ORG as HTTP_HL7_ORG4}from"@medplum/core";function getGenderIdentity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-genderIdentity`)?.valueCodeableConcept?.coding?.[0]?.display}function getBirthSex(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-birthsex`)?.valueCode}function getRace(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-race`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getEthnicity(patient){return getExtension(patient,`${HTTP_HL7_ORG4}/fhir/us/core/StructureDefinition/us-core-ethnicity`)?.extension?.find(subExt=>subExt.url==="ombCategory")?.valueCoding?.display}function getGeneralPractitioner(patient){return patient.generalPractitioner?.[0]?.display}function formatPatientGenderDisplay(patient){let capitalizedGender=patient.gender?capitalize5(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 Box20,Flex as Flex9,Group as Group46,Modal as Modal11,Text as Text28}from"@mantine/core";import{useDisclosure as useDisclosure4}from"@mantine/hooks";import{formatDate as formatDate3,getDisplayString as getDisplayString9}from"@medplum/core";import{useMedplum as useMedplum32}from"@medplum/react-hooks";import{useCallback as useCallback21,useState as useState72}from"react";import{Group as Group45,Stack as Stack20}from"@mantine/core";import{HTTP_HL7_ORG as HTTP_HL7_ORG5,HTTP_TERMINOLOGY_HL7_ORG,addProfileToResource as addProfileToResource3,createReference as createReference8}from"@medplum/core";import{useCallback as useCallback20,useState as useState71}from"react";import{jsx as jsx136,jsxs as jsxs79}from"react/jsx-runtime";function ConditionDialog(props){let{patient,encounter,condition,onSubmit}=props,[code,setCode]=useState71(condition?.code),[clinicalStatus,setClinicalStatus]=useState71(condition?.clinicalStatus),handleSubmit=useCallback20(formData=>{let updatedCondition=addProfileToResource3({...condition,resourceType:"Condition",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG+"/CodeSystem/condition-category",code:"problem-list-item",display:"Problem List Item"}],text:"Problem List Item"}],subject:createReference8(patient),encounter:encounter&&createReference8(encounter),code,clinicalStatus,onsetDateTime:formData.onsetDateTime?convertLocalToIso(formData.onsetDateTime):void 0},HTTP_HL7_ORG5+"/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns");onSubmit(updatedCondition)},[patient,encounter,condition,code,clinicalStatus,onSubmit]);return jsx136(Form,{onSubmit:handleSubmit,children:jsxs79(Stack20,{children:[jsx136(CodeableConceptInput,{name:"code",label:"Problem",path:"Condition.code","data-autofocus":!0,binding:HTTP_HL7_ORG5+"/fhir/us/core/ValueSet/us-core-condition-code",defaultValue:condition?.code,onChange:code2=>setCode(code2),outcome:void 0}),jsx136(CodeableConceptInput,{name:"clinicalStatus",label:"Status",path:"Condition.clinicalStatus",binding:HTTP_HL7_ORG5+"/fhir/ValueSet/condition-clinical",defaultValue:condition?.clinicalStatus,onChange:clinicalStatus2=>setClinicalStatus(clinicalStatus2),outcome:void 0}),jsx136(DateTimeInput,{name:"onsetDateTime",label:"Dx Date",defaultValue:condition?.onsetDateTime,required:!0}),jsx136(Group45,{justify:"flex-end",gap:4,mt:"md",children:jsx136(SubmitButton,{children:"Save"})})]})},condition?.id)}import{Fragment as Fragment41,jsx as jsx137,jsxs as jsxs80}from"react/jsx-runtime";function ProblemList(props){let medplum=useMedplum32(),{patient,encounter}=props,[problems,setProblems]=useState72(props.problems.filter(c=>c.verificationStatus?.coding?.[0]?.code!=="entered-in-error")),[editCondition,setEditCondition]=useState72(),[opened,{open,close}]=useDisclosure4(!1),handleSubmit=useCallback21(async condition=>{if(condition.id){let updatedCondition=await medplum.updateResource(condition);setProblems(problems.map(p=>p.id===updatedCondition.id?updatedCondition:p))}else{let newCondition=await medplum.createResource(condition);setProblems([newCondition,...problems])}setEditCondition(void 0),close()},[medplum,problems,close]);return jsxs80(Fragment41,{children:[jsx137(CollapsibleSection,{title:"Problems",onAdd:()=>{setEditCondition(void 0),open()},children:problems.length>0?jsx137(Flex9,{direction:"column",gap:8,children:problems.map(problem=>jsx137(SummaryItem,{onClick:()=>{setEditCondition(problem),open()},children:jsxs80(Box20,{children:[jsx137(Text28,{fw:500,className:SummaryItem_default.itemText,children:getDisplayString9(problem)}),jsxs80(Group46,{mt:2,gap:4,children:[problem.clinicalStatus?.coding?.[0]?.code&&jsx137(StatusBadge,{"data-testid":"status-badge",color:getStatusColor3(problem.clinicalStatus?.coding?.[0]?.code),variant:"light",status:problem.clinicalStatus?.coding?.[0]?.code}),jsx137(Text28,{size:"xs",fw:500,c:"dimmed",children:formatDate3(problem.onsetDateTime)})]})]})},problem.id))}):jsx137(Text28,{children:"(none)"})}),jsx137(Modal11,{opened,onClose:close,title:editCondition?"Edit Problem":"Add Problem",children:jsx137(ConditionDialog,{patient,encounter,condition:editCondition,onSubmit:handleSubmit})})]})}var getStatusColor3=status=>{if(!status)return"gray";switch(status){case"active":case"recurrence":case"relapse":return"green";case"inactive":return"orange";case"remission":return"blue";case"resolved":return"teal";default:return"gray"}};import{Box as Box21,Flex as Flex10,Group as Group47,Modal as Modal12,Radio as Radio2,Stack as Stack21,Text as Text29,UnstyledButton as UnstyledButton5}from"@mantine/core";import{useDisclosure as useDisclosure5}from"@mantine/hooks";import{createReference as createReference9,HTTP_HL7_ORG as HTTP_HL7_ORG6,HTTP_TERMINOLOGY_HL7_ORG as HTTP_TERMINOLOGY_HL7_ORG2,LOINC,SNOMED}from"@medplum/core";import{useMedplum as useMedplum33}from"@medplum/react-hooks";import{useCallback as useCallback22,useState as useState73}from"react";import{Fragment as Fragment42,jsx as jsx138,jsxs as jsxs81}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]=useState73(props.sexualOrientation),[opened,{open,close}]=useDisclosure5(!1),[hoverIndex,setHoverIndex]=useState73(null),handleSubmit=useCallback22(formData=>{let code=formData.sexualOrientation;medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG6+"/fhir/us/core/ValueSet/us-core-sexual-orientation"]},status:"final",category:[{coding:[{system:HTTP_TERMINOLOGY_HL7_ORG2+"/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC,code:"76690-7",display:"Sexual orientation"}],text:"Sexual orientation"},subject:createReference9(patient),encounter:encounter?createReference9(encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:CodesToSystem[code],code:formData.sexualOrientation}],text:CodesToText[code]}}).then(newSexualOrientation=>{setSexualOrientation(newSexualOrientation),close()}).catch(console.error)},[medplum,patient,encounter,close]);return jsxs81(Fragment42,{children:[jsx138(CollapsibleSection,{title:"Sexual Orientation",onAdd:()=>{open()},children:sexualOrientation?jsx138(Flex10,{direction:"column",gap:8,children:jsx138(Box21,{onMouseEnter:()=>setHoverIndex(0),onMouseLeave:()=>setHoverIndex(null),children:jsx138(UnstyledButton5,{"data-testid":"sexual-orientation-button",onClick:e=>{killEvent(e),props.onClickResource&&props.onClickResource(sexualOrientation)},children:jsx138(Box21,{pr:hoverIndex===0?24:0,children:jsx138(Text29,{size:"sm",fw:500,children:sexualOrientation.valueCodeableConcept?.text??"Unknown"})})})})}):jsx138(Text29,{children:"(none)"})}),jsx138(Modal12,{opened,onClose:close,title:"Set Sexual Orientation",children:jsx138(Form,{onSubmit:handleSubmit,children:jsxs81(Stack21,{children:[jsx138(Radio2.Group,{name:"sexualOrientation",label:"Sexual Orientation",required:!0,children:Object.entries(CodesToText).map(([code,text])=>jsx138(Radio2,{value:code,label:text,my:"xs"},code))}),jsx138(Group47,{justify:"flex-end",gap:4,mt:"md",children:jsx138(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group48,Modal as Modal13,Radio as Radio3,Stack as Stack22,Text as Text30,UnstyledButton as UnstyledButton6}from"@mantine/core";import{useDisclosure as useDisclosure6}from"@mantine/hooks";import{HTTP_HL7_ORG as HTTP_HL7_ORG7,LOINC as LOINC2,SNOMED as SNOMED2,createReference as createReference10,formatCodeableConcept as formatCodeableConcept5}from"@medplum/core";import{useMedplum as useMedplum34}from"@medplum/react-hooks";import{useCallback as useCallback23,useState as useState74}from"react";import{Fragment as Fragment43,jsx as jsx139,jsxs as jsxs82}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]=useState74(props.smokingStatus),[opened,{open,close}]=useDisclosure6(!1),handleSubmit=useCallback23(formData=>{medplum.createResource({resourceType:"Observation",meta:{profile:[HTTP_HL7_ORG7+"/fhir/us/core/StructureDefinition/us-core-smokingstatus"]},status:"final",category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"social-history",display:"Social History"}],text:"Social History"}],code:{coding:[{system:LOINC2,code:"72166-2",display:"Tobacco smoking status"}],text:"Tobacco smoking status"},subject:createReference10(props.patient),encounter:props.encounter?createReference10(props.encounter):void 0,effectiveDateTime:new Date().toISOString(),valueCodeableConcept:{coding:[{system:SNOMED2,version:SNOMED2+"/731000124108",code:formData.smokingStatus}],text:smokingStatusOptions[formData.smokingStatus]}}).then(newSmokingStatus=>{setSmokingStatus(newSmokingStatus),close()}).catch(console.error)},[medplum,props.patient,props.encounter,close]);return jsxs82(Fragment43,{children:[jsx139(CollapsibleSection,{title:"Smoking Status",onAdd:()=>{open()},children:smokingStatus?.valueCodeableConcept?jsx139(UnstyledButton6,{"data-testid":"smoking-status-button",onClick:()=>props.onClickResource?.(smokingStatus),children:jsx139(Text30,{children:formatCodeableConcept5(smokingStatus.valueCodeableConcept)})}):jsx139(Text30,{children:"(none)"})}),jsx139(Modal13,{opened,onClose:close,title:"Set Smoking Status",children:jsx139(Form,{onSubmit:handleSubmit,children:jsxs82(Stack22,{children:[jsx139(Radio3.Group,{name:"smokingStatus",label:"Smoking Status",required:!0,children:Object.entries(smokingStatusOptions).map(([code,text])=>jsx139(Radio3,{value:code,label:text,my:"xs"},code))}),jsx139(Group48,{justify:"flex-end",gap:4,mt:"md",children:jsx139(SubmitButton,{children:"Save"})})]})})})]})}import{Group as Group49,Modal as Modal14,SimpleGrid as SimpleGrid2,Stack as Stack23,Text as Text31,Textarea as Textarea3,TextInput as TextInput22}from"@mantine/core";import{useDisclosure as useDisclosure7}from"@mantine/hooks";import{formatQuantity as formatQuantity2}from"@medplum/core";import{useMedplum as useMedplum35}from"@medplum/react-hooks";import{useCallback as useCallback24,useState as useState75}from"react";import{LOINC as LOINC3,UCUM,createReference as createReference11}from"@medplum/core";function getObservationValue(obs,component){return component?obs.component?.find(c=>c.code?.coding?.[0].code===component)?.valueQuantity:obs.valueQuantity}function createObservation(patient,encounter,code,title,valueQuantity){if(isValidNumber(valueQuantity.value))return{...createBaseObservation(patient,encounter,code,title),valueQuantity}}function createCompoundObservation(patient,encounter,code,title,components){let component=components.filter(c=>isValidNumber(c.valueQuantity?.value));if(component.length!==0)return{...createBaseObservation(patient,encounter,code,title),component}}function createBaseObservation(patient,encounter,code,title){return{resourceType:"Observation",status:"preliminary",subject:createReference11(patient),encounter:encounter?createReference11(encounter):void 0,effectiveDateTime:new Date().toISOString(),category:[{coding:[{system:"http://terminology.hl7.org/CodeSystem/observation-category",code:"vital-signs",display:"Vital Signs"}]}],code:createLoincCode(code,title)}}function createLoincCode(code,display){return{coding:[{code,display,system:LOINC3}],text:display}}function createQuantity(value,unit){return{value,system:UCUM,unit,code:unit}}function isValidNumber(value){return value!==void 0&&!Number.isNaN(value)&&Number.isFinite(value)}import{Fragment as Fragment44,jsx as jsx140,jsxs as jsxs83}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]=useState75(props.vitals),[opened,{open,close}]=useDisclosure7(!1),handleSubmit=useCallback24(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 jsxs83(Fragment44,{children:[jsx140(CollapsibleSection,{title:"Vitals",onAdd:()=>{open()},children:jsx140(Stack23,{children:LOINC_CODES.map(meta=>{let obs=vitals.find(o=>o.code?.coding?.[0].code===meta.code);return jsxs83(Group49,{align:"center",children:[jsx140(Text31,{c:"dimmed",children:meta.short}),obs&&jsx140(Text31,{children:formatQuantity2(getObservationValue(obs,meta.component))})]},meta.name)})})}),jsx140(Modal14,{opened,onClose:close,title:"Add Vitals",children:jsxs83(Form,{onSubmit:handleSubmit,children:[jsx140(SimpleGrid2,{cols:2,children:LOINC_CODES.map((meta,index)=>jsx140(TextInput22,{name:meta.name,label:meta.short,description:`${meta.title} (${meta.unit})`,"data-autofocus":index===0,autoFocus:index===0},meta.name))}),jsx140(Textarea3,{name:"notes",label:"Notes"}),jsx140(Group49,{justify:"flex-end",gap:4,mt:"md",children:jsx140(SubmitButton,{children:"Save"})})]})})]})}import{Fragment as Fragment45,jsx as jsx141,jsxs as jsxs84}from"react/jsx-runtime";function PatientSummary(props){let medplum=useMedplum36(),{patient:propsPatient,onClickResource,onRequestLabs}=props,patient=useResource11(propsPatient),[medicalData,setMedicalData]=useState76(),[createdDate,setCreatedDate]=useState76();useEffect25(()=>{let ref=`Patient/${resolveId2(propsPatient)}`,searchMeta={_count:100,_sort:"-_lastUpdated"};Promise.all([medplum.searchResources("AllergyIntolerance",{patient:ref,...searchMeta}),medplum.searchResources("Condition",{patient:ref,...searchMeta}),medplum.searchResources("MedicationRequest",{subject:ref,...searchMeta}),medplum.searchResources("Observation",{subject:ref,...searchMeta}),medplum.searchResources("Appointment",{patient:ref,...searchMeta}),medplum.searchResources("Encounter",{subject:ref,...searchMeta}),medplum.searchResources("Coverage",{beneficiary:ref,...searchMeta}),medplum.searchResources("Immunization",{patient:ref,...searchMeta}),medplum.searchResources("Procedure",{subject:ref,...searchMeta}),medplum.searchResources("Device",{patient:ref,...searchMeta}),medplum.searchResources("Goal",{subject:ref,...searchMeta}),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]),useEffect25(()=>{patient?.id&&medplum.readHistory("Patient",patient.id).then(history=>{let lastUpdated=history.entry?.[history.entry.length-1]?.resource?.meta?.lastUpdated;setCreatedDate(typeof lastUpdated=="string"?lastUpdated:"")}).catch(()=>{})},[patient?.id,medplum]);let languageDisplay=patient?getPreferredLanguage(patient):void 0;return patient?jsxs84(Flex11,{direction:"column",gap:"xs",w:"100%",h:"100%",className:PatientSummary_default.panel,children:[jsxs84(SummaryItem,{onClick:()=>{onClickResource?.(patient)},children:[jsxs84(Group50,{align:"center",gap:"sm",p:16,children:[jsx141(ResourceAvatar,{value:patient,size:48,radius:48,style:{border:"2px solid white"}}),jsxs84(Stack24,{gap:0,style:{flex:1,minWidth:0},children:[jsx141(Tooltip6,{label:formatHumanName6(patient.name?.[0]),position:"top-start",openDelay:650,children:jsx141(Text32,{fz:"h4",fw:800,truncate:!0,style:{minWidth:0},children:formatHumanName6(patient.name?.[0])})}),(()=>{let dateString=typeof createdDate=="string"&&createdDate.length>0?createdDate:void 0;if(!dateString)return null;let d=new Date(dateString);return jsxs84(Text32,{fz:"xs",mt:-2,fw:500,c:"gray.6",truncate:!0,style:{minWidth:0},children:["Patient since ",d.getMonth()+1,"/",d.getDate(),"/",d.getFullYear()]})})()]})]}),jsx141(Divider4,{})]}),jsx141(Stack24,{gap:"xs",px:16,pt:12,pb:16,style:{flex:2,overflowY:"auto",minHeight:0},children:medicalData&&jsxs84(Fragment45,{children:[jsxs84(Stack24,{gap:"xs",py:8,children:[jsx141(PatientInfoItem,{patient,value:patient.birthDate?`${patient.birthDate} (${calculateAgeString2(patient.birthDate)})`:void 0,icon:jsx141(IconCake,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Birthdate",label:"Birthdate & Age",onClickResource}),jsx141(PatientInfoItem,{patient,value:patient.gender?formatPatientGenderDisplay(patient):void 0,icon:jsx141(IconEmpathize,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Gender & Identity",label:"Gender & Identity",onClickResource}),jsx141(PatientInfoItem,{patient,value:getRace(patient)||getEthnicity(patient)?formatPatientRaceEthnicityDisplay(patient):void 0,icon:jsx141(IconBinaryTree,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Race & Ethnicity",label:"Race & Ethnicity",onClickResource}),jsx141(PatientInfoItem,{patient,value:patient.address?.[0]?formatAddress2(patient.address[0]):void 0,icon:jsx141(IconMapPin,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Location",label:"Location",onClickResource}),jsx141(PatientInfoItem,{patient,value:languageDisplay,icon:jsx141(IconLanguage,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add Language",label:"Language",onClickResource}),jsx141(PatientInfoItem,{patient,value:getGeneralPractitioner(patient),icon:jsx141(IconStethoscope,{size:16,stroke:2,color:"var(--mantine-color-gray-6)"}),placeholder:"Add General Practitioner",label:"General Practitioner",onClickResource})]}),jsx141(Divider4,{}),jsx141(Insurance,{coverages:medicalData.coverages||[],onClickResource}),jsx141(Divider4,{}),jsx141(Allergies,{patient,allergies:medicalData.allergies,onClickResource}),jsx141(Divider4,{}),jsx141(ProblemList,{patient,problems:medicalData.problems,onClickResource}),jsx141(Divider4,{}),jsx141(Medications,{patient,medicationRequests:medicalData.medicationRequests,onClickResource}),jsx141(Divider4,{}),jsx141(Labs,{patient,serviceRequests:medicalData.serviceRequests,diagnosticReports:medicalData.diagnosticReports,onClickResource,onRequestLabs}),jsx141(Divider4,{}),jsx141(SexualOrientation,{patient,sexualOrientation:medicalData.sexualOrientation,onClickResource}),jsx141(Divider4,{}),jsx141(SmokingStatus,{patient,smokingStatus:medicalData.smokingStatus,onClickResource}),jsx141(Divider4,{}),jsx141(Vitals,{patient,vitals:medicalData.vitals,onClickResource}),jsx141(Divider4,{})]})})]}):null}import{createReference as createReference12}from"@medplum/core";import{useCallback as useCallback25}from"react";import{jsx as jsx142}from"react/jsx-runtime";function PatientTimeline(props){let{patient,...rest}=props,loadTimelineResources=useCallback25((medplum,resourceType,id)=>{let ref=`${resourceType}/${id}`,_count=100;return Promise.allSettled([medplum.readHistory("Patient",id),medplum.search("Communication",{subject:ref,_count}),medplum.search("Device",{patient:ref,_count}),medplum.search("DeviceRequest",{patient:ref,_count}),medplum.search("DiagnosticReport",{subject:ref,_count}),medplum.search("Media",{subject:ref,_count}),medplum.search("ServiceRequest",{subject:ref,_count}),medplum.search("Task",{subject:ref,_count})])},[]);return jsx142(ResourceTimeline,{value:patient,loadTimelineResources,createCommunication:(resource,sender,text)=>({resourceType:"Communication",status:"completed",subject:createReference12(resource),sender:createReference12(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",subject:createReference12(resource),operator:createReference12(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor7,Box as Box22,Button as Button15,CloseButton,Flex as Flex12,Group as Group51,Loader as Loader6,NativeSelect as NativeSelect11,Paper as Paper4,Stack as Stack25,Text as Text33,TextInput as TextInput23}from"@mantine/core";import{getReferenceString as getReferenceString7}from"@medplum/core";import{useMedplum as useMedplum37,useResource as useResource12}from"@medplum/react-hooks";import{useEffect as useEffect26,useRef as useRef19,useState as useState77}from"react";var PlanDefinitionBuilder_default={section:"PlanDefinitionBuilder_section",hovering:"PlanDefinitionBuilder_hovering",editing:"PlanDefinitionBuilder_editing"};import{jsx as jsx143,jsxs as jsxs85}from"react/jsx-runtime";function PlanDefinitionBuilder(props){let medplum=useMedplum37(),defaultValue2=useResource12(props.value),[schemaLoaded,setSchemaLoaded]=useState77(!1),[selectedKey,setSelectedKey]=useState77(),[hoverKey,setHoverKey]=useState77(),[value,setValue]=useState77();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}let valueRef=useRef19(value);if(valueRef.current=value,useEffect26(()=>{medplum.requestSchema("PlanDefinition").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect26(()=>(setValue(ensurePlanDefinitionKeys(defaultValue2??{resourceType:"PlanDefinition",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]),!schemaLoaded||!value)return null;function changeProperty(property,newValue){setValue({...valueRef.current,[property]:newValue})}return jsx143("div",{children:jsxs85(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx143(TextInput23,{label:"Plan Title",py:"md",defaultValue:value.title,onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx143(ActionArrayBuilder,{actions:value.action||[],selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:x=>changeProperty("action",x)}),jsx143(SubmitButton,{children:"Save"})]})})}function ActionArrayBuilder(props){let actionsRef=useRef19(props.actions);actionsRef.current=props.actions;function changeAction(changedAction){props.onChange(actionsRef.current.map(i=>i.id===changedAction.id?changedAction:i))}function addAction(addedAction){props.onChange([...actionsRef.current,addedAction]),props.setSelectedKey(addedAction.id)}function removeAction(removedAction){props.onChange(actionsRef.current.filter(i=>i!==removedAction))}return jsxs85(Stack25,{gap:"md",className:PlanDefinitionBuilder_default.section,children:[props.actions.map(action=>jsx143(ActionBuilder,{action,selectedKey:props.selectedKey,setSelectedKey:props.setSelectedKey,hoverKey:props.hoverKey,setHoverKey:props.setHoverKey,onChange:changeAction,onRemove:()=>removeAction(action)},action.id)),jsx143("div",{children:jsx143(Button15,{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 jsx143("div",{onClick,onMouseOver:onHover,onFocus:onHover,children:jsx143(ActionEditor,{action,onChange:props.onChange,selectedKey:props.selectedKey,hoverKey:props.hoverKey,onRemove:props.onRemove})})}function ActionEditor(props){let{action}=props,[actionType,setActionType]=useState77(),medplum=useMedplum37(),[loading,setLoading]=useState77(!1),[resource,setResource]=useState77(),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 useEffect26(()=>{(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?jsx143(Loader6,{}):jsxs85(Paper4,{"data-testid":action.id,className,p:0,radius:"sm",withBorder:!0,children:[jsxs85(Flex12,{w:"100%",p:"xs",bg:"gray.0",gap:"md",align:"center",justify:"space-between",children:[jsx143(TextInput23,{w:"100%",name:`actionTitle-${action.id}`,defaultValue:action.title,placeholder:"Title",onChange:e=>changeProperty("title",e.currentTarget.value)}),jsx143(CloseButton,{"data-testid":"close-button",onClick:props.onRemove})]}),editing&&jsxs85(Stack25,{gap:"xl",p:"md",children:[jsx143(Box22,{children:jsx143(TextInput23,{label:"Task Description",placeholder:"Enter task description",name:`actionDescription-${action.id}`,defaultValue:action.description,onChange:e=>changeProperty("description",e.currentTarget.value)})}),jsx143(Box22,{children:jsx143(NativeSelect11,{label:"Type of Action",value:actionType,onChange:e=>{let value=e.currentTarget.value==="standard"?void 0:e.currentTarget.value;setActionType(value),props.onChange({...props.action,definitionCanonical:value==="standard"?void 0:props.action.definitionCanonical})},data:[{value:"standard",label:"Standard task"},{value:"questionnaire",label:"Task with Questionnaire"},{value:"activitydefinition",label:"Task with Activity Definition"}]})}),actionType==="questionnaire"&&jsxs85(Stack25,{gap:0,children:[jsxs85(Group51,{gap:0,mb:"xs",children:[jsx143(Text33,{fw:600,children:"Select questionnaire"}),jsx143(Text33,{c:"red",children:"*"})]}),jsxs85(Text33,{size:"sm",c:"dimmed",mb:"sm",children:["Questionnaire to be shown in the task in Encounter view. You can create new one from"," ",jsx143(Anchor7,{href:"/Questionnaire",target:"_blank",c:"blue",children:"questionnaires list"})]}),jsx143(ActionResourceTypeBuilder,{resource,resourceType:"Questionnaire",action,onChange:props.onChange,placeholder:"Search for questionnaire"})]}),actionType==="activitydefinition"&&jsxs85(Stack25,{gap:0,children:[jsxs85(Group51,{gap:0,mb:"xs",children:[jsx143(Text33,{fw:600,children:"Select activity definition"}),jsx143(Text33,{c:"red",children:"*"})]}),jsxs85(Text33,{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"," ",jsx143(Anchor7,{href:"/ActivityDefinition",target:"_blank",c:"blue",children:"activity definitions list"})]}),jsx143(ActionResourceTypeBuilder,{resource,resourceType:"ActivityDefinition",action,onChange:props.onChange,placeholder:"Search for activity definition"})]})]})]})}function ActionResourceTypeBuilder(props){let{id}=props.action,{resource}=props;return jsx143(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:getReferenceString7(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 Anchor8,Box as Box23,Group as Group53,NativeSelect as NativeSelect13,Space as Space2,Textarea as Textarea5,TextInput as TextInput25,Title as Title8}from"@mantine/core";import{getElementDefinition as getElementDefinition3,isResource as isResourceType}from"@medplum/core";import{getQuestionnaireItemReferenceTargetTypes as getQuestionnaireItemReferenceTargetTypes2,isChoiceQuestion,QUESTIONNAIRE_ITEM_CONTROL_URL as QUESTIONNAIRE_ITEM_CONTROL_URL2,QuestionnaireItemType as QuestionnaireItemType2,setQuestionnaireItemReferenceTargetTypes,useMedplum as useMedplum39,useResource as useResource13}from"@medplum/react-hooks";import{useEffect as useEffect28,useRef as useRef20,useState as useState79}from"react";import{Checkbox as Checkbox6,Group as Group52,MultiSelect as MultiSelect2,NativeSelect as NativeSelect12,Radio as Radio4,Text as Text34,Textarea as Textarea4,TextInput as TextInput24}from"@mantine/core";import{capitalize as capitalize6,deepEquals as deepEquals2,formatCoding as formatCoding2,getElementDefinition as getElementDefinition2,getExtension as getExtension2,HTTP_HL7_ORG as HTTP_HL7_ORG8,stringify as stringify3,typedValueToString}from"@medplum/core";import{getItemAnswerOptionValue,getItemInitialValue,getNewMultiSelectValues,getQuestionnaireItemReferenceFilter,getQuestionnaireItemReferenceTargetTypes,QUESTIONNAIRE_ITEM_CONTROL_URL,QuestionnaireItemType,useMedplum as useMedplum38}from"@medplum/react-hooks";import{useEffect as useEffect27,useState as useState78}from"react";import{Fragment as Fragment46,jsx as jsx144,jsxs as jsxs86}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){formState&&props.context&&formState.onChangeAnswer(props.context,props.item,newResponseAnswer)}let type=item.type;if(!type)return null;let name=item.linkId;if(!name)return null;let initial;item.initial&&item.initial.length>0?initial=item.initial[0]:item.answerOption&&item.answerOption.length>0&&(initial=item.answerOption.find(option=>option.initialSelected));let defaultValue2=getCurrentAnswer(response,props.index)??getItemInitialValue(initial),validationError=getExtension2(response,`${HTTP_HL7_ORG8}/fhir/StructureDefinition/questionnaire-validationError`),formComponent=null;switch(type){case QuestionnaireItemType.display:formComponent=jsx144("p",{children:props.item.text},props.item.linkId);break;case QuestionnaireItemType.boolean:formComponent=jsx144(CheckboxFormSection,{title:props.item.text,htmlFor:props.item.linkId,children:jsx144(Checkbox6,{id:props.item.linkId,name:props.item.linkId,required:props.required??item.required,defaultChecked:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueBoolean:e.currentTarget.checked}])})},props.item.linkId);break;case QuestionnaireItemType.decimal:formComponent=jsx144(TextInput24,{type:"number",step:"any",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueDecimal:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.integer:formComponent=jsx144(TextInput24,{type:"number",step:1,id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer(e.currentTarget.value===""?[]:[{valueInteger:e.currentTarget.valueAsNumber}])});break;case QuestionnaireItemType.date:formComponent=jsx144(TextInput24,{type:"date",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueDate:e.currentTarget.value}])});break;case QuestionnaireItemType.dateTime:formComponent=jsx144(DateTimeInput,{name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueDateTime:newValue}])});break;case QuestionnaireItemType.time:formComponent=jsx144(TextInput24,{type:"time",id:name,name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:e=>onChangeAnswer([{valueTime:e.currentTarget.value}])});break;case QuestionnaireItemType.string:case QuestionnaireItemType.url:formComponent=jsx144(TextInput24,{id:name,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=jsx144(Textarea4,{id:name,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=jsx144(Group52,{py:4,children:jsx144(AttachmentInput,{path:"",name,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueAttachment:newValue}])})});break;case QuestionnaireItemType.reference:formComponent=jsx144(ReferenceInput,{name,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=jsx144(QuantityInput,{path:"",name,required:props.required??item.required,defaultValue:defaultValue2?.value,onChange:newValue=>onChangeAnswer([{valueQuantity:newValue}]),disableWheel:!0});break;case QuestionnaireItemType.choice:case QuestionnaireItemType.openChoice:isCheckboxChoice(item)?formComponent=jsx144(QuestionnaireCheckboxInput,{name,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):isDropdownChoice(item)||item.answerValueSet&&!isRadiobuttonChoice(item)?formComponent=jsx144(QuestionnaireDropdownInput,{name,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)}):formComponent=jsx144(QuestionnaireRadioButtonInput,{name,item,required:props.required??item.required,initial,response,onChangeAnswer:e=>onChangeAnswer(e)});break;default:return null}return jsxs86(Fragment46,{children:[formComponent,validationError?.valueString&&jsx144(Text34,{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 jsx144(NoAnswerDisplay,{});let initialValue=getItemInitialValue(initial),defaultValue2=getCurrentAnswer(response)??initialValue,currentAnswer=getCurrentMultiSelectAnswer(response),isMultiSelect=item.repeats||isMultiSelectChoice(item);if(item.answerValueSet)return jsx144(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 jsx144(MultiSelect2,{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 jsx144(NativeSelect12,{id:name,name,required,onChange:e=>{let index=e.currentTarget.selectedIndex;if(index===0){onChangeAnswer([{}]);return}let option=item.answerOption[index-1],optionValue=getItemAnswerOptionValue(option),propertyName="value"+capitalize6(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])},defaultValue:formatCoding2(defaultValue2?.value)||defaultValue2?.value,data:data2})}}function getValueSetOptions(valueSetUrl,medplum){return valueSetUrl?medplum.valueSetExpand({url:valueSetUrl,count:MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS+1}).then(valueSet=>valueSet.expansion?.contains??[]):Promise.resolve([])}function useValueSetOptions(valueSetUrl){let medplum=useMedplum38(),[valueSetOptions,setValueSetOptions]=useState78([]),[isLoading,setIsLoading]=useState78(!1);return useEffect27(()=>{async function loadValueSet(){if(valueSetUrl){setIsLoading(!0);try{let options=await getValueSetOptions(valueSetUrl,medplum);setValueSetOptions(options)}catch(err){console.error("Error loading value set:",err)}finally{setIsLoading(!1)}}}loadValueSet().catch(console.error)},[valueSetUrl,medplum]),[valueSetOptions,isLoading]}function getOptionsFromValueSet(valueSetOptions,name){return valueSetOptions.map((option,i)=>{let optionName=`${name}-valueset-${i}`,optionValue={type:"Coding",value:{system:option.system,code:option.code,display:option.display}};return[optionName,optionValue]})}function QuestionnaireRadioButtonInput(props){let{name,item,required,initial,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition2("QuestionnaireItemAnswerOption","value[x]"),initialValue=getItemInitialValue(initial),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),options=[],defaultValue2;if(item.answerValueSet)options.push(...getOptionsFromValueSet(valueSetOptions,name));else if(item.answerOption){let mappedOptions=item.answerOption.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_EXPLICITOPTION_OPTIONS).map((option,i)=>{let optionName=`${name}-option-${i}`,optionValue=getItemAnswerOptionValue(option);return optionValue?.value?(initialValue&&stringify3(optionValue)===stringify3(initialValue)&&(defaultValue2=optionName),[optionName,optionValue]):null}).filter(option=>option!==null);options.push(...mappedOptions)}let defaultAnswer=getCurrentAnswer(response),answerLinkId=getCurrentRadioAnswer(options,defaultAnswer);if(isLoading)return jsx144(Text34,{children:"Loading options..."});if(options.length===0)return jsx144(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS);return jsxs86(Fragment46,{children:[jsx144(Radio4.Group,{name,value:answerLinkId??defaultValue2,required,onChange:newValue=>{let option=options.find(option2=>option2[0]===newValue);if(option){let optionValue=option[1],propertyName="value"+capitalize6(optionValue.type);onChangeAnswer([{[propertyName]:optionValue.value}])}},children:limitedOptions.map(([optionName,optionValue])=>jsx144(Radio4,{id:optionName,value:optionName,py:4,required,label:jsx144(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)&&jsxs86(Text34,{size:"sm",c:"dimmed",mt:"xs",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function QuestionnaireCheckboxInput(props){let{name,item,onChangeAnswer,response}=props,valueElementDefinition=getElementDefinition2("QuestionnaireItemAnswerOption","value[x]"),[valueSetOptions,isLoading]=useValueSetOptions(item.answerValueSet),initialSelectedValues=item.answerValueSet?(response?.answer?.map(a=>a.valueCoding)||[]).filter(c=>c!==void 0):getCurrentMultiSelectAnswer(response),[selectedValues,setSelectedValues]=useState78(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 jsx144(Text34,{children:"Loading options..."});if(options.length===0)return jsx144(NoAnswerDisplay,{});let limitedOptions=options.slice(0,MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS),handleCheckboxChange=(optionValue,selected)=>{if(item.answerValueSet){let currentCodings=selectedValues,newCodings;selected?newCodings=[...currentCodings,optionValue.value]:newCodings=currentCodings.filter(c=>!deepEquals2(c,optionValue.value)),setSelectedValues(newCodings),newCodings.length===0?onChangeAnswer([{}]):onChangeAnswer(newCodings.map(coding=>({valueCoding:coding})))}else{let currentValues=selectedValues,optionValueStr=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"+capitalize6(optionValue.type),item);onChangeAnswer(values)}}};return jsxs86(Group52,{style:{flexDirection:"column",alignItems:"flex-start"},children:[limitedOptions.map(([optionName,optionValue])=>{let optionValueStr=typedValueToString(optionValue),isChecked=item.answerValueSet?selectedValues.some(coding=>deepEquals2(coding,optionValue.value)):selectedValues.includes(optionValueStr);return jsx144(Checkbox6,{id:optionName,label:jsx144(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)&&jsxs86(Text34,{size:"sm",c:"dimmed",children:["Showing first ",MAX_DISPLAYED_CHECKBOX_RADIO_VALUE_SET_OPTIONS," options"]})]})}function NoAnswerDisplay(){return jsx144(TextInput24,{disabled:!0,placeholder:"No Answers Defined"})}function getCurrentAnswer(response,index=0){return getItemAnswerOptionValue(response?.answer?.[index]??{})}function getCurrentMultiSelectAnswer(response){let results=response?.answer;return results?results.map(a=>getItemAnswerOptionValue(a)).map(type=>formatCoding2(type?.value)||type?.value).filter(Boolean):[]}function getCurrentRadioAnswer(options,defaultAnswer){return options.find(option=>deepEquals2(option[1].value,defaultAnswer?.value))?.[0]}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"+capitalize6(optionValue.type),data2=(item.answerOption??[]).map(answerOption=>{let answerOptionValue=getItemAnswerOptionValue(answerOption),answerOptionValueStr=typedValueToString(answerOptionValue);return{value:answerOptionValueStr,label:answerOptionValueStr}});return{propertyName,data:data2}}var QuestionnaireBuilder_default={section:"QuestionnaireBuilder_section",hovering:"QuestionnaireBuilder_hovering",editing:"QuestionnaireBuilder_editing",questionBody:"QuestionnaireBuilder_questionBody",topActions:"QuestionnaireBuilder_topActions",bottomActions:"QuestionnaireBuilder_bottomActions",movementActions:"QuestionnaireBuilder_movementActions",movementIcons:"QuestionnaireBuilder_movementIcons",columnAlignment:"QuestionnaireBuilder_columnAlignment",linkIdInput:"QuestionnaireBuilder_linkIdInput",typeSelect:"QuestionnaireBuilder_typeSelect",preserveBreaks:"QuestionnaireBuilder_preserveBreaks"};import{Fragment as Fragment47,jsx as jsx145,jsxs as jsxs87}from"react/jsx-runtime";function QuestionnaireBuilder(props){let medplum=useMedplum39(),defaultValue2=useResource13(props.questionnaire),[schemaLoaded,setSchemaLoaded]=useState79(!1),[value,setValue]=useState79(),[selectedKey,setSelectedKey]=useState79(),[hoverKey,setHoverKey]=useState79();function handleDocumentMouseOver(){setHoverKey(void 0)}function handleDocumentClick(){setSelectedKey(void 0)}useEffect28(()=>{medplum.requestSchema("Questionnaire").then(()=>setSchemaLoaded(!0)).catch(console.log)},[medplum]),useEffect28(()=>(setValue(ensureQuestionnaireKeys(defaultValue2??{resourceType:"Questionnaire",status:"active"})),document.addEventListener("mouseover",handleDocumentMouseOver),document.addEventListener("click",handleDocumentClick),()=>{document.removeEventListener("mouseover",handleDocumentMouseOver),document.removeEventListener("click",handleDocumentClick)}),[defaultValue2]);let handleChange=(questionnaire,disableSubmit)=>{setValue(questionnaire),props.autoSave&&!disableSubmit&&props.onSubmit&&props.onSubmit(questionnaire)};return!schemaLoaded||!value?null:jsx145("div",{children:jsxs87(Form,{testid:"questionnaire-form",onSubmit:()=>props.onSubmit(value),children:[jsx145(ItemBuilder,{item:value,selectedKey,setSelectedKey,hoverKey,setHoverKey,onChange:handleChange}),jsx145(SubmitButton,{children:"Save"})]})})}function ItemBuilder(props){let resource=props.item,item=props.item,isResource2=isResourceType(props.item),isContainer=isResource2||item.type===QuestionnaireItemType2.group,linkId=item.linkId??"[untitled]",editing=props.selectedKey===props.item.id,hovering=props.hoverKey===props.item.id,itemRef=useRef20(props.item);itemRef.current=props.item;function onClick(e){killEvent(e),props.setSelectedKey(props.item.id)}function onHover(e){killEvent(e),props.setHoverKey(props.item.id)}function changeItem(changedItem){let curr=itemRef.current;props.onChange({...curr,item:curr.item?.map(i=>i.id===changedItem.id?changedItem:i)})}function addItem(addedItem,disableSubmit){props.onChange({...props.item,item:[...props.item.item??[],addedItem]},disableSubmit)}function removeItem(removedItem){props.onChange({...props.item,item:props.item.item?.filter(i=>i!==removedItem)})}function changeProperty(property,value){props.onChange({...itemRef.current,[property]:value})}function updateItem(updatedItem){props.onChange({...props.item,...updatedItem})}function toggleRepeatable(item2){props.onChange({...props.item,item:props.item.item?.map(i=>i===item2?{...i,repeats:!i.repeats}:i)})}function moveItem(itemIndex,delta){let updatedItems=reorderItems(props.item.item,itemIndex,delta);props.onChange({...props.item,item:updatedItems})}let className=clsx_default(QuestionnaireBuilder_default.section,{[QuestionnaireBuilder_default.editing]:editing,[QuestionnaireBuilder_default.hovering]:hovering&&!editing});return jsxs87("div",{"data-testid":item.linkId,className,onClick,onMouseOver:onHover,onFocus:onHover,children:[jsx145("div",{className:QuestionnaireBuilder_default.questionBody,children:editing?jsxs87(Fragment47,{children:[isResource2&&jsx145(TextInput25,{size:"xl",defaultValue:resource.title,onBlur:e=>changeProperty("title",e.currentTarget.value)}),!isResource2&&jsx145(Textarea5,{autosize:!0,minRows:2,defaultValue:item.text,onBlur:e=>changeProperty("text",e.currentTarget.value)}),item.type==="reference"&&jsx145(ReferenceProfiles,{item,onChange:updateItem}),isChoiceQuestion(item)&&jsx145(AnswerBuilder,{item,onChange:item2=>updateItem(item2)})]}):jsxs87(Fragment47,{children:[resource.title&&jsx145(Title8,{children:resource.title}),item.text&&jsx145("div",{className:QuestionnaireBuilder_default.preserveBreaks,children:item.text}),!isContainer&&jsx145(QuestionnaireFormItem,{item,index:0,required:!1,responseItem:{linkId:item.linkId}})]})}),item.item?.map((item2,i)=>jsx145("div",{children:jsx145(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&&jsx145("div",{className:QuestionnaireBuilder_default.topActions,children:editing?jsxs87(Fragment47,{children:[jsx145(TextInput25,{size:"xs",className:QuestionnaireBuilder_default.linkIdInput,defaultValue:item.linkId,onBlur:e=>changeProperty("linkId",e.currentTarget.value)}),!isContainer&&jsx145(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"}]})]}):jsx145("div",{children:linkId})}),!isResource2&&jsx145(Box23,{className:QuestionnaireBuilder_default.movementActions,children:jsxs87(Box23,{className:QuestionnaireBuilder_default.columnAlignment,children:[!props.isFirst&&jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveUp&&props.onMoveUp()},children:jsx145(IconArrowUp,{"data-testid":"up-button",size:15,className:QuestionnaireBuilder_default.movementIcons})}),!props.isLast&&jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),props.onMoveDown&&props.onMoveDown()},children:jsx145(IconArrowDown,{"data-testid":"down-button",size:15,className:QuestionnaireBuilder_default.movementIcons})})]})}),jsxs87("div",{className:QuestionnaireBuilder_default.bottomActions,children:[isContainer&&jsxs87(Fragment47,{children:[jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("q"),type:"string",text:"Question"})},children:"Add item"}),jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),addItem({id:generateId2(),linkId:generateLinkId("g"),type:"group",text:"Group"},!0)},children:"Add group"})]}),isResource2&&jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),addItem(createPage(),!0)},children:"Add Page"}),editing&&!isResource2&&jsxs87(Fragment47,{children:[jsx145(Anchor8,{href:"#",onClick:e=>{e.preventDefault(),props.onRepeatable&&props.onRepeatable(item)},children:item.repeats?"Remove Repeatable":"Make Repeatable"}),jsx145(Anchor8,{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 jsxs87("div",{children:[props.item.answerValueSet!==void 0?jsx145(TextInput25,{placeholder:"Enter Value Set",defaultValue:props.item.answerValueSet,onChange:e=>props.onChange({...props.item,answerValueSet:e.target.value})}):jsx145(AnswerOptionsInput,{options,property,item:props.item,onChange:props.onChange}),jsxs87(Box23,{display:"flex",children:[jsx145(Anchor8,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerValueSet:void 0,answerOption:[...options,{id:generateId2()}]})},children:"Add choice"}),jsx145(Space2,{w:"lg"}),jsx145(Anchor8,{href:"#",onClick:e=>{killEvent(e),props.onChange({...props.item,answerOption:[],answerValueSet:""})},children:"Add value set"})]})]})}function AnswerOptionsInput(props){return jsx145("div",{children:props.options.map(option=>{let[propertyValue,propertyType]=getValueAndType({type:"QuestionnaireItemAnswerOption",value:option},"value");return jsxs87("div",{style:{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",width:"80%"},children:[jsx145("div",{children:jsx145(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)}),jsx145("div",{children:jsx145(Anchor8,{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 jsxs87(Fragment47,{children:[targetTypes.map((targetType,index)=>jsxs87(Group53,{children:[jsx145(ResourceTypeInput,{name:"resourceType",placeholder:"Resource Type",defaultValue:targetType,onChange:newValue=>{props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.map(t=>t===targetType?newValue:t)))}}),jsx145(Anchor8,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,targetTypes.filter(t=>t!==targetType)))},children:"Remove"})]},`${targetType}-${index}`)),jsx145(Anchor8,{href:"#",onClick:e=>{killEvent(e),props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item,[...targetTypes,""]))},children:"Add Resource Type"})]})}var nextLinkId=1,nextId2=1;function generateLinkId(prefix){return prefix+nextLinkId++}function generateId2(){return"id-"+nextId2++}function ensureQuestionnaireKeys(questionnaire){return{...questionnaire,id:questionnaire.id||generateId2(),item:ensureQuestionnaireItemKeys(questionnaire.item)}}function ensureQuestionnaireItemKeys(items){if(items)return items.forEach(item=>{item.id?.match(/^id-\d+$/)&&(nextId2=Math.max(nextId2,Number.parseInt(item.id.substring(3),10)+1)),item.linkId?.match(/^q\d+$/)&&(nextLinkId=Math.max(nextLinkId,Number.parseInt(item.linkId.substring(1),10)+1))}),items.map(item=>({...item,id:item.id||generateId2(),item:ensureQuestionnaireItemKeys(item.item),answerOption:ensureQuestionnaireOptionKeys(item.answerOption)}))}function ensureQuestionnaireOptionKeys(options){if(options)return options.map(option=>({...option,id:option.id||generateId2()}))}function createPage(){return{id:generateId2(),linkId:generateLinkId("s"),type:"group",text:"New Page",extension:[{url:QUESTIONNAIRE_ITEM_CONTROL_URL2,valueCodeableConcept:{coding:[{system:"http://hl7.org/fhir/questionnaire-item-control",code:"page"}]}}]}}function reorderItems(items,itemIndex,delta){let currentItems=items??[],newIndex=itemIndex+delta;if(newIndex<0||newIndex>=currentItems.length)return currentItems;let updatedItems=[...currentItems];return[updatedItems[itemIndex],updatedItems[newIndex]]=[updatedItems[newIndex],updatedItems[itemIndex]],updatedItems}import{Group as Group55,Stack as Stack28,Text as Text35,Title as Title10}from"@mantine/core";import{createReference as createReference14,getExtension as getExtension3,getReferenceString as getReferenceString8}from"@medplum/core";import{QUESTIONNAIRE_SIGNATURE_REQUIRED_URL,QUESTIONNAIRE_SIGNATURE_RESPONSE_URL,useMedplum as useMedplum41,useQuestionnaireForm}from"@medplum/react-hooks";import{useCallback as useCallback26,useMemo as useMemo30,useRef as useRef22,useState as useState80}from"react";import{Button as Button16,Paper as Paper5}from"@mantine/core";import{createReference as createReference13,HTTP_HL7_ORG as HTTP_HL7_ORG9}from"@medplum/core";import{useMedplum as useMedplum40}from"@medplum/react-hooks";import{useEffect as useEffect29,useRef as useRef21}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){switch(type){case"image/svg+xml":return typeof encoderOptions!="object"&&(encoderOptions=void 0),`data:image/svg+xml;base64,${btoa(this.toSVG(encoderOptions))}`;default:return 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 jsx146,jsxs as jsxs88}from"react/jsx-runtime";function SignatureInput(props){let medplum=useMedplum40(),{width=500,height=200,defaultValue:defaultValue2,who,onChange,...rest}=props,canvasRef=useRef21(null),signaturePadRef=useRef21(null),onChangeRef=useRef21(onChange);return onChangeRef.current=onChange,useEffect29(()=>{function handleEndStroke(){onChangeRef.current?.({type:[{system:HTTP_HL7_ORG9+"/fhir/signature-type",code:"ProofOfOrigin",display:"Proof of Origin"}],when:new Date().toISOString(),who:who??createReference13(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]),jsxs88(Paper5,{withBorder:!0,p:0,w:width,h:height,pos:"relative",...rest,children:[jsx146("canvas",{ref:canvasRef,width,height,"aria-label":"Signature input area"}),jsx146(Button16,{onClick:()=>{signaturePadRef.current&&signaturePadRef.current.clear(),onChangeRef.current?.(void 0)},"aria-label":"Clear signature",pos:"absolute",top:0,right:0,size:"xs",leftSection:jsx146(IconTrash,{size:16}),variant:"subtle",color:"gray",children:"Clear"})]})}import{Stack as Stack27}from"@mantine/core";import{isQuestionEnabled,QuestionnaireItemType as QuestionnaireItemType4}from"@medplum/react-hooks";import{Title as Title9}from"@mantine/core";import{jsx as jsx147,jsxs as jsxs89}from"react/jsx-runtime";function QuestionnaireFormGroup(props){let newContext=[...props.context,props.responseItem];return jsxs89("div",{children:[props.item.text&&jsx147(Title9,{order:3,mb:"md",children:props.item.text}),jsx147(QuestionnaireFormItemArray,{formState:props.formState,context:newContext,items:props.item.item??[],responseItems:props.responseItem.item??[]})]},props.item.linkId)}import{Anchor as Anchor9}from"@mantine/core";import{Fragment as Fragment48,jsx as jsx148,jsxs as jsxs90}from"react/jsx-runtime";function QuestionnaireFormRepeatableGroup(props){return jsxs90(Fragment48,{children:[props.responseItems.map(response=>jsx148(QuestionnaireFormGroup,{formState:props.formState,context:props.context,item:props.item,responseItem:response},`group-${response.id}`)),jsx148(Anchor9,{onClick:()=>props.formState.onAddGroup(props.context,props.item),children:`Add Group: ${props.item.text}`})]})}import{Anchor as Anchor10,Stack as Stack26}from"@mantine/core";import{QuestionnaireItemType as QuestionnaireItemType3}from"@medplum/react-hooks";import{jsx as jsx149,jsxs as jsxs91}from"react/jsx-runtime";function QuestionnaireFormRepeatableItem(props){let{formState,context,item,responseItem}=props,showAddButton=item.type!==QuestionnaireItemType3.choice&&item.type!==QuestionnaireItemType3.openChoice,answers=responseItem.answer&&responseItem.answer.length>0?responseItem.answer:[{}];return jsxs91(FormSection,{htmlFor:props.item.linkId,title:props.item.text,withAsterisk:props.item.required,children:[jsx149(Stack26,{gap:"xs",children:answers?.map((_,index)=>jsx149(QuestionnaireFormItem,{formState,context,item,responseItem,index},`${item.linkId}-${index}`))}),showAddButton&&jsx149(Anchor10,{onClick:()=>formState.onAddAnswer(context,item),children:"Add Item"})]},props.item.linkId)}import{jsx as jsx150}from"react/jsx-runtime";function QuestionnaireFormItemArray(props){let{formState,context,items,responseItems}=props;return jsx150(Stack27,{children:items.map((item,index)=>{if(!isQuestionEnabled(item,formState.questionnaireResponse))return null;if(item.type===QuestionnaireItemType4.display)return jsx150("p",{children:item.text},`display-${item.id}-${index}`);let filteredResponseItems=responseItems.filter(responseItem=>responseItem.linkId===item.linkId);return item.type===QuestionnaireItemType4.group&&item.repeats?jsx150(QuestionnaireFormRepeatableGroup,{formState,context,item,responseItems:filteredResponseItems},`repeating-group-${item.id}-${index}`):item.type===QuestionnaireItemType4.group?jsx150(QuestionnaireFormGroup,{formState,context,item,responseItem:filteredResponseItems[0]},`group-${item.id}-${index}`):item.type===QuestionnaireItemType4.boolean?jsx150(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0},`boolean-item-${item.id}-${index}`):item.repeats?jsx150(QuestionnaireFormRepeatableItem,{formState,context,item,responseItem:filteredResponseItems[0]},`repeating-item-${item.id}-${index}`):jsx150(FormSection,{htmlFor:item.linkId,title:item.text,withAsterisk:item.required,children:jsx150(QuestionnaireFormItem,{formState,context,item,responseItem:filteredResponseItems[0],index:0})},`repeating-item-${item.id}-${index}`)})})}import{Button as Button17,Group as Group54,Stepper}from"@mantine/core";import{Fragment as Fragment49,jsx as jsx151,jsxs as jsxs92}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 jsxs92(Fragment49,{children:[jsx151(Stepper,{active:activePage,allowNextStepsSelect:!1,p:6,children:pages.map((page,index)=>jsx151(Stepper.Step,{label:page.title,children:index===activePage&&children},page.linkId))}),!excludeButtons&&jsxs92(Group54,{justify:"flex-end",mt:"xl",gap:"xs",children:[showBackButton&&jsx151(Button17,{onClick:formState.onPrevPage,children:"Back"}),showNextButton&&jsx151(Button17,{onClick:e=>{e.currentTarget.closest("form").reportValidity()&&formState.onNextPage()},children:"Next"}),showSubmitButton&&jsx151(SubmitButton,{children:submitButtonText??"Submit"})]})]})}import{Fragment as Fragment50,jsx as jsx152,jsxs as jsxs93}from"react/jsx-runtime";function QuestionnaireForm(props){let medplum=useMedplum41(),[signatureRequiredSubmitted,setSignatureRequiredSubmitted]=useState80(!1),propsRef=useRef22(props);propsRef.current=props;let onFormChange=useCallback26(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=useRef22(formState);formStateRef.current=formState;let isSignatureRequired=useMemo30(()=>formState.loading?!1:!!getExtension3(formState.questionnaire,QUESTIONNAIRE_SIGNATURE_REQUIRED_URL),[formState]),hasSignature=useMemo30(()=>formState.loading?!1:!!formState.questionnaireResponse.extension?.find(ext=>ext.url===QUESTIONNAIRE_SIGNATURE_RESPONSE_URL),[formState]),handleSubmit=useCallback26(()=>{let formState2=formStateRef.current;if(formState2.loading)return;let onSubmit=propsRef.current.onSubmit;if(!onSubmit)return;if(isSignatureRequired&&!hasSignature){setSignatureRequiredSubmitted(!0);return}let questionnaire=formState2.questionnaire,response=formState2.questionnaireResponse,subject=propsRef.current.subject,source=propsRef.current.source;if(!source){let profile=medplum.getProfile();profile&&(source=createReference14(profile))}onSubmit({...response,questionnaire:questionnaire.url??getReferenceString8(questionnaire),subject,source,authored:new Date().toISOString(),status:"completed"})},[medplum,isSignatureRequired,hasSignature]);return formState.loading?null:jsxs93(Form,{testid:"questionnaire-form",onSubmit:handleSubmit,children:[formState.questionnaire.title&&jsx152(Title10,{children:formState.questionnaire.title}),formState.pagination?jsx152(QuestionnaireFormStepper,{formState,submitButtonText:props.submitButtonText,excludeButtons:props.excludeButtons,children:jsx152(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems})}):jsxs93(Fragment50,{children:[jsx152(QuestionnaireFormItemArray,{formState,context:[],items:formState.items,responseItems:formState.responseItems}),isSignatureRequired&&jsxs93(Stack28,{mt:"md",gap:0,children:[jsx152(Text35,{size:"sm",fw:500,children:"Signature"}),jsx152(SignatureInput,{onChange:formState.onChangeSignature}),!hasSignature&&signatureRequiredSubmitted&&jsx152(Text35,{c:"red",size:"sm",children:"Signature is required."})]}),!props.excludeButtons&&jsx152(Group55,{justify:"flex-end",mt:"xl",gap:"xs",children:jsx152(SubmitButton,{children:props.submitButtonText??"Submit"})})]})]})}import{Stack as Stack30}from"@mantine/core";import{useResource as useResource14}from"@medplum/react-hooks";import{Stack as Stack29,Text as Text36}from"@mantine/core";import{formatDate as formatDate4}from"@medplum/core";import{useMemo as useMemo31}from"react";import{Fragment as Fragment51,jsx as jsx153,jsxs as jsxs94}from"react/jsx-runtime";function QuestionnaireResponseItemDisplay(props){let{item}=props,{text:title,answer,item:nestedAnswers}=item,renderContent=useMemo31(()=>answer&&answer.length>0?jsx153(Fragment51,{children:answer.map((ans,index)=>jsx153(AnswerDisplay,{answer:ans},`answer-${index}`))}):nestedAnswers&&nestedAnswers.length>0?jsx153(Fragment51,{children:nestedAnswers.map((nestedAnswer,index)=>jsx153(QuestionnaireResponseItemDisplay,{item:nestedAnswer},`nested-${nestedAnswer.id??index}`))}):jsx153(Text36,{c:"dimmed",children:"No answer"}),[answer,nestedAnswers]);return jsxs94(Stack29,{gap:0,pb:"xs",children:[jsx153(Text36,{size:"lg",fw:600,id:item.id?`question-${item.id}`:void 0,component:"h3",children:title}),renderContent]})}function AnswerDisplay({answer}){if(!answer)return jsx153(Text36,{c:"dimmed",children:"Invalid answer"});let validEntries=Object.entries(answer).filter(([,value2])=>value2!=null);if(validEntries.length===0)return jsx153(Text36,{c:"dimmed",children:"No valid answer data"});let[key,value]=validEntries[0];switch(key){case"valueInteger":return jsx153(Text36,{children:value});case"valueQuantity":return jsx153(QuantityDisplay,{value});case"valueString":return jsx153(Text36,{children:value});case"valueCoding":return jsx153(CodeableConceptDisplay,{value:{coding:[value]}});case"valueRange":return jsx153(RangeDisplay,{value});case"valueDateTime":return jsx153(Text36,{children:formatDate4(value)});case"valueBoolean":return jsx153(Text36,{children:value?"True":"False"});case"valueReference":return jsx153(Text36,{children:value.display??value.reference});default:return jsx153(Text36,{children:value.toString()})}}import{jsx as jsx154}from"react/jsx-runtime";function QuestionnaireResponseDisplay(props){let questionnaireResponse=useResource14(props.questionnaireResponse);return jsx154(Stack30,{gap:0,children:questionnaireResponse?.item?.map((item,index)=>jsx154(QuestionnaireResponseItemDisplay,{item},`item-${item.id??index}`))})}import{ActionIcon as ActionIcon16,Divider as Divider5,Group as Group56,NativeSelect as NativeSelect14,Stack as Stack31,Text as Text37,TextInput as TextInput26}from"@mantine/core";import{formatRange as formatRange2,getCodeBySystem}from"@medplum/core";import{useEffect as useEffect30,useState as useState81}from"react";var ReferenceRangeEditor_default={section:"ReferenceRangeEditor_section"};import{jsx as jsx155,jsxs as jsxs95}from"react/jsx-runtime";var intervalFilters=["gender","age","gestationalAge","context","appliesTo","category"],defaultProps5={definition:{resourceType:"ObservationDefinition",code:{text:""}},onSubmit:()=>{}};function ReferenceRangeEditor(props){props=Object.assign(defaultProps5,props);let defaultDefinition=props.definition,[intervalGroups,setIntervalGroups]=useState81([]),[groupId,setGroupId]=useState81(1),[intervalId,setIntervalId]=useState81(1);return useEffect30(()=>{let definition=ensureQualifiedIntervalKeys(defaultDefinition,setIntervalId);setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval||[],setGroupId))},[defaultDefinition]),jsxs95(Form,{testid:"reference-range-editor",onSubmit:submitDefinition,children:[jsx155(Stack31,{children:intervalGroups.map(intervalGroup=>jsx155(ReferenceRangeGroupEditor,{unit:getUnitString(defaultDefinition.quantitativeDetails?.unit),onChange:changeInterval,onAdd:addInterval,onRemove:removeInterval,onRemoveGroup:removeGroup,intervalGroup},`group-${intervalGroup.id}`))}),jsx155(ActionIcon16,{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(Group56,{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&¤tGroup?.intervals[index]&&(currentGroup.intervals[index]=changedInterval),groups})}function addInterval(groupId2,addedInterval){addedInterval.id===void 0&&(addedInterval.id=`id-${intervalId}`,setIntervalId(id=>id+1)),setIntervalGroups(groups=>{groups=[...groups];let currentGroupIndex=groups.findIndex(g=>g.id===groupId2);if(currentGroupIndex!==-1){let currentGroup={...groups[currentGroupIndex]};addedInterval={...addedInterval,...currentGroup.filters},currentGroup.intervals=[...currentGroup.intervals,addedInterval],groups[currentGroupIndex]=currentGroup}return groups})}function removeInterval(groupId2,removedInterval){setIntervalGroups(groups=>{groups=[...groups];let currentGroup=groups.find(g=>g.id===groupId2);return currentGroup&&(currentGroup.intervals=currentGroup.intervals.filter(interval=>interval.id!==removedInterval.id)),groups})}}function ReferenceRangeGroupEditor(props){let{intervalGroup,unit}=props;return jsx155(Container,{"data-testid":intervalGroup.id,className:ReferenceRangeEditor_default.section,children:jsxs95(Stack31,{gap:"lg",children:[jsx155(Group56,{justify:"flex-end",children:jsx155(ActionIcon16,{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(Divider5,{}),intervalGroup.intervals.map(interval=>jsxs95(Stack31,{gap:"xs",children:[jsxs95(Group56,{children:[jsx155(TextInput26,{"data-testid":`condition-${interval.id}`,defaultValue:interval.condition,label:"Condition: ",size:"sm",onChange:e=>{killEvent(e),props.onChange(intervalGroup.id,{...interval,condition:e.currentTarget.value.trim()})}},`condition-${interval.id}`),jsx155(ActionIcon16,{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(ActionIcon16,{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 jsxs95(Stack31,{style:{maxWidth:"50%"},children:[jsx155(Group56,{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})}}})}),jsxs95(Group56,{gap:"xs",children:[jsx155(Text37,{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 Button18,Grid as Grid2,Text as Text38}from"@mantine/core";import{formatDateTime as formatDateTime6,getReferenceString as getReferenceString9}from"@medplum/core";import{useMedplum as useMedplum42,useResource as useResource15}from"@medplum/react-hooks";import{Fragment as Fragment52,useEffect as useEffect31,useState as useState82}from"react";import{jsx as jsx156,jsxs as jsxs96}from"react/jsx-runtime";function RequestGroupDisplay(props){let medplum=useMedplum42(),requestGroup=useResource15(props.value),[startedLoading,setStartedLoading]=useState82(!1),[responseBundle,setResponseBundle]=useState82();if(useEffect31(()=>{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 jsxs96(Fragment52,{children:[jsx156(Grid2.Col,{span:1,p:"md",children:task?.status==="completed"?jsx156(IconCheckbox,{}):jsx156(IconSquare,{color:"gray"})}),jsxs96(Grid2.Col,{span:9,p:"xs",children:[jsx156(Text38,{fw:500,children:action.title}),action.description&&jsx156("div",{children:action.description}),jsxs96("div",{children:["Last edited by\xA0",jsx156(ResourceName,{value:task?.meta?.author}),"\xA0on\xA0",formatDateTime6(task?.meta?.lastUpdated)]}),jsxs96("div",{children:["Status: ",jsx156(StatusBadge,{status:task?.status||"unknown"})]})]}),jsxs96(Grid2.Col,{span:2,p:"md",children:[taskInput&&!taskOutput&&jsx156(Button18,{onClick:()=>props.onStart(task,taskInput),children:"Start"}),taskInput&&taskOutput&&jsx156(Button18,{onClick:()=>props.onEdit(task,taskInput,taskOutput),children:"Edit"})]})]},`action-${index}`)})});function buildBatchRequest(request){let batchEntries=[];if(request.action)for(let action of request.action)action.resource?.reference&&batchEntries.push({request:{method:"GET",url:action.resource.reference}});return{resourceType:"Bundle",type:"batch",entry:batchEntries}}function findBundleEntry(reference){for(let entry of responseBundle?.entry??[])if(entry.resource&&reference.reference===getReferenceString9(entry.resource))return entry.resource}}import{useMedplum as useMedplum43}from"@medplum/react-hooks";import{useEffect as useEffect32,useState as useState83}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 Fragment53,jsx as jsx157,jsxs as jsxs97}from"react/jsx-runtime";function ResourceBlame(props){let medplum=useMedplum43(),[value,setValue]=useState83(props.history);if(useEffect32(()=>{!props.history&&props.resourceType&&props.id&&medplum.readHistory(props.resourceType,props.id).then(setValue).catch(console.log)},[medplum,props.history,props.resourceType,props.id]),!value)return 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)=>jsxs97("tr",{className:row.span>0?ResourceBlame_default.startRow:ResourceBlame_default.normalRow,children:[row.span>0&&jsxs97(Fragment53,{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 Fragment54,jsx as jsx158,jsxs as jsxs98}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 jsxs98(Fragment54,{children:["...",jsx158("br",{}),props.delta.original.lines.length>0&&jsx158("div",{className:ResourceDiff_default.removed,children:props.delta.original.lines.join(`
|
|
135
135
|
`)}),props.delta.revised.lines.length>0&&jsx158("div",{className:ResourceDiff_default.added,children:props.delta.revised.lines.join(`
|
|
136
|
-
`)}),"...",jsx158("br",{})]})}import{ActionIcon as ActionIcon16,Alert as Alert5,Button as Button20,Group as Group61,Menu as Menu7,Stack as Stack32,TextInput as TextInput27,useMantineTheme as useMantineTheme2}from"@mantine/core";import{AccessPolicyInteraction as AccessPolicyInteraction2,applyDefaultValuesToResource,canWriteResourceType,isPopulated as isPopulated12,satisfiedAccessPolicy as satisfiedAccessPolicy2,tryGetProfile as tryGetProfile5}from"@medplum/core";import{useMedplum as useMedplum45,useResource as useResource16}from"@medplum/react-hooks";import{useEffect as useEffect33,useMemo as useMemo32,useState as useState84}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx159,jsxs as jsxs99}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum45(),defaultValue2=useResource16(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState84(!1),[value,setValue]=useState84(),accessPolicy=medplum.getAccessPolicy(),theme=useMantineTheme2();useEffect33(()=>{if(defaultValue2)if(props.profileUrl){let profileUrl=props.profileUrl;medplum.requestProfileSchema(props.profileUrl,{expandProfile:!0}).then(()=>{let profile=tryGetProfile5(profileUrl);if(profile){setSchemaLoaded(!0);let modifiedDefaultValue=applyDefaultValuesToResource(defaultValue2,profile);setValue(modifiedDefaultValue)}else console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)})}else medplum.requestSchema(resourceType).then(()=>{setValue(defaultValue2),setSchemaLoaded(!0)}).catch(console.log)},[medplum,defaultValue2,resourceType,props.profileUrl]);let accessPolicyResource=useMemo32(()=>defaultValue2&&satisfiedAccessPolicy2(defaultValue2,AccessPolicyInteraction2.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=useMemo32(()=>medplum.isSuperAdmin()||!accessPolicy||!isPopulated12(value?.resourceType)?!0:canWriteResourceType(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?jsx159("div",{children:"Loading..."}):canWrite?jsxs99("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs99(Stack32,{mb:"xl",children:[jsx159(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx159(TextInput27,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx159(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx159(TextInput27,{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}),jsxs99(Group61,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx159(Button20,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs99(Menu7,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx159(Menu7.Target,{children:jsx159(ActionIcon16,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx159(IconChevronDown,{size:14,stroke:1.5})})}),jsxs99(Menu7.Dropdown,{children:[props.onPatch&&jsx159(Menu7.Item,{leftSection:jsx159(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx159(Menu7.Item,{color:"red",leftSection:jsx159(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs99(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 formatDateTime7,normalizeErrorString as normalizeErrorString10}from"@medplum/core";import{useMedplum as useMedplum46}from"@medplum/react-hooks";import{useEffect as useEffect34,useState as useState85}from"react";import{jsx as jsx160,jsxs as jsxs100}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum46(),[value,setValue]=useState85(props.history);return useEffect34(()=>{!props.history&&props.resourceType&&props.id&&medplum.readHistory(props.resourceType,props.id).then(setValue).catch(console.log)},[medplum,props.history,props.resourceType,props.id]),value?jsxs100(Table5,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx160(Table5.Thead,{children:jsxs100(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?jsxs100(Table5.Tr,{children:[jsx160(Table5.Td,{children:jsx160(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx160(Table5.Td,{children:formatDateTime7(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:normalizeErrorString10(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button21,Stack as Stack33,Text as Text39}from"@mantine/core";import{getReferenceString as getReferenceString10,isReference as isReference3}from"@medplum/core";import{useMedplum as useMedplum47,useResource as useResource17}from"@medplum/react-hooks";import{useEffect as useEffect35,useMemo as useMemo33,useState as useState86}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx161,jsxs as jsxs101}from"react/jsx-runtime";function Scheduler(props){let medplum=useMedplum47(),questionnaire=useResource17(props.questionnaire),[month,setMonth]=useState86(getStartMonth()),[date,setDate]=useState86(),[response,setResponse]=useState86(),[actor,setActor]=useState86(),[slots,setSlots]=useState86(),[selectedSlot,setSelectedSlot]=useState86();useEffect35(()=>{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:getReferenceString10(props.schedule));else for(let schedule of props.schedule)if(isReference3(schedule))scheduleArray.push(schedule.reference);else{let scheduleRef=getReferenceString10(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=useMemo33(()=>{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||!questionnaire?null:jsxs101("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs101("div",{className:Scheduler_default.info,children:[actor&&jsx161(ResourceAvatar,{value:actor,size:"xl"}),actor&&jsx161(Text39,{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))})]}),jsxs101("div",{className:Scheduler_default.selection,children:[!date&&jsxs101("div",{children:[jsx161("h3",{children:"Select date"}),jsx161(CalendarInput,{slots,onChangeMonth:setMonth,onClick:setDate})]}),date&&!selectedSlot&&jsxs101("div",{children:[jsx161("h3",{children:"Select time"}),jsx161(Stack33,{children:Array.from(startTimeToSlotMap?.entries()??[]).map(([startTime,slot])=>jsx161("div",{children:jsx161(Button21,{variant:"outline",style:{width:150},onClick:()=>setSelectedSlot(slot),children:startTime})},slot.id))})]}),date&&selectedSlot&&!response&&jsx161(QuestionnaireForm,{questionnaire,submitButtonText:"Next",onSubmit:setResponse}),date&&selectedSlot&&response&&jsxs101("div",{children:[jsx161("h3",{children:"You're all set!"}),jsx161("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 createReference15}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:[createReference15(resource)],subject:resource.subject,sender:createReference15(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference15(resource)],subject:resource.subject,operator:createReference15(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor11}from"@mantine/core";import{showNotification as showNotification7}from"@mantine/notifications";import{ensureTrailingSlash,locationUtils as locationUtils6,normalizeErrorString as normalizeErrorString11}from"@medplum/core";import{useMedplum as useMedplum48}from"@medplum/react-hooks";import{jsx as jsx163}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum48(),{client,patient,encounter,children,...rest}=props;function launchApp(){medplum.createResource({resourceType:"SmartAppLaunch",patient,encounter}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",ensureTrailingSlash(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),locationUtils6.assign(url.toString())}).catch(err=>showNotification7({color:"red",message:normalizeErrorString11(err),autoClose:!1}))}return jsx163(Anchor11,{onClick:()=>launchApp(),...rest,children})}export{AddressDisplay,AddressInput,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,CalendarInput,ChatModal,CheckboxFormSection,CodeInput,CodeableConceptDisplay,CodeableConceptInput,CodingDisplay,CodingInput,ContactDetailDisplay,ContactDetailInput,ContactPointDisplay,ContactPointInput,Container,DateTimeInput,DefaultResourceTimeline,DescriptionList,DescriptionListEntry,DiagnosticReportDisplay,Document,ElementDefinitionInputSelector,ElementDefinitionTypeInput,EncounterTimeline,ErrorBoundary,FhirPathTable,Form,FormSection,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,InfoBar,LinkTabs,Loading,Logo,MeasureReportDisplay,MedplumLink,MemoizedFhirPathTable,MfaForm,MoneyDisplay,MoneyInput,Navbar,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,Panel,PatientExportForm,PatientHeader,PatientSummary,PatientTimeline,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,StatusBadge,SubmitButton,ThreadChat,Timeline,TimelineItem,TimingInput,ValueSetAutocomplete,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNext24HoursFilter,addNextMonthFilter,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,clearFilters,clearFiltersOnField,convertIsoToLocal,convertLocalToIso,createScriptTag,deleteFilter,exportJsonFile,getAppName,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getOpString,getPaginationControlProps,getRecaptcha,getSearchOperators,getSortField,getValuePath,initRecaptcha,isAuxClick,isCheckboxCell,isSortDescending,isSupportedProfileStructureDefinition,killEvent,parseForm,renderValue,sendCommand,setFilters,setOffset,setPage,setPropertyValue,setSort,sortByDateAndPriority,toggleSort};
|
|
136
|
+
`)}),"...",jsx158("br",{})]})}import{ActionIcon as ActionIcon17,Alert as Alert5,Button as Button19,Group as Group57,Menu as Menu7,Stack as Stack32,TextInput as TextInput27,useMantineTheme as useMantineTheme2}from"@mantine/core";import{AccessPolicyInteraction as AccessPolicyInteraction2,applyDefaultValuesToResource,canWriteResourceType,isPopulated as isPopulated12,satisfiedAccessPolicy as satisfiedAccessPolicy2,tryGetProfile as tryGetProfile5}from"@medplum/core";import{useMedplum as useMedplum44,useResource as useResource16}from"@medplum/react-hooks";import{useEffect as useEffect33,useMemo as useMemo32,useState as useState84}from"react";var ResourceForm_default={splitButton:"ResourceForm_splitButton",menuControl:"ResourceForm_menuControl"};import{jsx as jsx159,jsxs as jsxs99}from"react/jsx-runtime";function ResourceForm(props){let{outcome}=props,medplum=useMedplum44(),defaultValue2=useResource16(props.defaultValue),resourceType=defaultValue2?.resourceType,[schemaLoaded,setSchemaLoaded]=useState84(!1),[value,setValue]=useState84(),accessPolicy=medplum.getAccessPolicy(),theme=useMantineTheme2();useEffect33(()=>{if(defaultValue2)if(props.profileUrl){let profileUrl=props.profileUrl;medplum.requestProfileSchema(props.profileUrl,{expandProfile:!0}).then(()=>{let profile=tryGetProfile5(profileUrl);if(profile){setSchemaLoaded(!0);let modifiedDefaultValue=applyDefaultValuesToResource(defaultValue2,profile);setValue(modifiedDefaultValue)}else console.error(`Schema not found for ${profileUrl}`)}).catch(reason=>{console.error("Error in requestProfileSchema",reason)})}else medplum.requestSchema(resourceType).then(()=>{setValue(defaultValue2),setSchemaLoaded(!0)}).catch(console.log)},[medplum,defaultValue2,resourceType,props.profileUrl]);let accessPolicyResource=useMemo32(()=>defaultValue2&&satisfiedAccessPolicy2(defaultValue2,AccessPolicyInteraction2.READ,accessPolicy),[accessPolicy,defaultValue2]),canWrite=useMemo32(()=>medplum.isSuperAdmin()||!accessPolicy||!isPopulated12(value?.resourceType)?!0:canWriteResourceType(accessPolicy,value?.resourceType),[medplum,accessPolicy,value?.resourceType]);return!schemaLoaded||!value?jsx159("div",{children:"Loading..."}):canWrite?jsxs99("form",{noValidate:!0,autoComplete:"off",onSubmit:e=>{e.preventDefault(),props.onSubmit&&props.onSubmit(value)},children:[jsxs99(Stack32,{mb:"xl",children:[jsx159(FormSection,{title:"Resource Type",htmlFor:"resourceType",outcome,children:jsx159(TextInput27,{name:"resourceType",defaultValue:value.resourceType,disabled:!0})}),jsx159(FormSection,{title:"ID",htmlFor:"id",outcome,children:jsx159(TextInput27,{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}),jsxs99(Group57,{justify:"flex-end",mt:"xl",wrap:"nowrap",gap:0,children:[jsx159(Button19,{type:"submit",className:clsx_default((props.onPatch||props.onDelete)&&ResourceForm_default.splitButton),children:defaultValue2?.id?"Update":"Create"}),(props.onPatch||props.onDelete)&&jsxs99(Menu7,{transitionProps:{transition:"pop"},position:"bottom-end",withinPortal:!0,children:[jsx159(Menu7.Target,{children:jsx159(ActionIcon17,{variant:"filled",color:theme.primaryColor,size:36,className:ResourceForm_default.menuControl,"aria-label":"More actions",children:jsx159(IconChevronDown,{size:14,stroke:1.5})})}),jsxs99(Menu7.Dropdown,{children:[props.onPatch&&jsx159(Menu7.Item,{leftSection:jsx159(IconEdit,{size:14,stroke:1.5}),onClick:()=>{props.onPatch(value)},children:"Patch"}),props.onDelete&&jsx159(Menu7.Item,{color:"red",leftSection:jsx159(IconTrash,{size:14,stroke:1.5,color:"red"}),onClick:()=>{props.onDelete(value)},children:"Delete"})]})]})]})]}):jsxs99(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 formatDateTime7,normalizeErrorString as normalizeErrorString10}from"@medplum/core";import{useMedplum as useMedplum45}from"@medplum/react-hooks";import{useEffect as useEffect34,useState as useState85}from"react";import{jsx as jsx160,jsxs as jsxs100}from"react/jsx-runtime";function ResourceHistoryTable(props){let medplum=useMedplum45(),[value,setValue]=useState85(props.history);return useEffect34(()=>{!props.history&&props.resourceType&&props.id&&medplum.readHistory(props.resourceType,props.id).then(setValue).catch(console.log)},[medplum,props.history,props.resourceType,props.id]),value?jsxs100(Table5,{withTableBorder:!0,withRowBorders:!0,withColumnBorders:!0,children:[jsx160(Table5.Thead,{children:jsxs100(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?jsxs100(Table5.Tr,{children:[jsx160(Table5.Td,{children:jsx160(ResourceBadge,{value:resource.meta?.author,link:!0})}),jsx160(Table5.Td,{children:formatDateTime7(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:normalizeErrorString10(response?.outcome)})})}function getVersionUrl2(resource){return`/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`}import{Button as Button20,Stack as Stack33,Text as Text39}from"@mantine/core";import{getReferenceString as getReferenceString10,isReference as isReference3}from"@medplum/core";import{useMedplum as useMedplum46,useResource as useResource17}from"@medplum/react-hooks";import{useEffect as useEffect35,useMemo as useMemo33,useState as useState86}from"react";var Scheduler_default={container:"Scheduler_container",info:"Scheduler_info",selection:"Scheduler_selection"};import{jsx as jsx161,jsxs as jsxs101}from"react/jsx-runtime";function Scheduler(props){let medplum=useMedplum46(),questionnaire=useResource17(props.questionnaire),[month,setMonth]=useState86(getStartMonth()),[date,setDate]=useState86(),[response,setResponse]=useState86(),[actor,setActor]=useState86(),[slots,setSlots]=useState86(),[selectedSlot,setSelectedSlot]=useState86();useEffect35(()=>{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:getReferenceString10(props.schedule));else for(let schedule of props.schedule)if(isReference3(schedule))scheduleArray.push(schedule.reference);else{let scheduleRef=getReferenceString10(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=useMemo33(()=>{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||!questionnaire?null:jsxs101("div",{className:Scheduler_default.container,"data-testid":"scheduler",children:[jsxs101("div",{className:Scheduler_default.info,children:[actor&&jsx161(ResourceAvatar,{value:actor,size:"xl"}),actor&&jsx161(Text39,{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))})]}),jsxs101("div",{className:Scheduler_default.selection,children:[!date&&jsxs101("div",{children:[jsx161("h3",{children:"Select date"}),jsx161(CalendarInput,{slots,onChangeMonth:setMonth,onClick:setDate})]}),date&&!selectedSlot&&jsxs101("div",{children:[jsx161("h3",{children:"Select time"}),jsx161(Stack33,{children:Array.from(startTimeToSlotMap?.entries()??[]).map(([startTime,slot])=>jsx161("div",{children:jsx161(Button20,{variant:"outline",style:{width:150},onClick:()=>setSelectedSlot(slot),children:startTime})},slot.id))})]}),date&&selectedSlot&&!response&&jsx161(QuestionnaireForm,{questionnaire,submitButtonText:"Next",onSubmit:setResponse}),date&&selectedSlot&&response&&jsxs101("div",{children:[jsx161("h3",{children:"You're all set!"}),jsx161("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 createReference15}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:[createReference15(resource)],subject:resource.subject,sender:createReference15(sender),sent:new Date().toISOString(),payload:[{contentString:text}]}),createMedia:(resource,operator,content)=>({resourceType:"Media",status:"completed",basedOn:[createReference15(resource)],subject:resource.subject,operator:createReference15(operator),issued:new Date().toISOString(),content}),...rest})}import{Anchor as Anchor11}from"@mantine/core";import{showNotification as showNotification7}from"@mantine/notifications";import{ensureTrailingSlash,locationUtils as locationUtils6,normalizeErrorString as normalizeErrorString11}from"@medplum/core";import{useMedplum as useMedplum47}from"@medplum/react-hooks";import{jsx as jsx163}from"react/jsx-runtime";function SmartAppLaunchLink(props){let medplum=useMedplum47(),{client,patient,encounter,children,...rest}=props;function launchApp(){medplum.createResource({resourceType:"SmartAppLaunch",patient,encounter}).then(result=>{let url=new URL(client.launchUri);url.searchParams.set("iss",ensureTrailingSlash(medplum.fhirUrl().toString())),url.searchParams.set("launch",result.id),locationUtils6.assign(url.toString())}).catch(err=>showNotification7({color:"red",message:normalizeErrorString11(err),autoClose:!1}))}return jsx163(Anchor11,{onClick:()=>launchApp(),...rest,children})}export{AddressDisplay,AddressInput,AnnotationInput,AppShell,AsyncAutocomplete,AttachmentArrayDisplay,AttachmentArrayInput,AttachmentButton,AttachmentDisplay,AttachmentInput,BackboneElementDisplay,BackboneElementInput,BaseChat,CalendarInput,ChatModal,CheckboxFormSection,CodeInput,CodeableConceptDisplay,CodeableConceptInput,CodingDisplay,CodingInput,ContactDetailDisplay,ContactDetailInput,ContactPointDisplay,ContactPointInput,Container,DateTimeInput,DefaultResourceTimeline,DescriptionList,DescriptionListEntry,DiagnosticReportDisplay,Document,ElementDefinitionInputSelector,ElementDefinitionTypeInput,EncounterTimeline,ErrorBoundary,FhirPathTable,Form,FormSection,Header,HumanNameDisplay,HumanNameInput,IdentifierDisplay,IdentifierInput,InfoBar,LinkTabs,Loading,Logo,MeasureReportDisplay,MedplumLink,MemoizedFhirPathTable,MfaForm,MoneyDisplay,MoneyInput,Navbar,NoteDisplay,NotificationIcon,ObservationTable,OperationOutcomeAlert,Panel,PatientExportForm,PatientHeader,PatientSummary,PatientTimeline,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,StatusBadge,SubmitButton,ThreadChat,Timeline,TimelineItem,TimingInput,ValueSetAutocomplete,addDateFilterBetween,addField,addFilter,addLastMonthFilter,addMissingFilter,addNext24HoursFilter,addNextMonthFilter,addThisMonthFilter,addTodayFilter,addTomorrowFilter,addYearToDateFilter,addYesterdayFilter,buildFieldNameString,clearFilters,clearFiltersOnField,convertIsoToLocal,convertLocalToIso,createScriptTag,deleteFilter,exportJsonFile,getAppName,getErrorsForInput,getFieldDefinitions,getIssuesForExpression,getOpString,getPaginationControlProps,getRecaptcha,getSearchOperators,getSortField,getValuePath,initRecaptcha,isAuxClick,isCheckboxCell,isSortDescending,isSupportedProfileStructureDefinition,killEvent,parseForm,renderValue,sendCommand,setFilters,setOffset,setPage,setPropertyValue,setSort,sortByDateAndPriority,toggleSort};
|
|
137
137
|
/*! Bundled license information:
|
|
138
138
|
|
|
139
139
|
@tabler/icons-react/dist/esm/defaultAttributes.mjs:
|
|
@@ -148,6 +148,7 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
|
|
|
148
148
|
@tabler/icons-react/dist/esm/icons/IconBleach.mjs:
|
|
149
149
|
@tabler/icons-react/dist/esm/icons/IconBoxMultiple.mjs:
|
|
150
150
|
@tabler/icons-react/dist/esm/icons/IconBracketsContain.mjs:
|
|
151
|
+
@tabler/icons-react/dist/esm/icons/IconBriefcase.mjs:
|
|
151
152
|
@tabler/icons-react/dist/esm/icons/IconBucketOff.mjs:
|
|
152
153
|
@tabler/icons-react/dist/esm/icons/IconBucket.mjs:
|
|
153
154
|
@tabler/icons-react/dist/esm/icons/IconCake.mjs:
|
|
@@ -180,6 +181,7 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
|
|
|
180
181
|
@tabler/icons-react/dist/esm/icons/IconMathGreater.mjs:
|
|
181
182
|
@tabler/icons-react/dist/esm/icons/IconMathLower.mjs:
|
|
182
183
|
@tabler/icons-react/dist/esm/icons/IconMessage.mjs:
|
|
184
|
+
@tabler/icons-react/dist/esm/icons/IconPencil.mjs:
|
|
183
185
|
@tabler/icons-react/dist/esm/icons/IconPlus.mjs:
|
|
184
186
|
@tabler/icons-react/dist/esm/icons/IconRefresh.mjs:
|
|
185
187
|
@tabler/icons-react/dist/esm/icons/IconSearch.mjs:
|