@medplum/react 2.2.10 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../node_modules/rfc6902/pointer.js", "../../../../node_modules/rfc6902/util.js", "../../../../node_modules/rfc6902/diff.js", "../../../../node_modules/rfc6902/patch.js", "../../../../node_modules/rfc6902/index.js", "../../../react-hooks/src/MedplumProvider/MedplumProvider.tsx", "../../../react-hooks/src/MedplumProvider/MedplumProvider.context.ts", "../../../react-hooks/src/useResource/useResource.ts", "../../../react-hooks/src/useSearch/useSearch.ts", "../../src/AddressDisplay/AddressDisplay.tsx", "../../src/AddressInput/AddressInput.tsx", "../../src/AnnotationInput/AnnotationInput.tsx", "../../src/AppShell/AppShell.tsx", "../../src/ErrorBoundary/ErrorBoundary.tsx", "../../../../node_modules/@tabler/icons-react/src/defaultAttributes.js", "../../../../node_modules/@tabler/icons-react/src/createReactComponent.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconAdjustmentsHorizontal.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconAlertCircle.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconArrowDown.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconArrowUp.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBleachOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBleach.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBoxMultiple.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBracketsContain.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBucketOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBucket.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCalendar.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCheck.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCheckbox.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconChevronDown.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCircleMinus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCirclePlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCloudUpload.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconColumns.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCopy.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCurrencyDollar.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconDots.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEdit.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEqualNot.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEqual.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFileAlert.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFilePlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFilter.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconGenderFemale.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconListDetails.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconLogout.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMathGreater.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMathLower.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMessage.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPin.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPinnedOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconRefresh.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSearch.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSettings.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSortAscending.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSortDescending.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSquare.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconStethoscope.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSwitchHorizontal.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconTableExport.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconTrash.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconUserSquare.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconX.js", "../../src/Loading/Loading.tsx", "../../src/AppShell/Header.tsx", "../../src/HumanNameDisplay/HumanNameDisplay.tsx", "../../src/ResourceAvatar/ResourceAvatar.tsx", "../../src/MedplumLink/MedplumLink.tsx", "../../src/utils/dom.ts", "../../src/AppShell/HeaderSearchInput.tsx", "../../src/AsyncAutocomplete/AsyncAutocomplete.tsx", "../../src/AppShell/Navbar.tsx", "../../src/BookmarkDialog/BookmarkDialog.tsx", "../../src/Form/FormUtils.ts", "../../src/Form/Form.tsx", "../../src/ResourceTypeInput/ResourceTypeInput.tsx", "../../src/CodeInput/CodeInput.tsx", "../../src/ValueSetAutocomplete/ValueSetAutocomplete.tsx", "../../src/AttachmentDisplay/AttachmentDisplay.tsx", "../../src/AttachmentArrayDisplay/AttachmentArrayDisplay.tsx", "../../src/AttachmentArrayInput/AttachmentArrayInput.tsx", "../../src/AttachmentButton/AttachmentButton.tsx", "../../src/AttachmentInput/AttachmentInput.tsx", "../../src/BackboneElementDisplay/BackboneElementDisplay.tsx", "../../src/constants.ts", "../../src/DescriptionList/DescriptionList.tsx", "../../src/ResourcePropertyDisplay/ResourcePropertyDisplay.tsx", "../../src/CodeableConceptDisplay/CodeableConceptDisplay.tsx", "../../src/CodingDisplay/CodingDisplay.tsx", "../../src/ContactPointDisplay/ContactPointDisplay.tsx", "../../src/ContactDetailDisplay/ContactDetailDisplay.tsx", "../../src/IdentifierDisplay/IdentifierDisplay.tsx", "../../src/MoneyDisplay/MoneyDisplay.tsx", "../../src/QuantityDisplay/QuantityDisplay.tsx", "../../src/RangeDisplay/RangeDisplay.tsx", "../../src/RatioDisplay/RatioDisplay.tsx", "../../src/ReferenceDisplay/ReferenceDisplay.tsx", "../../src/ResourceArrayDisplay/ResourceArrayDisplay.tsx", "../../src/ResourcePropertyDisplay/ResourcePropertyDisplay.utils.ts", "../../src/BackboneElementInput/BackboneElementInput.tsx", "../../src/ElementsInput/ElementsInput.tsx", "../../src/CheckboxFormSection/CheckboxFormSection.tsx", "../../src/BackboneElementInput/BackboneElementInput.utils.ts", "../../src/FormSection/FormSection.tsx", "../../src/utils/outcomes.ts", "../../src/ResourceForm/ResourceForm.utils.ts", "../../src/ResourcePropertyInput/ResourcePropertyInput.tsx", "../../src/CodeableConceptInput/CodeableConceptInput.tsx", "../../src/CodingInput/CodingInput.tsx", "../../src/ContactDetailInput/ContactDetailInput.tsx", "../../src/ContactPointInput/ContactPointInput.tsx", "../../src/DateTimeInput/DateTimeInput.tsx", "../../src/DateTimeInput/DateTimeInput.utils.ts", "../../src/ExtensionInput/ExtensionInput.tsx", "../../src/HumanNameInput/HumanNameInput.tsx", "../../src/IdentifierInput/IdentifierInput.tsx", "../../src/MoneyInput/MoneyInput.tsx", "../../src/PeriodInput/PeriodInput.tsx", "../../src/QuantityInput/QuantityInput.tsx", "../../src/RangeInput/RangeInput.tsx", "../../src/RatioInput/RatioInput.tsx", "../../src/ReferenceInput/ReferenceInput.tsx", "../../src/ResourceInput/ResourceInput.tsx", "../../src/ResourceArrayInput/ResourceArrayInput.tsx", "../../src/ResourceArrayInput/ResourceArrayInput.utils.ts", "../../src/SensitiveTextarea/SensitiveTextarea.tsx", "../../src/TimingInput/TimingInput.tsx", "../../src/CalendarInput/CalendarInput.tsx", "../../src/CalendarInput/CalendarInput.utils.ts", "../../src/Container/Container.tsx", "../../src/ResourceTimeline/ResourceTimeline.tsx", "../../src/DiagnosticReportDisplay/DiagnosticReportDisplay.tsx", "../../src/NoteDisplay/NoteDisplay.tsx", "../../src/ResourceBadge/ResourceBadge.tsx", "../../src/ResourceName/ResourceName.tsx", "../../src/StatusBadge/StatusBadge.tsx", "../../src/Panel/Panel.tsx", "../../src/ResourceDiffTable/ResourceDiffTable.tsx", "../../src/ResourceTable/ResourceTable.tsx", "../../src/Timeline/Timeline.tsx", "../../src/utils/date.ts", "../../src/DefaultResourceTimeline/DefaultResourceTimeline.tsx", "../../src/Document/Document.tsx", "../../src/EncounterTimeline/EncounterTimeline.tsx", "../../src/FhirPathTable/FhirPathTable.tsx", "../../src/FhirPathDisplay/FhirPathDisplay.tsx", "../../src/SearchControl/SearchControl.tsx", "../../src/SearchExportDialog/SearchExportDialog.tsx", "../../src/SearchFieldEditor/SearchFieldEditor.tsx", "../../src/SearchControl/SearchUtils.tsx", "../../src/SearchFilterEditor/SearchFilterEditor.tsx", "../../src/SearchFilterValueDisplay/SearchFilterValueDisplay.tsx", "../../src/SearchFilterValueInput/SearchFilterValueInput.tsx", "../../src/SearchFilterValueDialog/SearchFilterValueDialog.tsx", "../../src/SearchPopupMenu/SearchPopupMenu.tsx", "../../src/SearchControl/SearchControlField.ts", "../../src/Logo/Logo.tsx", "../../src/MeasureReportDisplay/MeasureReportDisplay.tsx", "../../src/MeasureReportDisplay/MeasureReportGroupDisplay/MeasureReportGroupDisplay.tsx", "../../src/OperationOutcomeAlert/OperationOutcomeAlert.tsx", "../../src/PatientSummary/PatientSummary.tsx", "../../src/PatientSummary/Allergies.tsx", "../../src/PatientSummary/Medications.tsx", "../../src/PatientSummary/ProblemList.tsx", "../../src/PatientSummary/SmokingStatus.tsx", "../../src/PatientSummary/Vitals.tsx", "../../src/PatientSummary/Vitals.utils.ts", "../../src/PatientTimeline/PatientTimeline.tsx", "../../src/PlanDefinitionBuilder/PlanDefinitionBuilder.tsx", "../../src/QuestionnaireBuilder/QuestionnaireBuilder.tsx", "../../src/QuestionnaireForm/QuestionnaireFormItem/QuestionnaireFormItem.tsx", "../../src/utils/questionnaire.ts", "../../src/QuestionnaireForm/QuestionnaireForm.context.ts", "../../src/QuestionnaireForm/QuestionnaireForm.tsx", "../../src/QuestionnaireForm/QuestionnaireFormComponents/QuestionnaireFormPageSequence.tsx", "../../src/QuestionnaireForm/QuestionnaireFormItem/QuestionnaireRepeatableItem.tsx", "../../src/QuestionnaireForm/QuestionnaireFormComponents/QuestionnaireFormGroup.tsx", "../../src/ReferenceRangeEditor/ReferenceRangeEditor.tsx", "../../src/RequestGroupDisplay/RequestGroupDisplay.tsx", "../../src/ResourceBlame/ResourceBlame.tsx", "../../src/utils/blame.ts", "../../src/utils/diff.ts", "../../src/ResourceBlame/ResourceBlame.utils.ts", "../../src/ResourceDiff/ResourceDiff.tsx", "../../src/ResourceForm/ResourceForm.tsx", "../../src/ResourceHistoryTable/ResourceHistoryTable.tsx", "../../src/Scheduler/Scheduler.tsx", "../../src/ServiceRequestTimeline/ServiceRequestTimeline.tsx", "../../src/SmartAppLaunchLink/SmartAppLaunchLink.tsx", "../../src/auth/RegisterForm.tsx", "../../src/auth/NewProjectForm.tsx", "../../src/auth/NewUserForm.tsx", "../../src/GoogleButton/GoogleButton.tsx", "../../src/utils/script.ts", "../../src/GoogleButton/GoogleButton.utils.ts", "../../src/utils/recaptcha.ts", "../../src/auth/SignInForm.tsx", "../../src/auth/AuthenticationForm.tsx", "../../src/auth/ChooseProfileForm.tsx", "../../src/auth/ChooseScopeForm.tsx", "../../src/auth/MfaForm.tsx"],
4
- "sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Pointer = void 0;\n/**\nUnescape token part of a JSON Pointer string\n\n`token` should *not* contain any '/' characters.\n\n> Evaluation of each reference token begins by decoding any escaped\n> character sequence. This is performed by first transforming any\n> occurrence of the sequence '~1' to '/', and then transforming any\n> occurrence of the sequence '~0' to '~'. By performing the\n> substitutions in this order, an implementation avoids the error of\n> turning '~01' first into '~1' and then into '/', which would be\n> incorrect (the string '~01' correctly becomes '~1' after\n> transformation).\n\nHere's my take:\n\n~1 is unescaped with higher priority than ~0 because it is a lower-order escape character.\nI say \"lower order\" because '/' needs escaping due to the JSON Pointer serialization technique.\nWhereas, '~' is escaped because escaping '/' uses the '~' character.\n*/\nfunction unescape(token) {\n return token.replace(/~1/g, '/').replace(/~0/g, '~');\n}\n/** Escape token part of a JSON Pointer string\n\n> '~' needs to be encoded as '~0' and '/'\n> needs to be encoded as '~1' when these characters appear in a\n> reference token.\n\nThis is the exact inverse of `unescape()`, so the reverse replacements must take place in reverse order.\n*/\nfunction escape(token) {\n return token.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n/**\nJSON Pointer representation\n*/\nvar Pointer = /** @class */ (function () {\n function Pointer(tokens) {\n if (tokens === void 0) { tokens = ['']; }\n this.tokens = tokens;\n }\n /**\n `path` *must* be a properly escaped string.\n */\n Pointer.fromJSON = function (path) {\n var tokens = path.split('/').map(unescape);\n if (tokens[0] !== '')\n throw new Error(\"Invalid JSON Pointer: \".concat(path));\n return new Pointer(tokens);\n };\n Pointer.prototype.toString = function () {\n return this.tokens.map(escape).join('/');\n };\n /**\n Returns an object with 'parent', 'key', and 'value' properties.\n In the special case that this Pointer's path == \"\",\n this object will be {parent: null, key: '', value: object}.\n Otherwise, parent and key will have the property such that parent[key] == value.\n */\n Pointer.prototype.evaluate = function (object) {\n var parent = null;\n var key = '';\n var value = object;\n for (var i = 1, l = this.tokens.length; i < l; i++) {\n parent = value;\n key = this.tokens[i];\n if (key == '__proto__' || key == 'constructor' || key == 'prototype') {\n continue;\n }\n // not sure if this the best way to handle non-existant paths...\n value = (parent || {})[key];\n }\n return { parent: parent, key: key, value: value };\n };\n Pointer.prototype.get = function (object) {\n return this.evaluate(object).value;\n };\n Pointer.prototype.set = function (object, value) {\n var endpoint = this.evaluate(object);\n if (endpoint.parent) {\n endpoint.parent[endpoint.key] = value;\n }\n };\n Pointer.prototype.push = function (token) {\n // mutable\n this.tokens.push(token);\n };\n /**\n `token` should be a String. It'll be coerced to one anyway.\n \n immutable (shallowly)\n */\n Pointer.prototype.add = function (token) {\n var tokens = this.tokens.concat(String(token));\n return new Pointer(tokens);\n };\n return Pointer;\n}());\nexports.Pointer = Pointer;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.clone = exports.objectType = exports.hasOwnProperty = void 0;\nexports.hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction objectType(object) {\n if (object === undefined) {\n return 'undefined';\n }\n if (object === null) {\n return 'null';\n }\n if (Array.isArray(object)) {\n return 'array';\n }\n return typeof object;\n}\nexports.objectType = objectType;\nfunction isNonPrimitive(value) {\n // loose-equality checking for null is faster than strict checking for each of null/undefined/true/false\n // checking null first, then calling typeof, is faster than vice-versa\n return value != null && typeof value == 'object';\n}\n/**\nRecursively copy a value.\n\n@param source - should be a JavaScript primitive, Array, Date, or (plain old) Object.\n@returns copy of source where every Array and Object have been recursively\n reconstructed from their constituent elements\n*/\nfunction clone(source) {\n if (!isNonPrimitive(source)) {\n // short-circuiting is faster than a single return\n return source;\n }\n // x.constructor == Array is the fastest way to check if x is an Array\n if (source.constructor == Array) {\n // construction via imperative for-loop is faster than source.map(arrayVsObject)\n var length_1 = source.length;\n // setting the Array length during construction is faster than just `[]` or `new Array()`\n var arrayTarget = new Array(length_1);\n for (var i = 0; i < length_1; i++) {\n arrayTarget[i] = clone(source[i]);\n }\n return arrayTarget;\n }\n // Date\n if (source.constructor == Date) {\n var dateTarget = new Date(+source);\n return dateTarget;\n }\n // Object\n var objectTarget = {};\n // declaring the variable (with const) inside the loop is faster\n for (var key in source) {\n // hasOwnProperty costs a bit of performance, but it's semantically necessary\n // using a global helper is MUCH faster than calling source.hasOwnProperty(key)\n if (exports.hasOwnProperty.call(source, key)) {\n objectTarget[key] = clone(source[key]);\n }\n }\n return objectTarget;\n}\nexports.clone = clone;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.diffAny = exports.diffObjects = exports.diffArrays = exports.intersection = exports.subtract = exports.isDestructive = void 0;\nvar util_1 = require(\"./util\");\nfunction isDestructive(_a) {\n var op = _a.op;\n return op === 'remove' || op === 'replace' || op === 'copy' || op === 'move';\n}\nexports.isDestructive = isDestructive;\n/**\nList the keys in `minuend` that are not in `subtrahend`.\n\nA key is only considered if it is both 1) an own-property (o.hasOwnProperty(k))\nof the object, and 2) has a value that is not undefined. This is to match JSON\nsemantics, where JSON object serialization drops keys with undefined values.\n\n@param minuend Object of interest\n@param subtrahend Object of comparison\n@returns Array of keys that are in `minuend` but not in `subtrahend`.\n*/\nfunction subtract(minuend, subtrahend) {\n // initialize empty object; we only care about the keys, the values can be anything\n var obj = {};\n // build up obj with all the properties of minuend\n for (var add_key in minuend) {\n if (util_1.hasOwnProperty.call(minuend, add_key) && minuend[add_key] !== undefined) {\n obj[add_key] = 1;\n }\n }\n // now delete all the properties of subtrahend from obj\n // (deleting a missing key has no effect)\n for (var del_key in subtrahend) {\n if (util_1.hasOwnProperty.call(subtrahend, del_key) && subtrahend[del_key] !== undefined) {\n delete obj[del_key];\n }\n }\n // finally, extract whatever keys remain in obj\n return Object.keys(obj);\n}\nexports.subtract = subtract;\n/**\nList the keys that shared by all `objects`.\n\nThe semantics of what constitutes a \"key\" is described in {@link subtract}.\n\n@param objects Array of objects to compare\n@returns Array of keys that are in (\"own-properties\" of) every object in `objects`.\n*/\nfunction intersection(objects) {\n var length = objects.length;\n // prepare empty counter to keep track of how many objects each key occurred in\n var counter = {};\n // go through each object and increment the counter for each key in that object\n for (var i = 0; i < length; i++) {\n var object = objects[i];\n for (var key in object) {\n if (util_1.hasOwnProperty.call(object, key) && object[key] !== undefined) {\n counter[key] = (counter[key] || 0) + 1;\n }\n }\n }\n // now delete all keys from the counter that were not seen in every object\n for (var key in counter) {\n if (counter[key] < length) {\n delete counter[key];\n }\n }\n // finally, extract whatever keys remain in the counter\n return Object.keys(counter);\n}\nexports.intersection = intersection;\nfunction isArrayAdd(array_operation) {\n return array_operation.op === 'add';\n}\nfunction isArrayRemove(array_operation) {\n return array_operation.op === 'remove';\n}\nfunction appendArrayOperation(base, operation) {\n return {\n // the new operation must be pushed on the end\n operations: base.operations.concat(operation),\n cost: base.cost + 1,\n };\n}\n/**\nCalculate the shortest sequence of operations to get from `input` to `output`,\nusing a dynamic programming implementation of the Levenshtein distance algorithm.\n\nTo get from the input ABC to the output AZ we could just delete all the input\nand say \"insert A, insert Z\" and be done with it. That's what we do if the\ninput is empty. But we can be smarter.\n\n output\n A Z\n - -\n [0] 1 2\ninput A | 1 [0] 1\n B | 2 [1] 1\n C | 3 2 [2]\n\n1) start at 0,0 (+0)\n2) keep A (+0)\n3) remove B (+1)\n4) replace C with Z (+1)\n\nIf the `input` (source) is empty, they'll all be in the top row, resulting in an\narray of 'add' operations.\nIf the `output` (target) is empty, everything will be in the left column,\nresulting in an array of 'remove' operations.\n\n@returns A list of add/remove/replace operations.\n*/\nfunction diffArrays(input, output, ptr, diff) {\n if (diff === void 0) { diff = diffAny; }\n // set up cost matrix (very simple initialization: just a map)\n var memo = {\n '0,0': { operations: [], cost: 0 },\n };\n /**\n Calculate the cheapest sequence of operations required to get from\n input.slice(0, i) to output.slice(0, j).\n There may be other valid sequences with the same cost, but none cheaper.\n \n @param i The row in the layout above\n @param j The column in the layout above\n @returns An object containing a list of operations, along with the total cost\n of applying them (+1 for each add/remove/replace operation)\n */\n function dist(i, j) {\n // memoized\n var memo_key = \"\".concat(i, \",\").concat(j);\n var memoized = memo[memo_key];\n if (memoized === undefined) {\n // TODO: this !diff(...).length usage could/should be lazy\n if (i > 0 && j > 0 && !diff(input[i - 1], output[j - 1], ptr.add(String(i - 1))).length) {\n // equal (no operations => no cost)\n memoized = dist(i - 1, j - 1);\n }\n else {\n var alternatives = [];\n if (i > 0) {\n // NOT topmost row\n var remove_base = dist(i - 1, j);\n var remove_operation = {\n op: 'remove',\n index: i - 1,\n };\n alternatives.push(appendArrayOperation(remove_base, remove_operation));\n }\n if (j > 0) {\n // NOT leftmost column\n var add_base = dist(i, j - 1);\n var add_operation = {\n op: 'add',\n index: i - 1,\n value: output[j - 1],\n };\n alternatives.push(appendArrayOperation(add_base, add_operation));\n }\n if (i > 0 && j > 0) {\n // TABLE MIDDLE\n // supposing we replaced it, compute the rest of the costs:\n var replace_base = dist(i - 1, j - 1);\n // okay, the general plan is to replace it, but we can be smarter,\n // recursing into the structure and replacing only part of it if\n // possible, but to do so we'll need the original value\n var replace_operation = {\n op: 'replace',\n index: i - 1,\n original: input[i - 1],\n value: output[j - 1],\n };\n alternatives.push(appendArrayOperation(replace_base, replace_operation));\n }\n // the only other case, i === 0 && j === 0, has already been memoized\n // the meat of the algorithm:\n // sort by cost to find the lowest one (might be several ties for lowest)\n // [4, 6, 7, 1, 2].sort((a, b) => a - b) -> [ 1, 2, 4, 6, 7 ]\n var best = alternatives.sort(function (a, b) { return a.cost - b.cost; })[0];\n memoized = best;\n }\n memo[memo_key] = memoized;\n }\n return memoized;\n }\n // handle weird objects masquerading as Arrays that don't have proper length\n // properties by using 0 for everything but positive numbers\n var input_length = (isNaN(input.length) || input.length <= 0) ? 0 : input.length;\n var output_length = (isNaN(output.length) || output.length <= 0) ? 0 : output.length;\n var array_operations = dist(input_length, output_length).operations;\n var padded_operations = array_operations.reduce(function (_a, array_operation) {\n var operations = _a[0], padding = _a[1];\n if (isArrayAdd(array_operation)) {\n var padded_index = array_operation.index + 1 + padding;\n var index_token = padded_index < (input_length + padding) ? String(padded_index) : '-';\n var operation = {\n op: array_operation.op,\n path: ptr.add(index_token).toString(),\n value: array_operation.value,\n };\n // padding++ // maybe only if array_operation.index > -1 ?\n return [operations.concat(operation), padding + 1];\n }\n else if (isArrayRemove(array_operation)) {\n var operation = {\n op: array_operation.op,\n path: ptr.add(String(array_operation.index + padding)).toString(),\n };\n // padding--\n return [operations.concat(operation), padding - 1];\n }\n else { // replace\n var replace_ptr = ptr.add(String(array_operation.index + padding));\n var replace_operations = diff(array_operation.original, array_operation.value, replace_ptr);\n return [operations.concat.apply(operations, replace_operations), padding];\n }\n }, [[], 0])[0];\n return padded_operations;\n}\nexports.diffArrays = diffArrays;\nfunction diffObjects(input, output, ptr, diff) {\n if (diff === void 0) { diff = diffAny; }\n // if a key is in input but not output -> remove it\n var operations = [];\n subtract(input, output).forEach(function (key) {\n operations.push({ op: 'remove', path: ptr.add(key).toString() });\n });\n // if a key is in output but not input -> add it\n subtract(output, input).forEach(function (key) {\n operations.push({ op: 'add', path: ptr.add(key).toString(), value: output[key] });\n });\n // if a key is in both, diff it recursively\n intersection([input, output]).forEach(function (key) {\n operations.push.apply(operations, diff(input[key], output[key], ptr.add(key)));\n });\n return operations;\n}\nexports.diffObjects = diffObjects;\n/**\n`diffAny()` returns an empty array if `input` and `output` are materially equal\n(i.e., would produce equivalent JSON); otherwise it produces an array of patches\nthat would transform `input` into `output`.\n\n> Here, \"equal\" means that the value at the target location and the\n> value conveyed by \"value\" are of the same JSON type, and that they\n> are considered equal by the following rules for that type:\n> o strings: are considered equal if they contain the same number of\n> Unicode characters and their code points are byte-by-byte equal.\n> o numbers: are considered equal if their values are numerically\n> equal.\n> o arrays: are considered equal if they contain the same number of\n> values, and if each value can be considered equal to the value at\n> the corresponding position in the other array, using this list of\n> type-specific rules.\n> o objects: are considered equal if they contain the same number of\n> members, and if each member can be considered equal to a member in\n> the other object, by comparing their keys (as strings) and their\n> values (using this list of type-specific rules).\n> o literals (false, true, and null): are considered equal if they are\n> the same.\n*/\nfunction diffAny(input, output, ptr, diff) {\n if (diff === void 0) { diff = diffAny; }\n // strict equality handles literals, numbers, and strings (a sufficient but not necessary cause)\n if (input === output) {\n return [];\n }\n var input_type = (0, util_1.objectType)(input);\n var output_type = (0, util_1.objectType)(output);\n if (input_type == 'array' && output_type == 'array') {\n return diffArrays(input, output, ptr, diff);\n }\n if (input_type == 'object' && output_type == 'object') {\n return diffObjects(input, output, ptr, diff);\n }\n // at this point we know that input and output are materially different;\n // could be array -> object, object -> array, boolean -> undefined,\n // number -> string, or some other combination, but nothing that can be split\n // up into multiple patches: so `output` must replace `input` wholesale.\n return [{ op: 'replace', path: ptr.toString(), value: output }];\n}\nexports.diffAny = diffAny;\n", "\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.apply = exports.InvalidOperationError = exports.test = exports.copy = exports.move = exports.replace = exports.remove = exports.add = exports.TestError = exports.MissingError = void 0;\nvar pointer_1 = require(\"./pointer\");\nvar util_1 = require(\"./util\");\nvar diff_1 = require(\"./diff\");\nvar MissingError = /** @class */ (function (_super) {\n __extends(MissingError, _super);\n function MissingError(path) {\n var _this = _super.call(this, \"Value required at path: \".concat(path)) || this;\n _this.path = path;\n _this.name = 'MissingError';\n return _this;\n }\n return MissingError;\n}(Error));\nexports.MissingError = MissingError;\nvar TestError = /** @class */ (function (_super) {\n __extends(TestError, _super);\n function TestError(actual, expected) {\n var _this = _super.call(this, \"Test failed: \".concat(actual, \" != \").concat(expected)) || this;\n _this.actual = actual;\n _this.expected = expected;\n _this.name = 'TestError';\n return _this;\n }\n return TestError;\n}(Error));\nexports.TestError = TestError;\nfunction _add(object, key, value) {\n if (Array.isArray(object)) {\n // `key` must be an index\n if (key == '-') {\n object.push(value);\n }\n else {\n var index = parseInt(key, 10);\n object.splice(index, 0, value);\n }\n }\n else {\n object[key] = value;\n }\n}\nfunction _remove(object, key) {\n if (Array.isArray(object)) {\n // '-' syntax doesn't make sense when removing\n var index = parseInt(key, 10);\n object.splice(index, 1);\n }\n else {\n // not sure what the proper behavior is when path = ''\n delete object[key];\n }\n}\n/**\n> o If the target location specifies an array index, a new value is\n> inserted into the array at the specified index.\n> o If the target location specifies an object member that does not\n> already exist, a new member is added to the object.\n> o If the target location specifies an object member that does exist,\n> that member's value is replaced.\n*/\nfunction add(object, operation) {\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n // it's not exactly a \"MissingError\" in the same way that `remove` is -- more like a MissingParent, or something\n if (endpoint.parent === undefined) {\n return new MissingError(operation.path);\n }\n _add(endpoint.parent, endpoint.key, (0, util_1.clone)(operation.value));\n return null;\n}\nexports.add = add;\n/**\n> The \"remove\" operation removes the value at the target location.\n> The target location MUST exist for the operation to be successful.\n*/\nfunction remove(object, operation) {\n // endpoint has parent, key, and value properties\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n if (endpoint.value === undefined) {\n return new MissingError(operation.path);\n }\n // not sure what the proper behavior is when path = ''\n _remove(endpoint.parent, endpoint.key);\n return null;\n}\nexports.remove = remove;\n/**\n> The \"replace\" operation replaces the value at the target location\n> with a new value. The operation object MUST contain a \"value\" member\n> whose content specifies the replacement value.\n> The target location MUST exist for the operation to be successful.\n\n> This operation is functionally identical to a \"remove\" operation for\n> a value, followed immediately by an \"add\" operation at the same\n> location with the replacement value.\n\nEven more simply, it's like the add operation with an existence check.\n*/\nfunction replace(object, operation) {\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n if (endpoint.parent === null) {\n return new MissingError(operation.path);\n }\n // this existence check treats arrays as a special case\n if (Array.isArray(endpoint.parent)) {\n if (parseInt(endpoint.key, 10) >= endpoint.parent.length) {\n return new MissingError(operation.path);\n }\n }\n else if (endpoint.value === undefined) {\n return new MissingError(operation.path);\n }\n endpoint.parent[endpoint.key] = (0, util_1.clone)(operation.value);\n return null;\n}\nexports.replace = replace;\n/**\n> The \"move\" operation removes the value at a specified location and\n> adds it to the target location.\n> The operation object MUST contain a \"from\" member, which is a string\n> containing a JSON Pointer value that references the location in the\n> target document to move the value from.\n> This operation is functionally identical to a \"remove\" operation on\n> the \"from\" location, followed immediately by an \"add\" operation at\n> the target location with the value that was just removed.\n\n> The \"from\" location MUST NOT be a proper prefix of the \"path\"\n> location; i.e., a location cannot be moved into one of its children.\n\nTODO: throw if the check described in the previous paragraph fails.\n*/\nfunction move(object, operation) {\n var from_endpoint = pointer_1.Pointer.fromJSON(operation.from).evaluate(object);\n if (from_endpoint.value === undefined) {\n return new MissingError(operation.from);\n }\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n if (endpoint.parent === undefined) {\n return new MissingError(operation.path);\n }\n _remove(from_endpoint.parent, from_endpoint.key);\n _add(endpoint.parent, endpoint.key, from_endpoint.value);\n return null;\n}\nexports.move = move;\n/**\n> The \"copy\" operation copies the value at a specified location to the\n> target location.\n> The operation object MUST contain a \"from\" member, which is a string\n> containing a JSON Pointer value that references the location in the\n> target document to copy the value from.\n> The \"from\" location MUST exist for the operation to be successful.\n\n> This operation is functionally identical to an \"add\" operation at the\n> target location using the value specified in the \"from\" member.\n\nAlternatively, it's like 'move' without the 'remove'.\n*/\nfunction copy(object, operation) {\n var from_endpoint = pointer_1.Pointer.fromJSON(operation.from).evaluate(object);\n if (from_endpoint.value === undefined) {\n return new MissingError(operation.from);\n }\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n if (endpoint.parent === undefined) {\n return new MissingError(operation.path);\n }\n _add(endpoint.parent, endpoint.key, (0, util_1.clone)(from_endpoint.value));\n return null;\n}\nexports.copy = copy;\n/**\n> The \"test\" operation tests that a value at the target location is\n> equal to a specified value.\n> The operation object MUST contain a \"value\" member that conveys the\n> value to be compared to the target location's value.\n> The target location MUST be equal to the \"value\" value for the\n> operation to be considered successful.\n*/\nfunction test(object, operation) {\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n // TODO: this diffAny(...).length usage could/should be lazy\n if ((0, diff_1.diffAny)(endpoint.value, operation.value, new pointer_1.Pointer()).length) {\n return new TestError(endpoint.value, operation.value);\n }\n return null;\n}\nexports.test = test;\nvar InvalidOperationError = /** @class */ (function (_super) {\n __extends(InvalidOperationError, _super);\n function InvalidOperationError(operation) {\n var _this = _super.call(this, \"Invalid operation: \".concat(operation.op)) || this;\n _this.operation = operation;\n _this.name = 'InvalidOperationError';\n return _this;\n }\n return InvalidOperationError;\n}(Error));\nexports.InvalidOperationError = InvalidOperationError;\n/**\nSwitch on `operation.op`, applying the corresponding patch function for each\ncase to `object`.\n*/\nfunction apply(object, operation) {\n // not sure why TypeScript can't infer typesafety of:\n // {add, remove, replace, move, copy, test}[operation.op](object, operation)\n // (seems like a bug)\n switch (operation.op) {\n case 'add': return add(object, operation);\n case 'remove': return remove(object, operation);\n case 'replace': return replace(object, operation);\n case 'move': return move(object, operation);\n case 'copy': return copy(object, operation);\n case 'test': return test(object, operation);\n }\n return new InvalidOperationError(operation);\n}\nexports.apply = apply;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createTests = exports.createPatch = exports.applyPatch = exports.Pointer = void 0;\nvar pointer_1 = require(\"./pointer\");\nObject.defineProperty(exports, \"Pointer\", { enumerable: true, get: function () { return pointer_1.Pointer; } });\nvar patch_1 = require(\"./patch\");\nvar diff_1 = require(\"./diff\");\n/**\nApply a 'application/json-patch+json'-type patch to an object.\n\n`patch` *must* be an array of operations.\n\n> Operation objects MUST have exactly one \"op\" member, whose value\n> indicates the operation to perform. Its value MUST be one of \"add\",\n> \"remove\", \"replace\", \"move\", \"copy\", or \"test\"; other values are\n> errors.\n\nThis method mutates the target object in-place.\n\n@returns list of results, one for each operation: `null` indicated success,\n otherwise, the result will be an instance of one of the Error classes:\n MissingError, InvalidOperationError, or TestError.\n*/\nfunction applyPatch(object, patch) {\n return patch.map(function (operation) { return (0, patch_1.apply)(object, operation); });\n}\nexports.applyPatch = applyPatch;\nfunction wrapVoidableDiff(diff) {\n function wrappedDiff(input, output, ptr) {\n var custom_patch = diff(input, output, ptr);\n // ensure an array is always returned\n return Array.isArray(custom_patch) ? custom_patch : (0, diff_1.diffAny)(input, output, ptr, wrappedDiff);\n }\n return wrappedDiff;\n}\n/**\nProduce a 'application/json-patch+json'-type patch to get from one object to\nanother.\n\nThis does not alter `input` or `output` unless they have a property getter with\nside-effects (which is not a good idea anyway).\n\n`diff` is called on each pair of comparable non-primitive nodes in the\n`input`/`output` object trees, producing nested patches. Return `undefined`\nto fall back to default behaviour.\n\nReturns list of operations to perform on `input` to produce `output`.\n*/\nfunction createPatch(input, output, diff) {\n var ptr = new pointer_1.Pointer();\n // a new Pointer gets a default path of [''] if not specified\n return (diff ? wrapVoidableDiff(diff) : diff_1.diffAny)(input, output, ptr);\n}\nexports.createPatch = createPatch;\n/**\nCreate a test operation based on `input`'s current evaluation of the JSON\nPointer `path`; if such a pointer cannot be resolved, returns undefined.\n*/\nfunction createTest(input, path) {\n var endpoint = pointer_1.Pointer.fromJSON(path).evaluate(input);\n if (endpoint !== undefined) {\n return { op: 'test', path: path, value: endpoint.value };\n }\n}\n/**\nProduce an 'application/json-patch+json'-type list of tests, to verify that\nexisting values in an object are identical to the those captured at some\ncheckpoint (whenever this function is called).\n\nThis does not alter `input` or `output` unless they have a property getter with\nside-effects (which is not a good idea anyway).\n\nReturns list of test operations.\n*/\nfunction createTests(input, patch) {\n var tests = new Array();\n patch.filter(diff_1.isDestructive).forEach(function (operation) {\n var pathTest = createTest(input, operation.path);\n if (pathTest)\n tests.push(pathTest);\n if ('from' in operation) {\n var fromTest = createTest(input, operation.from);\n if (fromTest)\n tests.push(fromTest);\n }\n });\n return tests;\n}\nexports.createTests = createTests;\n", "import { MedplumClient } from '@medplum/core';\nimport { ReactNode, useEffect, useMemo, useState } from 'react';\nimport { MepdlumNavigateFunction, reactContext } from './MedplumProvider.context';\n\nexport interface MedplumProviderProps {\n medplum: MedplumClient;\n navigate?: MepdlumNavigateFunction;\n children: ReactNode;\n}\n\n/**\n * The MedplumProvider component provides Medplum context state.\n *\n * Medplum context includes:\n * 1) medplum - Medplum client library\n * 2) profile - The current user profile (if signed in)\n * @param props - The MedplumProvider React props.\n * @returns The MedplumProvider React node.\n */\nexport function MedplumProvider(props: MedplumProviderProps): JSX.Element {\n const medplum = props.medplum;\n const navigate = props.navigate ?? defaultNavigate;\n\n const [state, setState] = useState({\n profile: medplum.getProfile(),\n loading: !medplum.isInitialized,\n });\n\n useEffect(() => {\n if (!medplum) {\n return;\n }\n if (!medplum.isInitialized) {\n setState((s) => ({ ...s, loading: true }));\n medplum\n .getInitPromise()\n .then(() => setState((s) => ({ ...s, loading: false })))\n .catch(console.error);\n }\n }, [medplum, medplum.isInitialized]);\n\n useEffect(() => {\n function eventListener(): void {\n setState({\n ...state,\n profile: medplum.getProfile(),\n });\n }\n\n medplum.addEventListener('change', eventListener);\n return () => medplum.removeEventListener('change', eventListener);\n }, [medplum, state]);\n\n const medplumContext = useMemo(\n () => ({\n ...state,\n medplum,\n navigate,\n }),\n [state, medplum, navigate]\n );\n\n return <reactContext.Provider value={medplumContext}>{props.children}</reactContext.Provider>;\n}\n\n/**\n * The default \"navigate\" function which simply uses window.location.href.\n * @param path - The path to navigate to.\n */\nfunction defaultNavigate(path: string): void {\n window.location.assign(path);\n}\n", "import { MedplumClient, ProfileResource } from '@medplum/core';\nimport { createContext, useContext } from 'react';\n\nexport const reactContext = createContext(undefined as MedplumContext | undefined);\n\nexport type MepdlumNavigateFunction = (path: string) => void;\n\nexport interface MedplumContext {\n medplum: MedplumClient;\n navigate: MepdlumNavigateFunction;\n profile?: ProfileResource;\n loading: boolean;\n}\n\n/**\n * Returns the MedplumContext instance.\n * @returns The MedplumContext instance.\n */\nexport function useMedplumContext(): MedplumContext {\n return useContext(reactContext) as MedplumContext;\n}\n\n/**\n * Returns the MedplumClient instance.\n * This is a shortcut for useMedplumContext().medplum.\n * @returns The MedplumClient instance.\n */\nexport function useMedplum(): MedplumClient {\n return useMedplumContext().medplum;\n}\n\n/**\n * Returns the Medplum navigate function.\n * @returns The Medplum navigate function.\n */\nexport function useMedplumNavigate(): MepdlumNavigateFunction {\n return useMedplumContext().navigate;\n}\n\n/**\n * Returns the current Medplum user profile (if signed in).\n * This is a shortcut for useMedplumContext().profile.\n * @returns The current user profile.\n */\nexport function useMedplumProfile(): ProfileResource | undefined {\n return useMedplumContext().profile;\n}\n", "import { deepEquals, isReference, isResource, MedplumClient, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider.context';\n\n/**\n * React Hook to use a FHIR reference.\n * Handles the complexity of resolving references and caching resources.\n * @param value - The resource or reference to resource.\n * @param setOutcome - Optional callback to set the OperationOutcome.\n * @returns The resolved resource.\n */\nexport function useResource<T extends Resource>(\n value: Reference<T> | T | undefined,\n setOutcome?: (outcome: OperationOutcome) => void\n): T | undefined {\n const medplum = useMedplum();\n const [resource, setResource] = useState<T | undefined>(getInitialResource(medplum, value));\n\n const setResourceIfChanged = useCallback(\n (r: T | undefined) => {\n if (!deepEquals(r, resource)) {\n setResource(r);\n }\n },\n [resource, setResource]\n );\n\n useEffect(() => {\n setResourceIfChanged(getInitialResource(medplum, value));\n }, [medplum, value, setResourceIfChanged]);\n\n useEffect(() => {\n let subscribed = true;\n\n if (isReference(value)) {\n medplum\n .readReference(value as Reference<T>)\n .then((r) => {\n if (subscribed) {\n setResourceIfChanged(r);\n }\n })\n .catch((err) => {\n if (subscribed) {\n setResourceIfChanged(undefined);\n if (setOutcome) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }\n });\n }\n\n return (() => (subscribed = false)) as () => void;\n }, [medplum, resource, value, setResourceIfChanged, setOutcome]);\n\n return resource;\n}\n\n/**\n * Returns the initial resource value based on the input value.\n * If the input value is a resource, returns the resource.\n * If the input value is a reference to a resource available in the cache, returns the resource.\n * Otherwise, returns undefined.\n * @param medplum - The medplum client.\n * @param value - The resource or reference to resource.\n * @returns An initial resource if available; undefined otherwise.\n */\nfunction getInitialResource<T extends Resource>(\n medplum: MedplumClient,\n value: Reference<T> | T | undefined\n): T | undefined {\n if (value) {\n if (isResource(value)) {\n return value;\n }\n\n if (isReference(value)) {\n return medplum.getCachedReference(value as Reference<T>);\n }\n }\n\n return undefined;\n}\n", "import { allOk, normalizeOperationOutcome, QueryTypes, ResourceArray } from '@medplum/core';\nimport { Bundle, ExtractResource, OperationOutcome, ResourceType } from '@medplum/fhirtypes';\nimport { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider.context';\n\ntype SearchFn = 'search' | 'searchOne' | 'searchResources';\n\n/**\n * React hook for searching FHIR resources.\n *\n * This is a convenience hook for calling the MedplumClient.search() method.\n *\n * @param resourceType - The FHIR resource type to search.\n * @param query - Optional search parameters.\n * @returns A 3-element tuple containing the search result, loading flag, and operation outcome.\n */\nexport function useSearch<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes\n): [Bundle<ExtractResource<K>> | undefined, boolean, OperationOutcome | undefined] {\n return useSearchImpl<K, Bundle<ExtractResource<K>>>('search', resourceType, query);\n}\n\n/**\n * React hook for searching for a single FHIR resource.\n *\n * This is a convenience hook for calling the MedplumClient.searchOne() method.\n *\n * @param resourceType - The FHIR resource type to search.\n * @param query - Optional search parameters.\n * @returns A 3-element tuple containing the search result, loading flag, and operation outcome.\n */\nexport function useSearchOne<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes\n): [ExtractResource<K> | undefined, boolean, OperationOutcome | undefined] {\n return useSearchImpl<K, ExtractResource<K>>('searchOne', resourceType, query);\n}\n\n/**\n * React hook for searching for an array of FHIR resources.\n *\n * This is a convenience hook for calling the MedplumClient.searchResources() method.\n *\n * @param resourceType - The FHIR resource type to search.\n * @param query - Optional search parameters.\n * @returns A 3-element tuple containing the search result, loading flag, and operation outcome.\n */\nexport function useSearchResources<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes\n): [ResourceArray<ExtractResource<K>> | undefined, boolean, OperationOutcome | undefined] {\n return useSearchImpl<K, ResourceArray<ExtractResource<K>>>('searchResources', resourceType, query);\n}\n\nfunction useSearchImpl<K extends ResourceType, ReturnType>(\n searchFn: SearchFn,\n resourceType: K,\n query: QueryTypes | undefined\n): [ReturnType | undefined, boolean, OperationOutcome | undefined] {\n const medplum = useMedplum();\n const [searchKey, setSearchKey] = useState<string>();\n const [loading, setLoading] = useState<boolean>(false);\n const [result, setResult] = useState<ReturnType>();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n\n useEffect(() => {\n const key = medplum.fhirSearchUrl(resourceType, query).toString();\n if (key !== searchKey) {\n setSearchKey(key);\n medplum[searchFn](resourceType, query)\n .then((res) => {\n setLoading(false);\n setResult(res as ReturnType);\n setOutcome(allOk);\n })\n .catch((err) => {\n setLoading(false);\n setResult(undefined);\n setOutcome(normalizeOperationOutcome(err));\n });\n }\n }, [medplum, searchFn, resourceType, query, searchKey, setResult]);\n\n return [result, loading, outcome];\n}\n", "import { formatAddress } from '@medplum/core';\nimport { Address } from '@medplum/fhirtypes';\n\nexport interface AddressDisplayProps {\n value?: Address;\n}\n\nexport function AddressDisplay(props: AddressDisplayProps): JSX.Element | null {\n const address = props.value;\n if (!address) {\n return null;\n }\n\n return <>{formatAddress(address)}</>;\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Address } from '@medplum/fhirtypes';\nimport { useRef, useState } from 'react';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\n\nfunction getLine(address: Address, index: number): string {\n return address.line && address.line.length > index ? address.line[index] : '';\n}\n\nfunction setLine(address: Address, index: number, str: string): Address {\n const line: string[] = address.line || [];\n while (line.length <= index) {\n line.push('');\n }\n line[index] = str;\n return { ...address, line };\n}\n\nexport type AddressInputProps = ComplexTypeInputProps<Address>;\n\nexport function AddressInput(props: AddressInputProps): JSX.Element {\n const [value, setValue] = useState<Address>(props.defaultValue || {});\n\n const valueRef = useRef<Address>();\n valueRef.current = value;\n\n // const stateElement = useMemo(\n // () => getModifiedNestedElement(props.path + '.state'),\n // [getModifiedNestedElement, props.path]\n // );\n // TODO{profiles} is it worth the complexity of subbing in an autocomplete input when\n // a binding is defined in a profile? If so, it should go in a new wrapper around TextInput\n // e.g. US Core Patient Profile\n\n function setValueWrapper(newValue: Address): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'billing'): void {\n setValueWrapper({ ...valueRef.current, use });\n }\n\n function setType(type: 'postal' | 'physical' | 'both'): void {\n setValueWrapper({ ...valueRef.current, type });\n }\n\n function setLine1(line1: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 0, line1));\n }\n\n function setLine2(line2: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 1, line2));\n }\n\n function setCity(city: string): void {\n setValueWrapper({ ...valueRef.current, city });\n }\n\n function setState(state: string): void {\n setValueWrapper({ ...valueRef.current, state });\n }\n\n function setPostalCode(postalCode: string): void {\n setValueWrapper({ ...valueRef.current, postalCode });\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n data-testid=\"address-use\"\n defaultValue={value.use}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'billing')}\n data={['', 'home', 'work', 'temp', 'old', 'billing']}\n />\n <NativeSelect\n data-testid=\"address-type\"\n defaultValue={value.type}\n onChange={(e) => setType(e.currentTarget.value as 'postal' | 'physical' | 'both')}\n data={['', 'postal', 'physical', 'both']}\n />\n <TextInput\n placeholder=\"Line 1\"\n defaultValue={getLine(value, 0)}\n onChange={(e) => setLine1(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Line 2\"\n defaultValue={getLine(value, 1)}\n onChange={(e) => setLine2(e.currentTarget.value)}\n />\n <TextInput placeholder=\"City\" defaultValue={value.city} onChange={(e) => setCity(e.currentTarget.value)} />\n <TextInput placeholder=\"State\" defaultValue={value.state} onChange={(e) => setState(e.currentTarget.value)} />\n <TextInput\n placeholder=\"Postal Code\"\n defaultValue={value.postalCode}\n onChange={(e) => setPostalCode(e.currentTarget.value)}\n />\n </Group>\n );\n}\n", "import { TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Annotation } from '@medplum/fhirtypes';\nimport { useMedplumProfile } from '@medplum/react-hooks';\nimport { useRef, useState } from 'react';\n\nexport interface AnnotationInputProps {\n name: string;\n defaultValue?: Annotation;\n onChange?: (value: Annotation) => void;\n}\n\nexport function AnnotationInput(props: AnnotationInputProps): JSX.Element {\n const author = useMedplumProfile();\n const [value, setValue] = useState<Annotation>(props.defaultValue || {});\n\n const valueRef = useRef<Annotation>();\n valueRef.current = value;\n\n function setText(text: string): void {\n const newValue: Annotation = text\n ? {\n text,\n authorReference: author && createReference(author),\n time: new Date().toISOString(),\n }\n : {};\n\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <TextInput\n name={props.name}\n placeholder=\"Annotation text\"\n defaultValue={value.text}\n onChange={(e) => setText(e.currentTarget.value)}\n />\n );\n}\n", "import { AppShell as MantineAppShell, useMantineTheme } from '@mantine/core';\nimport { showNotification } from '@mantine/notifications';\nimport { useMedplum, useMedplumProfile } from '@medplum/react-hooks';\nimport { ReactNode, Suspense, useEffect, useState } from 'react';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { Loading } from '../Loading/Loading';\nimport { Header } from './Header';\nimport { Navbar, NavbarMenu } from './Navbar';\n\nexport interface AppShellProps {\n logo: ReactNode;\n pathname?: string;\n searchParams?: URLSearchParams;\n headerSearchDisabled?: boolean;\n version?: string;\n menus?: NavbarMenu[];\n children: ReactNode;\n displayAddBookmark?: boolean;\n resourceTypeSearchDisabled?: boolean;\n}\n\nexport function AppShell(props: AppShellProps): JSX.Element {\n const theme = useMantineTheme();\n const [navbarOpen, setNavbarOpen] = useState(localStorage['navbarOpen'] === 'true');\n const medplum = useMedplum();\n const profile = useMedplumProfile();\n\n useEffect(() => {\n function eventListener(): void {\n showNotification({ color: 'red', message: 'No connection to server', autoClose: false });\n }\n medplum.addEventListener('offline', eventListener);\n return () => medplum.removeEventListener('offline', eventListener);\n }, [medplum]);\n\n function setNavbarOpenWrapper(open: boolean): void {\n localStorage['navbarOpen'] = open.toString();\n setNavbarOpen(open);\n }\n\n function closeNavbar(): void {\n setNavbarOpenWrapper(false);\n }\n\n function toggleNavbar(): void {\n setNavbarOpenWrapper(!navbarOpen);\n }\n\n if (medplum.isLoading()) {\n return <Loading />;\n }\n\n return (\n <MantineAppShell\n styles={{\n main: {\n background: theme.colorScheme === 'dark' ? theme.colors.dark[8] : theme.colors.gray[0],\n },\n }}\n padding={0}\n fixed={true}\n header={\n profile && (\n <Header\n pathname={props.pathname}\n searchParams={props.searchParams}\n headerSearchDisabled={props.headerSearchDisabled}\n logo={props.logo}\n version={props.version}\n navbarToggle={toggleNavbar}\n />\n )\n }\n navbar={\n profile && navbarOpen ? (\n <Navbar\n pathname={props.pathname}\n searchParams={props.searchParams}\n menus={props.menus}\n closeNavbar={closeNavbar}\n displayAddBookmark={props.displayAddBookmark}\n resourceTypeSearchDisabled={props.resourceTypeSearchDisabled}\n />\n ) : undefined\n }\n >\n <ErrorBoundary>\n <Suspense fallback={<Loading />}>{props.children}</Suspense>\n </ErrorBoundary>\n </MantineAppShell>\n );\n}\n", "import { Alert } from '@mantine/core';\nimport { normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { Component, ErrorInfo, ReactNode } from 'react';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n}\n\nexport interface ErrorBoundaryState {\n error?: Error;\n lastLocation: string;\n}\n\n/**\n * ErrorBoundary is a React component that handles errors in its child components.\n * See: https://reactjs.org/docs/error-boundaries.html\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { lastLocation: window.location.toString() };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error, lastLocation: window.location.toString() };\n }\n\n componentDidUpdate(_prevProps: Readonly<ErrorBoundaryProps>, _prevState: Readonly<ErrorBoundaryState>): void {\n if (window.location.toString() !== this.state.lastLocation) {\n this.setState({\n lastLocation: window.location.toString(),\n error: undefined,\n });\n }\n }\n\n shouldComponentUpdate(nextProps: Readonly<ErrorBoundaryProps>, nextState: Readonly<ErrorBoundaryState>): boolean {\n if (this.props.children !== nextProps.children) {\n return true;\n }\n if (nextState.error && !this.state.error) {\n return true;\n }\n if (this.state.lastLocation !== window.location.toString()) {\n return true;\n }\n return false;\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Something went wrong\" color=\"red\">\n {normalizeErrorString(this.state.error)}\n </Alert>\n );\n }\n\n return this.props.children;\n }\n}\n", "export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n", "import { forwardRef, createElement } from 'react';\nimport PropTypes from 'prop-types';\nimport defaultAttributes from './defaultAttributes';\n\nexport default (iconName, iconNamePascal, iconNode) => {\n const Component = forwardRef(\n ({ color = 'currentColor', size = 24, stroke = 2, children, ...rest }, ref) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: stroke,\n className: `tabler-icon tabler-icon-${iconName}`,\n ...rest,\n },\n [...iconNode.map(([tag, attrs]) => createElement(tag, attrs)), ...(children || [])],\n ),\n );\n\n Component.propTypes = {\n color: PropTypes.string,\n size: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n stroke: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n };\n\n Component.displayName = `${iconNamePascal}`;\n\n return Component;\n};\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent(\n 'adjustments-horizontal',\n 'IconAdjustmentsHorizontal',\n [\n ['path', { d: 'M14 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-0' }],\n ['path', { d: 'M4 6l8 0', key: 'svg-1' }],\n ['path', { d: 'M16 6l4 0', key: 'svg-2' }],\n ['path', { d: 'M8 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-3' }],\n ['path', { d: 'M4 12l2 0', key: 'svg-4' }],\n ['path', { d: 'M10 12l10 0', key: 'svg-5' }],\n ['path', { d: 'M17 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-6' }],\n ['path', { d: 'M4 18l11 0', key: 'svg-7' }],\n ['path', { d: 'M19 18l1 0', key: 'svg-8' }],\n ],\n);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('alert-circle', 'IconAlertCircle', [\n ['path', { d: 'M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0', key: 'svg-0' }],\n ['path', { d: 'M12 8v4', key: 'svg-1' }],\n ['path', { d: 'M12 16h.01', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('arrow-down', 'IconArrowDown', [\n ['path', { d: 'M12 5l0 14', key: 'svg-0' }],\n ['path', { d: 'M18 13l-6 6', key: 'svg-1' }],\n ['path', { d: 'M6 13l6 6', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('arrow-up', 'IconArrowUp', [\n ['path', { d: 'M12 5l0 14', key: 'svg-0' }],\n ['path', { d: 'M18 11l-6 -6', key: 'svg-1' }],\n ['path', { d: 'M6 11l6 -6', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bleach-off', 'IconBleachOff', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M3 3l18 18', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bleach', 'IconBleach', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('box-multiple', 'IconBoxMultiple', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M17 17v2a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('brackets-contain', 'IconBracketsContain', [\n ['path', { d: 'M7 4h-4v16h4', key: 'svg-0' }],\n ['path', { d: 'M17 4h4v16h-4', key: 'svg-1' }],\n ['path', { d: 'M8 16h.01', key: 'svg-2' }],\n ['path', { d: 'M12 16h.01', key: 'svg-3' }],\n ['path', { d: 'M16 16h.01', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bucket-off', 'IconBucketOff', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n 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',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M3 3l18 18', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bucket', 'IconBucket', [\n ['path', { d: 'M12 7m-8 0a8 4 0 1 0 16 0a8 4 0 1 0 -16 0', key: 'svg-0' }],\n [\n 'path',\n {\n 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',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('calendar', 'IconCalendar', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M16 3v4', key: 'svg-1' }],\n ['path', { d: 'M8 3v4', key: 'svg-2' }],\n ['path', { d: 'M4 11h16', key: 'svg-3' }],\n ['path', { d: 'M11 15h1', key: 'svg-4' }],\n ['path', { d: 'M12 15v3', key: 'svg-5' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('check', 'IconCheck', [\n ['path', { d: 'M5 12l5 5l10 -10', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('checkbox', 'IconCheckbox', [\n ['path', { d: 'M9 11l3 3l8 -8', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M20 12v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h9',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('chevron-down', 'IconChevronDown', [\n ['path', { d: 'M6 9l6 6l6 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('circle-minus', 'IconCircleMinus', [\n ['path', { d: 'M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0', key: 'svg-0' }],\n ['path', { d: 'M9 12l6 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('circle-plus', 'IconCirclePlus', [\n ['path', { d: 'M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0', key: 'svg-0' }],\n ['path', { d: 'M9 12h6', key: 'svg-1' }],\n ['path', { d: 'M12 9v6', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('cloud-upload', 'IconCloudUpload', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 15l3 -3l3 3', key: 'svg-1' }],\n ['path', { d: 'M12 12l0 9', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('columns', 'IconColumns', [\n ['path', { d: 'M4 6l5.5 0', key: 'svg-0' }],\n ['path', { d: 'M4 10l5.5 0', key: 'svg-1' }],\n ['path', { d: 'M4 14l5.5 0', key: 'svg-2' }],\n ['path', { d: 'M4 18l5.5 0', key: 'svg-3' }],\n ['path', { d: 'M14.5 6l5.5 0', key: 'svg-4' }],\n ['path', { d: 'M14.5 10l5.5 0', key: 'svg-5' }],\n ['path', { d: 'M14.5 14l5.5 0', key: 'svg-6' }],\n ['path', { d: 'M14.5 18l5.5 0', key: 'svg-7' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('copy', 'IconCopy', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n 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',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('currency-dollar', 'IconCurrencyDollar', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M12 3v3m0 12v3', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('dots', 'IconDots', [\n ['path', { d: 'M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-0' }],\n ['path', { d: 'M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-1' }],\n ['path', { d: 'M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('edit', 'IconEdit', [\n [\n 'path',\n {\n d: 'M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M16 5l3 3', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('equal-not', 'IconEqualNot', [\n ['path', { d: 'M5 10h14', key: 'svg-0' }],\n ['path', { d: 'M5 14h14', key: 'svg-1' }],\n ['path', { d: 'M5 19l14 -14', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('equal', 'IconEqual', [\n ['path', { d: 'M5 10h14', key: 'svg-0' }],\n ['path', { d: 'M5 14h14', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('file-alert', 'IconFileAlert', [\n ['path', { d: 'M14 3v4a1 1 0 0 0 1 1h4', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M12 17l.01 0', key: 'svg-2' }],\n ['path', { d: 'M12 11l0 3', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('file-plus', 'IconFilePlus', [\n ['path', { d: 'M14 3v4a1 1 0 0 0 1 1h4', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M12 11l0 6', key: 'svg-2' }],\n ['path', { d: 'M9 14l6 0', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('filter', 'IconFilter', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('gender-female', 'IconGenderFemale', [\n ['path', { d: 'M12 9m-5 0a5 5 0 1 0 10 0a5 5 0 1 0 -10 0', key: 'svg-0' }],\n ['path', { d: 'M12 14v7', key: 'svg-1' }],\n ['path', { d: 'M9 18h6', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('list-details', 'IconListDetails', [\n ['path', { d: 'M13 5h8', key: 'svg-0' }],\n ['path', { d: 'M13 9h5', key: 'svg-1' }],\n ['path', { d: 'M13 15h8', key: 'svg-2' }],\n ['path', { d: 'M13 19h5', key: 'svg-3' }],\n [\n 'path',\n {\n d: 'M3 4m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z',\n key: 'svg-4',\n },\n ],\n [\n 'path',\n {\n d: 'M3 14m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z',\n key: 'svg-5',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('logout', 'IconLogout', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 12h12l-3 -3', key: 'svg-1' }],\n ['path', { d: 'M18 15l3 -3', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('math-greater', 'IconMathGreater', [\n ['path', { d: 'M5 18l14 -6l-14 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('math-lower', 'IconMathLower', [\n ['path', { d: 'M19 18l-14 -6l14 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('message', 'IconMessage', [\n ['path', { d: 'M8 9h8', key: 'svg-0' }],\n ['path', { d: 'M8 13h6', key: 'svg-1' }],\n [\n 'path',\n {\n 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',\n key: 'svg-2',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('pin', 'IconPin', [\n [\n 'path',\n {\n d: 'M15 4.5l-4 4l-4 1.5l-1.5 1.5l7 7l1.5 -1.5l1.5 -4l4 -4',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 15l-4.5 4.5', key: 'svg-1' }],\n ['path', { d: 'M14.5 4l5.5 5.5', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('pinned-off', 'IconPinnedOff', [\n ['path', { d: 'M3 3l18 18', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M15 4.5l-3.249 3.249m-2.57 1.433l-2.181 .818l-1.5 1.5l7 7l1.5 -1.5l.82 -2.186m1.43 -2.563l3.25 -3.251',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M9 15l-4.5 4.5', key: 'svg-2' }],\n ['path', { d: 'M14.5 4l5.5 5.5', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('plus', 'IconPlus', [\n ['path', { d: 'M12 5l0 14', key: 'svg-0' }],\n ['path', { d: 'M5 12l14 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('refresh', 'IconRefresh', [\n ['path', { d: 'M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4', key: 'svg-0' }],\n ['path', { d: 'M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('search', 'IconSearch', [\n ['path', { d: 'M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0', key: 'svg-0' }],\n ['path', { d: 'M21 21l-6 -6', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('settings', 'IconSettings', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('sort-ascending', 'IconSortAscending', [\n ['path', { d: 'M4 6l7 0', key: 'svg-0' }],\n ['path', { d: 'M4 12l7 0', key: 'svg-1' }],\n ['path', { d: 'M4 18l9 0', key: 'svg-2' }],\n ['path', { d: 'M15 9l3 -3l3 3', key: 'svg-3' }],\n ['path', { d: 'M18 6l0 12', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('sort-descending', 'IconSortDescending', [\n ['path', { d: 'M4 6l9 0', key: 'svg-0' }],\n ['path', { d: 'M4 12l7 0', key: 'svg-1' }],\n ['path', { d: 'M4 18l7 0', key: 'svg-2' }],\n ['path', { d: 'M15 15l3 3l3 -3', key: 'svg-3' }],\n ['path', { d: 'M18 6l0 12', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('square', 'IconSquare', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('stethoscope', 'IconStethoscope', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M8 15a6 6 0 1 0 12 0v-3', key: 'svg-1' }],\n ['path', { d: 'M11 3v2', key: 'svg-2' }],\n ['path', { d: 'M6 3v2', key: 'svg-3' }],\n ['path', { d: 'M20 10m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent(\n 'switch-horizontal',\n 'IconSwitchHorizontal',\n [\n ['path', { d: 'M16 3l4 4l-4 4', key: 'svg-0' }],\n ['path', { d: 'M10 7l10 0', key: 'svg-1' }],\n ['path', { d: 'M8 13l-4 4l4 4', key: 'svg-2' }],\n ['path', { d: 'M4 17l9 0', key: 'svg-3' }],\n ],\n);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('table-export', 'IconTableExport', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M3 10h18', key: 'svg-1' }],\n ['path', { d: 'M10 3v18', key: 'svg-2' }],\n ['path', { d: 'M16 19h6', key: 'svg-3' }],\n ['path', { d: 'M19 16l3 3l-3 3', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('trash', 'IconTrash', [\n ['path', { d: 'M4 7l16 0', key: 'svg-0' }],\n ['path', { d: 'M10 11l0 6', key: 'svg-1' }],\n ['path', { d: 'M14 11l0 6', key: 'svg-2' }],\n [\n 'path',\n { d: 'M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12', key: 'svg-3' },\n ],\n ['path', { d: 'M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('user-square', 'IconUserSquare', [\n ['path', { d: 'M9 10a3 3 0 1 0 6 0a3 3 0 0 0 -6 0', key: 'svg-0' }],\n ['path', { d: 'M6 21v-1a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v1', key: 'svg-1' }],\n [\n 'path',\n {\n d: 'M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14z',\n key: 'svg-2',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('x', 'IconX', [\n ['path', { d: 'M18 6l-12 12', key: 'svg-0' }],\n ['path', { d: 'M6 6l12 12', key: 'svg-1' }],\n]);\n", "import { Center, Loader } from '@mantine/core';\n\nexport function Loading(): JSX.Element {\n return (\n <Center style={{ width: '100%', height: '100vh' }}>\n <Loader />\n </Center>\n );\n}\n", "import { Avatar, createStyles, Group, Header as MantineHeader, Menu, Stack, Text, UnstyledButton } from '@mantine/core';\nimport { formatHumanName, getReferenceString, ProfileResource } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport { useMedplumContext } from '@medplum/react-hooks';\nimport { IconChevronDown, IconLogout, IconSettings, IconSwitchHorizontal } from '@tabler/icons-react';\nimport { ReactNode, useState } from 'react';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { HeaderSearchInput } from './HeaderSearchInput';\n\nconst useStyles = createStyles((theme) => ({\n logoButton: {\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n borderRadius: theme.radius.sm,\n transition: 'background-color 100ms ease',\n\n '&:hover': {\n backgroundColor: theme.fn.lighten(\n theme.fn.variant({ variant: 'filled', color: theme.primaryColor }).background as string,\n 0.8\n ),\n },\n },\n\n user: {\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n borderRadius: theme.radius.sm,\n transition: 'background-color 100ms ease',\n\n '&:hover': {\n backgroundColor: theme.fn.lighten(\n theme.fn.variant({ variant: 'filled', color: theme.primaryColor }).background as string,\n 0.8\n ),\n },\n },\n\n userName: {\n fontWeight: 500,\n lineHeight: 1,\n marginRight: 3,\n\n [theme.fn.smallerThan('xs')]: {\n display: 'none',\n },\n },\n\n userActive: {\n backgroundColor: theme.fn.lighten(\n theme.fn.variant({ variant: 'filled', color: theme.primaryColor }).background as string,\n 0.8\n ),\n },\n}));\n\nexport interface HeaderProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n headerSearchDisabled?: boolean;\n logo: ReactNode;\n version?: string;\n navbarToggle: () => void;\n}\n\nexport function Header(props: HeaderProps): JSX.Element {\n const context = useMedplumContext();\n const { medplum, profile, navigate } = context;\n const logins = medplum.getLogins();\n const { classes, cx } = useStyles();\n const [userMenuOpened, setUserMenuOpened] = useState(false);\n\n return (\n <MantineHeader height={60} p={8} style={{ zIndex: 101 }}>\n <Group position=\"apart\">\n <Group spacing=\"xs\">\n <UnstyledButton className={classes.logoButton} onClick={props.navbarToggle}>\n {props.logo}\n </UnstyledButton>\n {!props.headerSearchDisabled && (\n <HeaderSearchInput pathname={props.pathname} searchParams={props.searchParams} />\n )}\n </Group>\n\n <Menu\n width={260}\n shadow=\"xl\"\n position=\"bottom-end\"\n transitionProps={{ transition: 'pop-top-right' }}\n opened={userMenuOpened}\n onClose={() => setUserMenuOpened(false)}\n >\n <Menu.Target>\n <UnstyledButton\n className={cx(classes.user, { [classes.userActive]: userMenuOpened })}\n onClick={() => setUserMenuOpened((o) => !o)}\n >\n <Group spacing={7}>\n <ResourceAvatar value={profile} radius=\"xl\" size={24} />\n <Text size=\"sm\" className={classes.userName}>\n {formatHumanName(profile?.name?.[0] as HumanName)}\n </Text>\n <IconChevronDown size={12} stroke={1.5} />\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <Menu.Dropdown>\n <Stack align=\"center\" p=\"xl\">\n <ResourceAvatar size=\"xl\" radius={100} value={context.profile} />\n <HumanNameDisplay value={context.profile?.name?.[0] as HumanName} />\n <Text color=\"dimmed\" size=\"xs\">\n {medplum.getActiveLogin()?.project.display}\n </Text>\n </Stack>\n {logins.length > 1 && <Menu.Divider />}\n {logins.map(\n (login) =>\n login.profile.reference !== getReferenceString(context.profile as ProfileResource) && (\n <Menu.Item\n key={login.profile.reference}\n onClick={() => {\n medplum\n .setActiveLogin(login)\n .then(() => window.location.reload())\n .catch(console.log);\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {login.profile.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {login.project.display}\n </Text>\n </div>\n </Group>\n </Menu.Item>\n )\n )}\n <Menu.Divider />\n <Menu.Item icon={<IconSwitchHorizontal size={14} stroke={1.5} />} onClick={() => navigate('/signin')}>\n Add another account\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} stroke={1.5} />}\n onClick={() => navigate(`/${getReferenceString(profile as ProfileResource)}`)}\n >\n Account settings\n </Menu.Item>\n <Menu.Item\n icon={<IconLogout size={14} stroke={1.5} />}\n onClick={async () => {\n await medplum.signOut();\n navigate('/signin');\n }}\n >\n Sign out\n </Menu.Item>\n <Text size=\"xs\" color=\"dimmed\" align=\"center\">\n {props.version}\n </Text>\n </Menu.Dropdown>\n </Menu>\n </Group>\n </MantineHeader>\n );\n}\n", "import { formatHumanName, HumanNameFormatOptions } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\n\nexport interface HumanNameDisplayProps {\n value?: HumanName;\n options?: HumanNameFormatOptions;\n}\n\nexport function HumanNameDisplay(props: HumanNameDisplayProps): JSX.Element | null {\n const name = props.value;\n if (!name) {\n return null;\n }\n\n return <>{formatHumanName(name, props.options)}</>;\n}\n", "import { Avatar, AvatarProps } from '@mantine/core';\nimport { getDisplayString, getImageSrc } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { useResource } from '@medplum/react-hooks';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ResourceAvatarProps extends AvatarProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceAvatar(props: ResourceAvatarProps): JSX.Element {\n const resource = useResource(props.value);\n const text = resource ? getDisplayString(resource) : props.alt ?? '';\n const imageUrl = (resource && getImageSrc(resource)) ?? props.src;\n const radius = props.radius ?? 'xl';\n\n const avatarProps = { ...props };\n delete avatarProps.value;\n delete avatarProps.link;\n\n if (props.link) {\n return (\n <MedplumLink to={resource}>\n <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />\n </MedplumLink>\n );\n }\n\n return <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />;\n}\n", "import { Anchor, TextProps } from '@mantine/core';\nimport { isReference, isResource } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { useMedplumNavigate } from '@medplum/react-hooks';\nimport { MouseEvent, MouseEventHandler, ReactNode } from 'react';\nimport { killEvent } from '../utils/dom';\n\nexport interface MedplumLinkProps extends TextProps {\n to?: Resource | Reference | string;\n suffix?: string;\n label?: string;\n onClick?: MouseEventHandler;\n children: ReactNode;\n}\n\nexport function MedplumLink(props: MedplumLinkProps): JSX.Element {\n const navigate = useMedplumNavigate();\n const { to, suffix, label, onClick, children, ...rest } = props;\n\n let href = getHref(to);\n if (suffix) {\n href += '/' + suffix;\n }\n\n return (\n <Anchor\n href={href}\n aria-label={label}\n onClick={(e: MouseEvent) => {\n killEvent(e);\n if (onClick) {\n onClick(e);\n } else if (to) {\n navigate(href);\n }\n }}\n {...rest}\n >\n {children}\n </Anchor>\n );\n}\n\nfunction getHref(to: Resource | Reference | string | undefined): string {\n if (to) {\n if (typeof to === 'string') {\n return getStringHref(to);\n } else if (isResource(to)) {\n return getResourceHref(to);\n } else if (isReference(to)) {\n return getReferenceHref(to);\n }\n }\n return '#';\n}\n\nfunction getStringHref(to: string): string {\n if (to.startsWith('http://') || to.startsWith('https://') || to.startsWith('/')) {\n return to;\n }\n return '/' + to;\n}\n\nfunction getResourceHref(to: Resource): string {\n return `/${to.resourceType}/${to.id}`;\n}\n\nfunction getReferenceHref(to: Reference): string {\n return `/${to.reference}`;\n}\n", "/**\n * Kills a browser event.\n * Prevents default behavior.\n * Stops event propagation.\n * @param e - The event.\n */\nexport function killEvent(e: Event | React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n}\n\n/**\n * Returns true if the element is a checkbox or a table cell containing a checkbox.\n * Table cells containing checkboxes are commonly accidentally clicked.\n * @param el - The HTML DOM element.\n * @returns True if the element is a checkbox or a table cell containing a checkbox.\n */\nexport function isCheckboxCell(el: Element): boolean {\n if (isCheckboxElement(el)) {\n return true;\n }\n\n if (el instanceof HTMLTableCellElement) {\n const children = el.children;\n if (children.length === 1 && isCheckboxElement(children[0])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isCheckboxElement(el: Element): boolean {\n return el instanceof HTMLInputElement && el.type === 'checkbox';\n}\n", "import { createStyles, Group, Text } from '@mantine/core';\nimport { formatHumanName, getDisplayString, getReferenceString, isUUID } from '@medplum/core';\nimport { Patient, ServiceRequest } from '@medplum/fhirtypes';\nimport { useMedplum, useMedplumNavigate } from '@medplum/react-hooks';\nimport { IconSearch } from '@tabler/icons-react';\nimport { forwardRef, useCallback } from 'react';\nimport { AsyncAutocomplete, AsyncAutocompleteOption } from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\n\nexport type HeaderSearchTypes = Patient | ServiceRequest;\n\nconst useStyles = createStyles(() => {\n return {\n searchInput: {\n input: {\n width: 220,\n transition: 'width 0.2s',\n },\n 'input:focus': {\n width: 400,\n },\n '@media (max-width: 800px)': {\n input: {\n width: 150,\n },\n 'input:focus': {\n width: 150,\n },\n },\n },\n };\n});\n\ninterface SearchGraphQLResponse {\n readonly data: {\n readonly Patients1: Patient[] | undefined;\n readonly Patients2: Patient[] | undefined;\n readonly ServiceRequestList: ServiceRequest[] | undefined;\n };\n}\n\nfunction toKey(resource: HeaderSearchTypes): string {\n return resource.id as string;\n}\n\nfunction toOption(resource: HeaderSearchTypes): AsyncAutocompleteOption<HeaderSearchTypes> {\n return {\n value: resource.id as string,\n label: getDisplayString(resource),\n resource,\n };\n}\n\nexport interface HeaderSearchInputProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n}\n\nexport function HeaderSearchInput(props: HeaderSearchInputProps): JSX.Element {\n const { classes } = useStyles();\n const navigate = useMedplumNavigate();\n const medplum = useMedplum();\n\n const loadData = useCallback(\n async (input: string, signal: AbortSignal): Promise<HeaderSearchTypes[]> => {\n const query = buildGraphQLQuery(input);\n const options = { signal };\n const response = (await medplum.graphql(query, undefined, undefined, options)) as SearchGraphQLResponse;\n return getResourcesFromResponse(response, input);\n },\n [medplum]\n );\n\n const handleSelect = useCallback(\n (item: HeaderSearchTypes[]): void => {\n if (item.length > 0) {\n navigate(`/${getReferenceString(item[0])}`);\n }\n },\n [navigate]\n );\n\n return (\n <AsyncAutocomplete\n key={`${props.pathname}?${props.searchParams}`}\n size=\"sm\"\n radius=\"md\"\n className={classes.searchInput}\n icon={<IconSearch size={16} />}\n placeholder=\"Search\"\n itemComponent={ItemComponent}\n toKey={toKey}\n toOption={toOption}\n onChange={handleSelect}\n loadOptions={loadData}\n maxSelectedValues={0}\n clearSearchOnChange\n clearable={false}\n />\n );\n}\n\nconst ItemComponent = forwardRef<HTMLDivElement, any>(\n ({ resource, ...others }: AsyncAutocompleteOption<HeaderSearchTypes>, ref) => {\n let helpText: string | undefined = undefined;\n\n if (resource.resourceType === 'Patient') {\n helpText = resource.birthDate;\n } else if (resource.resourceType === 'ServiceRequest') {\n helpText = resource.subject?.display;\n }\n\n return (\n <div ref={ref} {...others}>\n <Group noWrap>\n <ResourceAvatar value={resource} />\n <div>\n <Text>{getDisplayString(resource)}</Text>\n <Text size=\"xs\" color=\"dimmed\">\n {helpText}\n </Text>\n </div>\n </Group>\n </div>\n );\n }\n);\n\nfunction buildGraphQLQuery(input: string): string {\n const escaped = JSON.stringify(input);\n if (isUUID(input)) {\n return `{\n Patients1: PatientList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n }\n return `{\n Patients1: PatientList(name: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n Patients2: PatientList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n}\n\n/**\n * Returns a de-duped and sorted list of resources from the search response.\n * The search request is actually 3+ separate searches, which can include duplicates.\n * This function combines the results, de-dupes, and sorts by relevance.\n * @param response - The response from a search query.\n * @param query - The user entered search query.\n * @returns The resources to display in the autocomplete.\n */\nfunction getResourcesFromResponse(response: SearchGraphQLResponse, query: string): HeaderSearchTypes[] {\n const resources = [];\n if (response.data.Patients1) {\n resources.push(...response.data.Patients1);\n }\n if (response.data.Patients2) {\n resources.push(...response.data.Patients2);\n }\n if (response.data.ServiceRequestList) {\n resources.push(...response.data.ServiceRequestList);\n }\n return sortByRelevance(dedupeResources(resources), query).slice(0, 5);\n}\n\n/**\n * Removes duplicate resources from an array by ID.\n * @param resources - The array of resources with possible duplicates.\n * @returns The array of resources with no duplicates.\n */\nfunction dedupeResources(resources: HeaderSearchTypes[]): HeaderSearchTypes[] {\n const ids = new Set<string>();\n const result = [];\n\n for (const resource of resources) {\n if (!ids.has(resource.id as string)) {\n ids.add(resource.id as string);\n result.push(resource);\n }\n }\n\n return result;\n}\n\n/**\n * Sorts an array of resources by relevance.\n * @param resources - The candidate resources.\n * @param query - The user entered search string.\n * @returns The sorted array of resources.\n */\nfunction sortByRelevance(resources: HeaderSearchTypes[], query: string): HeaderSearchTypes[] {\n return resources.sort((a: HeaderSearchTypes, b: HeaderSearchTypes) => {\n return getResourceScore(b, query) - getResourceScore(a, query);\n });\n}\n\n/**\n * Calculates a relevance score of a candidate resource.\n * Higher scores are better.\n * @param resource - The candidate resource.\n * @param query - The user entered search string.\n * @returns The relevance score of the candidate resource.\n */\nfunction getResourceScore(resource: HeaderSearchTypes, query: string): number {\n let bestScore = 0;\n\n if (resource.identifier) {\n for (const identifier of resource.identifier) {\n bestScore = Math.max(bestScore, getStringScore(identifier.value, query));\n }\n }\n\n if (resource.resourceType === 'Patient' && resource.name) {\n for (const name of resource.name) {\n bestScore = Math.max(bestScore, getStringScore(formatHumanName(name), query));\n }\n }\n\n return bestScore;\n}\n\n/**\n * Calculates a relevance score of a candidate display string.\n * Higher scores are better.\n * @param str - The candidate display string.\n * @param query - The user entered search string.\n * @returns The relevance score of the candidate string.\n */\nfunction getStringScore(str: string | undefined, query: string): number {\n if (!str) {\n return 0;\n }\n const index = str.toLowerCase().indexOf(query.toLowerCase());\n if (index < 0) {\n return 0;\n }\n return 100 - index;\n}\n", "import { Loader, MultiSelect, MultiSelectProps, SelectItem } from '@mantine/core';\nimport { showNotification } from '@mantine/notifications';\nimport { normalizeErrorString } from '@medplum/core';\nimport { KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { killEvent } from '../utils/dom';\n\nexport interface AsyncAutocompleteOption<T> extends SelectItem {\n resource: T;\n}\n\nexport interface AsyncAutocompleteProps<T>\n extends Omit<MultiSelectProps, 'data' | 'defaultValue' | 'loadOptions' | 'onChange' | 'onCreate' | 'searchable'> {\n defaultValue?: T | T[];\n toKey: (item: T) => string;\n toOption: (item: T) => AsyncAutocompleteOption<T>;\n loadOptions: (input: string, signal: AbortSignal) => Promise<T[]>;\n onChange: (item: T[]) => void;\n onCreate?: (input: string) => T;\n creatable?: boolean;\n}\n\nexport function AsyncAutocomplete<T>(props: AsyncAutocompleteProps<T>): JSX.Element {\n const { defaultValue, toKey, toOption, loadOptions, onChange, onCreate, creatable, ...rest } = props;\n const defaultItems = toDefaultItems(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const [timer, setTimer] = useState<number>();\n const [abortController, setAbortController] = useState<AbortController>();\n const [autoSubmit, setAutoSubmit] = useState<boolean>();\n const [selected, setSelected] = useState<AsyncAutocompleteOption<T>[]>(defaultItems.map(toOption));\n const [options, setOptions] = useState<AsyncAutocompleteOption<T>[]>([]);\n\n const lastLoadOptionsRef = useRef<AsyncAutocompleteProps<T>['loadOptions']>();\n const lastValueRef = useRef<string>();\n\n const timerRef = useRef<number>();\n timerRef.current = timer;\n\n const abortControllerRef = useRef<AbortController>();\n abortControllerRef.current = abortController;\n\n const autoSubmitRef = useRef<boolean>();\n autoSubmitRef.current = autoSubmit;\n\n const optionsRef = useRef<AsyncAutocompleteOption<T>[]>();\n optionsRef.current = options;\n\n const handleTimer = useCallback((): void => {\n setTimer(undefined);\n\n const value = inputRef.current?.value.trim() || '';\n if (value === lastValueRef.current && loadOptions === lastLoadOptionsRef.current) {\n // Same search input and loadOptions function, move on\n return;\n }\n\n lastValueRef.current = value;\n lastLoadOptionsRef.current = loadOptions;\n\n const newAbortController = new AbortController();\n setAbortController(newAbortController);\n\n loadOptions(value, newAbortController.signal)\n .then((newValues: T[]) => {\n if (!newAbortController.signal.aborted) {\n setOptions(newValues.map(toOption));\n setAbortController(undefined);\n if (autoSubmitRef.current) {\n if (newValues.length > 0) {\n onChange(newValues.slice(0, 1));\n }\n setAutoSubmit(false);\n }\n }\n })\n .catch((err) => {\n if (!(newAbortController.signal.aborted || err.message.includes('aborted'))) {\n showNotification({ color: 'red', message: normalizeErrorString(err) });\n }\n });\n }, [loadOptions, onChange, toOption]);\n\n const handleSearchChange = useCallback((): void => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setAbortController(undefined);\n }\n\n if (timerRef.current !== undefined) {\n window.clearTimeout(timerRef.current);\n }\n\n const newTimer = window.setTimeout(() => handleTimer(), 100);\n setTimer(newTimer);\n }, [handleTimer]);\n\n const handleChange = useCallback(\n (values: string[]): void => {\n const result: T[] = [];\n const newSelected: AsyncAutocompleteOption<T>[] = [];\n for (const value of values) {\n let option = optionsRef.current?.find((option) => option.value === value);\n let item = option?.resource;\n if (!item && creatable !== false && onCreate) {\n item = onCreate(value);\n option = toOption(item);\n }\n\n if (item) {\n result.push(item);\n }\n\n if (option) {\n newSelected.push(option);\n }\n }\n onChange(result);\n setSelected(newSelected);\n },\n [creatable, onChange, onCreate, toOption]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent): void => {\n if (e.key === 'Enter') {\n if (!timerRef.current && !abortControllerRef.current) {\n killEvent(e);\n if (optionsRef.current && optionsRef.current.length > 0) {\n setOptions(optionsRef.current.slice(0, 1));\n handleChange([optionsRef.current[0].value]);\n }\n } else {\n // The user pressed enter, but we don't have results yet.\n // We need to wait for the results to come in.\n setAutoSubmit(true);\n }\n }\n },\n [handleChange]\n );\n\n const handleCreate = useCallback(\n (input: string): AsyncAutocompleteOption<T> => {\n const option = toOption((onCreate as (input: string) => T)(input));\n setOptions([...(optionsRef.current as AsyncAutocompleteOption<T>[]), option]);\n return option;\n },\n [onCreate, setOptions, toOption]\n );\n\n const handleFilter = useCallback((_value: string, selected: boolean) => !selected, []);\n\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return (\n <MultiSelect\n {...rest}\n ref={inputRef}\n defaultValue={defaultItems.map(toKey)}\n searchable\n onKeyDown={handleKeyDown}\n onSearchChange={handleSearchChange}\n data={[...selected, ...options]}\n onFocus={handleTimer}\n onChange={handleChange}\n onCreate={handleCreate}\n rightSectionWidth={40}\n rightSection={abortController ? <Loader size={16} /> : null}\n filter={handleFilter}\n creatable\n withinPortal={true}\n />\n );\n}\n\nfunction toDefaultItems<T>(defaultValue: T | T[] | undefined): T[] {\n if (!defaultValue) {\n return [];\n }\n if (Array.isArray(defaultValue)) {\n return defaultValue;\n }\n return [defaultValue];\n}\n", "import { Button, createStyles, Navbar as MantineNavbar, ScrollArea, Space, Text } from '@mantine/core';\nimport { useMedplumNavigate } from '@medplum/react-hooks';\nimport { IconPlus } from '@tabler/icons-react';\nimport { Fragment, MouseEventHandler, ReactNode, SyntheticEvent, useState } from 'react';\nimport { BookmarkDialog } from '../BookmarkDialog/BookmarkDialog';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { ResourceTypeInput } from '../ResourceTypeInput/ResourceTypeInput';\n\nconst useStyles = createStyles((theme) => {\n return {\n menuTitle: {\n margin: '20px 0 4px 6px',\n fontSize: '9px',\n fontWeight: 'normal',\n textTransform: 'uppercase',\n letterSpacing: '2px',\n },\n\n link: {\n ...theme.fn.focusStyles(),\n display: 'flex',\n alignItems: 'center',\n textDecoration: 'none',\n fontSize: theme.fontSizes.sm,\n color: theme.colorScheme === 'dark' ? theme.colors.dark[1] : theme.colors.gray[7],\n padding: `8px 12px`,\n borderRadius: theme.radius.sm,\n fontWeight: 500,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n color: theme.colorScheme === 'dark' ? theme.white : theme.black,\n textDecoration: 'none',\n\n [`& svg`]: {\n color: theme.colorScheme === 'dark' ? theme.white : theme.black,\n },\n },\n\n '& svg': {\n color: theme.colorScheme === 'dark' ? theme.colors.dark[2] : theme.colors.gray[6],\n marginRight: theme.spacing.sm,\n strokeWidth: 1.5,\n width: 18,\n height: 18,\n },\n },\n\n linkActive: {\n '&, &:hover': {\n backgroundColor: theme.fn.variant({ variant: 'light', color: theme.primaryColor }).background,\n color: theme.fn.variant({ variant: 'light', color: theme.primaryColor }).color,\n [`& svg`]: {\n color: theme.fn.variant({ variant: 'light', color: theme.primaryColor }).color,\n },\n },\n },\n };\n});\n\nexport interface NavbarLink {\n icon?: JSX.Element;\n label?: string;\n href: string;\n}\n\nexport interface NavbarMenu {\n title?: string;\n links?: NavbarLink[];\n}\n\nexport interface NavbarProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n menus?: NavbarMenu[];\n closeNavbar: () => void;\n displayAddBookmark?: boolean;\n resourceTypeSearchDisabled?: boolean;\n}\n\nexport function Navbar(props: NavbarProps): JSX.Element {\n const { classes } = useStyles();\n const navigate = useMedplumNavigate();\n const activeLink = getActiveLink(props.pathname, props.searchParams, props.menus);\n const [bookmarkDialogVisible, setBookmarkDialogVisible] = useState(false);\n\n function onLinkClick(e: SyntheticEvent, to: string): void {\n e.stopPropagation();\n e.preventDefault();\n navigate(to);\n if (window.innerWidth < 768) {\n props.closeNavbar();\n }\n }\n\n function navigateResourceType(resourceType: string | undefined): void {\n if (resourceType) {\n navigate(`/${resourceType}`);\n }\n }\n\n return (\n <>\n <MantineNavbar width={{ sm: 250 }} p=\"xs\">\n <ScrollArea>\n {!props.resourceTypeSearchDisabled && (\n <MantineNavbar.Section mb=\"sm\">\n <ResourceTypeInput\n key={window.location.pathname}\n name=\"resourceType\"\n placeholder=\"Resource Type\"\n onChange={(newValue) => navigateResourceType(newValue)}\n />\n </MantineNavbar.Section>\n )}\n <MantineNavbar.Section grow>\n {props.menus?.map((menu) => (\n <Fragment key={`menu-${menu.title}`}>\n <Text className={classes.menuTitle}>{menu.title}</Text>\n {menu.links?.map((link) => (\n <NavbarLink\n key={link.href}\n to={link.href}\n active={link.href === activeLink?.href}\n onClick={(e) => onLinkClick(e, link.href)}\n >\n <NavLinkIcon to={link.href} icon={link.icon} />\n <span>{link.label}</span>\n </NavbarLink>\n ))}\n </Fragment>\n ))}\n {props.displayAddBookmark && (\n <Button\n variant=\"subtle\"\n size=\"xs\"\n mt=\"xl\"\n leftIcon={<IconPlus size=\"0.75rem\" />}\n onClick={() => setBookmarkDialogVisible(true)}\n >\n Add Bookmark\n </Button>\n )}\n </MantineNavbar.Section>\n </ScrollArea>\n </MantineNavbar>\n {props.pathname && props.searchParams && (\n <BookmarkDialog\n pathname={props.pathname}\n searchParams={props.searchParams}\n visible={bookmarkDialogVisible}\n onOk={() => setBookmarkDialogVisible(false)}\n onCancel={() => setBookmarkDialogVisible(false)}\n />\n )}\n </>\n );\n}\n\ninterface NavbarLinkProps {\n to: string;\n active: boolean;\n onClick: MouseEventHandler;\n children: ReactNode;\n}\n\nfunction NavbarLink(props: NavbarLinkProps): JSX.Element {\n const { classes, cx } = useStyles();\n return (\n <MedplumLink\n onClick={props.onClick}\n to={props.to}\n className={cx(classes.link, { [classes.linkActive]: props.active })}\n >\n {props.children}\n </MedplumLink>\n );\n}\n\ninterface NavLinkIconProps {\n to: string;\n icon?: JSX.Element;\n}\n\nfunction NavLinkIcon(props: NavLinkIconProps): JSX.Element {\n if (props.icon) {\n return props.icon;\n }\n return <Space w={30} />;\n}\n\n/**\n * Returns the best \"active\" link for the menu.\n * In most cases, the navbar links are simple, and an exact match can determine which link is active.\n * However, we ignore some search parameters to support pagination.\n * But we cannot ignore all search parameters, to support separate links based on search filters.\n * So in the end, we use a simple scoring system based on the number of matching query search params.\n * @param currentPathname - The web browser current pathname.\n * @param currentSearchParams - The web browser current search parameters.\n * @param menus - Collection of navbar menus and links.\n * @returns The active link if one is found.\n */\nfunction getActiveLink(\n currentPathname: string | undefined,\n currentSearchParams: URLSearchParams | undefined,\n menus: NavbarMenu[] | undefined\n): NavbarLink | undefined {\n if (!currentPathname || !currentSearchParams || !menus) {\n return undefined;\n }\n\n let bestLink = undefined;\n let bestScore = 0;\n\n for (const menu of menus) {\n if (menu.links) {\n for (const link of menu.links) {\n const score = getLinkScore(currentPathname, currentSearchParams, link.href);\n if (score > bestScore) {\n bestScore = score;\n bestLink = link;\n }\n }\n }\n }\n\n return bestLink;\n}\n\n/**\n * Calculates a score for a link.\n * Zero means \"does not match at all\".\n * One means \"matches the pathname only\".\n * Additional increases for each matching search parameter.\n * Ignores pagination parameters \"_count\" and \"_offset\".\n * @param currentPathname - The web browser current pathname.\n * @param currentSearchParams - The web browser current search parameters.\n * @param linkHref - A candidate link href.\n * @returns The link score.\n */\nfunction getLinkScore(currentPathname: string, currentSearchParams: URLSearchParams, linkHref: string): number {\n const linkUrl = new URL(linkHref, 'https://example.com');\n if (currentPathname !== linkUrl.pathname) {\n return 0;\n }\n const ignoredParams = ['_count', '_offset'];\n for (const [key, value] of linkUrl.searchParams.entries()) {\n if (ignoredParams.includes(key)) {\n continue;\n }\n if (currentSearchParams.get(key) !== value) {\n return 0;\n }\n }\n let count = 1;\n for (const [key, value] of currentSearchParams.entries()) {\n if (ignoredParams.includes(key)) {\n continue;\n }\n if (linkUrl.searchParams.get(key) === value) {\n count++;\n }\n }\n return count;\n}\n", "import { Button, Group, Modal, NativeSelect, Stack, TextInput } from '@mantine/core';\nimport { showNotification } from '@mantine/notifications';\nimport { deepClone, normalizeErrorString } from '@medplum/core';\nimport { UserConfiguration } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { Form } from '../Form/Form';\n\ninterface BookmarkDialogProps {\n pathname: string;\n searchParams: URLSearchParams;\n visible: boolean;\n onOk: () => void;\n onCancel: () => void;\n defaultValue?: string;\n}\nexport function BookmarkDialog(props: BookmarkDialogProps): JSX.Element | null {\n const medplum = useMedplum();\n const config = medplum.getUserConfiguration() as UserConfiguration;\n\n function submitHandler(formData: Record<string, string>): void {\n const { menuname, bookmarkname: name } = formData;\n const target = `${props.pathname}?${props.searchParams.toString()}`;\n const newConfig = deepClone(config) as UserConfiguration;\n const menu = newConfig.menu?.find(({ title }) => title === menuname);\n\n menu?.link?.push({ name, target });\n medplum\n .updateResource(newConfig)\n .then((res) => {\n // refresh current config menu\n config.menu = res.menu;\n medplum.dispatchEvent({ type: 'change' });\n showNotification({ color: 'green', message: 'Success' });\n props.onOk();\n })\n .catch((err: any) => {\n showNotification({ color: 'red', message: normalizeErrorString(err) });\n });\n }\n\n return (\n <Modal\n title=\"Add Bookmark\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={props.onCancel}\n >\n <Form onSubmit={submitHandler}>\n <Stack>\n <SelectMenu config={config}></SelectMenu>\n <TextInput label=\"Bookmark Name\" type=\"text\" name=\"bookmarkname\" placeholder=\"Bookmark Name\" withAsterisk />\n <Group position=\"right\">\n <Button mt=\"sm\" type=\"submit\">\n OK\n </Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n );\n}\n\ninterface SelectMenuProps {\n config: UserConfiguration | undefined;\n}\n\nfunction SelectMenu(props: SelectMenuProps): JSX.Element {\n function userConfigToMenu(config: UserConfiguration | undefined): string[] {\n return config?.menu?.map((menu) => menu.title) as [];\n }\n const menus = userConfigToMenu(props.config);\n\n return <NativeSelect name=\"menuname\" defaultValue={menus[0]} label=\"Select Menu Option\" data={menus} withAsterisk />;\n}\n", "/**\n * Parses an HTML form and returns the result as a JavaScript object.\n * @param form - The HTML form element.\n * @returns Form values in key value pairs.\n */\nexport function parseForm(form: HTMLFormElement): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const element of Array.from(form.elements)) {\n if (element instanceof HTMLInputElement) {\n parseInputElement(result, element);\n } else if (element instanceof HTMLTextAreaElement) {\n result[element.name] = element.value;\n } else if (element instanceof HTMLSelectElement) {\n parseSelectElement(result, element);\n }\n }\n\n return result;\n}\n\n/**\n * Parses an HTML input element.\n * Sets the name/value pair in the result,\n * but only if the element is enabled and checked.\n * @param result - The result builder.\n * @param el - The input element.\n */\nfunction parseInputElement(result: Record<string, string>, el: HTMLInputElement): void {\n if (el.disabled) {\n // Ignore disabled elements\n return;\n }\n\n if ((el.type === 'checkbox' || el.type === 'radio') && !el.checked) {\n // Ignore unchecked radio or checkbox elements\n return;\n }\n\n result[el.name] = el.value;\n}\n\n/**\n * Parses an HTML select element.\n * Sets the name/value pair if one is selected.\n * @param result - The result builder.\n * @param el - The select element.\n */\nfunction parseSelectElement(result: Record<string, string>, el: HTMLSelectElement): void {\n result[el.name] = el.value;\n}\n", "import { CSSProperties, ReactNode, SyntheticEvent } from 'react';\nimport { parseForm } from './FormUtils';\n\nexport interface FormProps {\n onSubmit?: (formData: Record<string, string>) => void;\n style?: CSSProperties;\n children?: ReactNode;\n testid?: string;\n}\n\nexport function Form(props: FormProps): JSX.Element {\n return (\n <form\n style={props.style}\n data-testid={props.testid}\n onSubmit={(e: SyntheticEvent) => {\n e.preventDefault();\n const formData = parseForm(e.target as HTMLFormElement);\n if (props.onSubmit) {\n props.onSubmit(formData);\n }\n }}\n >\n {props.children}\n </form>\n );\n}\n", "import { ResourceType } from '@medplum/fhirtypes';\nimport { useCallback, useState } from 'react';\nimport { CodeInput } from '../CodeInput/CodeInput';\n\nexport interface ResourceTypeInputProps {\n name: string;\n placeholder?: string;\n defaultValue?: ResourceType;\n targetTypes?: string[];\n autoFocus?: boolean;\n testId?: string;\n onChange?: (value: ResourceType | undefined) => void;\n}\n\nexport function ResourceTypeInput(props: ResourceTypeInputProps): JSX.Element {\n const [resourceType, setResourceType] = useState<string | undefined>(props.defaultValue);\n const onChange = props.onChange;\n\n const setResourceTypeWrapper = useCallback(\n (newResourceType: string | undefined) => {\n setResourceType(newResourceType);\n if (onChange) {\n onChange(newResourceType as ResourceType);\n }\n },\n [onChange]\n );\n\n return (\n <CodeInput\n data-autofocus={props.autoFocus}\n data-testid={props.testId}\n defaultValue={resourceType}\n onChange={setResourceTypeWrapper}\n name={props.name}\n placeholder={props.placeholder}\n binding={'https://medplum.com/fhir/ValueSet/resource-types'}\n creatable={false}\n maxSelectedValues={0}\n clearSearchOnChange={true}\n clearable={false}\n />\n );\n}\n", "import { ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { ValueSetAutocomplete, ValueSetAutocompleteProps } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeInputProps extends Omit<ValueSetAutocompleteProps, 'defaultValue' | 'onChange'> {\n defaultValue?: string;\n onChange?: (value: string | undefined) => void;\n}\n\nexport function CodeInput(props: CodeInputProps): JSX.Element {\n const { defaultValue, onChange, ...rest } = props;\n const [value, setValue] = useState<string | undefined>(defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newValue = newValues[0];\n const newCode = valueSetElementToCode(newValue);\n setValue(newCode);\n if (onChange) {\n onChange(newCode);\n }\n }\n\n return <ValueSetAutocomplete defaultValue={codeToValueSetElement(value)} onChange={handleChange} {...rest} />;\n}\n\nfunction codeToValueSetElement(code: string | undefined): ValueSetExpansionContains | undefined {\n return code ? { code } : undefined;\n}\n\nfunction valueSetElementToCode(element: ValueSetExpansionContains | undefined): string | undefined {\n return element?.code;\n}\n", "import { ValueSetExpandParams } from '@medplum/core';\nimport { ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback } from 'react';\nimport {\n AsyncAutocomplete,\n AsyncAutocompleteOption,\n AsyncAutocompleteProps,\n} from '../AsyncAutocomplete/AsyncAutocomplete';\n\nexport interface ValueSetAutocompleteProps\n extends Omit<AsyncAutocompleteProps<ValueSetExpansionContains>, 'loadOptions' | 'toKey' | 'toOption'> {\n binding: string | undefined;\n creatable?: boolean;\n clearable?: boolean;\n expandParams?: Partial<ValueSetExpandParams>;\n}\n\nfunction toKey(element: ValueSetExpansionContains): string {\n if (typeof element.code === 'string') {\n return element.code;\n }\n return JSON.stringify(element);\n}\n\nfunction getDisplay(item: ValueSetExpansionContains): string {\n if (typeof item.display === 'string') {\n return item.display;\n }\n return toKey(item);\n}\n\nfunction toOption(element: ValueSetExpansionContains): AsyncAutocompleteOption<ValueSetExpansionContains> {\n return {\n value: toKey(element),\n label: getDisplay(element),\n resource: element,\n };\n}\n\nfunction createValue(input: string): ValueSetExpansionContains {\n return {\n code: input,\n display: input,\n };\n}\n\n/**\n * A low-level component to autocomplete based on a FHIR Valueset.\n * This is the base component for CodeableConceptInput, CodingInput, and CodeInput.\n * @param props - The ValueSetAutocomplete React props.\n * @returns The ValueSetAutocomplete React node.\n */\nexport function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element {\n const medplum = useMedplum();\n const { binding, creatable, clearable, expandParams, ...rest } = props;\n\n const loadValues = useCallback(\n async (input: string, signal: AbortSignal): Promise<ValueSetExpansionContains[]> => {\n if (!binding) {\n return [];\n }\n const valueSet = await medplum.valueSetExpand(\n {\n ...expandParams,\n url: binding,\n filter: input,\n },\n { signal }\n );\n const valueSetElements = valueSet.expansion?.contains as ValueSetExpansionContains[];\n const newData: ValueSetExpansionContains[] = [];\n for (const valueSetElement of valueSetElements) {\n if (valueSetElement.code && !newData.some((item) => item.code === valueSetElement.code)) {\n newData.push(valueSetElement);\n }\n }\n\n return newData;\n },\n [medplum, expandParams, binding]\n );\n\n return (\n <AsyncAutocomplete\n {...rest}\n creatable={creatable ?? true}\n clearable={clearable ?? true}\n toKey={toKey}\n toOption={toOption}\n loadOptions={loadValues}\n onCreate={createValue}\n getCreateLabel={creatable === false ? undefined : (query: any) => `+ Create ${query}`}\n />\n );\n}\n", "import { Anchor } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\n\nexport interface AttachmentDisplayProps {\n value?: Attachment;\n maxWidth?: number;\n}\n\nexport function AttachmentDisplay(props: AttachmentDisplayProps): JSX.Element | null {\n const { contentType, url, title } = props.value ?? {};\n\n if (!url) {\n return null;\n }\n\n return (\n <div data-testid=\"attachment-display\">\n {contentType?.startsWith('image/') && (\n <img data-testid=\"attachment-image\" style={{ maxWidth: props.maxWidth }} src={url} alt={title} />\n )}\n {contentType?.startsWith('video/') && (\n <video data-testid=\"attachment-video\" style={{ maxWidth: props.maxWidth }} controls={true}>\n <source type={contentType} src={url} />\n </video>\n )}\n {contentType === 'application/pdf' && (\n <div data-testid=\"attachment-pdf\" style={{ maxWidth: props.maxWidth, minHeight: 400 }}>\n <iframe\n width=\"100%\"\n height=\"400\"\n src={url + '#navpanes=0'}\n allowFullScreen={true}\n frameBorder={0}\n seamless={true}\n />\n </div>\n )}\n <div data-testid=\"download-link\" style={{ padding: '2px 16px 16px 16px' }}>\n <Anchor\n href={url}\n data-testid=\"attachment-details\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download={getDownloadName(title)}\n >\n {title || 'Download'}\n </Anchor>\n </div>\n </div>\n );\n}\n\nfunction getDownloadName(title: string | undefined): string | undefined {\n // Title often contains the filename by convention\n return title?.includes('.') ? title : undefined;\n}\n", "import { Attachment } from '@medplum/fhirtypes';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\n\nexport interface AttachmentArrayDisplayProps {\n values?: Attachment[];\n maxWidth?: number;\n}\n\nexport function AttachmentArrayDisplay(props: AttachmentArrayDisplayProps): JSX.Element {\n return (\n <div>\n {props.values?.map((v, index) => (\n <div key={'attatchment-' + index}>\n <AttachmentDisplay value={v} maxWidth={props.maxWidth} />\n </div>\n ))}\n </div>\n );\n}\n", "import { ActionIcon } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCloudUpload } from '@tabler/icons-react';\nimport { MouseEvent, useRef, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentArrayInputProps {\n name: string;\n defaultValue?: Attachment[];\n arrayElement?: boolean;\n onChange?: (value: Attachment[]) => void;\n}\n\nexport function AttachmentArrayInput(props: AttachmentArrayInputProps): JSX.Element {\n const [values, setValues] = useState<Attachment[]>(props.defaultValue ?? []);\n\n const valuesRef = useRef<Attachment[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: Attachment[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v: Attachment, index: number) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <AttachmentDisplay value={v} maxWidth={200} />\n </td>\n <td>\n <ActionIcon\n title=\"Remove\"\n size=\"sm\"\n onClick={(e: MouseEvent) => {\n killEvent(e);\n const copy = values.slice();\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td>\n <AttachmentButton\n onUpload={(attachment: Attachment) => {\n setValuesWrapper([...(valuesRef.current as Attachment[]), attachment]);\n }}\n >\n {(props) => (\n <ActionIcon {...props} title=\"Add\" size=\"sm\" color=\"green\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n", "import { Attachment, Binary, OperationOutcome } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ChangeEvent, MouseEvent, ReactNode, useRef } from 'react';\nimport { killEvent } from '../utils/dom';\nimport { normalizeOperationOutcome } from '@medplum/core';\n\nexport interface AttachmentButtonProps {\n onUpload: (attachment: Attachment) => void;\n onUploadStart?: () => void;\n onUploadProgress?: (e: ProgressEvent) => void;\n onUploadError?: (outcome: OperationOutcome) => void;\n children(props: { onClick(e: MouseEvent): void }): ReactNode;\n}\n\nexport function AttachmentButton(props: AttachmentButtonProps): JSX.Element {\n const medplum = useMedplum();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n function onClick(e: MouseEvent): void {\n killEvent(e);\n fileInputRef.current?.click();\n }\n\n function onFileChange(e: ChangeEvent): void {\n killEvent(e);\n const files = (e.target as HTMLInputElement).files;\n if (files) {\n Array.from(files).forEach(processFile);\n }\n }\n\n /**\n * Processes a single file.\n * @param file - The file descriptor.\n */\n function processFile(file: File): void {\n if (!file) {\n return;\n }\n\n const fileName = file.name;\n if (!fileName) {\n return;\n }\n\n if (props.onUploadStart) {\n props.onUploadStart();\n }\n\n const filename = file.name;\n const contentType = file.type || 'application/octet-stream';\n medplum\n .createBinary(file, filename, contentType, props.onUploadProgress)\n .then((binary: Binary) => {\n props.onUpload({\n contentType: binary.contentType,\n url: binary.url,\n title: filename,\n });\n })\n .catch((err) => {\n if (props.onUploadError) {\n props.onUploadError(normalizeOperationOutcome(err));\n }\n });\n }\n\n return (\n <>\n <input\n type=\"file\"\n data-testid=\"upload-file-input\"\n style={{ display: 'none' }}\n ref={fileInputRef}\n onChange={(e) => onFileChange(e)}\n />\n {props.children({ onClick })}\n </>\n );\n}\n", "import { Button } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport { MouseEvent, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentInputProps {\n name: string;\n defaultValue?: Attachment;\n arrayElement?: boolean;\n onChange?: (value: Attachment | undefined) => void;\n}\n\nexport function AttachmentInput(props: AttachmentInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Attachment | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n if (value) {\n return (\n <>\n <AttachmentDisplay value={value} maxWidth={200} />\n <Button\n onClick={(e: MouseEvent) => {\n killEvent(e);\n setValueWrapper(undefined);\n }}\n >\n Remove\n </Button>\n </>\n );\n }\n\n return (\n <AttachmentButton onUpload={setValueWrapper}>{(props) => <Button {...props}>Upload...</Button>}</AttachmentButton>\n );\n}\n", "import { getPathDisplayName, tryGetDataType, TypedValue } from '@medplum/core';\nimport { DEFAULT_IGNORED_NON_NESTED_PROPERTIES, DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { DescriptionList, DescriptionListEntry } from '../DescriptionList/DescriptionList';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.utils';\n\nexport interface BackboneElementDisplayProps {\n value: TypedValue;\n compact?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function BackboneElementDisplay(props: BackboneElementDisplayProps): JSX.Element | null {\n const typedValue = props.value;\n const value = typedValue.value;\n if (!value) {\n return null;\n }\n\n const typeName = typedValue.type;\n const typeSchema = tryGetDataType(typeName);\n if (!typeSchema) {\n return <div>{typeName}&nbsp;not implemented</div>;\n }\n\n if (\n typeof value === 'object' &&\n 'name' in value &&\n Object.keys(value).length === 1 &&\n typeof value.name === 'string'\n ) {\n // Special case for common BackboneElement pattern\n // Where there is an object with a single property 'name'\n // Just display the name value.\n return <div>{value.name}</div>;\n }\n\n return (\n <DescriptionList compact={props.compact}>\n {Object.entries(typeSchema.elements).map((entry) => {\n const [key, property] = entry;\n if (DEFAULT_IGNORED_PROPERTIES.includes(key)) {\n return null;\n }\n if (DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key) && property.path.split('.').length === 2) {\n return null;\n }\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n if (\n props.ignoreMissingValues &&\n (!propertyValue || (Array.isArray(propertyValue) && propertyValue.length === 0))\n ) {\n return null;\n }\n return (\n <DescriptionListEntry key={key} term={getPathDisplayName(key)}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={propertyType}\n value={propertyValue}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </DescriptionListEntry>\n );\n })}\n </DescriptionList>\n );\n}\n", "export const DEFAULT_IGNORED_PROPERTIES = ['meta', 'implicitRules', 'contained', 'extension', 'modifierExtension'];\n\n// Ignored only when they are top-level properties\n// e.g. Patient.language is ignored, but Patient.communication.language is not ignored\nexport const DEFAULT_IGNORED_NON_NESTED_PROPERTIES = ['language', 'text'];\n", "import { createStyles } from '@mantine/core';\nimport { ReactNode } from 'react';\n\nconst useStyles = createStyles((theme) => ({\n root: {\n display: 'grid',\n gridTemplateColumns: '30% 70%',\n margin: 0,\n\n '& > dt, & > dd': {\n padding: `${theme.spacing.sm} ${theme.spacing.sm}`,\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n margin: 0,\n },\n },\n\n compact: {\n gridTemplateColumns: '20% 80%',\n\n '& > dt, & > dd': {\n padding: `0 ${theme.spacing.xs} ${theme.spacing.xs} 0`,\n border: 0,\n },\n },\n}));\n\nexport interface DescriptionListProps {\n children: ReactNode;\n compact?: boolean;\n}\n\nexport function DescriptionList(props: DescriptionListProps): JSX.Element {\n const { children, compact } = props;\n const { classes, cx } = useStyles();\n return <dl className={cx(classes.root, { [classes.compact]: compact })}>{children}</dl>;\n}\n\nexport interface DescriptionListEntryProps {\n term: string;\n children: ReactNode;\n}\n\nexport function DescriptionListEntry(props: DescriptionListEntryProps): JSX.Element {\n return (\n <>\n <dt>{props.term}</dt>\n <dd>{props.children}</dd>\n </>\n );\n}\n", "import { ActionIcon, Box, CopyButton, Tooltip } from '@mantine/core';\nimport {\n InternalSchemaElement,\n PropertyType,\n formatDateTime,\n formatPeriod,\n formatTiming,\n isEmpty,\n} from '@medplum/core';\nimport { IconCheck, IconCopy } from '@tabler/icons-react';\nimport { AddressDisplay } from '../AddressDisplay/AddressDisplay';\nimport { AttachmentArrayDisplay } from '../AttachmentArrayDisplay/AttachmentArrayDisplay';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodingDisplay } from '../CodingDisplay/CodingDisplay';\nimport { ContactDetailDisplay } from '../ContactDetailDisplay/ContactDetailDisplay';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { IdentifierDisplay } from '../IdentifierDisplay/IdentifierDisplay';\nimport { MoneyDisplay } from '../MoneyDisplay/MoneyDisplay';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { RatioDisplay } from '../RatioDisplay/RatioDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceArrayDisplay } from '../ResourceArrayDisplay/ResourceArrayDisplay';\n\nexport interface ResourcePropertyDisplayProps {\n property?: InternalSchemaElement;\n propertyType: string;\n value: any;\n arrayElement?: boolean;\n maxWidth?: number;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\n/**\n * Low-level component that renders a property from a given resource, given type information.\n * @param props - The ResourcePropertyDisplay React props.\n * @returns The ResourcePropertyDisplay React node.\n */\nexport function ResourcePropertyDisplay(props: ResourcePropertyDisplayProps): JSX.Element {\n const { property, propertyType, value } = props;\n\n const isIdProperty = property?.path?.endsWith('.id');\n if (isIdProperty) {\n return (\n <Box component=\"div\" sx={{ display: 'flex', gap: 3, alignItems: 'center' }}>\n {value}\n {!isEmpty(value) && (\n <CopyButton value={value} timeout={2000}>\n {({ copied, copy }) => (\n <Tooltip label={copied ? 'Copied' : 'Copy'} withArrow position=\"right\">\n <ActionIcon color={copied ? 'teal' : 'gray'} onClick={copy}>\n {copied ? <IconCheck size=\"1rem\" /> : <IconCopy size=\"1rem\" />}\n </ActionIcon>\n </Tooltip>\n )}\n </CopyButton>\n )}\n </Box>\n );\n }\n\n if (property?.max && property.max > 1 && !props.arrayElement) {\n if (propertyType === PropertyType.Attachment) {\n return <AttachmentArrayDisplay values={value} maxWidth={props.maxWidth} />;\n }\n return (\n <ResourceArrayDisplay\n property={property}\n values={value}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n );\n }\n\n switch (propertyType) {\n case PropertyType.boolean:\n return <>{value === undefined ? '' : Boolean(value).toString()}</>;\n case PropertyType.SystemString:\n case PropertyType.string:\n return <div style={{ whiteSpace: 'pre-wrap' }}>{value}</div>;\n case PropertyType.code:\n case PropertyType.date:\n case PropertyType.decimal:\n case PropertyType.id:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n case PropertyType.uri:\n case PropertyType.url:\n return <>{value}</>;\n case PropertyType.canonical:\n return <ReferenceDisplay value={{ reference: value }} link={props.link} />;\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <>{formatDateTime(value)}</>;\n case PropertyType.markdown:\n return <pre>{value}</pre>;\n case PropertyType.Address:\n return <AddressDisplay value={value} />;\n case PropertyType.Annotation:\n return <>{value?.text}</>;\n case PropertyType.Attachment:\n return <AttachmentDisplay value={value} maxWidth={props.maxWidth} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptDisplay value={value} />;\n case PropertyType.Coding:\n return <CodingDisplay value={value} />;\n case PropertyType.ContactDetail:\n return <ContactDetailDisplay value={value} />;\n case PropertyType.ContactPoint:\n return <ContactPointDisplay value={value} />;\n case PropertyType.HumanName:\n return <HumanNameDisplay value={value} />;\n case PropertyType.Identifier:\n return <IdentifierDisplay value={value} />;\n case PropertyType.Money:\n return <MoneyDisplay value={value} />;\n case PropertyType.Period:\n return <>{formatPeriod(value)}</>;\n case PropertyType.Quantity:\n case PropertyType.Duration:\n return <QuantityDisplay value={value} />;\n case PropertyType.Range:\n return <RangeDisplay value={value} />;\n case PropertyType.Ratio:\n return <RatioDisplay value={value} />;\n case PropertyType.Reference:\n return <ReferenceDisplay value={value} link={props.link} />;\n case PropertyType.Timing:\n return <>{formatTiming(value)}</>;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n return (\n <BackboneElementDisplay\n value={{ type: propertyType, value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n default:\n if (!property) {\n throw Error(`Displaying property of type ${props.propertyType} requires element schema`);\n }\n return (\n <BackboneElementDisplay\n value={{ type: property.type[0].code, value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n }\n}\n", "import { formatCodeableConcept } from '@medplum/core';\nimport { CodeableConcept } from '@medplum/fhirtypes';\n\nexport interface CodeableConceptDisplayProps {\n value?: CodeableConcept;\n}\n\nexport function CodeableConceptDisplay(props: CodeableConceptDisplayProps): JSX.Element {\n return <>{formatCodeableConcept(props.value)}</>;\n}\n", "import { formatCoding } from '@medplum/core';\nimport { Coding } from '@medplum/fhirtypes';\n\nexport interface CodingDisplayProps {\n value?: Coding;\n}\n\nexport function CodingDisplay(props: CodingDisplayProps): JSX.Element {\n return <>{formatCoding(props.value)}</>;\n}\n", "import { ContactPoint } from '@medplum/fhirtypes';\n\nexport interface ContactPointDisplayProps {\n value?: ContactPoint;\n}\n\nexport function ContactPointDisplay(props: ContactPointDisplayProps): JSX.Element | null {\n const contactPoint = props.value;\n if (!contactPoint) {\n return null;\n }\n\n const builder = [];\n\n if (contactPoint.value) {\n builder.push(contactPoint.value);\n }\n\n if (contactPoint.use || contactPoint.system) {\n builder.push(' [');\n\n if (contactPoint.use) {\n builder.push(contactPoint.use);\n }\n\n if (contactPoint.use && contactPoint.system) {\n builder.push(' ');\n }\n\n if (contactPoint.system) {\n builder.push(contactPoint.system);\n }\n\n builder.push(']');\n }\n\n return <>{builder.join('').trim()}</>;\n}\n", "import { ContactDetail } from '@medplum/fhirtypes';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\n\nexport interface ContactDetailDisplayProps {\n value?: ContactDetail;\n}\n\nexport function ContactDetailDisplay(props: ContactDetailDisplayProps): JSX.Element | null {\n const contactDetail = props.value;\n if (!contactDetail) {\n return null;\n }\n\n return (\n <>\n {contactDetail.name}\n {contactDetail.name && ': '}\n {contactDetail.telecom?.map((telecom) => (\n <ContactPointDisplay key={`telecom-${contactDetail.name}-${telecom.value}`} value={telecom} />\n ))}\n </>\n );\n}\n", "import { Identifier } from '@medplum/fhirtypes';\n\nexport interface IdentifierDisplayProps {\n value?: Identifier;\n}\n\nexport function IdentifierDisplay(props: IdentifierDisplayProps): JSX.Element {\n return (\n <div>\n {props.value?.system}: {props.value?.value}\n </div>\n );\n}\n", "import { formatMoney } from '@medplum/core';\nimport { Money } from '@medplum/fhirtypes';\n\nexport interface MoneyDisplayProps {\n value?: Money;\n}\n\nexport function MoneyDisplay(props: MoneyDisplayProps): JSX.Element | null {\n return <>{formatMoney(props.value)}</>;\n}\n", "import { formatQuantity } from '@medplum/core';\nimport { Quantity } from '@medplum/fhirtypes';\n\nexport interface QuantityDisplayProps {\n value?: Quantity;\n}\n\nexport function QuantityDisplay(props: QuantityDisplayProps): JSX.Element | null {\n return <>{formatQuantity(props.value)}</>;\n}\n", "import { formatRange } from '@medplum/core';\nimport { Range } from '@medplum/fhirtypes';\n\nexport interface RangeDisplayProps {\n value?: Range;\n}\n\nexport function RangeDisplay(props: RangeDisplayProps): JSX.Element | null {\n return <>{formatRange(props.value)}</>;\n}\n", "import { Ratio } from '@medplum/fhirtypes';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\n\nexport interface RatioDisplayProps {\n value?: Ratio;\n}\n\nexport function RatioDisplay(props: RatioDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value) {\n return null;\n }\n\n return (\n <>\n <QuantityDisplay value={value.numerator} />\n &nbsp;/&nbsp;\n <QuantityDisplay value={value.denominator} />\n </>\n );\n}\n", "import { stringify } from '@medplum/core';\nimport { Reference } from '@medplum/fhirtypes';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ReferenceDisplayProps {\n value?: Reference;\n link?: boolean;\n}\n\nexport function ReferenceDisplay(props: ReferenceDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n\n const displayString = props.value.display || props.value.reference || stringify(props.value);\n\n // The \"link\" prop defaults to \"true\"; undefined is treated as \"true\"\n // To disable the link, it must be explicitly \"false\"\n if (props.link !== false && props.value.reference) {\n return <MedplumLink to={props.value}>{displayString}</MedplumLink>;\n } else {\n return <>{displayString}</>;\n }\n}\n", "import { InternalSchemaElement } from '@medplum/core';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface ResourceArrayDisplayProps {\n property: InternalSchemaElement;\n values: any[];\n arrayElement?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourceArrayDisplay(props: ResourceArrayDisplayProps): JSX.Element {\n const { property, values } = props;\n const propertyType = property.type[0].code;\n return props.values ? (\n <>\n {values.map((v: any, index: number) => (\n <div key={`${index}-${values.length}`}>\n <ResourcePropertyDisplay\n arrayElement={true}\n property={property}\n propertyType={propertyType}\n value={v}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </div>\n ))}\n </>\n ) : (\n <></>\n );\n}\n", "import {\n getTypedPropertyValue,\n getTypedPropertyValueWithSchema,\n InternalSchemaElement,\n TypedValue,\n} from '@medplum/core';\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param context - The base context (usually a FHIR resource).\n * @param path - The property path.\n * @returns The value of the property and the property type.\n */\nexport function getValueAndType(context: TypedValue, path: string): [any, string] {\n const typedResult = getTypedPropertyValue(context, path);\n if (!typedResult) {\n return [undefined, 'undefined'];\n }\n\n if (Array.isArray(typedResult)) {\n return [typedResult.map((e) => e.value), typedResult[0].type];\n }\n\n return [typedResult.value, typedResult.type];\n}\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param value - The base context (usually a FHIR resource).\n * @param path - The property path.\n * @param element - The property element definition.\n * @returns The value of the property and the property type.\n */\nexport function getValueAndTypeFromElement(\n value: TypedValue['value'],\n path: string,\n element: InternalSchemaElement\n): [any, string] {\n const typedResult = getTypedPropertyValueWithSchema(value, path, element);\n if (!typedResult) {\n return [undefined, 'undefined'];\n }\n\n if (Array.isArray(typedResult)) {\n return [typedResult.map((e) => e.value), typedResult[0].type];\n }\n\n return [typedResult.value, typedResult.type];\n}\n", "import { tryGetDataType } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useContext, useMemo, useState } from 'react';\nimport { ElementsInput } from '../ElementsInput/ElementsInput';\nimport { BackboneElementContext, buildBackboneElementContext } from './BackboneElementInput.utils';\n\nexport interface BackboneElementInputProps {\n /** Type name the backbone element represents */\n typeName: string;\n /** (optional) The contents of the resource represented by the backbone element */\n defaultValue?: any;\n /** (optional) OperationOutcome from the last attempted system action*/\n outcome?: OperationOutcome;\n /** (optional) callback function that is called when the value of the backbone element changes */\n onChange?: (value: any) => void;\n /** (optional) Profile URL of the structure definition represented by the backbone element */\n profileUrl?: string;\n}\n\nexport function BackboneElementInput(props: BackboneElementInputProps): JSX.Element {\n const { typeName } = props;\n const [value, setValue] = useState<any>(props.defaultValue ?? {});\n const backboneContext = useContext(BackboneElementContext);\n const profileUrl = props.profileUrl ?? backboneContext.profileUrl;\n const typeSchema = useMemo(() => tryGetDataType(typeName, profileUrl), [typeName, profileUrl]);\n\n const context = useMemo(() => {\n return buildBackboneElementContext(typeSchema, profileUrl);\n }, [typeSchema, profileUrl]);\n\n if (!typeSchema) {\n return <div>{typeName}&nbsp;not implemented</div>;\n }\n\n function setValueWrapper(newValue: any): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <BackboneElementContext.Provider value={context}>\n <ElementsInput\n type={typeSchema.type}\n elements={typeSchema.elements}\n defaultValue={value}\n onChange={setValueWrapper}\n outcome={props.outcome}\n />\n </BackboneElementContext.Provider>\n );\n}\n", "import { Stack } from '@mantine/core';\nimport { InternalSchemaElement, TypedValue, getPathDisplayName, isPopulated } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useMemo, useState } from 'react';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { FormSection } from '../FormSection/FormSection';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm.utils';\nimport { getValueAndTypeFromElement } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.utils';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { DEFAULT_IGNORED_NON_NESTED_PROPERTIES, DEFAULT_IGNORED_PROPERTIES } from '../constants';\n\nconst EXTENSION_KEYS = new Set(['extension', 'modifierExtension']);\nconst IGNORED_PROPERTIES = new Set(['id', ...DEFAULT_IGNORED_PROPERTIES].filter((prop) => !EXTENSION_KEYS.has(prop)));\n\nexport interface ElementsInputProps {\n type: string | undefined;\n elements: { [key: string]: InternalSchemaElement };\n defaultValue: any;\n outcome: OperationOutcome | undefined;\n onChange: ((value: any) => void) | undefined;\n testId?: string;\n}\n\nexport function ElementsInput(props: ElementsInputProps): JSX.Element {\n const { elements } = props;\n const [value, setValue] = useState<any>(props.defaultValue ?? {});\n\n const fixedProperties = useMemo(() => {\n const result: { [key: string]: InternalSchemaElement & { fixed: TypedValue } } = Object.create(null);\n for (const [key, property] of Object.entries(elements)) {\n if (property.fixed) {\n result[key] = property as any;\n }\n }\n return result;\n }, [elements]);\n\n function setValueWrapper(newValue: any): void {\n for (const [key, prop] of Object.entries(fixedProperties)) {\n setPropertyValue(newValue, key, key, prop, prop.fixed.value);\n }\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Stack style={{ flexGrow: 1 }} data-testid={props.testId}>\n {Object.entries(elements).map(([key, element]) => {\n if (!element.type) {\n return null;\n }\n\n if (element.max === 0) {\n return null;\n }\n\n // mostly for Extension.url\n if (key === 'url' && element.fixed) {\n return null;\n }\n\n if (EXTENSION_KEYS.has(key) && !isPopulated(element.slicing?.slices)) {\n // an extension property without slices has no nested extensions\n return null;\n } else if (IGNORED_PROPERTIES.has(key)) {\n return null;\n } else if (DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key) && element.path.split('.').length === 2) {\n return null;\n }\n\n // Profiles can include nested elements in addition to their containing element, e.g.:\n // identifier, identifier.use, identifier.system\n // Skip nested elements, e.g. identifier.use, since they are handled by the containing element\n if (key.includes('.')) {\n return null;\n }\n\n const [propertyValue, propertyType] = getValueAndTypeFromElement(value, key, element);\n\n const required = element.min !== undefined && element.min > 0;\n\n const resourcePropertyInput = (\n <ResourcePropertyInput\n key={key}\n property={element}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue({ ...value }, key, propName ?? key, element, newValue));\n }}\n arrayElement={undefined}\n outcome={props.outcome}\n />\n );\n\n // no FormSection wrapper for extensions\n if (props.type === 'Extension' || EXTENSION_KEYS.has(key)) {\n return resourcePropertyInput;\n }\n\n if (element.type.length === 1 && element.type[0].code === 'boolean') {\n return (\n <CheckboxFormSection\n key={key}\n title={getPathDisplayName(key)}\n description={element.description}\n htmlFor={key}\n fhirPath={element.path}\n withAsterisk={required}\n >\n {resourcePropertyInput}\n </CheckboxFormSection>\n );\n }\n\n return (\n <FormSection\n key={key}\n title={getPathDisplayName(key)}\n description={element.description}\n withAsterisk={required}\n htmlFor={key}\n outcome={props.outcome}\n fhirPath={element.path}\n >\n {resourcePropertyInput}\n </FormSection>\n );\n })}\n </Stack>\n );\n}\n", "import { Group, Input } from '@mantine/core';\nimport { ReactNode, useContext } from 'react';\nimport { BackboneElementContext } from '../BackboneElementInput/BackboneElementInput.utils';\n\nexport interface CheckboxFormSectionProps {\n htmlFor?: string;\n title?: string;\n description?: string;\n withAsterisk?: boolean;\n children?: ReactNode;\n testId?: string;\n fhirPath?: string;\n}\n\nexport function CheckboxFormSection(props: CheckboxFormSectionProps): JSX.Element {\n const { debugMode } = useContext(BackboneElementContext);\n\n let label: React.ReactNode;\n if (debugMode && props.fhirPath) {\n label = `${props.title} - ${props.fhirPath}`;\n } else {\n label = props.title;\n }\n return (\n <Group noWrap data-testid={props.testId}>\n <div>{props.children}</div>\n <div>\n <Input.Wrapper\n id={props.htmlFor}\n label={label}\n description={props.description}\n withAsterisk={props.withAsterisk}\n >\n {(() => null)()}\n </Input.Wrapper>\n </div>\n </Group>\n );\n}\n", "import { InternalSchemaElement, InternalTypeSchema } from '@medplum/core';\nimport React from 'react';\n\n/**\n * Splits a string on the last occurrence of the delimiter\n * @param str - The string to split\n * @param delim - The delimiter string\n * @returns An array of two strings; the first consisting of the beginning of the\n * string up to the last occurrence of the delimiter. the second is the remainder of the\n * string after the last occurrence of the delimiter. If the delimiter is not present\n * in the string, the first element is empty and the second is the input string.\n */\nfunction splitOnceRight(str: string, delim: string): [string, string] {\n const delimIndex = str.lastIndexOf(delim);\n if (delimIndex === -1) {\n return ['', str];\n }\n const beginning = str.substring(0, delimIndex);\n const last = str.substring(delimIndex + delim.length);\n return [beginning, last];\n}\n\nexport type FlatWalkedPaths = {\n [path: string]: InternalSchemaElement;\n};\n\nexport type BackboneElementContextType = {\n debugMode: boolean;\n profileUrl: string | undefined;\n /**\n * Get the element definition for the specified path if it has been modified by a profile.\n * @param nestedElementPath - The path of the nested element\n * @returns The modified element definition if it has been modified by the active profile or undefined. If undefined,\n * the element has the default definition for the given type.\n */\n getModifiedNestedElement: (nestedElementPath: string) => InternalSchemaElement | undefined;\n};\n\nexport const BackboneElementContext = React.createContext<BackboneElementContextType>({\n profileUrl: undefined,\n debugMode: false,\n getModifiedNestedElement: () => undefined,\n});\n\nexport function buildBackboneElementContext(\n typeSchema: InternalTypeSchema | undefined,\n profileUrl?: string | undefined,\n debugMode?: boolean | undefined\n): BackboneElementContextType {\n const nestedPaths: FlatWalkedPaths = Object.create(null);\n\n function getModifiedNestedElement(nestedElementPath: string): InternalSchemaElement | undefined {\n return nestedPaths[nestedElementPath];\n }\n\n const elements = typeSchema?.elements;\n if (elements) {\n const seenKeys = new Set<string>();\n for (const [key, property] of Object.entries(elements)) {\n const [beginning, _last] = splitOnceRight(key, '.');\n // assume paths are hierarchically sorted, e.g. identifier comes before identifier.id\n if (seenKeys.has(beginning)) {\n nestedPaths[typeSchema.type + '.' + key] = property;\n }\n seenKeys.add(key);\n }\n }\n\n return { debugMode: debugMode ?? false, profileUrl, getModifiedNestedElement };\n}\n", "import { Input } from '@mantine/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { ReactNode, useContext } from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\nimport { BackboneElementContext } from '../BackboneElementInput/BackboneElementInput.utils';\n\nexport interface FormSectionProps {\n title?: string;\n htmlFor?: string;\n description?: string;\n withAsterisk?: boolean;\n outcome?: OperationOutcome;\n children?: ReactNode;\n testId?: string;\n fhirPath?: string;\n}\n\nexport function FormSection(props: FormSectionProps): JSX.Element {\n const { debugMode } = useContext(BackboneElementContext);\n\n let label: React.ReactNode;\n if (debugMode && props.fhirPath) {\n label = `${props.title} - ${props.fhirPath}`;\n } else {\n label = props.title;\n }\n return (\n <Input.Wrapper\n id={props.htmlFor}\n label={label}\n description={props.description}\n withAsterisk={props.withAsterisk}\n error={getErrorsForInput(props.outcome, props.htmlFor)}\n data-testid={props.testId}\n >\n {props.children}\n </Input.Wrapper>\n );\n}\n", "import { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\n\nexport function getErrorsForInput(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): string | undefined {\n return outcome?.issue\n ?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression))\n ?.map((issue) => issue.details?.text)\n ?.join('\\n');\n}\n\nexport function getIssuesForExpression(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): OperationOutcomeIssue[] | undefined {\n return outcome?.issue?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression));\n}\n\nfunction isExpressionMatch(expr1: string | undefined, expr2: string | undefined): boolean {\n // Expression can be either \"fieldName\" or \"resourceType.fieldName\"\n if (expr1 === expr2) {\n return true;\n }\n if (!expr1 || !expr2) {\n return false;\n }\n const dot1 = expr1.indexOf('.');\n if (dot1 >= 0 && expr1.substring(dot1 + 1) === expr2) {\n return true;\n }\n const dot2 = expr2.indexOf('.');\n if (dot2 >= 0 && expr2.substring(dot2 + 1) === expr1) {\n return true;\n }\n return false;\n}\n", "import { capitalize, InternalSchemaElement, isEmpty } from '@medplum/core';\nimport { StructureDefinition } from '@medplum/fhirtypes';\n\nexport function setPropertyValue(\n obj: any,\n key: string,\n propName: string,\n elementDefinition: InternalSchemaElement,\n value: any\n): any {\n const types = elementDefinition.type;\n if (types.length > 1) {\n for (const type of types) {\n const compoundKey = key.replace('[x]', capitalize(type.code as string));\n if (compoundKey in obj) {\n delete obj[compoundKey];\n }\n }\n }\n obj[propName] = value;\n return obj;\n}\n\nexport type SupportedProfileStructureDefinition = StructureDefinition & {\n url: NonNullable<StructureDefinition['url']>;\n name: NonNullable<StructureDefinition['name']>;\n};\n\nexport function isSupportedProfileStructureDefinition(\n profile?: StructureDefinition\n): profile is SupportedProfileStructureDefinition {\n return !!profile && !isEmpty(profile.url) && !isEmpty(profile.name);\n}\n", "import { Checkbox, Group, NativeSelect, Textarea, TextInput } from '@mantine/core';\nimport { capitalize, HTTP_HL7_ORG, InternalSchemaElement, PropertyType } from '@medplum/core';\nimport { ElementDefinitionBinding, ElementDefinitionType, OperationOutcome } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { AddressInput } from '../AddressInput/AddressInput';\nimport { AnnotationInput } from '../AnnotationInput/AnnotationInput';\nimport { AttachmentArrayInput } from '../AttachmentArrayInput/AttachmentArrayInput';\nimport { AttachmentInput } from '../AttachmentInput/AttachmentInput';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { CodeableConceptInput } from '../CodeableConceptInput/CodeableConceptInput';\nimport { CodeInput } from '../CodeInput/CodeInput';\nimport { CodingInput } from '../CodingInput/CodingInput';\nimport { ContactDetailInput } from '../ContactDetailInput/ContactDetailInput';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { ExtensionInput } from '../ExtensionInput/ExtensionInput';\nimport { HumanNameInput } from '../HumanNameInput/HumanNameInput';\nimport { IdentifierInput } from '../IdentifierInput/IdentifierInput';\nimport { MoneyInput } from '../MoneyInput/MoneyInput';\nimport { PeriodInput } from '../PeriodInput/PeriodInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { RatioInput } from '../RatioInput/RatioInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourceArrayInput } from '../ResourceArrayInput/ResourceArrayInput';\nimport { SensitiveTextarea } from '../SensitiveTextarea/SensitiveTextarea';\nimport { TimingInput } from '../TimingInput/TimingInput';\nimport { getErrorsForInput } from '../utils/outcomes';\nimport { ComplexTypeInputProps } from './ResourcePropertyInput.utils';\n\nexport interface ResourcePropertyInputProps {\n property: InternalSchemaElement;\n name: string;\n defaultPropertyType?: string | undefined;\n defaultValue: any;\n arrayElement?: boolean | undefined;\n onChange: ((value: any, propName?: string) => void) | undefined;\n outcome: OperationOutcome | undefined;\n}\n\nexport function ResourcePropertyInput(props: ResourcePropertyInputProps): JSX.Element {\n const { property, name, defaultValue, onChange } = props;\n const defaultPropertyType =\n props.defaultPropertyType && props.defaultPropertyType !== 'undefined'\n ? props.defaultPropertyType\n : property.type[0].code;\n\n const propertyTypes = property.type as ElementDefinitionType[];\n\n if ((property.isArray || property.max > 1) && !props.arrayElement) {\n if (defaultPropertyType === PropertyType.Attachment) {\n return <AttachmentArrayInput name={name} defaultValue={defaultValue} onChange={onChange} />;\n }\n\n // Extensions are a special type of array that shouldn't be indented\n const indent = propertyTypes[0]?.code !== PropertyType.Extension;\n return (\n <ResourceArrayInput\n property={property}\n name={name}\n defaultValue={defaultValue}\n indent={indent}\n onChange={onChange}\n outcome={props.outcome}\n />\n );\n }\n\n if (propertyTypes.length > 1) {\n return <ElementDefinitionInputSelector elementDefinitionTypes={propertyTypes} {...props} />;\n } else {\n return (\n <ElementDefinitionTypeInput\n name={name}\n defaultValue={defaultValue}\n onChange={(newValue: any) => {\n if (props.onChange) {\n const newPropName = props.name.replace('[x]', capitalize(propertyTypes[0].code as string));\n props.onChange(newValue, newPropName);\n }\n }}\n outcome={props.outcome}\n elementDefinitionType={propertyTypes[0]}\n min={property.min}\n max={property.min}\n binding={property.binding}\n path={property.path}\n />\n );\n }\n}\n\nexport interface ElementDefinitionSelectorProps extends ResourcePropertyInputProps {\n elementDefinitionTypes: ElementDefinitionType[];\n}\n\nexport function ElementDefinitionInputSelector(props: ElementDefinitionSelectorProps): JSX.Element {\n const propertyTypes = props.elementDefinitionTypes;\n let initialPropertyType: ElementDefinitionType | undefined = undefined;\n if (props.defaultPropertyType) {\n initialPropertyType = propertyTypes.find((t) => t.code === props.defaultPropertyType) as ElementDefinitionType;\n }\n if (!initialPropertyType) {\n initialPropertyType = propertyTypes[0];\n }\n const [selectedType, setSelectedType] = useState(initialPropertyType);\n return (\n <Group spacing=\"xs\" grow noWrap align=\"flex-start\">\n <NativeSelect\n style={{ width: '200px' }}\n defaultValue={selectedType.code}\n onChange={(e) => {\n setSelectedType(\n propertyTypes.find(\n (type: ElementDefinitionType) => type.code === e.currentTarget.value\n ) as ElementDefinitionType\n );\n }}\n data={propertyTypes.map((type: ElementDefinitionType) => ({\n value: type.code as string,\n label: type.code as string,\n }))}\n />\n <ElementDefinitionTypeInput\n name={props.name}\n defaultValue={props.defaultValue}\n outcome={props.outcome}\n elementDefinitionType={selectedType}\n onChange={(newValue: any) => {\n if (props.onChange) {\n props.onChange(newValue, props.name.replace('[x]', capitalize(selectedType.code as string)));\n }\n }}\n min={props.property.min}\n max={props.property.max}\n binding={props.property.binding}\n path={props.property.path}\n />\n </Group>\n );\n}\n\n// Avoiding optional props on lower-level components like to make it more difficult to misuse\nexport type ElementDefinitionTypeInputProps = {\n name: ResourcePropertyInputProps['name'];\n path: string;\n defaultValue: ResourcePropertyInputProps['defaultValue'];\n onChange: ResourcePropertyInputProps['onChange'];\n outcome: ResourcePropertyInputProps['outcome'];\n elementDefinitionType: ElementDefinitionType;\n min: number;\n max: number;\n binding: ElementDefinitionBinding | undefined;\n};\n\nexport function ElementDefinitionTypeInput(props: ElementDefinitionTypeInputProps): JSX.Element {\n const { name, defaultValue, onChange, outcome, binding, path } = props;\n const required = props.min !== undefined && props.min > 0;\n\n const propertyType = props.elementDefinitionType.code;\n\n if (!propertyType) {\n return <div>Property type not specified </div>;\n }\n\n const properties: ComplexTypeInputProps<any> = { name, defaultValue, onChange, outcome, path };\n\n switch (propertyType) {\n // 2.24.0.1 Primitive Types\n // https://www.hl7.org/fhir/datatypes.html#primitive\n\n case PropertyType.SystemString:\n case PropertyType.canonical:\n case PropertyType.string:\n case PropertyType.time:\n case PropertyType.uri:\n case PropertyType.url:\n if (props.path === 'Project.secret.value[x]') {\n return (\n <SensitiveTextarea\n id={name}\n name={name}\n data-testid={name}\n defaultValue={defaultValue}\n required={required}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(props.outcome, name)}\n />\n );\n }\n\n return (\n <TextInput\n id={name}\n name={name}\n data-testid={name}\n defaultValue={defaultValue}\n required={required}\n onChange={(e) => {\n if (onChange) {\n onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(outcome, name)}\n />\n );\n case PropertyType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n data-testid={name}\n defaultValue={defaultValue}\n required={required}\n onChange={(e) => {\n if (onChange) {\n onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(outcome, name)}\n />\n );\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <DateTimeInput name={name} defaultValue={defaultValue} onChange={onChange} outcome={outcome} />;\n case PropertyType.decimal:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n return (\n <TextInput\n type=\"number\"\n step={propertyType === PropertyType.decimal ? 'any' : '1'}\n id={name}\n name={name}\n data-testid={name}\n defaultValue={defaultValue}\n required={required}\n onChange={(e) => {\n if (onChange) {\n onChange(e.currentTarget.valueAsNumber);\n }\n }}\n />\n );\n case PropertyType.code:\n return <CodeInput {...properties} binding={binding?.valueSet} />;\n case PropertyType.boolean:\n return (\n <Checkbox\n id={name}\n name={name}\n data-testid={name}\n defaultChecked={!!defaultValue}\n onChange={(e) => {\n if (onChange) {\n onChange(e.currentTarget.checked);\n }\n }}\n />\n );\n case PropertyType.base64Binary:\n case PropertyType.markdown:\n return (\n <Textarea\n id={name}\n spellCheck={propertyType !== PropertyType.base64Binary}\n name={name}\n data-testid={name}\n defaultValue={defaultValue}\n required={required}\n onChange={(e) => {\n if (onChange) {\n onChange(e.currentTarget.value);\n }\n }}\n />\n );\n\n // 2.24.0.2 Complex Types\n // https://www.hl7.org/fhir/datatypes.html#complex\n\n case PropertyType.Address:\n return <AddressInput {...properties} />;\n case PropertyType.Annotation:\n return <AnnotationInput {...properties} />;\n case PropertyType.Attachment:\n return <AttachmentInput {...properties} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptInput binding={binding?.valueSet} {...properties} />;\n case PropertyType.Coding:\n return <CodingInput binding={binding?.valueSet} {...properties} />;\n case PropertyType.ContactDetail:\n return <ContactDetailInput {...properties} />;\n case PropertyType.ContactPoint:\n return <ContactPointInput {...properties} />;\n case PropertyType.Extension:\n return <ExtensionInput {...properties} propertyType={props.elementDefinitionType} />;\n case PropertyType.HumanName:\n return <HumanNameInput {...properties} />;\n case PropertyType.Identifier:\n return <IdentifierInput {...properties} />;\n case PropertyType.Money:\n return <MoneyInput {...properties} />;\n case PropertyType.Period:\n return <PeriodInput {...properties} />;\n case PropertyType.Duration:\n case PropertyType.Quantity:\n return <QuantityInput {...properties} />;\n case PropertyType.Range:\n return <RangeInput {...properties} />;\n case PropertyType.Ratio:\n return <RatioInput {...properties} />;\n case PropertyType.Reference:\n return <ReferenceInput {...properties} targetTypes={getTargetTypes(props.elementDefinitionType)} />;\n case PropertyType.Timing:\n return <TimingInput {...properties} />;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n default:\n return (\n <BackboneElementInput\n typeName={propertyType}\n defaultValue={defaultValue}\n onChange={onChange}\n outcome={outcome}\n />\n );\n }\n}\n\nconst RESOURCE_TYPE_URL_PREFIXES = [\n `${HTTP_HL7_ORG}/fhir/StructureDefinition/`,\n 'https://medplum.com/fhir/StructureDefinition/',\n];\nfunction getTargetTypes(elementDefinitionType?: ElementDefinitionType): string[] | undefined {\n return elementDefinitionType?.targetProfile?.map((p) => {\n const resourceTypePrefix = RESOURCE_TYPE_URL_PREFIXES.find((prefix) => p.startsWith(prefix));\n if (resourceTypePrefix) {\n return p.slice(resourceTypePrefix.length);\n } else {\n return p;\n }\n });\n}\n", "import { CodeableConcept, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { ValueSetAutocomplete, ValueSetAutocompleteProps } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeableConceptInputProps extends Omit<ValueSetAutocompleteProps, 'defaultValue' | 'onChange'> {\n defaultValue?: CodeableConcept;\n onChange?: (value: CodeableConcept | undefined) => void;\n}\n\nexport function CodeableConceptInput(props: CodeableConceptInputProps): JSX.Element {\n const { defaultValue, onChange, ...rest } = props;\n const [value, setValue] = useState<CodeableConcept | undefined>(defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newConcept = valueSetElementToCodeableConcept(newValues);\n setValue(newConcept);\n if (onChange) {\n onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n defaultValue={value && codeableConceptToValueSetElement(value)}\n onChange={handleChange}\n {...rest}\n />\n );\n}\n\nfunction codeableConceptToValueSetElement(concept: CodeableConcept): ValueSetExpansionContains[] | undefined {\n return concept.coding?.map((c) => ({\n system: c.system,\n code: c.code,\n display: c.display,\n }));\n}\n\nfunction valueSetElementToCodeableConcept(elements: ValueSetExpansionContains[]): CodeableConcept | undefined {\n if (elements.length === 0) {\n return undefined;\n }\n return {\n coding: elements.map((e) => ({\n system: e.system,\n code: e.code,\n display: e.display,\n })),\n };\n}\n", "import { Coding, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { ValueSetAutocomplete, ValueSetAutocompleteProps } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodingInputProps extends Omit<ValueSetAutocompleteProps, 'defaultValue' | 'onChange'> {\n defaultValue?: Coding;\n onChange?: (value: Coding | undefined) => void;\n}\n\nexport function CodingInput(props: CodingInputProps): JSX.Element {\n const { defaultValue, onChange, ...rest } = props;\n const [value, setValue] = useState<Coding | undefined>(defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newValue = newValues[0];\n const newConcept = newValue && valueSetElementToCoding(newValue);\n setValue(newConcept);\n if (onChange) {\n onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n defaultValue={value && codingToValueSetElement(value)}\n maxSelectedValues={1}\n onChange={handleChange}\n {...rest}\n />\n );\n}\n\nfunction codingToValueSetElement(coding: Coding): ValueSetExpansionContains {\n return {\n system: coding.system,\n code: coding.code,\n display: coding.display,\n };\n}\n\nfunction valueSetElementToCoding(element: ValueSetExpansionContains): Coding {\n return {\n system: element.system,\n code: element.code,\n display: element.display,\n };\n}\n", "import { Group, TextInput } from '@mantine/core';\nimport { ContactDetail, ContactPoint } from '@medplum/fhirtypes';\nimport { useRef, useState } from 'react';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\n\nexport type ContactDetailInputProps = ComplexTypeInputProps<ContactDetail>;\n\nexport function ContactDetailInput(props: ContactDetailInputProps): JSX.Element {\n const [contactPoint, setContactDetail] = useState(props.defaultValue);\n\n const ref = useRef<ContactDetail>();\n ref.current = contactPoint;\n\n function setContactDetailWrapper(newValue: ContactDetail): void {\n setContactDetail(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setName(name: string): void {\n const newValue: ContactDetail = { ...ref.current, name };\n if (!name) {\n delete newValue.name;\n }\n setContactDetailWrapper(newValue);\n }\n\n function setTelecom(telecom: ContactPoint | undefined): void {\n const newValue: ContactDetail = { ...ref.current, telecom: telecom && [telecom] };\n if (!telecom) {\n delete newValue.telecom;\n }\n setContactDetailWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n data-testid={props.name + '-name'}\n name={props.name + '-name'}\n placeholder=\"Name\"\n style={{ width: 180 }}\n defaultValue={contactPoint?.name}\n onChange={(e) => setName(e.currentTarget.value)}\n />\n <ContactPointInput\n name={props.name + '-telecom'}\n path={props.path + '.telecom'}\n defaultValue={contactPoint?.telecom?.[0]}\n onChange={setTelecom}\n outcome={props.outcome}\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { ContactPoint } from '@medplum/fhirtypes';\nimport { useContext, useMemo, useRef, useState } from 'react';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\nimport { BackboneElementContext } from '../BackboneElementInput/BackboneElementInput.utils';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport type ContactPointInputProps = ComplexTypeInputProps<ContactPoint> & {\n onChange: ((value: ContactPoint | undefined) => void) | undefined;\n};\n\nexport function ContactPointInput(props: ContactPointInputProps): JSX.Element {\n const { path, outcome } = props;\n const { getModifiedNestedElement } = useContext(BackboneElementContext);\n const [contactPoint, setContactPoint] = useState(props.defaultValue);\n\n const ref = useRef<ContactPoint>();\n ref.current = contactPoint;\n\n const [systemElement, useElement, valueElement] = useMemo(\n () => ['system', 'use', 'value'].map((field) => getModifiedNestedElement(path + '.' + field)),\n [getModifiedNestedElement, path]\n );\n\n function setContactPointWrapper(newValue: ContactPoint | undefined): void {\n if (newValue && Object.keys(newValue).length === 0) {\n newValue = undefined;\n }\n setContactPoint(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setSystem(system: 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other'): void {\n const newValue: ContactPoint = { ...ref.current, system };\n if (!system) {\n delete newValue.system;\n }\n setContactPointWrapper(newValue);\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'mobile'): void {\n const newValue: ContactPoint = { ...ref.current, use };\n if (!use) {\n delete newValue.use;\n }\n setContactPointWrapper(newValue);\n }\n\n function setValue(value: string): void {\n const newValue: ContactPoint = { ...ref.current, value };\n if (!value) {\n delete newValue.value;\n }\n setContactPointWrapper(newValue);\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap align=\"flex-start\">\n <NativeSelect\n data-testid=\"system\"\n defaultValue={contactPoint?.system}\n required={(systemElement?.min ?? 0) > 0}\n onChange={(e) =>\n setSystem(e.currentTarget.value as 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other')\n }\n data={['', 'email', 'phone', 'fax', 'pager', 'sms', 'other']}\n error={getErrorsForInput(outcome, path + '.system')}\n />\n <NativeSelect\n data-testid=\"use\"\n defaultValue={contactPoint?.use}\n required={(useElement?.min ?? 0) > 0}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'mobile')}\n data={['', 'home', 'work', 'temp', 'old', 'mobile']}\n error={getErrorsForInput(outcome, path + '.use')}\n />\n <TextInput\n placeholder=\"Value\"\n defaultValue={contactPoint?.value}\n required={(valueElement?.min ?? 0) > 0}\n onChange={(e) => setValue(e.currentTarget.value)}\n error={getErrorsForInput(outcome, path + '.value')}\n />\n </Group>\n );\n}\n", "import { TextInput } from '@mantine/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { ChangeEvent } from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\nimport { convertIsoToLocal, convertLocalToIso } from './DateTimeInput.utils';\n\nexport interface DateTimeInputProps {\n name?: string;\n placeholder?: string;\n defaultValue?: string;\n autoFocus?: boolean;\n required?: boolean;\n outcome?: OperationOutcome;\n onChange?: (value: string) => void;\n}\n\n/**\n * The DateTimeInput component is a wrapper around the HTML5 input type=\"datetime-local\".\n * The main purpose is to reconcile time zones.\n * Most of our date/time values are in ISO-8601, which includes a time zone offset.\n * The datetime-local input does not support the time zone offset.\n * @param props - The Input props.\n * @returns The JSX element to render.\n */\nexport function DateTimeInput(props: DateTimeInputProps): JSX.Element {\n return (\n <TextInput\n id={props.name}\n name={props.name}\n data-autofocus={props.autoFocus}\n data-testid={props.name}\n placeholder={props.placeholder}\n required={props.required}\n type={getInputType()}\n defaultValue={convertIsoToLocal(props.defaultValue)}\n autoFocus={props.autoFocus}\n error={getErrorsForInput(props.outcome, props.name)}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n if (props.onChange) {\n const newValue = e.currentTarget.value;\n props.onChange(convertLocalToIso(newValue));\n }\n }}\n />\n );\n}\n\n/**\n * Returns the input type for the requested type.\n * JSDOM does not support many of the valid <input> type attributes.\n * For example, it won't fire change events for <input type=\"datetime-local\">.\n * @returns The input type for the current environment.\n */\nfunction getInputType(): string {\n return import.meta.env.NODE_ENV === 'test' ? 'text' : 'datetime-local';\n}\n", "import { isValidDate } from '@medplum/core';\n\n/**\n * Converts an ISO-8601 date/time string to a local date/time string.\n * @param isoString - The ISO-8601 date/time string to convert.\n * @returns The local date/time string.\n */\nexport function convertIsoToLocal(isoString: string | undefined): string {\n if (!isoString) {\n return '';\n }\n\n // Convert the ISO-8601 date to a local datetime-local value.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings\n // See: https://stackoverflow.com/a/60368477\n const date = new Date(isoString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toLocaleDateString('sv') + 'T' + date.toLocaleTimeString('sv');\n}\n\n/**\n * Converts a local date/time string to an ISO-8601 date/time string.\n * @param localString - The local date/time string to convert.\n * @returns The ISO-8601 date/time string.\n */\nexport function convertLocalToIso(localString: string | undefined): string {\n if (!localString) {\n return '';\n }\n\n // Try to parse the local string as a Date\n // JavaScript's Date() constructor defaults to the local time zone.\n // The Date() constructor will throw if the value is malformed.\n const date = new Date(localString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toISOString();\n}\n", "import { JsonInput } from '@mantine/core';\nimport { InternalTypeSchema, stringify, tryGetProfile } from '@medplum/core';\nimport { ElementDefinitionType, Extension } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useEffect, useMemo, useState } from 'react';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\n\nexport type ExtensionInputProps = ComplexTypeInputProps<Extension> & {\n propertyType: ElementDefinitionType;\n};\n\nexport function ExtensionInput(props: ExtensionInputProps): JSX.Element | null {\n const { propertyType } = props;\n\n const medplum = useMedplum();\n const [loading, setLoading] = useState(false);\n const [typeSchema, setTypeSchema] = useState<InternalTypeSchema | undefined>();\n\n const profileUrl: string | undefined = useMemo(() => {\n if (!propertyType.profile || propertyType.profile.length === 0) {\n return undefined;\n }\n\n return propertyType.profile[0] satisfies string;\n }, [propertyType]);\n\n useEffect(() => {\n if (profileUrl) {\n setLoading(true);\n medplum\n .requestProfileSchema(profileUrl)\n .then(() => {\n const profile = tryGetProfile(profileUrl);\n setLoading(false);\n setTypeSchema(profile);\n })\n .catch((reason) => {\n setLoading(false);\n console.warn(reason);\n });\n }\n }, [medplum, profileUrl]);\n\n function onChange(newValue: any): void {\n if (props.onChange) {\n console.log('Extension', newValue);\n props.onChange(newValue);\n }\n }\n\n if (!profileUrl) {\n return <ExtensionJsonInput {...props} />;\n }\n\n if (loading) {\n return <div>Loading {profileUrl}...</div>;\n }\n\n if (!typeSchema) {\n return <div>StructureDefinition for {profileUrl} not found</div>;\n }\n\n /*\n From the spec:\n An extension SHALL have either a value (i.e. a value[x] element) or sub-extensions, but not both.\n If present, the value[x] element SHALL have content (value attribute or other elements)\n */\n\n // const valueElement = typeSchema.elements['value[x]'];\n // const extensionHasValue = valueElement.max !== 0;\n // console.debug(typeSchema.name, { extensionHasValue });\n // It seems like the behavior of ExtensionInput should differ based on extensionHasValue. It likely\n // isn't strictly necessary to do so given the recursive use of BackboneElementInput\n\n return (\n <BackboneElementInput\n profileUrl={profileUrl}\n typeName={typeSchema.name}\n defaultValue={props.defaultValue}\n onChange={onChange}\n />\n );\n}\n\nfunction ExtensionJsonInput(props: ExtensionInputProps): JSX.Element {\n return (\n <JsonInput\n id={props.name}\n name={props.name}\n data-testid=\"extension-json-input\"\n defaultValue={stringify(props.defaultValue)}\n deserialize={JSON.parse}\n onChange={(newValue) => {\n if (props.onChange) {\n props.onChange(JSON.parse(newValue));\n }\n }}\n />\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\n\nexport type HumanNameInputProps = ComplexTypeInputProps<HumanName>;\n\nexport function HumanNameInput(props: HumanNameInputProps): JSX.Element {\n const { outcome, path } = props;\n const [value, setValue] = useState<HumanName | undefined>(props.defaultValue);\n\n function setValueWrapper(newValue: HumanName): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden' | undefined): void {\n // || instead of ?? to handle empty strings\n setValueWrapper({ ...value, use: use || undefined });\n }\n\n function setPrefix(prefix: string): void {\n setValueWrapper({\n ...value,\n prefix: prefix ? prefix.split(' ') : undefined,\n });\n }\n\n function setGiven(given: string): void {\n setValueWrapper({\n ...value,\n given: given ? given.split(' ') : undefined,\n });\n }\n\n function setFamily(family: string): void {\n setValueWrapper({\n ...value,\n // || instead of ?? to handle empty strings\n family: family || undefined,\n });\n }\n\n function setSuffix(suffix: string): void {\n setValueWrapper({\n ...value,\n suffix: suffix ? suffix.split(' ') : undefined,\n });\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n defaultValue={value?.use}\n name={props.name + '-use'}\n data-testid=\"use\"\n onChange={(e) =>\n setUse(e.currentTarget.value as 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden')\n }\n data={['', 'temp', 'old', 'usual', 'official', 'nickname', 'anonymous', 'maiden']}\n error={getErrorsForInput(outcome, path + '.use')}\n />\n <TextInput\n placeholder=\"Prefix\"\n name={props.name + '-prefix'}\n defaultValue={value?.prefix?.join(' ')}\n onChange={(e) => setPrefix(e.currentTarget.value)}\n error={getErrorsForInput(outcome, path + '.prefix')}\n />\n <TextInput\n placeholder=\"Given\"\n name={props.name + '-given'}\n defaultValue={value?.given?.join(' ')}\n onChange={(e) => setGiven(e.currentTarget.value)}\n error={getErrorsForInput(outcome, path + '.given')}\n />\n <TextInput\n name={props.name + '-family'}\n placeholder=\"Family\"\n defaultValue={value?.family}\n onChange={(e) => setFamily(e.currentTarget.value)}\n error={getErrorsForInput(outcome, path + '.family')}\n />\n <TextInput\n placeholder=\"Suffix\"\n name={props.name + '-suffix'}\n defaultValue={value?.suffix?.join(' ')}\n onChange={(e) => setSuffix(e.currentTarget.value)}\n error={getErrorsForInput(outcome, path + '.suffix')}\n />\n </Group>\n );\n}\n", "import { Group, TextInput } from '@mantine/core';\nimport { Identifier } from '@medplum/fhirtypes';\nimport { useContext, useMemo, useState } from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\nimport { BackboneElementContext } from '../BackboneElementInput/BackboneElementInput.utils';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\n\nexport type IdentifierInputProps = ComplexTypeInputProps<Identifier>;\n\nexport function IdentifierInput(props: IdentifierInputProps): JSX.Element {\n const { path, outcome } = props;\n const [value, setValue] = useState(props.defaultValue);\n const { getModifiedNestedElement } = useContext(BackboneElementContext);\n\n const [systemElement, valueElement] = useMemo(\n () => ['system', 'value'].map((field) => getModifiedNestedElement(path + '.' + field)),\n [getModifiedNestedElement, path]\n );\n\n function setValueWrapper(newValue: Identifier): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap align=\"flex-start\">\n <TextInput\n placeholder=\"System\"\n required={(systemElement?.min ?? 0) > 0}\n defaultValue={value?.system}\n onChange={(e) => setValueWrapper({ ...value, system: e.currentTarget.value })}\n error={getErrorsForInput(outcome, path + '.system')}\n />\n <TextInput\n placeholder=\"Value\"\n required={(valueElement?.min ?? 0) > 0}\n defaultValue={value?.value}\n onChange={(e) => setValueWrapper({ ...value, value: e.currentTarget.value })}\n error={getErrorsForInput(outcome, path + '.value')}\n />\n </Group>\n );\n}\n", "import { NativeSelect, TextInput } from '@mantine/core';\nimport { Money } from '@medplum/fhirtypes';\nimport { IconCurrencyDollar } from '@tabler/icons-react';\nimport { ChangeEvent, useCallback, useState } from 'react';\n\n/*\n * Based on: https://github.com/mantinedev/ui.mantine.dev/blob/master/components/CurrencyInput/CurrencyInput.tsx\n */\n\n/**\n * List of currencies.\n *\n * Full list of currencies:\n * https://www.hl7.org/fhir/valueset-currencies.html\n *\n * Latest browsers can report list of supported currencies, but it's not widely supported:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/supportedValuesOf\n *\n * Using a short list for simplicity for now.\n */\nconst data = ['USD', 'EUR', 'CAD', 'GBP', 'AUD'];\n\nexport interface MoneyInputProps {\n name: string;\n label?: string;\n placeholder?: string;\n defaultValue?: Money;\n onChange?: (value: Money) => void;\n}\n\nexport function MoneyInput(props: MoneyInputProps): JSX.Element {\n const { onChange } = props;\n const [value, setValue] = useState(props.defaultValue);\n\n const setValueWrapper = useCallback(\n (newValue: Money): void => {\n setValue(newValue);\n if (onChange) {\n onChange(newValue);\n }\n },\n [onChange]\n );\n\n const handleCurrencyChange = useCallback(\n (e: ChangeEvent<HTMLSelectElement>) => {\n setValueWrapper({\n ...value,\n currency: e.currentTarget.value,\n });\n },\n [value, setValueWrapper]\n );\n\n const handleValueChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n setValueWrapper({\n ...value,\n value: e.currentTarget.valueAsNumber,\n });\n },\n [value, setValueWrapper]\n );\n\n const select = (\n <NativeSelect\n defaultValue={value?.currency}\n data={data}\n styles={{\n input: {\n fontWeight: 500,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n width: 92,\n },\n }}\n onChange={handleCurrencyChange}\n />\n );\n\n return (\n <TextInput\n type=\"number\"\n label={props.label}\n placeholder={props.placeholder ?? 'Value'}\n defaultValue={value?.value?.toString() ?? 'USD'}\n icon={<IconCurrencyDollar size={14} />}\n rightSection={select}\n rightSectionWidth={92}\n onChange={handleValueChange}\n />\n );\n}\n", "import { Group } from '@mantine/core';\nimport { Period } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\n\nexport interface PeriodInputProps {\n name: string;\n defaultValue?: Period;\n onChange?: (value: Period) => void;\n}\n\nexport function PeriodInput(props: PeriodInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Period): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <DateTimeInput\n name={props.name + '.start'}\n placeholder=\"Start\"\n defaultValue={value?.start}\n onChange={(newValue) => setValueWrapper({ ...value, start: newValue })}\n />\n <DateTimeInput\n name={props.name + '.end'}\n placeholder=\"End\"\n defaultValue={value?.end}\n onChange={(newValue) => setValueWrapper({ ...value, end: newValue })}\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Quantity } from '@medplum/fhirtypes';\nimport { useState, WheelEvent } from 'react';\n\nexport interface QuantityInputProps {\n name: string;\n defaultValue?: Quantity;\n autoFocus?: boolean;\n required?: boolean;\n onChange?: (value: Quantity) => void;\n disableWheel?: boolean;\n}\n\nexport function QuantityInput(props: QuantityInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Quantity): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <NativeSelect\n style={{ width: 80 }}\n data-testid={props.name + '-comparator'}\n defaultValue={value?.comparator}\n data={['', '<', '<=', '>=', '>']}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n comparator: e.currentTarget.value as '<' | '<=' | '>=' | '>',\n })\n }\n />\n <TextInput\n id={props.name}\n name={props.name}\n required={props.required}\n data-autofocus={props.autoFocus}\n data-testid={props.name + '-value'}\n type=\"number\"\n placeholder=\"Value\"\n defaultValue={value?.value}\n autoFocus={props.autoFocus}\n step=\"any\"\n onWheel={(e: WheelEvent<HTMLInputElement>) => {\n if (props.disableWheel) {\n e.currentTarget.blur();\n }\n }}\n onChange={(e) => {\n setValueWrapper({\n ...value,\n value: tryParseNumber(e.currentTarget.value),\n });\n }}\n />\n <TextInput\n placeholder=\"Unit\"\n data-testid={props.name + '-unit'}\n defaultValue={value?.unit}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n unit: e.currentTarget.value,\n })\n }\n />\n </Group>\n );\n}\n\nfunction tryParseNumber(str: string): number | undefined {\n if (!str) {\n return undefined;\n }\n return parseFloat(str);\n}\n", "import { Group } from '@mantine/core';\nimport { Range } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RangeInputProps {\n name: string;\n defaultValue?: Range;\n onChange?: (value: Range) => void;\n}\n\n/**\n * Renders a Range input.\n * See: https://www.hl7.org/fhir/datatypes.html#Range\n * @param props - Range input properties.\n * @returns Range input element.\n */\nexport function RangeInput(props: RangeInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Range): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-low'}\n defaultValue={value?.low}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n low: v,\n })\n }\n />\n\n <QuantityInput\n name={props.name + '-high'}\n defaultValue={value?.high}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n high: v,\n })\n }\n />\n </Group>\n );\n}\n", "import { Group } from '@mantine/core';\nimport { Ratio } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RatioInputProps {\n name: string;\n defaultValue?: Ratio;\n onChange?: (value: Ratio) => void;\n}\n\n/**\n * Renders a Ratio input.\n * See: https://www.hl7.org/fhir/datatypes.html#Ratio\n * @param props - Ratio input properties.\n * @returns Ratio input element.\n */\nexport function RatioInput(props: RatioInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Ratio): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n <QuantityInput\n name={props.name + '-numerator'}\n defaultValue={value?.numerator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n numerator: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-denominator'}\n defaultValue={value?.denominator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n denominator: v,\n })\n }\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect } from '@mantine/core';\nimport {\n LRUCache,\n MedplumClient,\n ReadablePromise,\n createReference,\n isEmpty,\n isPopulated,\n tryGetProfile,\n} from '@medplum/core';\nimport { Reference, Resource, ResourceType, StructureDefinition } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\nimport { ResourceTypeInput } from '../ResourceTypeInput/ResourceTypeInput';\n\nexport interface ReferenceInputProps {\n name: string;\n placeholder?: string;\n defaultValue?: Reference;\n targetTypes?: string[];\n searchCriteria?: Record<string, string>;\n autoFocus?: boolean;\n required?: boolean;\n onChange?: (value: Reference | undefined) => void;\n}\n\ninterface BaseTargetType {\n value: string;\n}\n\ntype ProfileTargetType = BaseTargetType & {\n type: 'profile';\n name?: string;\n title?: string;\n resourceType?: string;\n error?: any;\n};\n\ntype ResourceTypeTargetType = BaseTargetType & {\n type: 'resourceType';\n resourceType: string;\n};\ntype TargetType = ResourceTypeTargetType | ProfileTargetType;\n\nexport function ReferenceInput(props: ReferenceInputProps): JSX.Element {\n const { onChange } = props;\n const medplum = useMedplum();\n const [value, setValue] = useState<Reference | undefined>(props.defaultValue);\n const [targetTypes, setTargetTypes] = useState<TargetType[] | undefined>(() => createTargetTypes(props.targetTypes));\n const [targetType, setTargetType] = useState<TargetType | undefined>(() =>\n getInitialTargetType(props.defaultValue, targetTypes)\n );\n\n const promiseCache = useRef(new LRUCache<ReadablePromise<TargetType>>());\n\n const searchCriteria = useMemo<ReferenceInputProps['searchCriteria']>(() => {\n if (targetType?.type === 'profile') {\n return { ...props.searchCriteria, _profile: targetType.value };\n }\n return props.searchCriteria;\n }, [props.searchCriteria, targetType]);\n\n useEffect(() => {\n let anyToFetch = false;\n const newTargetTypePromises: Promise<TargetType>[] | undefined = targetTypes?.map((tt) => {\n if (!shouldFetchResourceType(tt)) {\n return Promise.resolve(tt);\n }\n\n anyToFetch = true;\n const cacheKey = tt.value;\n const cached = promiseCache.current.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const promise = fetchResourceTypeOfProfile(medplum, tt.value)\n .then((profile) => {\n const newTargetType = { ...tt };\n\n if (!profile) {\n console.error(`StructureDefinition not found for ${tt.value}`);\n newTargetType.error = 'StructureDefinition not found';\n } else if (!isPopulated(profile.type)) {\n console.error(`StructureDefinition.type missing for ${tt.value}`);\n newTargetType.error = 'StructureDefinition.type missing';\n } else {\n newTargetType.resourceType = profile.type satisfies string;\n newTargetType.name = profile.name;\n newTargetType.title = profile.title;\n }\n\n return newTargetType;\n })\n .catch((reason) => {\n console.error(reason);\n return { ...tt, error: reason };\n });\n\n const readablePromise = new ReadablePromise(promise);\n promiseCache.current.set(cacheKey, readablePromise);\n\n return readablePromise;\n });\n\n if (!newTargetTypePromises || !anyToFetch) {\n return;\n }\n\n Promise.all(newTargetTypePromises)\n .then((newTargetTypes) => {\n setTargetTypes(newTargetTypes);\n if (!targetType) {\n return;\n }\n\n const index = newTargetTypes.findIndex(\n (tt) => tt.value === targetType.value || tt.resourceType === targetType.resourceType\n );\n if (index === -1) {\n console.debug(`defaultValue had unexpected resourceType: ${targetType.resourceType}`);\n return;\n }\n // orphaned targetType has been resolved\n setTargetType(newTargetTypes[index]);\n })\n .catch(console.error);\n }, [medplum, targetType, targetTypes]);\n\n const setValueHelper = useCallback(\n (item: Resource | undefined) => {\n const newValue = item ? createReference(item) : undefined;\n setValue(newValue);\n if (onChange) {\n onChange(newValue);\n }\n },\n [onChange]\n );\n\n const typeSelectOptions = useMemo(() => {\n if (targetTypes) {\n return targetTypes.map((tt) => {\n return {\n value: tt.value,\n label: tt.type === 'profile' ? tt.title ?? tt.name ?? tt.resourceType ?? tt.value : tt.value,\n };\n });\n }\n return [];\n }, [targetTypes]);\n\n return (\n <Group spacing=\"xs\" grow noWrap>\n {targetTypes && targetTypes.length > 1 && (\n <NativeSelect\n data-autofocus={props.autoFocus}\n data-testid=\"reference-input-resource-type-select\"\n defaultValue={targetType?.resourceType}\n autoFocus={props.autoFocus}\n onChange={(e) => {\n const newValue = e.currentTarget.value;\n const newTargetType = targetTypes.find((tt) => tt.value === newValue);\n setTargetType(newTargetType);\n }}\n data={typeSelectOptions}\n />\n )}\n {!targetTypes && (\n <ResourceTypeInput\n autoFocus={props.autoFocus}\n testId=\"reference-input-resource-type-input\"\n defaultValue={targetType?.resourceType as ResourceType}\n onChange={(newResourceType) => {\n if (newResourceType) {\n setTargetType({ type: 'resourceType', value: newResourceType, resourceType: newResourceType });\n } else {\n setTargetType(undefined);\n }\n }}\n name={props.name + '-resourceType'}\n placeholder=\"Resource Type\"\n />\n )}\n <ResourceInput\n resourceType={targetType?.resourceType as ResourceType}\n name={props.name + '-id'}\n required={props.required}\n placeholder={props.placeholder}\n defaultValue={value}\n searchCriteria={searchCriteria}\n onChange={setValueHelper}\n />\n </Group>\n );\n}\n\nfunction createTargetTypes(resourceTypesAndProfileUrls: string[] | undefined): TargetType[] | undefined {\n if (\n !resourceTypesAndProfileUrls ||\n resourceTypesAndProfileUrls.length === 0 ||\n (resourceTypesAndProfileUrls.length === 1 && resourceTypesAndProfileUrls[0] === 'Resource')\n ) {\n return undefined;\n }\n\n const results: TargetType[] = [];\n for (const value of resourceTypesAndProfileUrls) {\n // is there a less hacky way to distinguish resourceType from profile URLs?\n if (value.includes('/')) {\n results.push({ type: 'profile', value });\n } else {\n results.push({ type: 'resourceType', value, resourceType: value });\n }\n }\n return results;\n}\n\nfunction getInitialTargetType(\n defaultValue: Reference | undefined,\n targetTypes: TargetType[] | undefined\n): TargetType | undefined {\n const defaultValueResourceType = defaultValue?.reference?.split('/')[0];\n if (defaultValueResourceType) {\n const targetType = targetTypes?.find((tt) => tt.resourceType === defaultValueResourceType);\n if (targetType) {\n return targetType;\n }\n\n // An \"orphaned\" TargetType is created when defaultValue references a resourceType\n // that is not yet represented in targetTypes due to profile URL resolution to resource type\n // that has yet to occur. An orphan can also occur if a defaultValue is provided\n // but targetTypes is not.\n return {\n type: 'resourceType',\n value: defaultValueResourceType,\n resourceType: defaultValueResourceType,\n };\n }\n\n if (targetTypes && targetTypes.length > 0) {\n return targetTypes[0];\n }\n\n return undefined;\n}\n\ntype PartialStructureDefinition = Pick<StructureDefinition, 'type' | 'name' | 'title'>;\n\ninterface ResourceTypeGraphQLResponse {\n readonly data: {\n readonly StructureDefinitionList: PartialStructureDefinition[];\n };\n}\n\nasync function fetchResourceTypeOfProfile(\n medplum: MedplumClient,\n profileUrl: string\n): Promise<PartialStructureDefinition | undefined> {\n const profile = tryGetProfile(profileUrl);\n if (profile) {\n return { type: profile.type, name: profile.name, title: profile.title };\n }\n\n const query = `{\n StructureDefinitionList(url: \"${profileUrl}\", _sort: \"_lastUpdated\", _count: 1) {\n type,\n name,\n title,\n }\n }`.replace(/\\s+/g, ' ');\n\n const response = (await medplum.graphql(query)) as ResourceTypeGraphQLResponse;\n\n return response.data.StructureDefinitionList[0];\n}\n\nfunction shouldFetchResourceType(targetType: TargetType): targetType is ProfileTargetType {\n return targetType.type === 'profile' && !targetType?.error && isEmpty(targetType.resourceType);\n}\n", "import { Group, Text } from '@mantine/core';\nimport { getDisplayString, getReferenceString } from '@medplum/core';\nimport { OperationOutcome, Patient, Reference, Resource } from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { forwardRef, useCallback, useState } from 'react';\nimport { AsyncAutocomplete, AsyncAutocompleteOption } from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\n\n/**\n * Search parameter overrides for specific resource types.\n * Use this to specify the search parameter to use for a given resource type.\n * Otherwise it will fallback to \"name\" if the resource type is in NAME_RESOURCE_TYPES.\n * Otherwise it will fallback to \"_id\".\n */\nconst SEARCH_CODES: Record<string, string> = {\n Observation: 'code',\n User: 'email:contains',\n};\n\n/**\n * Resource types that should use the \"name\" search parameter.\n * This is the full list of resource types that have a \"name\" search parameter.\n * Otherwise it will fallback to \"_id\".\n */\nconst NAME_RESOURCE_TYPES = [\n 'AccessPolicy',\n 'Account',\n 'ActivityDefinition',\n 'Bot',\n 'CapabilityStatement',\n 'ClientApplication',\n 'CodeSystem',\n 'CompartmentDefinition',\n 'ConceptMap',\n 'EffectEvidenceSynthesis',\n 'Endpoint',\n 'EventDefinition',\n 'Evidence',\n 'EvidenceVariable',\n 'ExampleScenario',\n 'GraphDefinition',\n 'HealthcareService',\n 'ImplementationGuide',\n 'InsurancePlan',\n 'Library',\n 'Location',\n 'Measure',\n 'MedicinalProduct',\n 'MessageDefinition',\n 'NamingSystem',\n 'OperationDefinition',\n 'Organization',\n 'Patient',\n 'Person',\n 'PlanDefinition',\n 'Practitioner',\n 'Project',\n 'Questionnaire',\n 'RelatedPerson',\n 'ResearchDefinition',\n 'ResearchElementDefinition',\n 'RiskEvidenceSynthesis',\n 'SearchParameter',\n 'StructureDefinition',\n 'StructureMap',\n 'TerminologyCapabilities',\n 'TestScript',\n 'UserConfiguration',\n 'ValueSet',\n];\n\nexport interface ResourceInputProps<T extends Resource = Resource> {\n readonly resourceType: T['resourceType'];\n readonly name: string;\n readonly defaultValue?: T | Reference<T>;\n readonly searchCriteria?: Record<string, string>;\n readonly placeholder?: string;\n readonly loadOnFocus?: boolean;\n readonly required?: boolean;\n readonly onChange?: (value: T | undefined) => void;\n}\n\nfunction toOption<T extends Resource>(resource: T): AsyncAutocompleteOption<T> {\n return {\n value: getReferenceString(resource),\n label: getDisplayString(resource),\n resource,\n };\n}\n\nexport function ResourceInput<T extends Resource = Resource>(props: ResourceInputProps<T>): JSX.Element | null {\n const medplum = useMedplum();\n const { resourceType, searchCriteria } = props;\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const defaultValue = useResource(props.defaultValue, setOutcome);\n const onChange = props.onChange;\n\n const loadValues = useCallback(\n async (input: string, signal: AbortSignal): Promise<T[]> => {\n const searchCode = getSearchParamForResourceType(resourceType);\n const searchParams = new URLSearchParams({\n [searchCode]: input ?? '',\n _count: '10',\n ...searchCriteria,\n });\n\n const resources = await medplum.searchResources(resourceType, searchParams, { signal });\n return resources as unknown as T[];\n },\n [medplum, resourceType, searchCriteria]\n );\n\n const handleChange = useCallback(\n (newResources: T[]) => {\n if (onChange) {\n onChange(newResources[0]);\n }\n },\n [onChange]\n );\n\n if (props.defaultValue && !outcome && !defaultValue) {\n // If a default value was specified, but the default resource is not loaded yet,\n // then return null to avoid rendering the input until the default resource is loaded.\n // The Mantine <MultiSelect> component does not reliably handle changes to defaultValue.\n return null;\n }\n\n return (\n <AsyncAutocomplete<T>\n name={props.name}\n required={props.required}\n itemComponent={ItemComponent}\n defaultValue={defaultValue}\n placeholder={props.placeholder}\n maxSelectedValues={1}\n toKey={getReferenceString}\n toOption={toOption}\n loadOptions={loadValues}\n onChange={handleChange}\n clearable\n />\n );\n}\n\nconst ItemComponent = forwardRef<HTMLDivElement, any>(({ label, resource, ...others }: any, ref) => {\n return (\n <div ref={ref} {...others}>\n <Group noWrap>\n <ResourceAvatar value={resource} />\n <div>\n <Text>{label}</Text>\n <Text size=\"xs\" color=\"dimmed\">\n {(resource as Patient).birthDate}\n </Text>\n </div>\n </Group>\n </div>\n );\n});\n\n/**\n * Returns the search parameter to use for the given resource type.\n * If the resource type is in SEARCH_CODES, then that value is used.\n * Otherwise, if the resource type is in NAME_RESOURCE_TYPES, then \"name\" is used.\n * Otherwise, \"_id\" is used.\n * @param resourceType - The FHIR resource type.\n * @returns The search parameter to use for the autocomplete input.\n */\nfunction getSearchParamForResourceType(resourceType: string): string {\n return SEARCH_CODES[resourceType] ?? (NAME_RESOURCE_TYPES.includes(resourceType) ? 'name' : '_id');\n}\n", "import { ActionIcon, Button, Group, Stack, createStyles } from '@mantine/core';\nimport {\n InternalSchemaElement,\n getPathDisplayName,\n getPropertyDisplayName,\n isEmpty,\n tryGetProfile,\n} from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons-react';\nimport { MouseEvent, useEffect, useState } from 'react';\nimport { ElementsInput } from '../ElementsInput/ElementsInput';\nimport { FormSection } from '../FormSection/FormSection';\nimport { ElementDefinitionTypeInput, ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { killEvent } from '../utils/dom';\nimport {\n SupportedSliceDefinition,\n assignValuesIntoSlices,\n isSupportedSliceDefinition,\n} from './ResourceArrayInput.utils';\n\nconst useStyles = createStyles((theme) => ({\n indented: {\n marginTop: '0.5rem',\n borderLeft: `3px solid ${theme.colors.gray[4]}`,\n padding: '0.5rem 0 0.5rem 0.5rem',\n },\n}));\n\nexport interface ResourceArrayInputProps {\n property: InternalSchemaElement;\n name: string;\n defaultValue?: any[];\n indent?: boolean;\n arrayElement?: boolean;\n outcome: OperationOutcome | undefined;\n onChange?: (value: any[]) => void;\n hideNonSliceValues?: boolean;\n}\n\nexport function ResourceArrayInput(props: Readonly<ResourceArrayInputProps>): JSX.Element {\n const { property } = props;\n const medplum = useMedplum();\n const [loading, setLoading] = useState(true);\n const [slices, setSlices] = useState<SupportedSliceDefinition[]>([]);\n // props.defaultValue should NOT be used after this; prefer the defaultValue state\n const [defaultValue] = useState<any[]>(() => (Array.isArray(props.defaultValue) ? props.defaultValue : []));\n const [slicedValues, setSlicedValues] = useState<any[][]>([[]]);\n const { classes } = useStyles();\n\n const propertyTypeCode = property.type[0]?.code;\n useEffect(() => {\n if (!property.slicing) {\n const emptySlices: SupportedSliceDefinition[] = [];\n setSlices(emptySlices);\n const results = assignValuesIntoSlices(defaultValue, emptySlices, property.slicing);\n setSlicedValues(results);\n setLoading(false);\n return;\n }\n\n const supportedSlices: SupportedSliceDefinition[] = [];\n const profileUrls: (string | undefined)[] = [];\n const promises: Promise<void>[] = [];\n for (const slice of property.slicing.slices) {\n if (!isSupportedSliceDefinition(slice)) {\n continue;\n }\n\n const sliceType = slice.type[0];\n let profileUrl: string | undefined;\n if (isEmpty(slice.elements)) {\n if (sliceType.profile) {\n profileUrl = sliceType.profile[0];\n }\n }\n\n // important to keep these three arrays the same length;\n supportedSlices.push(slice);\n profileUrls.push(profileUrl);\n if (profileUrl) {\n promises.push(medplum.requestProfileSchema(profileUrl));\n } else {\n promises.push(Promise.resolve());\n }\n }\n\n Promise.all(promises)\n .then(() => {\n for (let i = 0; i < supportedSlices.length; i++) {\n const slice = supportedSlices[i];\n const profileUrl = profileUrls[i];\n if (profileUrl) {\n const typeSchema = tryGetProfile(profileUrl);\n slice.typeSchema = typeSchema;\n }\n }\n setSlices(supportedSlices);\n const results = assignValuesIntoSlices(defaultValue, supportedSlices, property.slicing);\n setSlicedValues(results);\n setLoading(false);\n })\n .catch((reason) => {\n console.error(reason);\n setLoading(false);\n });\n }, [medplum, property.slicing, propertyTypeCode, defaultValue]);\n\n function setValuesWrapper(newValues: any[], sliceIndex: number): void {\n const newSlicedValues = [...slicedValues];\n newSlicedValues[sliceIndex] = newValues;\n setSlicedValues(newSlicedValues);\n if (props.onChange) {\n // Remove any placeholder (i.e. undefined) values before propagating\n const cleaned = newSlicedValues.flat().filter((val) => val !== undefined);\n props.onChange(cleaned);\n }\n }\n\n if (loading) {\n return <div>Loading...</div>;\n }\n\n const nonSliceIndex = slices.length;\n const nonSliceValues = slicedValues[nonSliceIndex];\n\n // Hide non-sliced values when handling sliced extensions\n const showNonSliceValues = !(props.hideNonSliceValues ?? (propertyTypeCode === 'Extension' && slices.length > 0));\n const propertyDisplayName = getPathDisplayName(property.path);\n\n return (\n <Stack className={props.indent ? classes.indented : undefined}>\n {slices.map((slice, sliceIndex) => {\n return (\n <SliceInput\n slice={slice}\n key={slice.name}\n property={property}\n defaultValue={slicedValues[sliceIndex]}\n onChange={(newValue: any[]) => {\n setValuesWrapper(newValue, sliceIndex);\n }}\n testId={`slice-${slice.name}`}\n />\n );\n })}\n\n {showNonSliceValues &&\n nonSliceValues.map((value, valueIndex) => (\n <Group key={`${valueIndex}-${nonSliceValues.length}`} noWrap style={{ flexGrow: 1 }}>\n <div style={{ flexGrow: 1 }}>\n <ResourcePropertyInput\n arrayElement={true}\n property={props.property}\n name={props.name + '.' + valueIndex}\n defaultValue={value}\n onChange={(newValue: any) => {\n const newNonSliceValues = [...nonSliceValues];\n newNonSliceValues[valueIndex] = newValue;\n setValuesWrapper(newNonSliceValues, nonSliceIndex);\n }}\n defaultPropertyType={undefined}\n outcome={props.outcome}\n />\n </div>\n <RemoveButton\n propertyDisplayName={propertyDisplayName}\n testId={`nonsliced-remove-${valueIndex}`}\n onClick={(e: MouseEvent) => {\n killEvent(e);\n const newNonSliceValues = [...nonSliceValues];\n newNonSliceValues.splice(valueIndex, 1);\n setValuesWrapper(newNonSliceValues, nonSliceIndex);\n }}\n />\n </Group>\n ))}\n {showNonSliceValues && slicedValues.flat().length < property.max && (\n <Group noWrap style={{ justifyContent: 'flex-start' }}>\n <AddButton\n propertyDisplayName={propertyDisplayName}\n onClick={(e: MouseEvent) => {\n killEvent(e);\n const newNonSliceValues = [...nonSliceValues];\n newNonSliceValues.push(undefined);\n setValuesWrapper(newNonSliceValues, nonSliceIndex);\n }}\n testId=\"nonsliced-add\"\n />\n </Group>\n )}\n </Stack>\n );\n}\n\ntype SliceInputProps = Readonly<{\n slice: SupportedSliceDefinition;\n property: InternalSchemaElement;\n defaultValue: any[];\n onChange: (newValue: any[]) => void;\n outcome?: OperationOutcome;\n testId?: string;\n}>;\nfunction SliceInput(props: SliceInputProps): JSX.Element | null {\n const { slice, property } = props;\n const [values, setValues] = useState<any[]>(() => {\n return props.defaultValue.map((v) => v ?? {});\n });\n const { classes } = useStyles();\n\n function setValuesWrapper(newValues: any[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n const required = slice.min > 0;\n\n // this is a bit of a hack targeted at nested extensions; indentation would ideally be controlled elsewhere\n // e.g. USCorePatientProfile -> USCoreEthnicityExtension -> {ombCategory, detailed, text}\n const indentedStack = isEmpty(slice.elements);\n const propertyDisplayName = getPropertyDisplayName(slice.name);\n return (\n <FormSection\n title={propertyDisplayName}\n description={slice.definition}\n withAsterisk={required}\n fhirPath={`${property.path}:${slice.name}`}\n testId={props.testId}\n >\n <Stack className={indentedStack ? classes.indented : undefined}>\n {values.map((value, valueIndex) => {\n return (\n <Group key={`${valueIndex}-${values.length}`} noWrap>\n <div style={{ flexGrow: 1 }}>\n <Stack>\n {!isEmpty(slice.elements) ? (\n <ElementsInput\n type={slice.type[0].code}\n elements={slice.elements}\n defaultValue={value}\n outcome={props.outcome}\n onChange={(newValue) => {\n const newValues = [...values];\n newValues[valueIndex] = newValue;\n setValuesWrapper(newValues);\n }}\n testId={props.testId && `${props.testId}-elements-${valueIndex}`}\n />\n ) : (\n <ElementDefinitionTypeInput\n elementDefinitionType={slice.type[0]}\n name={slice.name}\n defaultValue={value}\n onChange={(newValue) => {\n const newValues = [...values];\n newValues[valueIndex] = newValue;\n setValuesWrapper(newValues);\n }}\n outcome={undefined}\n min={slice.min}\n max={slice.max}\n binding={undefined}\n path={slice.path}\n />\n )}\n </Stack>\n </div>\n {values.length > slice.min && (\n <RemoveButton\n propertyDisplayName={propertyDisplayName}\n testId={props.testId && `${props.testId}-remove-${valueIndex}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const newValues = [...values];\n newValues.splice(valueIndex, 1);\n setValuesWrapper(newValues);\n }}\n />\n )}\n </Group>\n );\n })}\n {values.length < slice.max && (\n <Group noWrap style={{ justifyContent: 'flex-start' }}>\n <AddButton\n propertyDisplayName={propertyDisplayName}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const newValues = [...values, undefined];\n setValuesWrapper(newValues);\n }}\n testId={props.testId && `${props.testId}-add`}\n />\n </Group>\n )}\n </Stack>\n </FormSection>\n );\n}\n\ntype ButtonProps = Readonly<{\n propertyDisplayName?: string;\n onClick: React.MouseEventHandler;\n testId?: string;\n}>;\n\nfunction AddButton({ propertyDisplayName, onClick, testId }: ButtonProps): JSX.Element {\n const text = propertyDisplayName ? `Add ${propertyDisplayName}` : 'Add';\n\n return propertyDisplayName ? (\n <Button\n title={text}\n size=\"sm\"\n color=\"green.6\"\n variant=\"subtle\"\n data-testid={testId}\n leftIcon={<IconCirclePlus size=\"1.25rem\" />}\n onClick={onClick}\n >\n {text}\n </Button>\n ) : (\n <ActionIcon title={text} color=\"green.6\" data-testid={testId} onClick={onClick}>\n <IconCirclePlus size=\"1.25rem\" />\n </ActionIcon>\n );\n}\n\nfunction RemoveButton({ propertyDisplayName, onClick, testId }: ButtonProps): JSX.Element {\n return (\n <ActionIcon\n title={propertyDisplayName ? `Remove ${propertyDisplayName}` : 'Remove'}\n color=\"red.5\"\n data-testid={testId}\n onClick={onClick}\n >\n <IconCircleMinus size=\"1.25rem\" />\n </ActionIcon>\n );\n}\n", "import {\n InternalTypeSchema,\n SliceDefinition,\n SliceDiscriminator,\n SlicingRules,\n TypedValue,\n arrayify,\n getElementDefinitionFromElements,\n getTypedPropertyValueWithSchema,\n isPopulated,\n matchDiscriminant,\n} from '@medplum/core';\n\nfunction isDiscriminatorComponentMatch(\n typedValue: TypedValue,\n discriminator: SliceDiscriminator,\n slice: SupportedSliceDefinition\n): boolean {\n for (const elementList of [slice.elements, slice.typeSchema?.elements]) {\n let nestedProp: TypedValue | TypedValue[] | undefined;\n if (isPopulated(elementList)) {\n const ed = getElementDefinitionFromElements(elementList, discriminator.path);\n if (ed) {\n nestedProp = getTypedPropertyValueWithSchema(typedValue.value, discriminator.path, ed);\n }\n }\n\n if (nestedProp) {\n return arrayify(nestedProp)?.some((v: any) => matchDiscriminant(v, discriminator, slice, elementList)) ?? false;\n }\n }\n\n return false;\n}\nfunction getValueSliceName(\n value: any,\n slices: SupportedSliceDefinition[],\n discriminators: SliceDiscriminator[]\n): string | undefined {\n if (!value) {\n return undefined;\n }\n\n for (const slice of slices) {\n const typedValue: TypedValue = {\n value,\n type: slice.typeSchema?.name ?? slice.type[0].code,\n };\n if (discriminators.every((d) => isDiscriminatorComponentMatch(typedValue, d, slice))) {\n return slice.name;\n }\n }\n return undefined;\n}\n\nexport function assignValuesIntoSlices(\n values: any[],\n slices: SupportedSliceDefinition[],\n slicing: SlicingRules | undefined\n): any[][] {\n if (!slicing || slicing.slices.length === 0) {\n return [values];\n }\n\n // store values in an array of arrays: one for each slice plus another for non-sliced values\n const slicedValues: any[][] = new Array(slices.length + 1);\n for (let i = 0; i < slicedValues.length; i++) {\n slicedValues[i] = [];\n }\n\n for (const value of values) {\n const sliceName = getValueSliceName(value, slices, slicing.discriminator);\n let sliceIndex = sliceName ? slices.findIndex((slice) => slice.name === sliceName) : -1;\n if (sliceIndex === -1) {\n sliceIndex = slices.length; // values not matched to a slice go in the last entry for non-slice\n }\n slicedValues[sliceIndex].push(value);\n }\n\n // for slices without existing values, add a placeholder empty value\n for (let i = 0; i < slices.length; i++) {\n if (slicedValues[i].length === 0) {\n slicedValues[i].push(undefined);\n }\n }\n\n return slicedValues;\n}\n\nexport type SupportedSliceDefinition = SliceDefinition & {\n type: NonNullable<SliceDefinition['type']>;\n typeSchema?: InternalTypeSchema;\n};\n\nexport function isSupportedSliceDefinition(slice: SliceDefinition): slice is SupportedSliceDefinition {\n return slice.type !== undefined && slice.type.length > 0;\n}\n", "import { ActionIcon, Flex, Textarea, TextareaProps } from '@mantine/core';\nimport { useClipboard } from '@mantine/hooks';\nimport { showNotification } from '@mantine/notifications';\nimport { IconCopy } from '@tabler/icons-react';\nimport { RefAttributes, useRef, useState } from 'react';\n\nexport interface SensitiveTextareaProps extends TextareaProps, RefAttributes<HTMLTextAreaElement> {}\n\nexport function SensitiveTextarea(props: Omit<SensitiveTextareaProps, 'ref'>): JSX.Element {\n const [revealed, setRevealed] = useState(false);\n const clipboard = useClipboard();\n const ref = useRef<HTMLTextAreaElement | null>(null);\n\n const styles: SensitiveTextareaProps['styles'] = {\n ...props.styles,\n };\n if (!revealed) {\n if (!styles.input) {\n styles.input = {};\n }\n\n styles.input['WebkitTextSecurity'] = 'disc';\n }\n\n return (\n <Flex gap=\"xs\">\n <Textarea\n {...props}\n styles={{\n ...styles,\n root: {\n ...(styles.root ?? {}),\n flexGrow: 1,\n },\n }}\n ref={ref}\n autosize\n minRows={1}\n onFocus={() => setRevealed(true)}\n onBlur={() => setRevealed(false)}\n />\n <ActionIcon\n title=\"Copy secret\"\n onClick={() => {\n clipboard.copy(ref.current?.value);\n showNotification({ color: 'green', message: 'Copied' });\n }}\n >\n <IconCopy />\n </ActionIcon>\n </Flex>\n );\n}\n", "import { Button, Chip, Group, Modal, NativeSelect, Stack, Switch, TextInput } from '@mantine/core';\nimport { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport { useRef, useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\ntype PeriodUnit = 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing | undefined>(props.defaultValue);\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <Group spacing=\"xs\" grow noWrap>\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </Group>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nconst defaultValue: Timing = {\n repeat: {\n period: 1,\n periodUnit: 'd',\n },\n};\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || defaultValue);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat | undefined): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: PeriodUnit | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDaysOfWeek(newDaysOfWeek: DayOfWeek[] | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: newDaysOfWeek });\n }\n\n return (\n <Modal\n title=\"Timing\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={() => props.onCancel()}\n >\n <Stack>\n <FormSection title=\"Starts on\" htmlFor={'timing-dialog-start'}>\n <DateTimeInput name={'timing-dialog-start'} onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <Switch\n label=\"Repeat\"\n checked={!!value.repeat}\n onChange={(e) => setRepeat(e.currentTarget.checked ? defaultValue.repeat : undefined)}\n />\n {value.repeat && (\n <>\n <FormSection title=\"Repeat every\" htmlFor={'timing-dialog-period'}>\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n type=\"number\"\n step={1}\n id=\"timing-dialog-period\"\n name=\"timing-dialog-period\"\n defaultValue={value.repeat.period || 1}\n onChange={(e) => setPeriod(parseInt(e.currentTarget.value, 10) || 1)}\n />\n <NativeSelect\n id=\"timing-dialog-periodUnit\"\n name=\"timing-dialog-periodUnit\"\n defaultValue={value.repeat.periodUnit}\n onChange={(e) => setPeriodUnit(e.currentTarget.value as PeriodUnit | undefined)}\n data={[\n { label: 'second', value: 's' },\n { label: 'minute', value: 'min' },\n { label: 'hour', value: 'h' },\n { label: 'day', value: 'd' },\n { label: 'week', value: 'wk' },\n { label: 'month', value: 'mo' },\n { label: 'year', value: 'a' },\n ]}\n />\n </Group>\n </FormSection>\n {value.repeat.periodUnit === 'wk' && (\n <FormSection title=\"Repeat on\">\n <Chip.Group multiple onChange={setDaysOfWeek as (v: string[] | undefined) => void}>\n <Group position=\"apart\" mt=\"md\" spacing=\"xs\">\n {daysOfWeek.map((day) => (\n <Chip key={day} value={day} size=\"xs\" radius=\"xl\">\n {day.charAt(0).toUpperCase()}\n </Chip>\n ))}\n </Group>\n </Chip.Group>\n </FormSection>\n )}\n </>\n )}\n <Group position=\"right\">\n <Button onClick={() => props.onOk(value)}>OK</Button>\n </Group>\n </Stack>\n </Modal>\n );\n}\n", "import { Button, createStyles, Group } from '@mantine/core';\nimport { Slot } from '@medplum/fhirtypes';\nimport { useMemo, useState } from 'react';\nimport { getMonthString, getStartMonth } from './CalendarInput.utils';\n\nconst useStyles = createStyles((theme) => ({\n table: {\n width: 350,\n\n '& th': {\n fontWeight: 'normal',\n fontSize: 11,\n padding: 8,\n textAlign: 'center',\n },\n\n '& td': {\n padding: '2px 4px',\n },\n\n '& td button': {\n width: 44,\n height: 44,\n color: theme.colors[theme.primaryColor][5],\n fontSize: 16,\n fontWeight: 500,\n textAlign: 'center',\n padding: 0,\n backgroundColor: theme.colors[theme.primaryColor][0],\n border: 0,\n borderRadius: '50%',\n cursor: 'pointer',\n },\n\n '& td button:hover': {\n backgroundColor: theme.colors[theme.primaryColor][1],\n },\n\n '& td button:disabled': {\n backgroundColor: 'transparent',\n cursor: 'default',\n color: theme.colors.gray[4],\n fontWeight: 'normal',\n },\n },\n}));\n\nexport interface CalendarInputProps {\n slots: Slot[];\n onChangeMonth: (date: Date) => void;\n onClick: (date: Date) => void;\n}\n\ninterface CalendarCell {\n date: Date;\n available: boolean;\n}\n\ntype OptionalCalendarCell = CalendarCell | undefined;\n\nexport function CalendarInput(props: CalendarInputProps): JSX.Element {\n const { classes } = useStyles();\n const { onChangeMonth, onClick } = props;\n const [month, setMonth] = useState<Date>(getStartMonth);\n\n function moveMonth(delta: number): void {\n setMonth((currMonth) => {\n const newMonth = new Date(currMonth.getTime());\n newMonth.setMonth(currMonth.getMonth() + delta);\n onChangeMonth(newMonth);\n return newMonth;\n });\n }\n\n const grid = useMemo(() => buildGrid(month, props.slots), [month, props.slots]);\n\n return (\n <div>\n <Group position=\"apart\" spacing=\"xs\" grow noWrap>\n <p style={{ flex: 1 }}>{getMonthString(month)}</p>\n <Group position=\"right\" spacing=\"xs\">\n <Button variant=\"outline\" aria-label=\"Previous month\" onClick={() => moveMonth(-1)}>\n &lt;\n </Button>\n <Button variant=\"outline\" aria-label=\"Next month\" onClick={() => moveMonth(1)}>\n &gt;\n </Button>\n </Group>\n </Group>\n <table className={classes.table}>\n <thead>\n <tr>\n <th>SUN</th>\n <th>MON</th>\n <th>TUE</th>\n <th>WED</th>\n <th>THU</th>\n <th>FRI</th>\n <th>SAT</th>\n </tr>\n </thead>\n <tbody>\n {grid.map((week, weekIndex) => (\n <tr key={'week-' + weekIndex}>\n {week.map((day, dayIndex) => (\n <td key={'day-' + dayIndex}>\n {day && (\n <Button disabled={!day.available} onClick={() => onClick(day.date)}>\n {day.date.getDate()}\n </Button>\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction buildGrid(startDate: Date, slots: Slot[]): OptionalCalendarCell[][] {\n const d = new Date(startDate.getFullYear(), startDate.getMonth());\n const grid: OptionalCalendarCell[][] = [];\n let row: OptionalCalendarCell[] = [];\n\n // Fill leading empty days\n for (let i = 0; i < d.getDay(); i++) {\n row.push(undefined);\n }\n\n while (d.getMonth() === startDate.getMonth()) {\n row.push({\n date: new Date(d.getTime()),\n available: isDayAvailable(d, slots),\n });\n\n if (d.getDay() === 6) {\n grid.push(row);\n row = [];\n }\n\n d.setDate(d.getDate() + 1);\n }\n\n // Fill trailing empty days\n if (d.getDay() !== 0) {\n for (let i = d.getDay(); i < 7; i++) {\n row.push(undefined);\n }\n grid.push(row);\n }\n\n return grid;\n}\n\n/**\n * Returns true if the given date is available for booking.\n * @param day - The day to check.\n * @param slots - The list of available slots.\n * @returns True if there are any available slots for the day.\n */\nfunction isDayAvailable(day: Date, slots: Slot[]): boolean {\n // Note that slot start and end time may or may not be in UTC.\n for (const slot of slots) {\n const slotStart = new Date(slot.start as string);\n if (\n slotStart.getFullYear() === day.getFullYear() &&\n slotStart.getMonth() === day.getMonth() &&\n slotStart.getDate() === day.getDate()\n ) {\n return true;\n }\n }\n\n return false;\n}\n", "/**\n * Returns a month display string (e.g. \"January 2020\").\n * @param date - Any date within the month.\n * @returns The month display string (e.g. \"January 2020\")\n */\nexport function getMonthString(date: Date): string {\n return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();\n}\n\nexport function getStartMonth(): Date {\n const result = new Date();\n result.setDate(1);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n", "import { Container as MantineContainer, ContainerProps, createStyles } from '@mantine/core';\n\nconst useStyles = createStyles(() => ({\n root: {\n '@media (max-width: 800px)': {\n paddingLeft: 4,\n paddingRight: 4,\n },\n },\n}));\n\nexport function Container(props: ContainerProps): JSX.Element {\n const { children, ...others } = props;\n const { classes } = useStyles();\n\n return (\n <MantineContainer className={classes.root} {...others}>\n {children}\n </MantineContainer>\n );\n}\n", "import { ActionIcon, Center, createStyles, Group, Loader, Menu, ScrollArea, TextInput } from '@mantine/core';\nimport { showNotification, updateNotification } from '@mantine/notifications';\nimport { getReferenceString, MedplumClient, normalizeErrorString, ProfileResource } from '@medplum/core';\nimport {\n Attachment,\n AuditEvent,\n Bundle,\n BundleEntry,\n Communication,\n DiagnosticReport,\n Media,\n OperationOutcome,\n Reference,\n Resource,\n ResourceType,\n} from '@medplum/fhirtypes';\nimport { useMedplum, useMedplumNavigate, useResource } from '@medplum/react-hooks';\nimport {\n IconCheck,\n IconCloudUpload,\n IconEdit,\n IconFileAlert,\n IconListDetails,\n IconMessage,\n IconPin,\n IconPinnedOff,\n IconTrash,\n} from '@tabler/icons-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { DiagnosticReportDisplay } from '../DiagnosticReportDisplay/DiagnosticReportDisplay';\nimport { Form } from '../Form/Form';\nimport { Panel } from '../Panel/Panel';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceDiffTable } from '../ResourceDiffTable/ResourceDiffTable';\nimport { ResourceTable } from '../ResourceTable/ResourceTable';\nimport { Timeline, TimelineItem } from '../Timeline/Timeline';\nimport { sortByDateAndPriority } from '../utils/date';\n\nconst useStyles = createStyles((theme) => ({\n pinnedComment: {\n backgroundColor: theme.colors.blue[0],\n },\n}));\n\nexport interface ResourceTimelineProps<T extends Resource> {\n value: T | Reference<T>;\n loadTimelineResources: (\n medplum: MedplumClient,\n resourceType: ResourceType,\n id: string\n ) => Promise<PromiseSettledResult<Bundle>[]>;\n createCommunication?: (resource: T, sender: ProfileResource, text: string) => Communication;\n createMedia?: (resource: T, operator: ProfileResource, attachment: Attachment) => Media;\n}\n\nexport function ResourceTimeline<T extends Resource>(props: ResourceTimelineProps<T>): JSX.Element {\n const medplum = useMedplum();\n const navigate = useMedplumNavigate();\n const sender = medplum.getProfile() as ProfileResource;\n const inputRef = useRef<HTMLInputElement>(null);\n const resource = useResource(props.value);\n const [history, setHistory] = useState<Bundle>();\n const [items, setItems] = useState<Resource[]>([]);\n const loadTimelineResources = props.loadTimelineResources;\n\n const itemsRef = useRef<Resource[]>(items);\n itemsRef.current = items;\n\n /**\n * Sorts and sets the items.\n *\n * Sorting is primarily a function of meta.lastUpdated, but there are special cases.\n * When displaying connected resources, for example a Communication in the context of an Encounter,\n * the Communication.sent time is used rather than Communication.meta.lastUpdated.\n *\n * Other examples of special cases:\n * - DiagnosticReport.issued\n * - Media.issued\n * - Observation.issued\n * - DocumentReference.date\n *\n * See \"sortByDateAndPriority()\" for more details.\n */\n const sortAndSetItems = useCallback(\n (newItmes: Resource[]): void => {\n sortByDateAndPriority(newItmes, resource);\n newItmes.reverse();\n setItems(newItmes);\n },\n [resource]\n );\n\n /**\n * Handles a batch request response.\n * @param batchResponse - The batch response.\n */\n const handleBatchResponse = useCallback(\n (batchResponse: PromiseSettledResult<Bundle>[]): void => {\n const newItems = [];\n\n for (const settledResult of batchResponse) {\n if (settledResult.status !== 'fulfilled') {\n // User may not have access to all resource types\n continue;\n }\n\n const bundle = settledResult.value;\n if (bundle.type === 'history') {\n setHistory(bundle);\n }\n\n if (bundle.entry) {\n for (const entry of bundle.entry) {\n newItems.push(entry.resource as Resource);\n }\n }\n }\n\n sortAndSetItems(newItems);\n },\n [sortAndSetItems]\n );\n\n /**\n * Adds an array of resources to the timeline.\n * @param resource - Resource to add.\n */\n const addResource = useCallback(\n (resource: Resource): void => sortAndSetItems([...itemsRef.current, resource]),\n [sortAndSetItems]\n );\n\n /**\n * Loads the timeline.\n */\n const loadTimeline = useCallback(() => {\n let resourceType: ResourceType;\n let id: string;\n if ('resourceType' in props.value) {\n resourceType = props.value.resourceType;\n id = props.value.id as string;\n } else {\n [resourceType, id] = props.value.reference?.split('/') as [ResourceType, string];\n }\n loadTimelineResources(medplum, resourceType, id).then(handleBatchResponse).catch(console.log);\n }, [medplum, props.value, loadTimelineResources, handleBatchResponse]);\n\n useEffect(() => loadTimeline(), [loadTimeline]);\n\n /**\n * Adds a Communication resource to the timeline.\n * @param contentString - The comment content.\n */\n function createComment(contentString: string): void {\n if (!resource || !props.createCommunication) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createCommunication(resource, sender, contentString))\n .then((result) => addResource(result))\n .catch(console.log);\n }\n\n /**\n * Adds a Media resource to the timeline.\n * @param attachment - The media attachment.\n */\n function createMedia(attachment: Attachment): void {\n if (!resource || !props.createMedia) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createMedia(resource, sender, attachment))\n .then((result) => addResource(result))\n .then(() =>\n updateNotification({\n id: 'upload-notification',\n color: 'teal',\n title: 'Upload complete',\n message: '',\n icon: <IconCheck size={16} />,\n autoClose: 2000,\n })\n )\n .catch((reason) =>\n updateNotification({\n id: 'upload-notification',\n color: 'red',\n title: 'Upload error',\n message: normalizeErrorString(reason),\n icon: <IconFileAlert size={16} />,\n autoClose: 2000,\n })\n );\n }\n\n function setPriority(\n communication: Communication,\n priority: 'routine' | 'urgent' | 'asap' | 'stat'\n ): Promise<Communication> {\n return medplum.updateResource({ ...communication, priority });\n }\n\n function onPin(communication: Communication): void {\n setPriority(communication, 'stat').then(loadTimeline).catch(console.log);\n }\n\n function onUnpin(communication: Communication): void {\n setPriority(communication, 'routine').then(loadTimeline).catch(console.log);\n }\n\n function onDetails(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}`);\n }\n\n function onEdit(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/edit`);\n }\n\n function onDelete(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/delete`);\n }\n\n function onVersionDetails(version: Resource): void {\n navigate(`/${version.resourceType}/${version.id}/_history/${version.meta?.versionId}`);\n }\n\n function onUploadStart(): void {\n showNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Initializing upload...',\n message: 'Please wait...',\n autoClose: false,\n withCloseButton: false,\n });\n }\n\n function onUploadProgress(e: ProgressEvent): void {\n updateNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Uploading...',\n message: getProgressMessage(e),\n autoClose: false,\n withCloseButton: false,\n });\n }\n\n function onUploadError(outcome: OperationOutcome): void {\n updateNotification({\n id: 'upload-notification',\n color: 'red',\n title: 'Upload error',\n message: normalizeErrorString(outcome),\n icon: <IconFileAlert size={16} />,\n autoClose: 2000,\n });\n }\n\n if (!resource) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n return (\n <Timeline>\n {props.createCommunication && (\n <Panel>\n <Form\n testid=\"timeline-form\"\n onSubmit={(formData: Record<string, string>) => {\n createComment(formData.text);\n\n const input = inputRef.current;\n if (input) {\n input.value = '';\n input.focus();\n }\n }}\n >\n <Group spacing=\"xs\" noWrap style={{ width: '100%' }}>\n <ResourceAvatar value={sender} />\n <TextInput\n name=\"text\"\n ref={inputRef}\n placeholder=\"Add comment\"\n style={{ width: '100%', maxWidth: 300 }}\n />\n <ActionIcon type=\"submit\" radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconMessage size={16} />\n </ActionIcon>\n <AttachmentButton\n onUpload={createMedia}\n onUploadStart={onUploadStart}\n onUploadProgress={onUploadProgress}\n onUploadError={onUploadError}\n >\n {(props) => (\n <ActionIcon {...props} radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </Group>\n </Form>\n </Panel>\n )}\n {items.map((item) => {\n if (!item) {\n // TODO: Handle null history items for deleted versions.\n return null;\n }\n const key = `${item.resourceType}/${item.id}/${item.meta?.versionId}`;\n if (item.resourceType === resource.resourceType && item.id === resource.id) {\n return (\n <HistoryTimelineItem key={key} history={history as Bundle} resource={item} onDetails={onVersionDetails} />\n );\n }\n switch (item.resourceType) {\n case 'AuditEvent':\n return <AuditEventTimelineItem key={key} resource={item} onDetails={onDetails} />;\n case 'Communication':\n return (\n <CommunicationTimelineItem\n key={key}\n resource={item}\n onPin={item.priority !== 'stat' ? onPin : undefined}\n onUnpin={item.priority === 'stat' ? onUnpin : undefined}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'DiagnosticReport':\n return (\n <DiagnosticReportTimelineItem\n key={key}\n resource={item}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'Media':\n return (\n <MediaTimelineItem key={key} resource={item} onDetails={onDetails} onEdit={onEdit} onDelete={onDelete} />\n );\n default:\n return (\n <TimelineItem key={key} resource={item} padding={true}>\n <ResourceTable value={item} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n })}\n </Timeline>\n );\n}\n\ninterface BaseTimelineItemProps<T extends Resource> {\n resource: T;\n onPin?: (resource: T) => void;\n onUnpin?: (resource: T) => void;\n onDetails?: (resource: T) => void;\n onEdit?: (resource: T) => void;\n onDelete?: (resource: T) => void;\n}\n\nfunction TimelineItemPopupMenu<T extends Resource>(props: BaseTimelineItemProps<T>): JSX.Element {\n return (\n <Menu.Dropdown>\n <Menu.Label>Resource</Menu.Label>\n {props.onPin && (\n <Menu.Item\n icon={<IconPin size={14} />}\n onClick={() => (props.onPin as (resource: T) => void)(props.resource)}\n aria-label={`Pin ${getReferenceString(props.resource)}`}\n >\n Pin\n </Menu.Item>\n )}\n {props.onUnpin && (\n <Menu.Item\n icon={<IconPinnedOff size={14} />}\n onClick={() => (props.onUnpin as (resource: T) => void)(props.resource)}\n aria-label={`Unpin ${getReferenceString(props.resource)}`}\n >\n Unpin\n </Menu.Item>\n )}\n {props.onDetails && (\n <Menu.Item\n icon={<IconListDetails size={14} />}\n onClick={() => (props.onDetails as (resource: T) => void)(props.resource)}\n aria-label={`Details ${getReferenceString(props.resource)}`}\n >\n Details\n </Menu.Item>\n )}\n {props.onEdit && (\n <Menu.Item\n icon={<IconEdit size={14} />}\n onClick={() => (props.onEdit as (resource: T) => void)(props.resource)}\n aria-label={`Edit ${getReferenceString(props.resource)}`}\n >\n Edit\n </Menu.Item>\n )}\n {props.onDelete && (\n <>\n <Menu.Divider />\n <Menu.Label>Danger zone</Menu.Label>\n <Menu.Item\n color=\"red\"\n icon={<IconTrash size={14} />}\n onClick={() => (props.onDelete as (resource: T) => void)(props.resource)}\n aria-label={`Delete ${getReferenceString(props.resource)}`}\n >\n Delete\n </Menu.Item>\n </>\n )}\n </Menu.Dropdown>\n );\n}\n\ninterface HistoryTimelineItemProps extends BaseTimelineItemProps<Resource> {\n history: Bundle;\n}\n\nfunction HistoryTimelineItem(props: HistoryTimelineItemProps): JSX.Element {\n const previous = getPrevious(props.history, props.resource);\n if (previous) {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ResourceDiffTable original={previous} revised={props.resource} />\n </TimelineItem>\n );\n } else {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <h3>Created</h3>\n <ResourceTable value={props.resource} ignoreMissingValues forceUseInput />\n </TimelineItem>\n );\n }\n}\n\nfunction getPrevious(history: Bundle, version: Resource): Resource | undefined {\n const entries = history.entry as BundleEntry[];\n const index = entries.findIndex((entry) => entry.resource?.meta?.versionId === version.meta?.versionId);\n if (index >= entries.length - 1) {\n return undefined;\n }\n return entries[index + 1].resource;\n}\n\nfunction CommunicationTimelineItem(props: BaseTimelineItemProps<Communication>): JSX.Element {\n const { classes } = useStyles();\n const routine = !props.resource.priority || props.resource.priority === 'routine';\n const className = routine ? undefined : classes.pinnedComment;\n return (\n <TimelineItem\n resource={props.resource}\n profile={props.resource.sender}\n dateTime={props.resource.sent}\n padding={true}\n className={className}\n popupMenuItems={<TimelineItemPopupMenu {...props} />}\n >\n <p>{props.resource.payload?.[0]?.contentString}</p>\n </TimelineItem>\n );\n}\n\nfunction MediaTimelineItem(props: BaseTimelineItemProps<Media>): JSX.Element {\n const contentType = props.resource.content?.contentType;\n const padding =\n contentType &&\n !contentType.startsWith('image/') &&\n !contentType.startsWith('video/') &&\n contentType !== 'application/pdf';\n return (\n <TimelineItem resource={props.resource} padding={!!padding} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <AttachmentDisplay value={props.resource.content} />\n </TimelineItem>\n );\n}\n\nfunction AuditEventTimelineItem(props: BaseTimelineItemProps<AuditEvent>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ScrollArea>\n <pre>{props.resource.outcomeDesc}</pre>\n </ScrollArea>\n </TimelineItem>\n );\n}\n\nfunction DiagnosticReportTimelineItem(props: BaseTimelineItemProps<DiagnosticReport>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <DiagnosticReportDisplay value={props.resource} />\n </TimelineItem>\n );\n}\n\nfunction getProgressMessage(e: ProgressEvent): string {\n if (e.lengthComputable) {\n const percent = (100 * e.loaded) / e.total;\n return `Uploaded: ${formatFileSize(e.loaded)} / ${formatFileSize(e.total)} ${percent.toFixed(2)}%`;\n }\n return `Uploaded: ${formatFileSize(e.loaded)}`;\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) {\n return '0.00 B';\n }\n const e = Math.floor(Math.log(bytes) / Math.log(1024));\n return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';\n}\n", "import { createStyles, Group, List, Stack, Text, Title } from '@mantine/core';\nimport { capitalize, formatCodeableConcept, formatDateTime, formatObservationValue, isReference } from '@medplum/core';\nimport {\n Annotation,\n DiagnosticReport,\n Observation,\n ObservationComponent,\n ObservationReferenceRange,\n Reference,\n Specimen,\n} from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { useEffect, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { NoteDisplay } from '../NoteDisplay/NoteDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\n\nconst useStyles = createStyles((theme) => ({\n table: {\n border: `0.1px solid ${theme.colors.gray[5]}`,\n borderCollapse: 'collapse',\n\n '& td, & th': {\n border: `0.1px solid ${theme.colors.gray[5]}`,\n padding: 4,\n },\n },\n\n criticalRow: {\n background: theme.colorScheme === 'dark' ? theme.colors.red[7] : theme.colors.red[1],\n border: `0.1px solid ${theme.colors.red[5]}`,\n color: theme.colors.red[5],\n fontWeight: 500,\n\n '& td': {\n border: `0.1px solid ${theme.colors.red[5]}`,\n },\n },\n\n noteBody: { fontSize: theme.fontSizes.sm },\n noteCite: { fontSize: theme.fontSizes.xs, marginBlockStart: 3 },\n noteRoot: { padding: 5 },\n}));\n\nexport interface DiagnosticReportDisplayProps {\n value?: DiagnosticReport | Reference<DiagnosticReport>;\n hideObservationNotes?: boolean;\n hideSpecimenInfo?: boolean;\n}\n\nDiagnosticReportDisplay.defaultProps = {\n hideObservationNotes: false,\n hideSpecimenInfo: false,\n} as DiagnosticReportDisplayProps;\n\nexport function DiagnosticReportDisplay(props: DiagnosticReportDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const diagnosticReport = useResource(props.value);\n const [specimens, setSpecimens] = useState<Specimen[]>();\n\n useEffect(() => {\n if (diagnosticReport?.specimen) {\n Promise.allSettled(diagnosticReport.specimen.map((ref) => medplum.readReference(ref)))\n .then((outcomes) =>\n outcomes\n .filter((outcome) => outcome.status === 'fulfilled')\n .map((outcome) => (outcome as PromiseFulfilledResult<Specimen>).value)\n )\n .then(setSpecimens)\n .catch(console.error);\n }\n }, [medplum, diagnosticReport]);\n\n if (!diagnosticReport) {\n return null;\n }\n\n const specimenNotes: Annotation[] = specimens?.flatMap((spec) => spec.note || []) || [];\n\n if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {\n const pf = diagnosticReport.presentedForm[0];\n if (pf.contentType?.startsWith('text/plain') && pf.data) {\n specimenNotes.push({ text: window.atob(pf.data) });\n }\n }\n\n return (\n <Stack>\n <Title>Diagnostic Report</Title>\n <DiagnosticReportHeader value={diagnosticReport} />\n {specimens && !props.hideSpecimenInfo && SpecimenInfo(specimens)}\n {diagnosticReport.result && (\n <ObservationTable hideObservationNotes={props.hideObservationNotes} value={diagnosticReport.result} />\n )}\n {specimenNotes.length > 0 && <NoteDisplay value={specimenNotes} />}\n </Stack>\n );\n}\n\ninterface DiagnosticReportHeaderProps {\n value: DiagnosticReport;\n}\n\nfunction DiagnosticReportHeader({ value }: DiagnosticReportHeaderProps): JSX.Element {\n return (\n <Group mt=\"md\" spacing={30}>\n {value.subject && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Subject\n </Text>\n <Text>\n <ResourceBadge value={value.subject} link={true} />\n </Text>\n </div>\n )}\n {value.resultsInterpreter?.map((interpreter) => (\n <div key={interpreter.reference}>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Interpreter\n </Text>\n <Text>\n <ResourceBadge value={interpreter} link={true} />\n </Text>\n </div>\n ))}\n {value.performer?.map((performer) => (\n <div key={performer.reference}>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Performer\n </Text>\n <Text>\n <ResourceBadge value={performer} link={true} />\n </Text>\n </div>\n ))}\n {value.issued && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Issued\n </Text>\n <Text>{formatDateTime(value.issued)}</Text>\n </div>\n )}\n {value.status && (\n <div>\n <Text size=\"xs\" transform=\"uppercase\" color=\"dimmed\">\n Status\n </Text>\n <Text>{capitalize(value.status)}</Text>\n </div>\n )}\n </Group>\n );\n}\n\nfunction SpecimenInfo(specimens: Specimen[] | undefined): JSX.Element {\n return (\n <Stack spacing={'xs'}>\n <Title order={2} size=\"h6\">\n Specimens\n </Title>\n\n <List type=\"ordered\">\n {specimens?.map((specimen) => (\n <List.Item ml={'sm'} key={`specimen-${specimen.id}`}>\n <Group spacing={20}>\n <Group spacing={5}>\n <Text fw={500}>Collected:</Text> {formatDateTime(specimen.collection?.collectedDateTime)}\n </Group>\n <Group spacing={5}>\n <Text fw={500}>Received:</Text> {formatDateTime(specimen.receivedTime)}\n </Group>\n </Group>\n </List.Item>\n ))}\n </List>\n </Stack>\n );\n}\n\nexport interface ObservationTableProps {\n value?: Observation[] | Reference<Observation>[];\n ancestorIds?: string[];\n hideObservationNotes?: boolean;\n}\n\nexport function ObservationTable(props: ObservationTableProps): JSX.Element {\n const { classes } = useStyles();\n return (\n <table className={classes.table}>\n <thead>\n <tr>\n <th>Test</th>\n <th>Value</th>\n <th>Reference Range</th>\n <th>Interpretation</th>\n <th>Category</th>\n <th>Performer</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n <ObservationRowGroup\n value={props.value}\n ancestorIds={props.ancestorIds}\n hideObservationNotes={props.hideObservationNotes}\n />\n </tbody>\n </table>\n );\n}\n\ninterface ObservationRowGroupProps {\n value?: Observation[] | Reference<Observation>[];\n ancestorIds?: string[];\n hideObservationNotes?: boolean;\n}\n\nfunction ObservationRowGroup(props: ObservationRowGroupProps): JSX.Element {\n return (\n <>\n {props.value?.map((observation) => (\n <ObservationRow\n key={`obs-${isReference(observation) ? observation.reference : observation.id}`}\n value={observation}\n ancestorIds={props.ancestorIds}\n hideObservationNotes={props.hideObservationNotes}\n />\n ))}\n </>\n );\n}\n\ninterface ObservationRowProps {\n value: Observation | Reference<Observation>;\n ancestorIds?: string[];\n hideObservationNotes?: boolean;\n}\n\nfunction ObservationRow(props: ObservationRowProps): JSX.Element | null {\n const { classes, cx } = useStyles();\n const observation = useResource(props.value);\n\n if (!observation || props.ancestorIds?.includes(observation.id as string)) {\n return null;\n }\n\n const displayNotes = !props.hideObservationNotes && observation.note;\n\n const critical = isCritical(observation);\n\n return (\n <>\n <tr className={cx({ [classes.criticalRow]: critical })}>\n <td rowSpan={displayNotes ? 2 : 1}>\n <MedplumLink to={observation}>\n <CodeableConceptDisplay value={observation.code} />\n </MedplumLink>\n </td>\n <td>\n <ObservationValueDisplay value={observation} />\n </td>\n <td>\n <ReferenceRangeDisplay value={observation.referenceRange} />\n </td>\n <td>\n {observation.interpretation && observation.interpretation.length > 0 && (\n <CodeableConceptDisplay value={observation.interpretation[0]} />\n )}\n </td>\n <td>\n {observation.category && observation.category.length > 0 && (\n <>\n {observation.category.map((concept) => (\n <div key={`category-${formatCodeableConcept(concept)}`}>\n <CodeableConceptDisplay value={concept} />\n </div>\n ))}\n </>\n )}\n </td>\n <td>\n {observation.performer?.map((performer) => <ReferenceDisplay key={performer.reference} value={performer} />)}\n </td>\n <td>{observation.status && <StatusBadge status={observation.status} />}</td>\n </tr>\n {observation.hasMember && (\n <ObservationRowGroup\n value={observation.hasMember as Reference<Observation>[]}\n ancestorIds={\n props.ancestorIds ? [...props.ancestorIds, observation.id as string] : [observation.id as string]\n }\n hideObservationNotes={props.hideObservationNotes}\n />\n )}\n {displayNotes && (\n <tr>\n <td colSpan={6}>\n <NoteDisplay value={observation.note} />\n </td>\n </tr>\n )}\n </>\n );\n}\n\ninterface ObservationValueDisplayProps {\n value?: Observation | ObservationComponent;\n}\n\nfunction ObservationValueDisplay(props: ObservationValueDisplayProps): JSX.Element | null {\n const obs = props.value;\n return <>{formatObservationValue(obs)}</>;\n}\n\ninterface ReferenceRangeProps {\n value?: ObservationReferenceRange[];\n}\n\nfunction ReferenceRangeDisplay(props: ReferenceRangeProps): JSX.Element | null {\n const range = props.value && props.value.length > 0 && props.value[0];\n if (!range) {\n return null;\n }\n if (range.text) {\n return <>{range.text}</>;\n }\n return <RangeDisplay value={range} />;\n}\n\n/**\n * Returns true if the observation is critical.\n * See: https://www.hl7.org/fhir/valueset-observation-interpretation.html\n * @param observation - The FHIR observation.\n * @returns True if the FHIR observation is a critical value.\n */\nfunction isCritical(observation: Observation): boolean {\n const code = observation.interpretation?.[0]?.coding?.[0]?.code;\n return code === 'AA' || code === 'LL' || code === 'HH' || code === 'A';\n}\n", "import { Blockquote, createStyles, Stack } from '@mantine/core';\nimport { Annotation } from '@medplum/fhirtypes';\n\nconst useStyles = createStyles((theme) => ({\n noteBody: { fontSize: theme.fontSizes.sm },\n noteCite: { fontSize: theme.fontSizes.xs, marginBlockStart: 3 },\n noteRoot: { padding: 5 },\n}));\n\nexport interface NoteDisplayProps {\n value?: Annotation[];\n}\n\nexport function NoteDisplay({ value }: NoteDisplayProps): JSX.Element | null {\n const { classes } = useStyles();\n if (!value) {\n return null;\n }\n\n return (\n <Stack justify=\"flex-start\" spacing=\"xs\">\n {value.map(\n (note) =>\n note.text && (\n <Blockquote\n key={`note-${note.text}`}\n classNames={{ cite: classes.noteCite, body: classes.noteBody, root: classes.noteRoot }}\n cite={note.authorReference?.display || note.authorString}\n icon={null}\n >\n {note.text}\n </Blockquote>\n )\n )}\n </Stack>\n );\n}\n", "import { Group } from '@mantine/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface ResourceBadgeProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceBadge(props: ResourceBadgeProps): JSX.Element {\n return (\n <Group spacing=\"xs\">\n <ResourceAvatar size={24} radius={12} value={props.value} link={props.link} />\n <ResourceName value={props.value} link={props.link} />\n </Group>\n );\n}\n", "import { Text, TextProps } from '@mantine/core';\nimport { getDisplayString, isOk, normalizeErrorString } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport { useResource } from '@medplum/react-hooks';\nimport { useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ResourceNameProps extends TextProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceName(props: ResourceNameProps): JSX.Element | null {\n const { value, link, ...rest } = props;\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const resource = useResource(value, setOutcome);\n let text: string;\n\n if (outcome && !isOk(outcome)) {\n text = `[${normalizeErrorString(outcome)}]`;\n } else if (resource) {\n text = getDisplayString(resource);\n } else {\n return null;\n }\n\n return link ? (\n <MedplumLink to={value} {...rest}>\n {text}\n </MedplumLink>\n ) : (\n <Text component=\"span\" {...rest}>\n {text}\n </Text>\n );\n}\n", "import { Badge, DefaultMantineColor } from '@mantine/core';\n\n/*\n * Request status: https://hl7.org/fhir/valueset-request-status.html\n * draft, active, on-hold, revoked, completed, entered-in-error, unknown\n *\n * Publication status: https://hl7.org/fhir/valueset-publication-status.html\n * draft, active, retired, unknown\n *\n * Observation status: https://www.hl7.org/fhir/valueset-observation-status.html\n * registered, preliminary, final, amended, corrected, cancelled, entered-in-error, unknown\n *\n * DiagnosticReport status: https://hl7.org/fhir/valueset-diagnostic-report-status.html\n * registered, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown\n *\n * Task status: https://hl7.org/fhir/valueset-task-status.html\n * draft, requested, received, accepted, rejected, ready, cancelled, in-progress, on-hold, failed, completed, entered-in-error\n *\n * Appointment status: https://www.hl7.org/fhir/valueset-appointmentstatus.html\n * proposed, pending, booked, arrived, fulfilled, cancelled, noshow, entered-in-error, chcked-in, waitlist\n */\n\nconst statusToColor: Record<string, DefaultMantineColor> = {\n draft: 'blue',\n active: 'blue',\n 'on-hold': 'yellow',\n revoked: 'red',\n completed: 'green',\n 'entered-in-error': 'red',\n unknown: 'gray',\n retired: 'gray',\n registered: 'blue',\n preliminary: 'blue',\n final: 'green',\n amended: 'yellow',\n corrected: 'yellow',\n cancelled: 'red',\n requested: 'blue',\n received: 'blue',\n accepted: 'blue',\n rejected: 'red',\n ready: 'blue',\n 'in-progress': 'blue',\n failed: 'red',\n proposed: 'blue',\n pending: 'blue',\n booked: 'blue',\n arrived: 'blue',\n fulfilled: 'green',\n noshow: 'red',\n 'checked-in': 'blue',\n waitlist: 'gray',\n routine: 'gray',\n urgent: 'red',\n asap: 'red',\n stat: 'red',\n};\n\nexport interface StatusBadgeProps {\n readonly status: string;\n}\n\nexport function StatusBadge(props: StatusBadgeProps): JSX.Element {\n return <Badge color={statusToColor[props.status]}>{props.status}</Badge>;\n}\n", "import { createStyles, Paper, PaperProps, useComponentDefaultProps } from '@mantine/core';\n\nexport interface PanelStylesParams {\n width?: number;\n fill?: boolean;\n}\n\nconst useStyles = createStyles((theme, { width, fill }: PanelStylesParams) => ({\n paper: {\n maxWidth: width,\n margin: `${theme.spacing.xl} auto`,\n padding: fill ? 0 : theme.spacing.md,\n '@media (max-width: 800px)': {\n padding: fill ? 0 : 8,\n },\n '& img': {\n width: '100%',\n maxWidth: '100%',\n },\n '& video': {\n width: '100%',\n maxWidth: '100%',\n },\n },\n}));\n\nexport interface PanelProps extends PaperProps {\n width?: number;\n fill?: boolean;\n}\n\nconst defaultProps: Partial<PanelProps> = {\n shadow: 'xs',\n radius: 'md',\n withBorder: true,\n};\n\nexport function Panel(props: PanelProps): JSX.Element {\n const { className, children, width, fill, unstyled, ...others } = useComponentDefaultProps(\n 'Panel',\n defaultProps,\n props\n );\n const { classes, cx } = useStyles({ width, fill }, { name: 'Panel', unstyled });\n\n return (\n <Paper className={cx(classes.paper, className)} {...others}>\n {children}\n </Paper>\n );\n}\n", "import { createStyles } from '@mantine/core';\nimport { capitalize, evalFhirPathTyped, getSearchParameterDetails, toTypedValue } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useEffect, useState } from 'react';\nimport { createPatch } from 'rfc6902';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nconst useStyles = createStyles((theme) => ({\n root: {\n borderCollapse: 'collapse',\n width: '100%',\n\n '& tr': {\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n },\n\n '& th, & td': {\n padding: `${theme.spacing.sm} ${theme.spacing.sm}`,\n verticalAlign: 'top',\n },\n },\n\n removed: {\n color: theme.colors.red[7],\n fontFamily: 'monospace',\n textDecoration: 'line-through',\n whiteSpace: 'pre-wrap',\n },\n\n added: {\n color: theme.colors.green[7],\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n },\n}));\n\nexport interface ResourceDiffTableProps {\n original: Resource;\n revised: Resource;\n}\n\nexport function ResourceDiffTable(props: ResourceDiffTableProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n\n useEffect(() => {\n medplum\n .requestSchema(props.original.resourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.original.resourceType]);\n\n if (!schemaLoaded) {\n return null;\n }\n\n const patch = createPatch(props.original, props.revised);\n const typedOriginal = [toTypedValue(props.original)];\n const typedRevised = [toTypedValue(props.revised)];\n\n return (\n <table className={classes.root}>\n <thead>\n <tr>\n <th />\n <th>Before</th>\n <th>After</th>\n </tr>\n </thead>\n <tbody>\n {patch.map((op) => {\n if (op.path.startsWith('/meta')) {\n return null;\n }\n\n const path = op.path;\n const fhirPath = jsonPathToFhirPath(path);\n const details = getSearchParameterDetails(props.original.resourceType, {\n resourceType: 'SearchParameter',\n base: [props.original.resourceType],\n code: props.original.resourceType + '.' + fhirPath,\n expression: props.original.resourceType + '.' + fhirPath,\n });\n const property = details?.elementDefinitions?.[0];\n const isArray = !!property?.isArray;\n const originalValue = op.op === 'add' ? undefined : evalFhirPathTyped(fhirPath, typedOriginal)?.[0];\n const revisedValue = op.op === 'remove' ? undefined : evalFhirPathTyped(fhirPath, typedRevised)?.[0];\n\n return (\n <tr key={`op-${op.op}-${op.path}`}>\n <td>\n {capitalize(op.op)} {fhirPath}\n </td>\n <td className={classes.removed}>\n {originalValue && (\n <ResourcePropertyDisplay\n property={property}\n propertyType={originalValue.type}\n value={fixArray(originalValue.value, isArray)}\n ignoreMissingValues={true}\n />\n )}\n </td>\n <td className={classes.added}>\n {revisedValue && (\n <ResourcePropertyDisplay\n property={property}\n propertyType={revisedValue.type}\n value={fixArray(revisedValue.value, isArray)}\n ignoreMissingValues={true}\n />\n )}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction jsonPathToFhirPath(path: string): string {\n const parts = path.split('/').filter(Boolean);\n let result = '';\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === '-') {\n result += '.last()';\n } else if (/^\\d+$/.test(part)) {\n result += `[${part}]`;\n } else {\n if (i > 0) {\n result += '.';\n }\n result += part;\n }\n }\n return result;\n}\n\nfunction fixArray(inputValue: any, isArray: boolean): any {\n if (Array.isArray(inputValue) && !isArray) {\n return inputValue[0];\n }\n if (!Array.isArray(inputValue) && isArray) {\n return [inputValue];\n }\n return inputValue;\n}\n", "import { Reference, Resource } from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { useEffect, useState } from 'react';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\n\nexport interface ResourceTableProps {\n /**\n * The input value either as a resource or a reference.\n */\n value: Resource | Reference;\n\n /**\n * Optional flag to ignore missing values.\n * By default, missing values are displayed as empty strings.\n */\n ignoreMissingValues?: boolean;\n\n /**\n * Optional flag to force use the input value.\n * This is useful when you want to display a specific version of the resource,\n * and not use the latest version.\n */\n forceUseInput?: boolean;\n}\n\nexport function ResourceTable(props: ResourceTableProps): JSX.Element | null {\n const medplum = useMedplum();\n const value = useResource(props.value);\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n\n useEffect(() => {\n if (value) {\n medplum\n .requestSchema(value.resourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }\n }, [medplum, value]);\n\n if (!schemaLoaded || !value) {\n return null;\n }\n\n return (\n <BackboneElementDisplay\n value={{\n type: value.resourceType,\n value: props.forceUseInput ? props.value : value,\n }}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n}\n", "import { ActionIcon, Group, Menu, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { IconDots } from '@tabler/icons-react';\nimport { ReactNode } from 'react';\nimport { Container } from '../Container/Container';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { Panel, PanelProps } from '../Panel/Panel';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface TimelineProps {\n children?: ReactNode;\n}\n\nexport function Timeline(props: TimelineProps): JSX.Element {\n return <Container>{props.children}</Container>;\n}\n\nexport interface TimelineItemProps extends PanelProps {\n resource: Resource;\n profile?: Reference;\n dateTime?: string;\n padding?: boolean;\n popupMenuItems?: ReactNode;\n}\n\nexport function TimelineItem(props: TimelineItemProps): JSX.Element {\n const { resource, profile, padding, popupMenuItems, ...others } = props;\n const author = profile ?? resource.meta?.author;\n const dateTime = props.dateTime ?? resource.meta?.lastUpdated;\n\n return (\n <Panel data-testid=\"timeline-item\" fill={true} {...others}>\n <Group position=\"apart\" spacing={8} mx=\"xs\" my=\"sm\">\n <ResourceAvatar value={author} link={true} size=\"md\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\">\n <ResourceName color=\"dark\" weight={500} value={author} link={true} />\n </Text>\n <Text size=\"xs\">\n <MedplumLink color=\"dimmed\" to={props.resource}>\n {formatDateTime(dateTime)}\n </MedplumLink>\n <Text component=\"span\" color=\"dimmed\" mx={8}>\n &middot;\n </Text>\n <MedplumLink color=\"dimmed\" to={props.resource}>\n {props.resource.resourceType}\n </MedplumLink>\n </Text>\n </div>\n {popupMenuItems && (\n <Menu position=\"bottom-end\" shadow=\"md\" width={200}>\n <Menu.Target>\n <ActionIcon radius=\"xl\" aria-label={`Actions for ${getReferenceString(props.resource)}`}>\n <IconDots />\n </ActionIcon>\n </Menu.Target>\n {popupMenuItems}\n </Menu>\n )}\n </Group>\n <ErrorBoundary>\n {padding && <div style={{ padding: '0 16px 16px 16px' }}>{props.children}</div>}\n {!padding && <>{props.children}</>}\n </ErrorBoundary>\n </Panel>\n );\n}\n", "import { Resource } from '@medplum/fhirtypes';\n\n/**\n * Sorts an array of resources in place by meta.lastUpdated ascending.\n * @param resources - Array of resources.\n * @param timelineResource - Optional primary resource of a timeline view. If specified, the primary resource will be sorted by meta.lastUpdated descending.\n */\nexport function sortByDateAndPriority(resources: Resource[], timelineResource?: Resource): void {\n resources.sort((a: Resource, b: Resource): number => {\n const priority1 = getPriorityScore(a, timelineResource);\n const priority2 = getPriorityScore(b, timelineResource);\n if (priority1 > priority2) {\n return 1;\n }\n if (priority1 < priority2) {\n return -1;\n }\n return getTime(a, timelineResource) - getTime(b, timelineResource);\n });\n}\n\nfunction getPriorityScore(resource: Resource, timelineResource: Resource | undefined): number {\n if (!isSameResourceType(resource, timelineResource)) {\n // Only use priority if not the primary resource of a timeline view.\n\n const priority = (resource as any).priority;\n if (typeof priority === 'string') {\n return { stat: 4, asap: 3, urgent: 2 }[priority] ?? 0;\n }\n }\n return 0;\n}\n\nfunction getTime(resource: Resource, timelineResource: Resource | undefined): number {\n if (!isSameResourceType(resource, timelineResource)) {\n // Only use special case timestamps if not the primary resource of a timeline view.\n\n if (resource.resourceType === 'Communication' && resource.sent) {\n return new Date(resource.sent).getTime();\n }\n\n if (\n (resource.resourceType === 'DiagnosticReport' ||\n resource.resourceType === 'Media' ||\n resource.resourceType === 'Observation') &&\n resource.issued\n ) {\n return new Date(resource.issued).getTime();\n }\n\n if (resource.resourceType === 'DocumentReference' && resource.date) {\n return new Date(resource.date).getTime();\n }\n }\n\n const dateTime = resource.meta?.lastUpdated;\n if (!dateTime) {\n return 0;\n }\n return new Date(dateTime).getTime();\n}\n\nfunction isSameResourceType(a: Resource, b: Resource | undefined): boolean {\n return !!b && a.resourceType === b.resourceType && a.id === b.id;\n}\n", "import { MedplumClient } from '@medplum/core';\nimport { Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface DefaultResourceTimelineProps {\n resource: Resource | Reference;\n}\n\nexport function DefaultResourceTimeline(props: DefaultResourceTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.resource}\n loadTimelineResources={async (medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory(resourceType, id),\n medplum.search('Task', { _filter: `based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`, _count }),\n ]);\n }}\n />\n );\n}\n", "import { Container } from '../Container/Container';\nimport { Panel, PanelProps } from '../Panel/Panel';\n\nexport function Document(props: PanelProps): JSX.Element {\n const { children, ...others } = props;\n return (\n <Container>\n <Panel {...others}>{children}</Panel>\n </Container>\n );\n}\n", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Encounter, Reference, ResourceType } from '@medplum/fhirtypes';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface EncounterTimelineProps {\n encounter: Encounter | Reference<Encounter>;\n}\n\nexport function EncounterTimeline(props: EncounterTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.encounter}\n loadTimelineResources={async (medplum: MedplumClient, _resourceType: ResourceType, id: string) => {\n return Promise.allSettled([\n medplum.readHistory('Encounter', id),\n medplum.search('Communication', 'encounter=Encounter/' + id),\n medplum.search('Media', 'encounter=Encounter/' + id),\n ]);\n }}\n createCommunication={(resource: Encounter, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Encounter, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { Button, Loader, Table } from '@mantine/core';\nimport { normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ChangeEvent, MouseEvent, memo, useEffect, useRef, useState } from 'react';\nimport { FhirPathDisplay } from '../FhirPathDisplay/FhirPathDisplay';\nimport { SearchClickEvent } from '../SearchControl/SearchControl';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\n\nexport interface FhirPathTableField {\n readonly propertyType: string;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: FhirPathTableField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n * @param props - FhirPathTable React props.\n * @returns FhirPathTable React node.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum\n .graphql(query)\n .then(setResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }, [medplum, query]);\n\n function handleSingleCheckboxClick(e: ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(newSelected);\n }\n\n function handleAllCheckboxClick(e: ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const resources = responseRef.current?.data.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n function handleRowClick(e: MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n medplum\n .requestSchema(props.resourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.resourceType]);\n\n if (!schemaLoaded) {\n return <Loader />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <Table>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>{field.name}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {response?.data.ResourceList.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => {\n return (\n <td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </td>\n );\n })}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {response?.data.ResourceList.length === 0 && <div data-testid=\"empty-search\">No results</div>}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = memo(FhirPathTable);\n", "import { evalFhirPath } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface FhirPathDisplayProps {\n resource: Resource;\n path: string;\n propertyType: string;\n}\n\nexport function FhirPathDisplay(props: FhirPathDisplayProps): JSX.Element | null {\n let value;\n\n try {\n value = evalFhirPath(props.path, props.resource);\n } catch (err) {\n console.warn('FhirPathDisplay:', err);\n return null;\n }\n\n if (value.length > 1) {\n throw new Error(\n `Component \"path\" for \"FhirPathDisplay\" must resolve to a single element. \\\n Received ${value.length} elements \\\n [${JSON.stringify(value, null, 2)}]`\n );\n }\n return <ResourcePropertyDisplay value={value[0] || ''} propertyType={props.propertyType} />;\n}\n", "import {\n ActionIcon,\n Button,\n Center,\n createStyles,\n Group,\n Loader,\n Menu,\n Pagination,\n Table,\n Text,\n UnstyledButton,\n} from '@mantine/core';\nimport { DEFAULT_SEARCH_COUNT, Filter, formatSearchQuery, SearchRequest } from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport {\n IconAdjustmentsHorizontal,\n IconBoxMultiple,\n IconColumns,\n IconFilePlus,\n IconFilter,\n IconRefresh,\n IconTableExport,\n IconTrash,\n} from '@tabler/icons-react';\nimport { ChangeEvent, memo, MouseEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { SearchExportDialog } from '../SearchExportDialog/SearchExportDialog';\nimport { SearchFieldEditor } from '../SearchFieldEditor/SearchFieldEditor';\nimport { SearchFilterEditor } from '../SearchFilterEditor/SearchFilterEditor';\nimport { SearchFilterValueDialog } from '../SearchFilterValueDialog/SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchPopupMenu } from '../SearchPopupMenu/SearchPopupMenu';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { addFilter, buildFieldNameString, getOpString, renderValue, setPage } from './SearchUtils';\n\nexport class SearchChangeEvent extends Event {\n readonly definition: SearchRequest;\n\n constructor(definition: SearchRequest) {\n super('change');\n this.definition = definition;\n }\n}\n\nexport class SearchLoadEvent extends Event {\n readonly response: Bundle;\n\n constructor(response: Bundle) {\n super('load');\n this.response = response;\n }\n}\n\nexport class SearchClickEvent extends Event {\n readonly resource: Resource;\n readonly browserEvent: MouseEvent;\n\n constructor(resource: Resource, browserEvent: MouseEvent) {\n super('click');\n this.resource = resource;\n this.browserEvent = browserEvent;\n }\n}\n\nexport interface SearchControlProps {\n search: SearchRequest;\n userConfig?: UserConfiguration;\n checkboxesEnabled?: boolean;\n hideToolbar?: boolean;\n hideFilters?: boolean;\n onLoad?: (e: SearchLoadEvent) => void;\n onChange?: (e: SearchChangeEvent) => void;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onNew?: () => void;\n onExport?: () => void;\n onExportCsv?: () => void;\n onExportTransactionBundle?: () => void;\n onDelete?: (ids: string[]) => void;\n onPatch?: (ids: string[]) => void;\n onBulk?: (ids: string[]) => void;\n}\n\ninterface SearchControlState {\n searchResponse?: Bundle;\n selected: { [id: string]: boolean };\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n exportDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\n}\n\nconst useStyles = createStyles((theme) => ({\n root: {\n maxWidth: '100%',\n overflow: 'auto',\n textAlign: 'left',\n marginBottom: '20px',\n },\n\n table: {\n cursor: 'pointer',\n },\n\n tr: {\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0],\n },\n },\n\n th: {\n padding: '0 !important',\n },\n\n control: {\n width: '100%',\n padding: `${theme.spacing.xs} ${theme.spacing.md}`,\n\n '&:hover': {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n },\n },\n\n icon: {\n width: 21,\n height: 21,\n borderRadius: 21,\n },\n}));\n\n/**\n * The SearchControl component represents the embeddable search table control.\n * It includes the table, rows, headers, sorting, etc.\n * It does not include the field editor, filter editor, pagination buttons.\n * @param props - The SearchControl React props.\n * @returns The SearchControl React node.\n */\nexport function SearchControl(props: SearchControlProps): JSX.Element {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n fieldEditorVisible: false,\n filterEditorVisible: false,\n exportDialogVisible: false,\n filterDialogVisible: false,\n });\n\n const stateRef = useRef<SearchControlState>(state);\n stateRef.current = state;\n\n const totalType = search.total ?? 'accurate';\n\n const loadResults = useCallback(\n (options?: RequestInit) => {\n setOutcome(undefined);\n\n medplum\n .search(\n search.resourceType as ResourceType,\n formatSearchQuery({ ...search, total: totalType, fields: undefined }),\n options\n )\n .then((response) => {\n setState({ ...stateRef.current, searchResponse: response });\n if (onLoad) {\n onLoad(new SearchLoadEvent(response));\n }\n })\n .catch((reason) => {\n setState({ ...stateRef.current, searchResponse: undefined });\n setOutcome(reason);\n });\n },\n [medplum, search, totalType, onLoad]\n );\n\n const refreshResults = useCallback(() => {\n setState({ ...stateRef.current, searchResponse: undefined });\n loadResults({ cache: 'reload' });\n }, [loadResults]);\n\n useEffect(() => {\n loadResults();\n }, [loadResults]);\n\n function handleSingleCheckboxClick(e: ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...stateRef.current.selected };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function handleAllCheckboxClick(e: ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const searchResponse = stateRef.current.searchResponse;\n if (checked && searchResponse?.entry) {\n searchResponse.entry.forEach((entry) => {\n if (entry.resource?.id) {\n newSelected[entry.resource.id] = true;\n }\n });\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function isAllSelected(): boolean {\n const state = stateRef.current;\n if (!state.searchResponse?.entry || state.searchResponse.entry.length === 0) {\n return false;\n }\n for (const e of state.searchResponse.entry) {\n if (e.resource?.id && !state.selected[e.resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Emits a change event to the optional change listener.\n * @param newSearch - The new search definition.\n */\n function emitSearchChange(newSearch: SearchRequest): void {\n if (props.onChange) {\n props.onChange(new SearchChangeEvent(newSearch));\n }\n }\n\n /**\n * Handles a click on a order row.\n * @param e - The click event.\n * @param resource - The FHIR resource.\n */\n function handleRowClick(e: MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n if (e.button === 2) {\n // Ignore right clicks\n return;\n }\n\n killEvent(e);\n\n const isAux = e.button === 1 || e.ctrlKey || e.metaKey;\n\n if (!isAux && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (isAux && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n function isExportPassed(): boolean {\n return !!(props.onExport ?? props.onExportCsv ?? props.onExportTransactionBundle);\n }\n\n useEffect(() => {\n setSchemaLoaded(false);\n medplum\n .requestSchema(props.search.resourceType as ResourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.search.resourceType]);\n\n if (!schemaLoaded) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(search);\n const resourceType = search.resourceType;\n const lastResult = state.searchResponse;\n const entries = lastResult?.entry;\n const resources = entries?.map((e) => e.resource);\n\n const buttonVariant = 'subtle';\n const buttonColor = 'gray';\n const iconSize = 16;\n const isMobile = window.innerWidth < 768;\n\n return (\n <div className={classes.root} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <Group position=\"apart\" mb=\"xl\">\n <Group spacing={2}>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconColumns size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilter size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconFilePlus size={iconSize} />}\n onClick={props.onNew}\n >\n New...\n </Button>\n )}\n {!isMobile && isExportPassed() && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTableExport size={iconSize} />}\n onClick={\n props.onExport ? props.onExport : () => setState({ ...stateRef.current, exportDialogVisible: true })\n }\n >\n Export...\n </Button>\n )}\n {!isMobile && props.onDelete && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconTrash size={iconSize} />}\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {!isMobile && props.onBulk && (\n <Button\n compact\n variant={buttonVariant}\n color={buttonColor}\n leftIcon={<IconBoxMultiple size={iconSize} />}\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </Group>\n <Group spacing={2}>\n {lastResult && (\n <Text size=\"xs\" color=\"dimmed\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {`${totalType === 'estimate' ? '~' : ''}${lastResult.total?.toLocaleString()}`}\n </Text>\n )}\n <ActionIcon title=\"Refresh\" onClick={refreshResults}>\n <IconRefresh size=\"1.125rem\" />\n </ActionIcon>\n </Group>\n </Group>\n )}\n <Table className={classes.table}>\n <thead>\n <tr>\n {checkboxColumn && (\n <th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </th>\n )}\n {fields.map((field) => (\n <th key={field.name}>\n <Menu shadow=\"md\" width={240} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton className={classes.control}>\n <Group position=\"apart\" noWrap>\n <Text weight={500} size=\"sm\">\n {buildFieldNameString(field.name)}\n </Text>\n <Center className={classes.icon}>\n <IconAdjustmentsHorizontal size={14} stroke={1.5} />\n </Center>\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <SearchPopupMenu\n search={props.search}\n searchParams={field.searchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n }}\n />\n </Menu>\n </th>\n ))}\n </tr>\n {!props.hideFilters && (\n <tr>\n {checkboxColumn && <th />}\n {fields.map((field) => (\n <th key={field.name}>\n {field.searchParams && (\n <FilterDescription\n resourceType={resourceType}\n searchParams={field.searchParams}\n filters={props.search.filters}\n />\n )}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {resources?.map(\n (resource) =>\n resource && (\n <tr\n key={resource.id}\n className={classes.tr}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!state.selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </td>\n )}\n {fields.map((field) => (\n <td key={field.name}>{renderValue(resource, field)}</td>\n ))}\n </tr>\n )\n )}\n </tbody>\n </Table>\n {resources?.length === 0 && (\n <Container>\n <Center style={{ height: 150 }}>\n <Text size=\"xl\" color=\"dimmed\">\n No results\n </Text>\n </Center>\n </Container>\n )}\n {lastResult?.total !== undefined && lastResult.total > 0 && (\n <Center m=\"md\" p=\"md\">\n <Pagination\n value={getPage(search)}\n total={getTotalPages(search, lastResult.total)}\n onChange={(newPage) => emitSearchChange(setPage(search, newPage))}\n getControlProps={(control) => {\n switch (control) {\n case 'previous':\n return { 'aria-label': 'Previous page' };\n case 'next':\n return { 'aria-label': 'Next page' };\n default:\n return {};\n }\n }}\n />\n </Center>\n )}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchFieldEditor\n search={props.search}\n visible={stateRef.current.fieldEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n />\n <SearchFilterEditor\n search={props.search}\n visible={stateRef.current.filterEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n />\n <SearchExportDialog\n visible={stateRef.current.exportDialogVisible}\n exportCsv={props.onExportCsv}\n exportTransactionBundle={props.onExportTransactionBundle}\n onCancel={() => {\n setState({\n ...stateRef.current,\n exportDialogVisible: false,\n });\n }}\n />\n <SearchFilterValueDialog\n key={state.filterDialogSearchParam?.code}\n visible={stateRef.current.filterDialogVisible}\n title={state.filterDialogSearchParam?.code ? buildFieldNameString(state.filterDialogSearchParam.code) : ''}\n resourceType={resourceType}\n searchParam={state.filterDialogSearchParam}\n filter={state.filterDialogFilter}\n defaultValue=\"\"\n onOk={(filter) => {\n emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n />\n </div>\n );\n}\n\nexport const MemoizedSearchControl = memo(SearchControl);\n\ninterface FilterDescriptionProps {\n readonly resourceType: string;\n readonly searchParams: SearchParameter[];\n readonly filters?: Filter[];\n}\n\nfunction FilterDescription(props: FilterDescriptionProps): JSX.Element {\n const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));\n if (filters.length === 0) {\n return <span>no filters</span>;\n }\n\n return (\n <>\n {filters.map((filter: Filter) => (\n <div key={`filter-${filter.code}-${filter.operator}-${filter.value}`}>\n {getOpString(filter.operator)}\n &nbsp;\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </div>\n ))}\n </>\n );\n}\n\nfunction getPage(search: SearchRequest): number {\n return Math.floor((search.offset ?? 0) / (search.count ?? DEFAULT_SEARCH_COUNT)) + 1;\n}\n\nfunction getTotalPages(search: SearchRequest, total: number): number {\n const pageSize = search.count ?? DEFAULT_SEARCH_COUNT;\n return Math.ceil(total / pageSize);\n}\n\nfunction getStart(search: SearchRequest, total: number): number {\n return Math.min(total, (search.offset ?? 0) + 1);\n}\n\nfunction getEnd(search: SearchRequest, total: number): number {\n return Math.min(total, ((search.offset ?? 0) + 1) * (search.count ?? DEFAULT_SEARCH_COUNT));\n}\n", "import { Box, Button, Modal, Text } from '@mantine/core';\n\ninterface SearchExportDialogProps {\n visible: boolean;\n exportCsv?: () => void;\n exportTransactionBundle?: () => void;\n onCancel: () => void;\n}\n\nexport function SearchExportDialog(props: SearchExportDialogProps): JSX.Element | null {\n return (\n <Modal title=\"Export\" closeButtonProps={{ 'aria-label': 'Close' }} opened={props.visible} onClose={props.onCancel}>\n <Box display=\"flex\" sx={{ justifyContent: 'space-between' }}>\n {props.exportCsv && <ExportButton text=\"CSV\" exportLogic={props.exportCsv} onCancel={props.onCancel} />}\n {props.exportTransactionBundle && (\n <ExportButton\n text=\"Transaction Bundle\"\n exportLogic={props.exportTransactionBundle}\n onCancel={props.onCancel}\n />\n )}\n </Box>\n <Text sx={{ marginTop: '10px', marginLeft: '2px' }}>Limited to 1000 records</Text>\n </Modal>\n );\n}\n\ninterface ExportButtonProps {\n text: string;\n exportLogic: () => void;\n onCancel: () => void;\n}\n\nexport function ExportButton(props: ExportButtonProps): JSX.Element {\n return (\n <Button\n onClick={() => {\n props.exportLogic();\n props.onCancel();\n }}\n >\n {`Export as ${props.text}`}\n </Button>\n );\n}\n", "import { Button, Group, Modal, MultiSelect, Stack } from '@mantine/core';\nimport { InternalTypeSchema, SearchRequest, getDataType, getSearchParameters, stringify } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { buildFieldNameString } from '../SearchControl/SearchUtils';\n\nexport interface SearchFieldEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFieldEditor(props: SearchFieldEditorProps): JSX.Element | null {\n const wasDropdownOpen = useRef(false);\n const [state, setState] = useState({\n search: JSON.parse(stringify(props.search)) as SearchRequest,\n });\n\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n\n useEffect(() => {\n setState({ search: props.search });\n }, [props.search]);\n\n const allFields = useMemo(() => {\n if (!props.visible) {\n return [];\n }\n\n const resourceType = props.search.resourceType;\n const typeSchema = getDataType(resourceType);\n const searchParams = getSearchParameters(resourceType);\n return getFieldsList(typeSchema, searchParams)\n .sort((a, b) => a.localeCompare(b))\n .map((field) => {\n return { value: field, label: buildFieldNameString(field) };\n });\n }, [props.visible, props.search.resourceType]);\n\n if (!props.visible) {\n return null;\n }\n\n function handleChange(newFields: string[]): void {\n setState({ search: { ...state.search, fields: newFields } });\n }\n\n return (\n <Modal\n title=\"Fields\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={() => {\n props.onCancel();\n }}\n size=\"auto\"\n /*\n By default, the MultiSelect dropdown does not interact well with Modal's closeOnClickOutside:\n When the MultiSelect's dropdown is opened and the user clicks outside of the dropdown to close it\n (and outside the modal, i.e. clicks on the Modal's overlay), the Modal is undesirably also closed\n from the same click.\n\n Due to the sequencing of the events fired during a click on the overlay and when React\n rerenders of various components occur, it is not possible to simply do something such as setting\n closeOnClickOutside={!isDropdownOpened}:\n\n * user begins a click on the overlay which triggers\n * mousedown event on the overlay which triggers\n * blur event on the MultiSelect's input element which invokes\n * the MultiSelect.onDropdownClose callback which calls setIsDropdownOpen(false) which causes\n * rerender of SearchFieldEditor with isDropdownOpen set to false\n * the user ends the click which triggers\n * click event on the Modal which activates the closeOnClickOutside logic\n * since isDropdownOpen is false, closeOnClickOutside is true, so the Modal closes\n\n Instead, emulate closeOnClickOutside's behavior only when the MultiSelect dropdown\n was not open at the beginning of the click\n */\n withOverlay\n closeOnClickOutside={false}\n overlayProps={{\n onMouseDownCapture: () => {\n // capture whether the MultiSelect dropdown is open when a click on the overlay begins (i.e. mousedown)\n wasDropdownOpen.current = isDropdownOpen;\n },\n onClick: () => {\n if (!wasDropdownOpen.current) {\n // invoke onCancel callback since the dropdown wasn't open at the start of the click on the overlay\n props.onCancel();\n }\n\n // not strictly needed since onMouseDownCapture should always precede onClick, but reset the ref\n wasDropdownOpen.current = false;\n },\n children: <div data-testid=\"overlay-child\" />, // can't specify testid on the overlay itself\n }}\n >\n <Stack>\n <MultiSelect\n withinPortal={true}\n style={{ width: 550 }}\n placeholder=\"Select fields to display\"\n data={allFields}\n value={state.search.fields ?? []}\n onChange={handleChange}\n onDropdownOpen={() => setIsDropdownOpen(true)}\n onDropdownClose={() => setIsDropdownOpen(false)}\n /* shows at most ~6.5 items; the extra half to provide a hint that there are more entries to scroll through */\n maxDropdownHeight={'250px'}\n dropdownPosition=\"bottom\"\n clearButtonProps={{ 'aria-label': 'Clear selection' }}\n clearable\n searchable\n />\n <Group position=\"right\">\n <Button onClick={() => props.onOk(state.search)}>OK</Button>\n </Group>\n </Stack>\n </Modal>\n );\n}\n\n/**\n * Returns a list of fields/columns available for a type.\n * The result is the union of properties and search parameters.\n * @param typeSchema - The type definition.\n * @param searchParams - The search parameters.\n * @returns A list of fields/columns available for a resource type.\n */\nfunction getFieldsList(\n typeSchema: InternalTypeSchema,\n searchParams: Record<string, SearchParameter> | undefined\n): string[] {\n const result = [] as string[];\n const keys = new Set<string>();\n const names = new Set<string>();\n\n // Add properties first\n for (const key of Object.keys(typeSchema.elements)) {\n result.push(key);\n keys.add(key.toLowerCase());\n names.add(buildFieldNameString(key));\n }\n\n // Add search parameters if unique\n if (searchParams) {\n for (const code of Object.keys(searchParams)) {\n const name = buildFieldNameString(code);\n if (!keys.has(code) && !names.has(name)) {\n result.push(code);\n keys.add(code);\n names.add(name);\n }\n }\n }\n\n return result;\n}\n", "import {\n capitalize,\n DEFAULT_SEARCH_COUNT,\n evalFhirPathTyped,\n Filter,\n formatDateTime,\n InternalSchemaElement,\n Operator,\n SearchRequest,\n} from '@medplum/core';\nimport { Resource, SearchParameter } from '@medplum/fhirtypes';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.utils';\nimport { SearchControlField } from './SearchControlField';\n\nconst searchParamToOperators: Record<string, Operator[]> = {\n string: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n fulltext: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n token: [Operator.EQUALS, Operator.NOT],\n reference: [Operator.EQUALS, Operator.NOT],\n numeric: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n quantity: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n date: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n datetime: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n};\n\nconst operatorNames: Record<Operator, string> = {\n eq: 'equals',\n ne: 'not equals',\n gt: 'greater than',\n lt: 'less than',\n ge: 'greater than or equals',\n le: 'less than or equals',\n sa: 'starts after',\n eb: 'ends before',\n ap: 'approximately',\n contains: 'contains',\n exact: 'exact',\n text: 'text',\n not: 'not',\n above: 'above',\n below: 'below',\n in: 'in',\n 'not-in': 'not in',\n 'of-type': 'of type',\n missing: 'missing',\n identifier: 'identifier',\n iterate: 'iterate',\n};\n\n/**\n * Sets the array of filters.\n * @param definition - The original search request.\n * @param filters - The new filters.\n * @returns The updated search request.\n */\nexport function setFilters(definition: SearchRequest, filters: Filter[]): SearchRequest {\n return {\n ...definition,\n filters: filters,\n offset: 0,\n name: undefined,\n };\n}\n\n/**\n * Clears all of the filters.\n * @param definition - The original search request.\n * @returns The updated search request.\n */\nexport function clearFilters(definition: SearchRequest): SearchRequest {\n return setFilters(definition, []);\n}\n\n/**\n * Clears all of the filters on a certain field.\n * @param definition - The original search request.\n * @param code - The field key name to clear filters.\n * @returns The updated search request.\n */\nexport function clearFiltersOnField(definition: SearchRequest, code: string): SearchRequest {\n return setFilters(\n definition,\n (definition.filters ?? []).filter((f) => f.code !== code)\n );\n}\n\n/**\n * Adds a filter.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param op - The operation key name.\n * @param value - The filter value.\n * @param opt_clear - Optional flag to clear filters on the field.\n * @returns The updated search request.\n */\nexport function addFilter(\n definition: SearchRequest,\n field: string,\n op: Operator,\n value?: string,\n opt_clear?: boolean\n): SearchRequest {\n if (opt_clear) {\n definition = clearFiltersOnField(definition, field);\n }\n\n const nextFilters: Filter[] = [];\n if (definition.filters) {\n nextFilters.push(...definition.filters);\n }\n nextFilters.push({ code: field, operator: op, value: value ?? '' });\n\n return setFilters(definition, nextFilters);\n}\n\n/**\n * Adds a field.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addField(definition: SearchRequest, field: string): SearchRequest {\n if (definition.fields?.includes(field)) {\n return definition;\n }\n const newFields = [];\n if (definition.fields) {\n newFields.push(...definition.fields);\n }\n newFields.push(field);\n return {\n ...definition,\n fields: newFields,\n name: undefined,\n };\n}\n\n/**\n * Deletes a filter at the specified index.\n * @param definition - The original search request.\n * @param index - The filter index.\n * @returns The updated search request.\n */\nexport function deleteFilter(definition: SearchRequest, index: number): SearchRequest {\n if (!definition.filters) {\n return definition;\n }\n const newFilters = [...definition.filters];\n newFilters.splice(index, 1);\n return {\n ...definition,\n filters: newFilters,\n name: undefined,\n };\n}\n\n/**\n * Adds a filter that constrains the specified field to \"yesterday\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addYesterdayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"today\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addTodayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"tomorrow\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addTomorrowFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a day.\n * The day is specified as a delta from the current day.\n * \"Today\" would be 0.\n * \"Yesterday\" would be -1.\n * \"Tomorrow\" would be 1.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param delta - The number of days from this day.\n * @returns The updated search request.\n */\nfunction addDayFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setDate(startTime.getDate() + delta);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setDate(endTime.getDate() + 1);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"last month\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addLastMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"this month\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addThisMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"next month\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addNextMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a month.\n * The month is specified as a delta from the current month.\n * \"This month\" would be 0.\n * \"Last month\" would be -1.\n * \"Next month\" would be 1.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param delta - The number of months from this month.\n * @returns The updated search request.\n */\nfunction addMonthFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(startTime.getMonth() + delta);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setMonth(endTime.getMonth() + 1);\n endTime.setDate(1);\n endTime.setHours(0, 0, 0, 0);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to the year to date.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addYearToDateFilter(definition: SearchRequest, field: string): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(0);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date();\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter for a date between two dates (inclusive of both dates).\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param d1 - The start date.\n * @param d2 - The end date.\n * @returns The updated search request.\n */\nexport function addDateFilterBetween(definition: SearchRequest, field: string, d1: Date, d2: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n definition = addDateFilterImpl(definition, field, Operator.GREATER_THAN_OR_EQUALS, d1);\n definition = addDateFilterImpl(definition, field, Operator.LESS_THAN_OR_EQUALS, d2);\n return definition;\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param op - The date/time operation.\n * @param value - The date.\n * @returns The updated search request.\n */\nfunction addDateFilterImpl(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n return addFilter(definition, field, op, value.toISOString());\n}\n\n/**\n * Adds a filter that constrains the specified field to \"missing\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param value - Optional boolean value. Default is true.\n * @returns The updated search request.\n */\nexport function addMissingFilter(definition: SearchRequest, field: string, value = true): SearchRequest {\n return addFilter(definition, field, Operator.MISSING, value.toString());\n}\n\n/**\n * Sets the offset (starting at zero).\n * @param definition - The original search request.\n * @param offset - The offset number.\n * @returns The updated search request.\n */\nexport function setOffset(definition: SearchRequest, offset: number): SearchRequest {\n if (definition.offset === offset) {\n return definition;\n }\n return {\n ...definition,\n offset,\n name: undefined,\n };\n}\n\n/**\n * Creates a new search request with the search offset at the specified page.\n * @param definition - The search definition.\n * @param page - The new page number\n * @returns The new search definition.\n */\nexport function setPage(definition: SearchRequest, page: number): SearchRequest {\n const count = definition.count ?? DEFAULT_SEARCH_COUNT;\n const newOffset = (page - 1) * count;\n return setOffset(definition, newOffset);\n}\n\n/**\n * Sorts the search by the specified key, and optional direction.\n * Direction defaults to ascending ('asc') if not specified.\n * @param definition - The original search request.\n * @param sort - The sort key.\n * @param desc - Optional descending flag. Default is false.\n * @returns The updated search request.\n */\nexport function setSort(definition: SearchRequest, sort: string, desc?: boolean): SearchRequest {\n if (sort === getSortField(definition) && desc !== undefined && desc === isSortDescending(definition)) {\n return definition;\n }\n return {\n ...definition,\n sortRules: [\n {\n code: sort,\n descending: !!desc,\n },\n ],\n name: undefined,\n };\n}\n\n/**\n * Toggles the sort of the search by key.\n * If the search is already sorted by the key, reverses the direction.\n * If the search is not sorted by the key, sort in ascending order.\n * @param definition - The original search request.\n * @param key - The field key name.\n * @returns The updated search request.\n */\nexport function toggleSort(definition: SearchRequest, key: string): SearchRequest {\n let desc = false;\n if (getSortField(definition) === key) {\n desc = !isSortDescending(definition);\n }\n return setSort(definition, key, desc);\n}\n\nexport function getSortField(definition: SearchRequest): string | undefined {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return undefined;\n }\n const field = sortRules[0].code;\n return field.startsWith('-') ? field.substr(1) : field;\n}\n\nexport function isSortDescending(definition: SearchRequest): boolean {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return false;\n }\n return !!sortRules[0].descending;\n}\n\n/**\n * Returns a list of operators for a search parameter.\n * @param searchParam - The search parameter.\n * @returns The list of operators that can be used for the search parameter.\n */\nexport function getSearchOperators(searchParam: SearchParameter): Operator[] | undefined {\n return searchParamToOperators[searchParam.type as string];\n}\n\n/**\n * Returns a string representing the operation.\n * @param op - The operation code.\n * @returns A display string for the operation.\n */\nexport function getOpString(op: Operator): string {\n return operatorNames[op] ?? '';\n}\n\n/**\n * Returns a field display name.\n * @param key - The field key.\n * @returns The field display name.\n */\nexport function buildFieldNameString(key: string): string {\n let tmp = key;\n\n // If dot separated, only the last part\n if (tmp.includes('.')) {\n tmp = tmp.split('.').pop() as string;\n }\n\n // Special case for Version ID\n if (tmp === 'versionId') {\n return 'Version ID';\n }\n\n // Remove choice of type\n tmp = tmp.replace('[x]', '');\n\n // Convert camel case to space separated\n tmp = tmp.replace(/([A-Z])/g, ' $1');\n\n // Convert dashes and underscores to spaces\n tmp = tmp.replace(/[-_]/g, ' ');\n\n // Normalize whitespace to single space character\n tmp = tmp.replace(/\\s+/g, ' ');\n\n // Trim\n tmp = tmp.trim();\n\n // Special case for ID\n if (tmp.toLowerCase() === 'id') {\n return 'ID';\n }\n\n // Capitalize the first letter of each word\n return tmp.split(/\\s/).map(capitalize).join(' ');\n}\n\n/**\n * Returns a fragment to be displayed in the search table for the value.\n * @param resource - The parent resource.\n * @param field - The search code or FHIRPath expression.\n * @returns The fragment to display.\n */\nexport function renderValue(resource: Resource, field: SearchControlField): string | JSX.Element | null | undefined {\n const key = field.name;\n if (key === 'id') {\n return resource.id;\n }\n\n if (key === 'meta.versionId') {\n return resource.meta?.versionId;\n }\n\n if (key === '_lastUpdated') {\n return formatDateTime(resource.meta?.lastUpdated);\n }\n\n // Priority 1: InternalSchemaElement by exact match\n if (field.elementDefinition && `${resource.resourceType}.${field.name}` === field.elementDefinition.path) {\n return renderPropertyValue(resource, field.elementDefinition);\n }\n\n // Priority 2: SearchParameter by exact match\n if (field.searchParams && field.searchParams.length === 1 && field.name === field.searchParams[0].code) {\n return renderSearchParameterValue(resource, field.searchParams[0]);\n }\n\n // We don't know how to render this field definition\n return null;\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a resource property.\n * @param resource - The parent resource.\n * @param elementDefinition - The property element definition.\n * @returns A React element or null.\n */\nfunction renderPropertyValue(resource: Resource, elementDefinition: InternalSchemaElement): JSX.Element | null {\n const path = elementDefinition.path?.split('.')?.pop()?.replaceAll('[x]', '') ?? '';\n const [value, propertyType] = getValueAndType({ type: resource.resourceType, value: resource }, path);\n if (!value) {\n return null;\n }\n\n return (\n <ResourcePropertyDisplay\n property={elementDefinition}\n propertyType={propertyType}\n value={value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a search parameter.\n * @param resource - The parent resource.\n * @param searchParam - The search parameter.\n * @returns A React element or null.\n */\nfunction renderSearchParameterValue(resource: Resource, searchParam: SearchParameter): JSX.Element | null {\n const value = evalFhirPathTyped(searchParam.expression as string, [{ type: resource.resourceType, value: resource }]);\n if (!value || value.length === 0) {\n return null;\n }\n\n return (\n <>\n {value.map((v, index) => (\n <ResourcePropertyDisplay\n key={`${index}-${value.length}`}\n propertyType={v.type}\n value={v.value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n ))}\n </>\n );\n}\n", "import { Button, Group, Modal, NativeSelect } from '@mantine/core';\nimport { Filter, getSearchParameters, Operator, SearchRequest, stringify } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport { useEffect, useRef, useState } from 'react';\nimport {\n addFilter,\n buildFieldNameString,\n deleteFilter,\n getOpString,\n getSearchOperators,\n setFilters,\n} from '../SearchControl/SearchUtils';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterEditor(props: SearchFilterEditorProps): JSX.Element | null {\n const [search, setSearch] = useState<SearchRequest>(JSON.parse(stringify(props.search)) as SearchRequest);\n const [editingIndex, setEditingIndex] = useState<number>(-1);\n\n const searchRef = useRef<SearchRequest>(search);\n searchRef.current = search;\n\n useEffect(() => {\n setSearch(JSON.parse(stringify(props.search)) as SearchRequest);\n }, [props.search]);\n\n function onAddFilter(filter: Filter): void {\n setSearch(addFilter(searchRef.current, filter.code, filter.operator, filter.value));\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const searchParams = getSearchParameters(resourceType) ?? {};\n const filters = search.filters || [];\n\n return (\n <Modal\n title=\"Filters\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n size={900}\n opened={props.visible}\n onClose={props.onCancel}\n >\n <div>\n <table>\n <colgroup>\n <col style={{ width: 200 }} />\n <col style={{ width: 200 }} />\n <col style={{ width: 380 }} />\n <col style={{ width: 120 }} />\n </colgroup>\n <thead>\n <tr>\n <th>Field</th>\n <th>Operation</th>\n <th>Value</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n {filters.map((filter: Filter, index: number) => {\n if (index === editingIndex) {\n return (\n <FilterRowInput\n key={`filter-${filter.code}-${filter.operator}-${filter.value}-input`}\n resourceType={resourceType}\n searchParams={searchParams}\n defaultValue={filter}\n okText=\"Save\"\n onOk={(newFilter: Filter) => {\n const newFilters = [...filters];\n newFilters[index] = newFilter;\n setSearch(setFilters(searchRef.current, newFilters));\n setEditingIndex(-1);\n }}\n onCancel={() => setEditingIndex(-1)}\n />\n );\n } else {\n return (\n <FilterRowDisplay\n key={`filter-${filter.code}-${filter.operator}-${filter.value}-display`}\n resourceType={resourceType}\n searchParams={searchParams}\n filter={filter}\n onEdit={() => setEditingIndex(index)}\n onDelete={() => setSearch(deleteFilter(searchRef.current, index))}\n />\n );\n }\n })}\n <FilterRowInput resourceType={resourceType} searchParams={searchParams} okText=\"Add\" onOk={onAddFilter} />\n </tbody>\n </table>\n </div>\n <Group position=\"right\" mt=\"xl\">\n <Button onClick={() => props.onOk(searchRef.current)}>OK</Button>\n </Group>\n </Modal>\n );\n}\n\ninterface FilterRowDisplayProps {\n readonly searchParams: Record<string, SearchParameter>;\n readonly resourceType: string;\n readonly filter: Filter;\n readonly onEdit: () => void;\n readonly onDelete: () => void;\n}\n\nfunction FilterRowDisplay(props: FilterRowDisplayProps): JSX.Element | null {\n const { filter } = props;\n return (\n <tr>\n <td>{buildFieldNameString(filter.code)}</td>\n <td>{getOpString(filter.operator)}</td>\n <td>\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </td>\n <td>\n <Button compact variant=\"outline\" onClick={props.onEdit}>\n Edit\n </Button>\n <Button compact variant=\"outline\" onClick={props.onDelete}>\n Delete\n </Button>\n </td>\n </tr>\n );\n}\n\ninterface FilterRowInputProps {\n resourceType: string;\n searchParams: Record<string, SearchParameter>;\n defaultValue?: Filter;\n okText: string;\n onOk: (value: Filter) => void;\n onCancel?: () => void;\n}\n\nfunction FilterRowInput(props: FilterRowInputProps): JSX.Element {\n const [value, setValue] = useState<Filter>(props.defaultValue ?? ({} as Filter));\n const valueRef = useRef<Filter>(value);\n valueRef.current = value;\n\n function setFilterCode(newCode: string): void {\n setValue({ ...valueRef.current, code: newCode });\n }\n\n function setFilterOperator(newOperator: Operator): void {\n setValue({ ...valueRef.current, operator: newOperator });\n }\n\n function setFilterValue(newFilterValue: string): void {\n setValue({ ...valueRef.current, value: newFilterValue });\n }\n\n const searchParam = props.searchParams[value.code];\n const operators = searchParam && getSearchOperators(searchParam);\n\n return (\n <tr>\n <td>\n <NativeSelect\n data-testid=\"filter-field\"\n defaultValue={valueRef.current.code}\n onChange={(e) => setFilterCode(e.currentTarget.value)}\n data={[\n '',\n ...Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) })),\n ]}\n />\n </td>\n <td>\n {operators && (\n <NativeSelect\n data-testid=\"filter-operation\"\n defaultValue={value.operator}\n onChange={(e) => setFilterOperator(e.currentTarget.value as Operator)}\n data={['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))]}\n />\n )}\n </td>\n <td>\n {searchParam && value.operator && (\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={searchParam}\n defaultValue={value.value}\n onChange={setFilterValue}\n />\n )}\n </td>\n <td>\n {value.code && value.operator && (\n <Button\n compact\n variant=\"outline\"\n onClick={() => {\n props.onOk(valueRef.current);\n setValue({} as Filter);\n }}\n >\n {props.okText}\n </Button>\n )}\n {props.onCancel && (\n <Button compact variant=\"outline\" onClick={props.onCancel}>\n Cancel\n </Button>\n )}\n </td>\n </tr>\n );\n}\n", "import {\n Filter,\n formatDateTime,\n getSearchParameterDetails,\n globalSchema,\n Operator,\n SearchParameterType,\n} from '@medplum/core';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface SearchFilterValueDisplayProps {\n readonly resourceType: string;\n readonly filter: Filter;\n}\n\nexport function SearchFilterValueDisplay(props: SearchFilterValueDisplayProps): JSX.Element {\n const { resourceType, filter } = props;\n\n const searchParam = globalSchema.types[resourceType].searchParams?.[filter.code];\n if (searchParam) {\n if (\n searchParam.type === 'reference' &&\n (filter.operator === Operator.EQUALS || filter.operator === Operator.NOT_EQUALS)\n ) {\n return <ResourceName value={{ reference: filter.value }} />;\n }\n\n const searchParamDetails = getSearchParameterDetails(resourceType, searchParam);\n if (filter.code === '_lastUpdated' || searchParamDetails.type === SearchParameterType.DATETIME) {\n return <>{formatDateTime(filter.value)}</>;\n }\n }\n\n return <>{filter.value}</>;\n}\n", "import { Checkbox, TextInput } from '@mantine/core';\nimport { getSearchParameterDetails, SearchParameterType } from '@medplum/core';\nimport { Quantity, Reference, SearchParameter } from '@medplum/fhirtypes';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\n\nexport interface SearchFilterValueInputProps {\n resourceType: string;\n searchParam: SearchParameter;\n defaultValue?: string;\n autoFocus?: boolean;\n onChange: (value: string) => void;\n}\n\nexport function SearchFilterValueInput(props: SearchFilterValueInputProps): JSX.Element | null {\n const details = getSearchParameterDetails(props.resourceType, props.searchParam);\n const name = 'filter-value';\n\n switch (details.type) {\n case SearchParameterType.REFERENCE:\n return (\n <ReferenceInput\n name={name}\n defaultValue={props.defaultValue ? { reference: props.defaultValue } : undefined}\n targetTypes={props.searchParam.target}\n autoFocus={props.autoFocus}\n onChange={(newReference: Reference | undefined) => {\n if (newReference) {\n props.onChange(newReference.reference as string);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n case SearchParameterType.BOOLEAN:\n return (\n <Checkbox\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultChecked={props.defaultValue === 'true'}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.checked.toString())}\n />\n );\n\n case SearchParameterType.DATE:\n return (\n <TextInput\n type=\"date\"\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.DATETIME:\n return (\n <DateTimeInput\n name={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={props.onChange}\n />\n );\n\n case SearchParameterType.NUMBER:\n return (\n <TextInput\n type=\"number\"\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.QUANTITY:\n return (\n <QuantityInput\n name={name}\n defaultValue={tryParseQuantity(props.defaultValue)}\n autoFocus={props.autoFocus}\n onChange={(newQuantity: Quantity | undefined) => {\n if (newQuantity) {\n props.onChange(`${newQuantity.value}`);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n default:\n return (\n <TextInput\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n placeholder=\"Search value\"\n />\n );\n }\n}\n\nfunction tryParseQuantity(value: string | undefined): Quantity | undefined {\n if (value) {\n const [valueString, systemString, unitString] = value.split('|');\n if (valueString) {\n return {\n value: parseFloat(valueString),\n system: systemString,\n unit: unitString,\n };\n }\n }\n return undefined;\n}\n", "import { Button, Grid, Modal } from '@mantine/core';\nimport { Filter } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterValueDialogProps {\n title: string;\n visible: boolean;\n resourceType: string;\n searchParam?: SearchParameter;\n filter?: Filter;\n defaultValue?: string;\n onOk: (filter: Filter) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterValueDialog(props: SearchFilterValueDialogProps): JSX.Element | null {\n const [value, setValue] = useState<string>(props.defaultValue ?? '');\n\n if (!props.visible || !props.searchParam || !props.filter) {\n return null;\n }\n\n function onOk(): void {\n props.onOk({ ...(props.filter as Filter), value });\n }\n\n return (\n <Modal title={props.title} size=\"xl\" opened={props.visible} onClose={props.onCancel}>\n <Form onSubmit={onOk}>\n <Grid>\n <Grid.Col span={10}>\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={props.searchParam}\n defaultValue={value}\n autoFocus={true}\n onChange={setValue}\n />\n </Grid.Col>\n <Grid.Col span={2}>\n <Button onClick={onOk} fullWidth>\n OK\n </Button>\n </Grid.Col>\n </Grid>\n </Form>\n </Modal>\n );\n}\n", "import { Menu } from '@mantine/core';\nimport { Filter, Operator, SearchRequest } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport {\n IconBleach,\n IconBleachOff,\n IconBracketsContain,\n IconBucket,\n IconBucketOff,\n IconCalendar,\n IconEqual,\n IconEqualNot,\n IconMathGreater,\n IconMathLower,\n IconSettings,\n IconSortAscending,\n IconSortDescending,\n IconX,\n} from '@tabler/icons-react';\nimport {\n addLastMonthFilter,\n addMissingFilter,\n addNextMonthFilter,\n addThisMonthFilter,\n addTodayFilter,\n addTomorrowFilter,\n addYearToDateFilter,\n addYesterdayFilter,\n buildFieldNameString,\n clearFiltersOnField,\n setSort,\n} from '../SearchControl/SearchUtils';\n\nexport interface SearchPopupMenuProps {\n search: SearchRequest;\n searchParams?: SearchParameter[];\n onPrompt: (searchParam: SearchParameter, filter: Filter) => void;\n onChange: (definition: SearchRequest) => void;\n}\n\nexport function SearchPopupMenu(props: SearchPopupMenuProps): JSX.Element | null {\n if (!props.searchParams) {\n return null;\n }\n\n function onSort(searchParam: SearchParameter, desc: boolean): void {\n onChange(setSort(props.search, searchParam.code as string, desc));\n }\n\n function onClear(searchParam: SearchParameter): void {\n onChange(clearFiltersOnField(props.search, searchParam.code as string));\n }\n\n function onPrompt(searchParam: SearchParameter, operator: Operator): void {\n props.onPrompt(searchParam, { code: searchParam.code as string, operator, value: '' });\n }\n\n function onChange(definition: SearchRequest): void {\n props.onChange(definition);\n }\n\n // If there is only one search parameter, then show it directly\n if (props.searchParams.length === 1) {\n return (\n <SearchParameterSubMenu\n search={props.search}\n searchParam={props.searchParams[0]}\n onSort={onSort}\n onPrompt={onPrompt}\n onChange={onChange}\n onClear={onClear}\n />\n );\n }\n\n // Otherwise, show a menu, with each search parameter as a sub menu\n return (\n <Menu.Dropdown>\n {props.searchParams.map((searchParam) => (\n <Menu.Item key={searchParam.code}>{buildFieldNameString(searchParam.code as string)}</Menu.Item>\n ))}\n </Menu.Dropdown>\n );\n}\n\ninterface SearchPopupSubMenuProps {\n search: SearchRequest;\n searchParam: SearchParameter;\n onSort: (searchParam: SearchParameter, descending: boolean) => void;\n onPrompt: (searchParam: SearchParameter, operator: Operator) => void;\n onChange: (search: SearchRequest) => void;\n onClear: (searchParam: SearchParameter) => void;\n}\n\nfunction SearchParameterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n switch (props.searchParam.type) {\n case 'date':\n return <DateFilterSubMenu {...props} />;\n case 'number':\n case 'quantity':\n return <NumericFilterSubMenu {...props} />;\n case 'reference':\n return <ReferenceFilterSubMenu {...props} />;\n case 'string':\n case 'token':\n case 'uri':\n return <TextFilterSubMenu {...props} />;\n default:\n return <>Unknown search param type: {props.searchParam.type}</>;\n }\n}\n\nfunction DateFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Oldest to Newest\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Newest to Oldest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconMathLower size={14} />} onClick={() => props.onPrompt(searchParam, Operator.ENDS_BEFORE)}>\n Before...\n </Menu.Item>\n <Menu.Item\n icon={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.STARTS_AFTER)}\n >\n After...\n </Menu.Item>\n <Menu.Item icon={<IconBracketsContain size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Between...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addTomorrowFilter(props.search, code))}\n >\n Tomorrow\n </Menu.Item>\n <Menu.Item icon={<IconCalendar size={14} />} onClick={() => props.onChange(addTodayFilter(props.search, code))}>\n Today\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYesterdayFilter(props.search, code))}\n >\n Yesterday\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addNextMonthFilter(props.search, code))}\n >\n Next Month\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addThisMonthFilter(props.search, code))}\n >\n This Month\n </Menu.Item>\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addLastMonthFilter(props.search, code))}\n >\n Last Month\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYearToDateFilter(props.search, code))}\n >\n Year to date\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction NumericFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Smallest to Largest\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Largest to Smallest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n icon={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN)}\n >\n Greater than...\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN_OR_EQUALS)}\n >\n Greater than or equal to...\n </Menu.Item>\n <Menu.Item icon={<IconMathLower size={14} />} onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN)}>\n Less than...\n </Menu.Item>\n <Menu.Item\n icon={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN_OR_EQUALS)}\n >\n Less than or equal to...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction ReferenceFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction TextFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item icon={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort A to Z\n </Menu.Item>\n <Menu.Item icon={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Z to A\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item icon={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconBucket size={14} />} onClick={() => props.onPrompt(searchParam, Operator.CONTAINS)}>\n Contains...\n </Menu.Item>\n <Menu.Item icon={<IconBucketOff size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Does not contain...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction CommonMenuItems(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <Menu.Divider />\n <Menu.Item icon={<IconBleach size={14} />} onClick={() => props.onChange(addMissingFilter(props.search, code))}>\n Missing\n </Menu.Item>\n <Menu.Item\n icon={<IconBleachOff size={14} />}\n onClick={() => props.onChange(addMissingFilter(props.search, code, false))}\n >\n Not missing\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item icon={<IconX size={14} />} onClick={() => props.onClear(searchParam)}>\n Clear filters\n </Menu.Item>\n </>\n );\n}\n", "import {\n getElementDefinition,\n getSearchParameter,\n getSearchParameterDetails,\n getSearchParameters,\n InternalSchemaElement,\n SearchRequest,\n} from '@medplum/core';\nimport { ResourceType, SearchParameter } from '@medplum/fhirtypes';\n\n/**\n * The SearchControlField type describes a field in the search control.\n *\n * In a SearchRequest, a field is a simple string. Strings can be one of the following:\n * 1) Simple property names, which refer to InternalSchemaElement objects\n * 2) Search parameter names, which refer to SearchParameter resources\n *\n * Consider a few examples of how this becomes complicated.\n *\n * \"name\" (easy)\n * - element definition path=\"Patient.name\"\n * - search parameter code=\"name\"\n *\n * \"birthDate\" (medium)\n * - refers to the element definition path=\"Patient.birthDate\"\n * - refers to the search parameter code=\"birthdate\" (note the capitalization)\n *\n * \"email\" (hard)\n * - refers to the search parameter code=\"email\"\n * - refers to the element definition path=\"Patient.telecom\"\n *\n * In the last case, we start with the search parameter, and walk backwards to the\n * element definition in order to get type details for rendering.\n *\n * Overall, we want columns, fields, properties, and search parameters to feel seamless,\n * so we try our darndest to make this work.\n */\nexport interface SearchControlField {\n readonly name: string;\n readonly elementDefinition?: InternalSchemaElement;\n readonly searchParams?: SearchParameter[];\n}\n\n/**\n * Returns the collection of field definitions for the search request.\n * @param search - The search request definition.\n * @returns An array of field definitions.\n */\nexport function getFieldDefinitions(search: SearchRequest): SearchControlField[] {\n const resourceType = search.resourceType;\n const fields = [] as SearchControlField[];\n\n for (const name of search.fields || ['id', '_lastUpdated']) {\n fields.push(getFieldDefinition(resourceType, name));\n }\n return fields;\n}\n\n/**\n * Return the field definition for a given field name.\n * Field names can be either property names or search parameter codes.\n * @param resourceType - The resource type.\n * @param name - The search field name (either property name or search parameter code).\n * @returns The field definition.\n */\nfunction getFieldDefinition(resourceType: string, name: string): SearchControlField {\n if (name === '_lastUpdated') {\n return {\n name: '_lastUpdated',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_lastUpdated',\n name: '_lastUpdated',\n type: 'date',\n expression: 'Resource.meta.lastUpdated',\n },\n ],\n };\n }\n\n if (name === 'meta.versionId') {\n return {\n name: 'meta.versionId',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_versionId',\n name: '_versionId',\n type: 'token',\n expression: 'Resource.meta.versionId',\n },\n ],\n };\n }\n\n const exactElementDefinition = getElementDefinition(resourceType, name);\n const exactSearchParam = getSearchParameter(resourceType, name.toLowerCase());\n\n // Best case: Exact match of element definition or search parameter.\n // Examples: ServiceRequest.subject, Patient.name, Patient.birthDate\n // In this case, we only show the one search parameter.\n if (exactElementDefinition && exactSearchParam) {\n return { name, elementDefinition: exactElementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Next best case: Exact match of element definition\n // Examples: Observation.value\n // In this case, there could be zero or more search parameters that are a function of the element definition.\n // So search for those search parameters.\n if (exactElementDefinition) {\n const allSearchParams = getSearchParameters(resourceType);\n let searchParams: SearchParameter[] | undefined = undefined;\n if (allSearchParams) {\n // To avoid matching names that happen to be prefixes of other names, e.g. id and identifier,\n // match ${resourceType}.${name} followed by a non-name character OR the end of the string\n // Name characters include letters, numbers, underscores, and hyphens\n const pathRegex = new RegExp(`${resourceType}\\\\.${name.replaceAll('[x]', '')}([^\\\\w-]|$)`);\n\n searchParams = Object.values(allSearchParams).filter((p) => !!p.expression && pathRegex.test(p?.expression));\n if (searchParams.length === 0) {\n searchParams = undefined;\n }\n }\n return { name, elementDefinition: exactElementDefinition, searchParams };\n }\n\n // Search parameter case: Exact match of search parameter\n // Examples: Observation.value-quantity, Patient.email\n // Here we have a search parameter, but no element definition.\n // Observation.value-quantity is a search parameter for the Observation.value element.\n // Patient.email is a search parameter for the Patient.telecom element.\n // So we need to walk backwards to find the element definition.\n if (exactSearchParam) {\n const details = getSearchParameterDetails(resourceType, exactSearchParam);\n return { name, elementDefinition: details.elementDefinitions?.[0], searchParams: [exactSearchParam] };\n }\n\n // Worst case: no element definition and no search parameter.\n // This is probably a malformed URL that includes an unknown field.\n // We will render the column header, but all cells will be empty.\n return { name };\n}\n", "export interface LogoProps {\n size: number;\n fill?: string;\n}\n\nexport function Logo(props: LogoProps): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 491 491\" style={{ width: props.size, height: props.size }}>\n <title>Medplum Logo</title>\n <path fill={props.fill ?? '#ad7136'} d=\"M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z\" />\n <path\n fill={props.fill ?? '#946af9'}\n d=\"M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z\"\n />\n <path\n fill={props.fill ?? '#7857c5'}\n d=\"M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z\"\n />\n <path\n fill={props.fill ?? '#40bc26'}\n d=\"M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z\"\n />\n <path fill={props.fill ?? '#33961e'} d=\"M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z\" />\n </svg>\n );\n}\n", "import { Box, SimpleGrid } from '@mantine/core';\nimport { MeasureReport, MeasureReportGroup, Reference } from '@medplum/fhirtypes';\nimport { useResource, useSearchOne } from '@medplum/react-hooks';\nimport { MeasureReportGroupDisplay, MeasureTitle } from './MeasureReportGroupDisplay/MeasureReportGroupDisplay';\n\nexport interface MeasureReportDisplayProps {\n readonly measureReport: MeasureReport | Reference<MeasureReport>;\n}\n\nexport function MeasureReportDisplay(props: MeasureReportDisplayProps): JSX.Element | null {\n const report = useResource(props.measureReport);\n const [measure] = useSearchOne('Measure', { url: report?.measure });\n\n if (!report) {\n return null;\n }\n\n return (\n <Box>\n {measure && <MeasureTitle measure={measure} />}\n <SimpleGrid\n cols={3}\n breakpoints={[\n { maxWidth: '48rem', cols: 2, spacing: 'md' },\n { maxWidth: '36rem', cols: 1, spacing: 'sm' },\n ]}\n spacing={'md'}\n >\n {report.group?.map((group: MeasureReportGroup, idx: number) => (\n <MeasureReportGroupDisplay key={group.id ?? idx} group={group} />\n ))}\n </SimpleGrid>\n </Box>\n );\n}\n", "import { Box, Flex, Group, Paper, RingProgress, Text, Title } from '@mantine/core';\nimport { formatCodeableConcept } from '@medplum/core';\nimport { Measure, MeasureReportGroup } from '@medplum/fhirtypes';\nimport { QuantityDisplay } from '../../QuantityDisplay/QuantityDisplay';\n\ninterface MeasureReportGroupDisplayProps {\n readonly group: MeasureReportGroup;\n}\n\ninterface MeasureProps {\n readonly measure: Measure;\n}\n\nexport function MeasureReportGroupDisplay(props: MeasureReportGroupDisplayProps): JSX.Element | null {\n const { group } = props;\n return (\n <Paper withBorder radius=\"md\" p=\"xs\" display=\"flex\" sx={{ alignItems: 'center', justifyContent: 'center' }}>\n <Group>\n {group.measureScore && <MeasureScore group={group} />}\n {!group.measureScore && <MeasureReportPopulation group={group} />}\n </Group>\n </Paper>\n );\n}\n\nexport function MeasureTitle(props: MeasureProps): JSX.Element {\n const { measure } = props;\n return (\n <>\n <Text fz=\"md\" fw={500} mb={8}>\n {measure.title}\n </Text>\n <Text fz=\"xs\" c=\"dimmed\" mb={8}>\n {measure.subtitle}\n </Text>\n </>\n );\n}\n\nfunction MeasureReportPopulation(props: MeasureReportGroupDisplayProps): JSX.Element {\n const { group } = props;\n const populations = group.population;\n const numerator = populations?.find((p: any) => formatCodeableConcept(p.code) === 'numerator');\n const denominator = populations?.find((p: any) => formatCodeableConcept(p.code) === 'denominator');\n\n const numeratorCount = numerator?.count;\n const denominatorCount = denominator?.count;\n\n if (denominatorCount === 0) {\n return (\n <Box>\n <Title order={3}>Not Applicable</Title>\n <Text>{`Denominator: ${denominatorCount}`}</Text>\n </Box>\n );\n }\n\n if (numeratorCount === undefined || denominatorCount === undefined) {\n return (\n <Box>\n <Title order={3}>Insufficient Data</Title>\n <Text>{`Numerator: ${numeratorCount}`}</Text>\n <Text>{`Denominator: ${denominatorCount}`}</Text>\n </Box>\n );\n }\n\n const value = (numeratorCount / denominatorCount) * 100;\n return (\n <RingProgress\n size={120}\n thickness={12}\n roundCaps\n sections={[{ value: value, color: groupColor(value) }]}\n label={\n <Flex justify=\"center\">\n <Text fw={700} fz={18}>\n {numeratorCount} / {denominatorCount}\n </Text>\n </Flex>\n }\n />\n );\n}\n\nfunction MeasureScore(props: MeasureReportGroupDisplayProps): JSX.Element {\n const { group } = props;\n const unit = group.measureScore?.unit ?? group.measureScore?.code;\n\n return (\n <>\n {unit === '%' ? (\n <RingProgress\n size={120}\n thickness={12}\n roundCaps\n sections={[{ value: groupValue(group), color: groupColor(group?.measureScore?.value ?? 0) }]}\n label={\n <Flex justify=\"center\">\n <Text fw={700} fz={18}>\n <QuantityDisplay value={group.measureScore} />\n </Text>\n </Flex>\n }\n />\n ) : (\n <Flex h={120} align=\"center\">\n <Title order={3}>\n <QuantityDisplay value={group.measureScore} />\n </Title>\n </Flex>\n )}\n </>\n );\n}\n\nfunction groupValue(group: MeasureReportGroup): number {\n const score = group.measureScore?.value;\n const unit = group.measureScore?.unit;\n if (!score) {\n return 0;\n }\n if (score <= 1 && unit === '%') {\n return score * 100;\n }\n return score;\n}\n\nfunction groupColor(score: number): string {\n if (score <= 33) {\n return 'red';\n }\n if (score <= 67) {\n return 'yellow';\n }\n return 'green';\n}\n", "import { Alert } from '@mantine/core';\nimport { operationOutcomeIssueToString } from '@medplum/core';\nimport { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\nimport { IconAlertCircle } from '@tabler/icons-react';\n\nexport interface OperationOutcomeAlertProps {\n outcome?: OperationOutcome;\n issues?: OperationOutcomeIssue[];\n}\n\nexport function OperationOutcomeAlert(props: OperationOutcomeAlertProps): JSX.Element | null {\n const issues = props.outcome?.issue || props.issues;\n if (!issues || issues.length === 0) {\n return null;\n }\n return (\n <Alert icon={<IconAlertCircle size={16} />} color=\"red\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {operationOutcomeIssueToString(issue)}\n </div>\n ))}\n </Alert>\n );\n}\n", "import { Anchor, Card, CardProps, Divider, Flex, Group, Paper, Stack, Text } from '@mantine/core';\nimport { calculateAgeString, formatHumanName, resolveId } from '@medplum/core';\nimport {\n AllergyIntolerance,\n Condition,\n HumanName,\n MedicationRequest,\n Observation,\n Patient,\n Reference,\n} from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { IconGenderFemale, IconStethoscope, IconUserSquare } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { Allergies } from './Allergies';\nimport { Medications } from './Medications';\nimport { ProblemList } from './ProblemList';\nimport { SmokingStatus } from './SmokingStatus';\nimport { Vitals } from './Vitals';\n\nexport interface PatientSummaryProps extends Omit<CardProps, 'children'> {\n readonly patient: Patient | Reference<Patient>;\n readonly background?: string;\n}\n\nexport function PatientSummary(props: PatientSummaryProps): JSX.Element | null {\n const medplum = useMedplum();\n const { patient: propsPatient, background, ...rest } = props;\n const [patient, setPatient] = useState<Patient>();\n const [allergies, setAllergies] = useState<AllergyIntolerance[]>();\n const [problems, setProblems] = useState<Condition[]>();\n const [smokingStatus, setSmokingStatus] = useState<Observation>();\n const [vitals, setVitals] = useState<Observation[]>();\n const [medicationRequest, setMedicationRequest] = useState<MedicationRequest[]>();\n\n useEffect(() => {\n const id = resolveId(propsPatient) as string;\n const ref = `Patient/${id}`;\n const searchMeta = { _count: 100, _sort: '-_lastUpdated' };\n\n Promise.all([\n medplum.readResource('Patient', id),\n medplum.searchResources('AllergyIntolerance', { patient: ref, ...searchMeta }),\n medplum.searchResources('Condition', { patient: ref, ...searchMeta }),\n medplum.searchResources('MedicationRequest', { subject: ref, ...searchMeta }),\n medplum.searchResources('Observation', { subject: ref, ...searchMeta }),\n ])\n .then((results) => {\n setPatient(results[0] as Patient);\n setAllergies(results[1] as AllergyIntolerance[]);\n setProblems(results[2] as Condition[]);\n setMedicationRequest(results[3] as MedicationRequest[]);\n\n const observations = results[4] as Observation[];\n setSmokingStatus(observations.find((obs) => obs.code?.coding?.[0].code === '72166-2'));\n setVitals(observations.filter((obs) => obs.category?.[0]?.coding?.[0].code === 'vital-signs'));\n })\n .catch(console.error);\n }, [medplum, propsPatient]);\n\n if (!patient) {\n return null;\n }\n\n return (\n <Card {...rest}>\n <Card.Section h={100} style={{ background }} />\n <ResourceAvatar value={patient} size={80} radius={80} mx=\"auto\" mt={-50} sx={{ border: '2px solid white' }} />\n <Text ta=\"center\" fz=\"lg\" fw={500}>\n {formatHumanName(patient.name?.[0] as HumanName)}\n </Text>\n <Text ta=\"center\" fz=\"xs\" color=\"dimmed\">\n {patient.birthDate} ({calculateAgeString(patient.birthDate as string)})\n </Text>\n <Paper withBorder p=\"md\" my=\"md\">\n <Group grow>\n <Flex justify=\"center\" align=\"center\" direction=\"column\" gap={0} maw=\"33%\">\n <IconUserSquare size={24} color=\"gray\" />\n <Text fz=\"xs\" align=\"center\" sx={{ whiteSpace: 'nowrap' }}>\n Self\n </Text>\n </Flex>\n <Flex justify=\"center\" align=\"center\" direction=\"column\" gap={0}>\n <IconStethoscope size={24} color=\"gray\" />\n <Text fz=\"xs\" sx={{ whiteSpace: 'nowrap' }}>\n {patient?.generalPractitioner?.[0]?.display ?? 'No provider'}\n </Text>\n </Flex>\n <Flex justify=\"center\" align=\"center\" direction=\"column\" gap={0}>\n <IconGenderFemale size={24} color=\"gray\" />\n <Text fz=\"xs\" sx={{ whiteSpace: 'nowrap' }}>\n {patient.gender}\n </Text>\n </Flex>\n </Group>\n </Paper>\n <Stack spacing=\"xs\">\n <Anchor href=\"#\">No upcoming appointments</Anchor>\n <Anchor href=\"#\">No documented visits</Anchor>\n <Divider />\n <Allergies patient={patient} allergies={allergies as AllergyIntolerance[]} />\n <Divider />\n <ProblemList patient={patient} problems={problems as Condition[]} />\n <Divider />\n <Medications patient={patient} medicationRequests={medicationRequest as MedicationRequest[]} />\n <Divider />\n <SmokingStatus patient={patient} smokingStatus={smokingStatus} />\n <Divider />\n <Vitals patient={patient} vitals={vitals as Observation[]} />\n </Stack>\n </Card>\n );\n}\n", "import { Anchor, Badge, Box, Button, Group, Modal, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { createReference } from '@medplum/core';\nimport { AllergyIntolerance, CodeableConcept, Encounter, Patient } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodeableConceptInput } from '../CodeableConceptInput/CodeableConceptInput';\nimport { Form } from '../Form/Form';\nimport { killEvent } from '../utils/dom';\n\nexport interface AllergiesProps {\n readonly patient: Patient;\n readonly encounter?: Encounter;\n readonly allergies: AllergyIntolerance[];\n}\n\nexport function Allergies(props: AllergiesProps): JSX.Element {\n const medplum = useMedplum();\n const { patient, encounter } = props;\n const [allergies, setAllergies] = useState<AllergyIntolerance[]>(props.allergies);\n const [opened, { open, close }] = useDisclosure(false);\n const [code, setCode] = useState<CodeableConcept>();\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .createResource<AllergyIntolerance>({\n resourceType: 'AllergyIntolerance',\n patient: createReference(patient),\n encounter: encounter ? createReference(encounter) : undefined,\n code,\n onsetDateTime: formData.onset ? formData.onset : undefined,\n reaction: formData.reaction ? [{ manifestation: [{ text: formData.reaction }] }] : undefined,\n })\n .then((newAllergy) => {\n setAllergies([...allergies, newAllergy]);\n close();\n })\n .catch(console.error);\n },\n [medplum, patient, encounter, allergies, close, code]\n );\n\n return (\n <>\n <Group position=\"apart\">\n <Text fz=\"md\" fw={700}>\n Allergies\n </Text>\n <Anchor\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n open();\n }}\n >\n + Add\n </Anchor>\n </Group>\n {allergies.length > 0 ? (\n <Box>\n {allergies.map((allergy) => (\n <Badge key={allergy.id} maw=\"100%\">\n <CodeableConceptDisplay value={allergy.code} />\n </Badge>\n ))}\n </Box>\n ) : (\n <Text>(none)</Text>\n )}\n <Modal opened={opened} onClose={close} title=\"Add Allergy\">\n <Form onSubmit={handleSubmit}>\n <Stack>\n <CodeableConceptInput\n name=\"allergy\"\n data-autofocus={true}\n binding=\"http://hl7.org/fhir/us/core/ValueSet/us-core-allergy-substance\"\n onChange={(allergy) => setCode(allergy)}\n />\n <TextInput name=\"reaction\" label=\"Reaction\" />\n <NativeSelect name=\"status\" label=\"Status\" data={['active']} />\n <TextInput name=\"onset\" label=\"Onset\" type=\"date\" />\n <Group position=\"right\" spacing={4} mt=\"md\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n </>\n );\n}\n", "import { Anchor, Badge, Box, Button, Group, Modal, Radio, Stack, Text } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { createReference } from '@medplum/core';\nimport { CodeableConcept, Encounter, MedicationRequest, Patient } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodeableConceptInput } from '../CodeableConceptInput/CodeableConceptInput';\nimport { Form } from '../Form/Form';\nimport { killEvent } from '../utils/dom';\n\nexport interface MedicationsProps {\n readonly patient: Patient;\n readonly encounter?: Encounter;\n readonly medicationRequests: MedicationRequest[];\n}\n\nexport function Medications(props: MedicationsProps): JSX.Element {\n const medplum = useMedplum();\n const [medicationRequests, setMedicationRequests] = useState<MedicationRequest[]>(props.medicationRequests);\n const [opened, { open, close }] = useDisclosure(false);\n const [code, setCode] = useState<CodeableConcept>();\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n const status = formData.status as 'active' | 'stopped';\n medplum\n .createResource<MedicationRequest>({\n resourceType: 'MedicationRequest',\n status,\n intent: 'order',\n encounter: props.encounter ? createReference(props.encounter) : undefined,\n medicationCodeableConcept: code,\n subject: createReference(props.patient),\n })\n .then((newRequest) => {\n setMedicationRequests([newRequest, ...medicationRequests]);\n close();\n })\n .catch(console.error);\n },\n [medplum, props.patient, props.encounter, medicationRequests, close, code]\n );\n\n return (\n <>\n <Group position=\"apart\">\n <Text fz=\"md\" fw={700}>\n Medications\n </Text>\n <Anchor\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n open();\n }}\n >\n + Add\n </Anchor>\n </Group>\n {medicationRequests.length > 0 ? (\n <Box>\n {medicationRequests.map((request) => (\n <Badge mt={4} key={request.id} maw=\"50%\" color={request.status === 'active' ? 'blue' : 'gray'}>\n <CodeableConceptDisplay value={request.medicationCodeableConcept} />\n </Badge>\n ))}\n </Box>\n ) : (\n <Text>(none)</Text>\n )}\n <Modal opened={opened} onClose={close} title=\"Add Medication Request\">\n <Form onSubmit={handleSubmit}>\n <Stack h={275}>\n <CodeableConceptInput\n name=\"request\"\n data-autofocus={true}\n binding=\"https://app.medplum.com/ValueSet/16d6f7b7-7eeb-4d0e-a83b-83be082aa10b\"\n onChange={(request) => setCode(request)}\n />\n <Radio.Group mt={32} name=\"status\" label=\"Request Status\" required>\n <Radio key={'active'} value={'active'} label={'active'} my=\"xs\" />\n <Radio key={'stopped'} value={'stopped'} label={'stopped'} my=\"xs\" />\n </Radio.Group>\n <Group position=\"right\" spacing={4} mt=\"md\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n </>\n );\n}\n", "import {\n Anchor,\n Badge,\n Button,\n Grid,\n Group,\n Modal,\n NativeSelect,\n Stack,\n Text,\n Textarea,\n TextInput,\n} from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { createReference } from '@medplum/core';\nimport { Condition, Encounter, Patient } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { Fragment, useCallback, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { Form } from '../Form/Form';\nimport { killEvent } from '../utils/dom';\n\nexport interface ProblemListProps {\n readonly patient: Patient;\n readonly encounter?: Encounter;\n readonly problems: Condition[];\n}\n\nexport function ProblemList(props: ProblemListProps): JSX.Element {\n const medplum = useMedplum();\n const { patient, encounter } = props;\n const [problems, setProblems] = useState<Condition[]>(props.problems);\n const [opened, { open, close }] = useDisclosure(false);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .createResource<Condition>({\n resourceType: 'Condition',\n subject: createReference(patient),\n encounter: encounter ? createReference(encounter) : undefined,\n code: { coding: [{ code: formData.problem, display: formData.problem }] },\n onsetDateTime: formData.onset ? formData.onset : undefined,\n })\n .then((newProblem) => {\n setProblems([...problems, newProblem]);\n close();\n })\n .catch(console.error);\n },\n [medplum, patient, encounter, problems, close]\n );\n\n return (\n <>\n <Group position=\"apart\">\n <Text fz=\"md\" fw={700}>\n Problem List\n </Text>\n <Anchor\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n open();\n }}\n >\n + Add\n </Anchor>\n </Group>\n {problems.length > 0 ? (\n <Grid gutter=\"xs\">\n {problems.map((problem) => (\n <Fragment key={problem.id}>\n <Grid.Col span={2}>{problem.onsetDateTime?.substring(0, 4)}</Grid.Col>\n <Grid.Col span={10}>\n <Badge key={problem.id} maw=\"100%\">\n <CodeableConceptDisplay value={problem.code} />\n </Badge>\n </Grid.Col>\n </Fragment>\n ))}\n </Grid>\n ) : (\n <Text>(none)</Text>\n )}\n <Modal opened={opened} onClose={close} title=\"Add Problem\">\n <Form onSubmit={handleSubmit}>\n <Stack>\n <TextInput name=\"problem\" label=\"Problem\" data-autofocus={true} autoFocus required />\n <TextInput name=\"onset\" label=\"Dx Date\" type=\"date\" required />\n <NativeSelect name=\"status\" label=\"Status\" data={['active']} />\n <Textarea name=\"notes\" label=\"Notes\" />\n <Group position=\"right\" spacing={4} mt=\"md\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n </>\n );\n}\n", "import { Anchor, Badge, Box, Button, Group, Modal, Radio, Stack, Text } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { HTTP_HL7_ORG, LOINC, SNOMED, createReference } from '@medplum/core';\nimport { Encounter, Observation, Patient } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { Form } from '../Form/Form';\nimport { killEvent } from '../utils/dom';\n\n// Smoking Status widget\n// See: https://build.fhir.org/ig/HL7/US-Core/StructureDefinition-us-core-smokingstatus.html\n\nconst smokingStatusOptions: Record<string, string> = {\n '266919005': 'Never smoked tobacco',\n '266927001': 'Tobacco smoking consumption unknown',\n '428041000124106': 'Occasional tobacco smoker',\n '428061000124105': 'Light tobacco smoker',\n '428071000124103': 'Heavy tobacco smoker',\n '449868002': 'Smokes tobacco daily',\n '77176002': 'Smoker',\n '8517006': 'Ex-smoker',\n};\n\nexport interface SmokingStatusProps {\n readonly patient: Patient;\n readonly encounter?: Encounter;\n readonly smokingStatus?: Observation;\n}\n\nexport function SmokingStatus(props: SmokingStatusProps): JSX.Element {\n const medplum = useMedplum();\n const { patient, encounter } = props;\n const [smokingStatus, setSmokingStatus] = useState<Observation | undefined>(props.smokingStatus);\n const [opened, { open, close }] = useDisclosure(false);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .createResource<Observation>({\n resourceType: 'Observation',\n meta: {\n profile: [HTTP_HL7_ORG + '/fhir/us/core/StructureDefinition/us-core-smokingstatus'],\n },\n status: 'final',\n category: [\n {\n coding: [\n {\n system: 'http://terminology.hl7.org/CodeSystem/observation-category',\n code: 'social-history',\n display: 'Social History',\n },\n ],\n text: 'Social History',\n },\n ],\n code: {\n coding: [\n {\n system: LOINC,\n code: '72166-2',\n display: 'Tobacco smoking status',\n },\n ],\n text: 'Tobacco smoking status',\n },\n subject: createReference(patient),\n encounter: encounter ? createReference(encounter) : undefined,\n effectiveDateTime: new Date().toISOString(),\n valueCodeableConcept: {\n coding: [\n {\n system: SNOMED,\n version: SNOMED + '/731000124108',\n code: formData.smokingStatus,\n },\n ],\n text: smokingStatusOptions[formData.smokingStatus],\n },\n })\n .then((newSmokingStatus) => {\n setSmokingStatus(newSmokingStatus);\n close();\n })\n .catch(console.error);\n },\n [medplum, patient, encounter, close]\n );\n\n return (\n <>\n <Group position=\"apart\">\n <Text fz=\"md\" fw={700}>\n Smoking Status\n </Text>\n <Anchor\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n open();\n }}\n >\n + Edit\n </Anchor>\n </Group>\n {smokingStatus?.valueCodeableConcept ? (\n <Box>\n <Badge>\n <CodeableConceptDisplay value={smokingStatus.valueCodeableConcept} />\n </Badge>\n </Box>\n ) : (\n <Text>(none)</Text>\n )}\n <Modal opened={opened} onClose={close} title=\"Set Smoking Status\">\n <Form onSubmit={handleSubmit}>\n <Stack>\n <Radio.Group name=\"smokingStatus\" label=\"Smoking Status\" required>\n {Object.entries(smokingStatusOptions).map(([code, text]) => (\n <Radio key={code} value={code} label={text} my=\"xs\" />\n ))}\n </Radio.Group>\n <Group position=\"right\" spacing={4} mt=\"md\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n </>\n );\n}\n", "import { Anchor, Button, Grid, Group, Modal, Stack, Text, Textarea, TextInput } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { Encounter, Observation, Patient } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\nimport { killEvent } from '../utils/dom';\nimport {\n createCompoundObservation,\n createLoincCode,\n createObservation,\n createQuantity,\n getCompoundObservationValue,\n getObservationValue,\n} from './Vitals.utils';\n\ninterface ObservationMeta {\n readonly code: string;\n readonly title: string;\n readonly unit: string;\n}\n\nconst LOINC_CODES: Record<string, ObservationMeta> = {\n bloodPressure: {\n code: '85354-9',\n title: 'Blood Pressure',\n unit: 'mm[Hg]',\n },\n heartRate: {\n code: '8867-4',\n title: 'Heart Rate',\n unit: '/min',\n },\n bodyTemperature: {\n code: '8310-5',\n title: 'Body Temperature',\n unit: 'Cel',\n },\n respiratoryRate: {\n code: '9279-1',\n title: 'Respiratory Rate',\n unit: '/min',\n },\n height: {\n code: '8302-2',\n title: 'height',\n unit: 'cm',\n },\n weight: {\n code: '29463-7',\n title: 'weight',\n unit: 'kg',\n },\n bmi: {\n code: '39156-5',\n title: 'BMI',\n unit: 'kg/m2',\n },\n oxygen: {\n code: '2708-6',\n title: 'Oxygen',\n unit: '%',\n },\n headCircumference: {\n code: '9843-4',\n title: 'Head Circumference',\n unit: 'cm',\n },\n};\n\nconst SYSTOLIC = '8480-6';\nconst DIASTOLIC = '8462-4';\n\nexport interface VitalsProps {\n readonly patient: Patient;\n readonly encounter?: Encounter;\n readonly vitals: Observation[];\n}\n\nexport function Vitals(props: VitalsProps): JSX.Element {\n const medplum = useMedplum();\n const { patient, encounter } = props;\n const [vitals, setVitals] = useState<Observation[]>(props.vitals);\n const [opened, { open, close }] = useDisclosure(false);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n const newObservations = Object.entries(LOINC_CODES)\n .map(([name, meta]) => {\n if (name === 'bloodPressure') {\n return createCompoundObservation(patient, encounter, meta.code, meta.title, [\n {\n code: createLoincCode(SYSTOLIC, 'Systolic blood pressure'),\n valueQuantity: createQuantity(parseFloat(formData['systolic']), 'mm[Hg]'),\n },\n {\n code: createLoincCode(DIASTOLIC, 'Diastolic blood pressure'),\n valueQuantity: createQuantity(parseFloat(formData['diastolic']), 'mm[Hg]'),\n },\n ]);\n }\n return createObservation(\n patient,\n encounter,\n meta.code,\n meta.title,\n createQuantity(parseFloat(formData[name]), meta.unit)\n );\n })\n .filter(Boolean) as Observation[];\n\n // Execute all create requests in parallel to take advantage of autobatching\n Promise.all(newObservations.map((obs) => medplum.createResource<Observation>(obs)))\n .then((newVitals) => setVitals([...newVitals, ...vitals]))\n .catch(console.error);\n\n close();\n },\n [medplum, patient, encounter, vitals, close]\n );\n\n return (\n <>\n <Group position=\"apart\">\n <Text fz=\"md\" fw={700}>\n Vitals\n </Text>\n <Anchor\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n open();\n }}\n >\n + Add\n </Anchor>\n </Group>\n <Grid>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n BP Sys\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getCompoundObservationValue(vitals, LOINC_CODES.bloodPressure.code, SYSTOLIC)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n BP Dias\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getCompoundObservationValue(vitals, LOINC_CODES.bloodPressure.code, DIASTOLIC)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n HR\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.heartRate.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n Temp\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.bodyTemperature.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n RR\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.respiratoryRate.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n Height\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.height.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n Weight\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.weight.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n BMI\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.bmi.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n O2\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.oxygen.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n HC\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.headCircumference.code)} />\n </Grid.Col>\n </Grid>\n <Modal opened={opened} onClose={close} title=\"Add Vitals\">\n <Form onSubmit={handleSubmit}>\n <Stack>\n <Group grow>\n <TextInput name=\"systolic\" label=\"BP Sys\" data-autofocus={true} autoFocus />\n <TextInput name=\"diastolic\" label=\"BP Dias\" />\n </Group>\n <Group grow>\n <TextInput name=\"heartRate\" label=\"HR\" />\n <TextInput name=\"bodyTemperature\" label=\"Temp\" />\n </Group>\n <Group grow>\n <TextInput name=\"respiratoryRate\" label=\"RR\" />\n <TextInput name=\"height\" label=\"height\" />\n </Group>\n <Group grow>\n <TextInput name=\"weight\" label=\"Wt\" />\n <TextInput name=\"bmi\" label=\"BMI\" />\n </Group>\n <Group grow>\n <TextInput name=\"oxygen\" label=\"O2\" />\n <TextInput name=\"headCircumference\" label=\"HC\" />\n </Group>\n <Textarea name=\"notes\" label=\"Notes\" />\n </Stack>\n <Group position=\"right\" spacing={4} mt=\"md\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n </Modal>\n </>\n );\n}\n", "import { LOINC, UCUM, createReference } from '@medplum/core';\nimport { CodeableConcept, Encounter, Observation, ObservationComponent, Patient, Quantity } from '@medplum/fhirtypes';\n\nexport function getObservationValue(observations: Observation[], code: string): Quantity | undefined {\n const observation = observations.find((o) => o.code?.coding?.[0].code === code);\n return observation?.valueQuantity;\n}\n\nexport function getCompoundObservationValue(\n observations: Observation[],\n code: string,\n innerCode: string\n): Quantity | undefined {\n const observation = observations.find((o) => o.code?.coding?.[0].code === code);\n const component = observation?.component?.find((c) => c.code?.coding?.[0].code === innerCode);\n return component?.valueQuantity;\n}\n\nexport function createObservation(\n patient: Patient,\n encounter: Encounter | undefined,\n code: string,\n title: string,\n valueQuantity: Quantity\n): Observation | undefined {\n if (!isValidNumber(valueQuantity.value)) {\n return undefined;\n }\n return {\n ...createBaseObservation(patient, encounter, code, title),\n valueQuantity,\n };\n}\n\nexport function createCompoundObservation(\n patient: Patient,\n encounter: Encounter | undefined,\n code: string,\n title: string,\n components: ObservationComponent[]\n): Observation | undefined {\n const component = components.filter((c) => isValidNumber(c.valueQuantity?.value));\n if (component.length === 0) {\n return undefined;\n }\n return {\n ...createBaseObservation(patient, encounter, code, title),\n component,\n };\n}\n\nexport function createBaseObservation(\n patient: Patient,\n encounter: Encounter | undefined,\n code: string,\n title: string\n): Observation {\n return {\n resourceType: 'Observation',\n status: 'preliminary',\n subject: createReference(patient),\n encounter: encounter ? createReference(encounter) : undefined,\n effectiveDateTime: new Date().toISOString(),\n category: [\n {\n coding: [\n {\n system: 'http://terminology.hl7.org/CodeSystem/observation-category',\n code: 'vital-signs',\n display: 'Vital Signs',\n },\n ],\n },\n ],\n code: createLoincCode(code, title),\n };\n}\n\nexport function createLoincCode(code: string, display: string): CodeableConcept {\n return {\n coding: [\n {\n code,\n display,\n system: LOINC,\n },\n ],\n text: display,\n };\n}\n\nexport function createQuantity(value: number, unit: string): Quantity {\n return {\n value,\n system: UCUM,\n unit,\n code: unit,\n };\n}\n\nfunction isValidNumber(value: number | undefined): boolean {\n return value !== undefined && !isNaN(value) && isFinite(value);\n}\n", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Patient, Reference, ResourceType } from '@medplum/fhirtypes';\nimport { useCallback } from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface PatientTimelineProps {\n patient: Patient | Reference<Patient>;\n}\n\nexport function PatientTimeline(props: PatientTimelineProps): JSX.Element {\n const loadTimelineResources = useCallback((medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory('Patient', id),\n medplum.search('Communication', { subject: ref, _count }),\n medplum.search('Device', { patient: ref, _count }),\n medplum.search('DeviceRequest', { patient: ref, _count }),\n medplum.search('DiagnosticReport', { subject: ref, _count }),\n medplum.search('Media', { subject: ref, _count }),\n medplum.search('ServiceRequest', { subject: ref, _count }),\n medplum.search('Task', { subject: ref, _count }),\n ]);\n }, []);\n\n return (\n <ResourceTimeline\n value={props.patient}\n loadTimelineResources={loadTimelineResources}\n createCommunication={(resource: Patient, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n subject: createReference(resource),\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Patient, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n subject: createReference(resource),\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { Anchor, Button, createStyles, NativeSelect, Stack, TextInput } from '@mantine/core';\nimport { getReferenceString, InternalSchemaElement } from '@medplum/core';\nimport { PlanDefinition, PlanDefinitionAction, Reference, ResourceType } from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { MouseEvent, SyntheticEvent, useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm.utils';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.utils';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n}));\n\nexport interface PlanDefinitionBuilderProps {\n value: PlanDefinition | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.value);\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n const [value, setValue] = useState<PlanDefinition>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n medplum\n .requestSchema('PlanDefinition')\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schemaLoaded || !value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <TextInput\n label=\"Plan Title\"\n defaultValue={value.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <ActionArrayBuilder\n actions={value.action || []}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const { classes } = useStyles();\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n props.setSelectedKey(addedAction.id);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className={classes.section}>\n {props.actions.map((action) => (\n <div key={action.id}>\n <ActionBuilder\n action={action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeAction}\n onRemove={() => removeAction(action)}\n />\n </div>\n ))}\n <div className={classes.bottomActions}>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n killEvent(e);\n addAction({ id: generateId() });\n }}\n >\n Add action\n </Anchor>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { classes, cx } = useStyles();\n const { action } = props;\n const actionType = getInitialActionType(action);\n const editing = props.selectedKey === props.action.id;\n const hovering = props.hoverKey === props.action.id;\n\n function onClick(e: SyntheticEvent): void {\n e.stopPropagation();\n props.setSelectedKey(props.action.id);\n }\n\n function onHover(e: SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.action.id);\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={action.id} className={className} onClick={onClick} onMouseOver={onHover} onFocus={onHover}>\n {editing ? (\n <ActionEditor\n action={action}\n actionType={actionType}\n onChange={props.onChange}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onRemove={props.onRemove}\n />\n ) : (\n <ActionDisplay action={action} actionType={actionType} />\n )}\n <div className={classes.bottomActions}>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n}\n\nconst timingProperty: InternalSchemaElement = {\n path: 'PlanDefinition.action.timing[x]',\n min: 0,\n max: 1,\n description: '',\n isArray: false,\n constraints: [],\n type: ['dateTime', 'Period', 'Range', 'Timing'].map((t) => ({ code: t })),\n};\n\ninterface ActionDisplayProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n}\n\nfunction ActionDisplay(props: ActionDisplayProps): JSX.Element {\n const { action, actionType } = props;\n const [propertyValue, propertyType] = getActionTiming(action);\n return (\n <div>\n <div>\n {action.title || 'Untitled'} {actionType && `(${actionType})`}\n </div>\n {action.definitionCanonical && (\n <div>\n <ReferenceDisplay value={{ reference: action.definitionCanonical }} />\n </div>\n )}\n {propertyValue && (\n <div>\n <ResourcePropertyDisplay property={timingProperty} propertyType={propertyType} value={propertyValue} />\n </div>\n )}\n </div>\n );\n}\n\ninterface ActionEditorProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionEditor(props: ActionEditorProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(props.actionType);\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...action,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <Stack spacing=\"xl\">\n <TextInput\n name={`actionTitle-${action.id}`}\n label=\"Title\"\n defaultValue={action.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <TextInput\n name={`actionDescription-${action.id}`}\n label=\"Description\"\n defaultValue={action.description}\n onChange={(e) => changeProperty('description', e.currentTarget.value)}\n />\n <NativeSelect\n label=\"Type of Action\"\n description=\"The type of the action to be performed.\"\n name={`actionType-${action.id}`}\n defaultValue={actionType}\n onChange={(e) => setActionType(e.currentTarget.value)}\n data={['', 'appointment', 'lab', 'questionnaire', 'task']}\n />\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder\n actions={action.action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return (\n <ActionResourceTypeBuilder\n title=\"Appointment\"\n description=\"The subject must schedule an appointment from the schedule.\"\n resourceType=\"Schedule\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'lab':\n return (\n <ActionResourceTypeBuilder\n title=\"Lab\"\n description=\"The subject must complete the following lab panel.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'questionnaire':\n return (\n <ActionResourceTypeBuilder\n title=\"Questionnaire\"\n description=\"The subject must complete the selected questionnaire.\"\n resourceType=\"Questionnaire\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'task':\n return (\n <ActionResourceTypeBuilder\n title=\"Task\"\n description=\"The subject must complete the following task.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n default:\n return null;\n }\n })()}\n <FormSection title=\"Timing\" description=\"When the action should take place.\">\n <ActionTimingInput name={'timing-' + action.id} action={action} onChange={props.onChange} />\n </FormSection>\n </Stack>\n );\n}\n\ninterface ActionResourceTypeBuilderProps {\n action: PlanDefinitionAction;\n title: string;\n description: string;\n resourceType: ResourceType;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionResourceTypeBuilder(props: ActionResourceTypeBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const reference = definitionCanonical?.startsWith(props.resourceType + '/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <ResourceInput\n name={id as string}\n resourceType={props.resourceType}\n defaultValue={reference}\n loadOnFocus={true}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n );\n}\n\ninterface ActionTimingInputProps {\n name: string;\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionTimingInput(props: ActionTimingInputProps): JSX.Element {\n const value = props.action;\n const key = 'timing';\n const [propertyValue, propertyType] = getActionTiming(value);\n return (\n <ResourcePropertyInput\n property={timingProperty}\n name=\"timing[x]\"\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n props.onChange(setPropertyValue(value, key, propName ?? key, timingProperty, newValue));\n }}\n outcome={undefined}\n />\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Schedule')) {\n return 'appointment';\n }\n\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n if (action.definitionCanonical?.startsWith('ActivityDefinition/')) {\n return 'task';\n }\n\n return undefined;\n}\n\nfunction getActionTiming(action: PlanDefinitionAction): [any, string] {\n return getValueAndType({ type: 'PlanDefinitionAction', value: action }, 'timing');\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @param existing - Optional existing id which will update nextId.\n * @returns A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3), 10);\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n", "import {\n Anchor,\n Box,\n Button,\n createStyles,\n Group,\n NativeSelect,\n Space,\n Textarea,\n TextInput,\n Title,\n} from '@mantine/core';\nimport { getElementDefinition, isResource as isResourceType } from '@medplum/core';\nimport {\n Extension,\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n Reference,\n ResourceType,\n} from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { IconArrowDown, IconArrowUp } from '@tabler/icons-react';\nimport { MouseEvent, SyntheticEvent, useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { QuestionnaireFormItem } from '../QuestionnaireForm/QuestionnaireFormItem/QuestionnaireFormItem';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.utils';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { ResourceTypeInput } from '../ResourceTypeInput/ResourceTypeInput';\nimport { killEvent } from '../utils/dom';\nimport {\n getQuestionnaireItemReferenceTargetTypes,\n isChoiceQuestion,\n QuestionnaireItemType,\n setQuestionnaireItemReferenceTargetTypes,\n} from '../utils/questionnaire';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n\n hovering: {\n border: `1.5px solid ${theme.colors.blue[5]}`,\n },\n\n editing: {\n border: `1.5px solid ${theme.colors.gray[1]}`,\n borderLeft: `4px solid ${theme.colors.blue[5]}`,\n },\n\n questionBody: {\n maxWidth: 600,\n },\n\n topActions: {\n position: 'absolute',\n right: 32,\n top: 1,\n padding: 4,\n color: theme.colors.gray[5],\n fontSize: theme.fontSizes.xs,\n },\n\n bottomActions: {\n position: 'absolute',\n right: 4,\n bottom: 0,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n\n movementActions: {\n position: 'absolute',\n right: 8,\n top: 0,\n paddingTop: 8,\n fontSize: theme.fontSizes.xs,\n\n '& a': {\n marginLeft: 8,\n },\n },\n\n movementIcons: {\n color: theme.colors.gray[5],\n },\n\n columnAlignment: {\n display: 'flex',\n flexDirection: 'column',\n },\n\n linkIdInput: {\n width: 100,\n marginBottom: 4,\n },\n\n typeSelect: {\n width: 100,\n },\n}));\n\nexport interface QuestionnaireBuilderProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n onSubmit: (result: Questionnaire) => void;\n autoSave?: boolean;\n}\n\nexport function QuestionnaireBuilder(props: QuestionnaireBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.questionnaire);\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n const [value, setValue] = useState<Questionnaire>();\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n const handleChange = (questionnaire: Questionnaire, disableSubmit?: boolean): void => {\n setValue(questionnaire);\n if (props.autoSave && !disableSubmit && props.onSubmit) {\n props.onSubmit(questionnaire);\n }\n };\n\n if (!schemaLoaded || !value) {\n return null;\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <ItemBuilder\n item={value}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={handleChange}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ItemBuilderProps<T extends Questionnaire | QuestionnaireItem> {\n item: T;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n isFirst?: boolean;\n isLast?: boolean;\n setHoverKey: (key: string | undefined) => void;\n onChange: (item: T, disableSubmit?: boolean) => void;\n onRemove?: () => void;\n onRepeatable?: (item: QuestionnaireItem) => void;\n onMoveUp?(): void;\n onMoveDown?(): void;\n}\n\nfunction ItemBuilder<T extends Questionnaire | QuestionnaireItem>(props: ItemBuilderProps<T>): JSX.Element {\n const { classes, cx } = useStyles();\n const resource = props.item as Questionnaire;\n const item = props.item as QuestionnaireItem;\n const isResource = isResourceType(props.item);\n const isContainer = isResource || item.type === QuestionnaireItemType.group;\n const linkId = item.linkId ?? '[untitled]';\n const editing = props.selectedKey === props.item.id;\n const hovering = props.hoverKey === props.item.id;\n\n const itemRef = useRef<T>();\n itemRef.current = props.item;\n\n function onClick(e: SyntheticEvent): void {\n killEvent(e);\n props.setSelectedKey(props.item.id);\n }\n\n function onHover(e: SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.item.id);\n }\n\n function changeItem(changedItem: QuestionnaireItem): void {\n const curr = itemRef.current as T;\n props.onChange({\n ...curr,\n item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),\n } as T);\n }\n\n function addItem(addedItem: QuestionnaireItem, disableSubmit?: boolean): void {\n props.onChange(\n {\n ...props.item,\n item: [...(props.item.item ?? []), addedItem],\n },\n disableSubmit\n );\n }\n\n function removeItem(removedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item.item?.filter((i) => i !== removedItem),\n });\n }\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...itemRef.current,\n [property]: value,\n } as T);\n }\n\n function updateItem(updatedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n ...updatedItem,\n });\n }\n\n function toggleRepeatable(item: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item.item?.map((i) => (i === item ? { ...i, repeats: !i.repeats } : i)),\n });\n }\n\n function moveItem(itemIndex: number, delta: number): void {\n const updatedItems = reorderItems(props.item.item, itemIndex, delta);\n\n props.onChange({\n ...props.item,\n item: updatedItems,\n });\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={item.linkId} className={className} onClick={onClick} onMouseOver={onHover} onFocus={onHover}>\n <div className={classes.questionBody}>\n {editing ? (\n <>\n {isResource && (\n <TextInput\n size=\"xl\"\n defaultValue={resource.title}\n onBlur={(e) => changeProperty('title', e.currentTarget.value)}\n />\n )}\n {!isResource && (\n <Textarea\n autosize\n minRows={2}\n defaultValue={item.text}\n onBlur={(e) => changeProperty('text', e.currentTarget.value)}\n />\n )}\n {item.type === 'reference' && <ReferenceProfiles item={item} onChange={updateItem} />}\n {isChoiceQuestion(item) && <AnswerBuilder item={item} onChange={(item) => updateItem(item)} />}\n </>\n ) : (\n <>\n {resource.title && <Title>{resource.title}</Title>}\n {item.text && <div>{item.text}</div>}\n {!isContainer && <QuestionnaireFormItem item={item} index={0} onChange={() => undefined} response={{}} />}\n </>\n )}\n </div>\n {item.item?.map((item, i) => (\n <div key={item.id}>\n <ItemBuilder\n item={item}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n isFirst={i === 0}\n isLast={i === (props.item.item ?? []).length - 1}\n setHoverKey={props.setHoverKey}\n onChange={changeItem}\n onRemove={() => removeItem(item)}\n onRepeatable={toggleRepeatable}\n onMoveUp={() => moveItem(i, -1)}\n onMoveDown={() => moveItem(i, 1)}\n />\n </div>\n ))}\n {!isContainer && (\n <div className={classes.topActions}>\n {editing ? (\n <>\n <TextInput\n size=\"xs\"\n className={classes.linkIdInput}\n defaultValue={item.linkId}\n onBlur={(e) => changeProperty('linkId', e.currentTarget.value)}\n />\n {!isContainer && (\n <NativeSelect\n size=\"xs\"\n className={classes.typeSelect}\n defaultValue={item.type}\n onChange={(e) => changeProperty('type', e.currentTarget.value)}\n data={[\n { value: 'display', label: 'Display' },\n { value: 'boolean', label: 'Boolean' },\n { value: 'decimal', label: 'Decimal' },\n { value: 'integer', label: 'Integer' },\n { value: 'date', label: 'Date' },\n { value: 'dateTime', label: 'Date/Time' },\n { value: 'time', label: 'Time' },\n { value: 'string', label: 'String' },\n { value: 'text', label: 'Text' },\n { value: 'url', label: 'URL' },\n { value: 'choice', label: 'Choice' },\n { value: 'open-choice', label: 'Open Choice' },\n { value: 'attachment', label: 'Attachment' },\n { value: 'reference', label: 'Reference' },\n { value: 'quantity', label: 'Quantity' },\n ]}\n />\n )}\n </>\n ) : (\n <div>{linkId}</div>\n )}\n </div>\n )}\n {!isResource && (\n <Box className={classes.movementActions}>\n <Box className={classes.columnAlignment}>\n {!props.isFirst && (\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (props.onMoveUp) {\n props.onMoveUp();\n }\n }}\n >\n <IconArrowUp data-testid=\"up-button\" size={15} className={classes.movementIcons} />\n </Anchor>\n )}\n {!props.isLast && (\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (props.onMoveDown) {\n props.onMoveDown();\n }\n }}\n >\n <IconArrowDown data-testid=\"down-button\" size={15} className={classes.movementIcons} />\n </Anchor>\n )}\n </Box>\n </Box>\n )}\n <div className={classes.bottomActions}>\n {isContainer && (\n <>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('q'),\n type: 'string',\n text: 'Question',\n } as QuestionnaireItem);\n }}\n >\n Add item\n </Anchor>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n addItem(\n {\n id: generateId(),\n linkId: generateLinkId('g'),\n type: 'group',\n text: 'Group',\n } as QuestionnaireItem,\n true\n );\n }}\n >\n Add group\n </Anchor>\n </>\n )}\n {isResource && (\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n addItem(createPage(), true);\n }}\n >\n Add Page\n </Anchor>\n )}\n {editing && !isResource && (\n <>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (props.onRepeatable) {\n props.onRepeatable(item);\n }\n }}\n >\n {item.repeats ? 'Remove Repeatable' : 'Make Repeatable'}\n </Anchor>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (props.onRemove) {\n props.onRemove();\n }\n }}\n >\n Remove\n </Anchor>\n </>\n )}\n </div>\n </div>\n );\n}\n\ninterface AnswerBuilderProps {\n item: QuestionnaireItem;\n onChange: (item: QuestionnaireItem) => void;\n}\n\nfunction AnswerBuilder(props: AnswerBuilderProps): JSX.Element {\n const property = getElementDefinition('QuestionnaireItemAnswerOption', 'value[x]');\n const options = props.item.answerOption ?? [];\n return (\n <div>\n {props.item.answerValueSet !== undefined ? (\n <TextInput\n placeholder=\"Enter Value Set\"\n defaultValue={props.item.answerValueSet}\n onChange={(e) => props.onChange({ ...props.item, answerValueSet: e.target.value })}\n />\n ) : (\n <AnswerOptionsInput options={options} property={property} item={props.item} onChange={props.onChange} />\n )}\n <Box display=\"flex\">\n <Anchor\n href=\"#\"\n onClick={(e: SyntheticEvent) => {\n killEvent(e);\n props.onChange({\n ...props.item,\n answerValueSet: undefined,\n answerOption: [\n ...options,\n {\n id: generateId(),\n },\n ],\n });\n }}\n >\n Add choice\n </Anchor>\n <Space w=\"lg\" />\n <Anchor\n href=\"#\"\n onClick={(e: SyntheticEvent) => {\n killEvent(e);\n props.onChange({\n ...props.item,\n answerOption: [],\n answerValueSet: '',\n });\n }}\n >\n Add value set\n </Anchor>\n </Box>\n </div>\n );\n}\n\ninterface AnswerOptionsInputProps {\n options: QuestionnaireItemAnswerOption[];\n property: any;\n item: QuestionnaireItem;\n onChange: (item: QuestionnaireItem) => void;\n}\n\nfunction AnswerOptionsInput(props: AnswerOptionsInputProps): JSX.Element {\n return (\n <div>\n {props.options.map((option: QuestionnaireItemAnswerOption) => {\n const [propertyValue, propertyType] = getValueAndType(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n );\n return (\n <div\n key={option.id}\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <ResourcePropertyInput\n key={option.id}\n name=\"value[x]\"\n property={props.property}\n defaultPropertyType={propertyType}\n defaultValue={propertyValue}\n onChange={(newValue: any, propName?: string) => {\n const newOptions = [...props.options];\n const index = newOptions.findIndex((o) => o.id === option.id);\n newOptions[index] = { id: option.id, [propName as string]: newValue };\n props.onChange({\n ...props.item,\n answerOption: newOptions,\n });\n }}\n outcome={undefined}\n />\n </div>\n\n <div>\n <Anchor\n href=\"#\"\n onClick={(e: SyntheticEvent) => {\n killEvent(e);\n props.onChange({\n ...props.item,\n answerOption: props.options.filter((o) => o.id !== option.id),\n });\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\ninterface ReferenceTypeProps {\n item: QuestionnaireItem;\n onChange: (updatedItem: QuestionnaireItem) => void;\n}\n\nfunction ReferenceProfiles(props: ReferenceTypeProps): JSX.Element {\n const targetTypes = getQuestionnaireItemReferenceTargetTypes(props.item) ?? [];\n return (\n <>\n {targetTypes.map((targetType: ResourceType, index: number) => {\n return (\n <Group key={`${targetType}-${index}`}>\n <ResourceTypeInput\n name=\"resourceType\"\n placeholder=\"Resource Type\"\n defaultValue={targetType}\n onChange={(newValue: ResourceType | undefined) => {\n props.onChange(\n setQuestionnaireItemReferenceTargetTypes(\n props.item,\n targetTypes.map((t) => (t === targetType ? (newValue as ResourceType) : t))\n )\n );\n }}\n />\n <Anchor\n href=\"#\"\n onClick={(e: SyntheticEvent) => {\n killEvent(e);\n props.onChange(\n setQuestionnaireItemReferenceTargetTypes(\n props.item,\n targetTypes.filter((t) => t !== targetType)\n )\n );\n }}\n >\n Remove\n </Anchor>\n </Group>\n );\n })}\n <Anchor\n href=\"#\"\n onClick={(e: SyntheticEvent) => {\n killEvent(e);\n props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item, [...targetTypes, '' as ResourceType]));\n }}\n >\n Add Resource Type\n </Anchor>\n </>\n );\n}\n\nlet nextLinkId = 1;\nlet nextId = 1;\n\n/**\n * Generates a link ID for an item.\n * Link IDs are required properties on QuestionnaireItem objects.\n * @param prefix - The link ID prefix string.\n * @returns A unique link ID.\n */\nfunction generateLinkId(prefix: string): string {\n return prefix + nextLinkId++;\n}\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @returns A unique key.\n */\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction ensureQuestionnaireKeys(questionnaire: Questionnaire): Questionnaire {\n return {\n ...questionnaire,\n id: questionnaire.id || generateId(),\n item: ensureQuestionnaireItemKeys(questionnaire.item),\n } as Questionnaire;\n}\n\nfunction ensureQuestionnaireItemKeys(items: QuestionnaireItem[] | undefined): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n items.forEach((item) => {\n if (item.id?.match(/^id-\\d+$/)) {\n nextId = Math.max(nextId, parseInt(item.id.substring(3), 10) + 1);\n }\n if (item.linkId?.match(/^q\\d+$/)) {\n nextLinkId = Math.max(nextLinkId, parseInt(item.linkId.substring(1), 10) + 1);\n }\n });\n return items.map((item) => ({\n ...item,\n id: item.id || generateId(),\n item: ensureQuestionnaireItemKeys(item.item),\n answerOption: ensureQuestionnaireOptionKeys(item.answerOption),\n }));\n}\n\nfunction ensureQuestionnaireOptionKeys(\n options: QuestionnaireItemAnswerOption[] | undefined\n): QuestionnaireItemAnswerOption[] | undefined {\n if (!options) {\n return undefined;\n }\n return options.map((option) => ({\n ...option,\n id: option.id || generateId(),\n }));\n}\n\nfunction createPage(): QuestionnaireItem {\n return {\n id: generateId(),\n linkId: generateLinkId('s'),\n type: 'group',\n text: `New Page`,\n extension: [\n {\n url: 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl',\n valueCodeableConcept: {\n coding: [\n {\n system: 'http://hl7.org/fhir/questionnaire-item-control',\n code: 'page',\n },\n ],\n },\n } as Extension,\n ],\n } as QuestionnaireItem;\n}\n\nfunction reorderItems(items: QuestionnaireItem[] | undefined, itemIndex: number, delta: number): QuestionnaireItem[] {\n const currentItems = items ?? [];\n const newIndex = itemIndex + delta;\n if (newIndex < 0 || newIndex >= currentItems.length) {\n return currentItems;\n }\n\n const updatedItems = [...currentItems];\n [updatedItems[itemIndex], updatedItems[newIndex]] = [updatedItems[newIndex], updatedItems[itemIndex]];\n\n return updatedItems;\n}\n", "import { Checkbox, Group, MultiSelect, NativeSelect, Radio, Textarea, TextInput } from '@mantine/core';\nimport {\n capitalize,\n deepEquals,\n formatCodeableConcept,\n formatCoding,\n getElementDefinition,\n getTypedPropertyValue,\n stringify,\n TypedValue,\n} from '@medplum/core';\nimport {\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemInitial,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n} from '@medplum/fhirtypes';\nimport { ChangeEvent, useContext } from 'react';\nimport { AttachmentInput } from '../../AttachmentInput/AttachmentInput';\nimport { CheckboxFormSection } from '../../CheckboxFormSection/CheckboxFormSection';\nimport { CodingInput } from '../../CodingInput/CodingInput';\nimport { DateTimeInput } from '../../DateTimeInput/DateTimeInput';\nimport { QuantityInput } from '../../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../../ReferenceInput/ReferenceInput';\nimport { ResourcePropertyDisplay } from '../../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport {\n formatReferenceString,\n getNewMultiSelectValues,\n getQuestionnaireItemReferenceFilter,\n getQuestionnaireItemReferenceTargetTypes,\n QuestionnaireItemType,\n} from '../../utils/questionnaire';\nimport { QuestionnaireFormContext } from '../QuestionnaireForm.context';\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n index: number;\n response: QuestionnaireResponseItem;\n onChange: (newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nexport function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null {\n const context = useContext(QuestionnaireFormContext);\n const item = props.item;\n const response = props.response;\n\n function onChangeAnswer(\n newResponseAnswer: QuestionnaireResponseItemAnswer | QuestionnaireResponseItemAnswer[]\n ): void {\n let updatedAnswers: QuestionnaireResponseItemAnswer[];\n if (Array.isArray(newResponseAnswer)) {\n // It's a multi-select case, so use the array directly.\n updatedAnswers = newResponseAnswer;\n } else if (props.index >= (props.response?.answer?.length ?? 0)) {\n // if adding a new answer\n updatedAnswers = (props.response?.answer ?? []).concat([newResponseAnswer]);\n } else {\n // if updating an existing answer\n const newAnswers = (props.response?.answer ?? []).map((a, idx) =>\n idx === props.index ? newResponseAnswer : a\n ) as QuestionnaireResponseItemAnswer[];\n updatedAnswers = newAnswers ?? [];\n }\n props.onChange({\n id: response?.id,\n linkId: response?.linkId,\n text: item.text,\n answer: updatedAnswers,\n });\n }\n\n const type = item.type;\n if (!type) {\n return null;\n }\n\n const name = item.linkId;\n if (!name) {\n return null;\n }\n\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n const defaultValue =\n getCurrentAnswer(response, props.index) ??\n getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value');\n\n switch (type) {\n case QuestionnaireItemType.display:\n return <p key={props.item.linkId}>{props.item.text}</p>;\n case QuestionnaireItemType.boolean:\n return (\n <CheckboxFormSection key={props.item.linkId} title={props.item.text} htmlFor={props.item.linkId}>\n <Checkbox\n id={props.item.linkId}\n name={props.item.linkId}\n defaultChecked={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked })}\n />\n </CheckboxFormSection>\n );\n case QuestionnaireItemType.decimal:\n return (\n <TextInput\n type=\"number\"\n step=\"any\"\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <TextInput\n type=\"number\"\n step={1}\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueDate: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(newValue: string) => onChangeAnswer({ valueDateTime: newValue })}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <TextInput\n type=\"time\"\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueTime: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.string:\n case QuestionnaireItemType.url:\n return (\n <TextInput\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <Textarea\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.attachment:\n return (\n <Group py={4}>\n <AttachmentInput\n name={name}\n defaultValue={defaultValue?.value}\n onChange={(newValue) => onChangeAnswer({ valueAttachment: newValue })}\n />\n </Group>\n );\n case QuestionnaireItemType.reference:\n return (\n <ReferenceInput\n name={name}\n required={item.required}\n targetTypes={getQuestionnaireItemReferenceTargetTypes(item)}\n searchCriteria={getQuestionnaireItemReferenceFilter(item, context.subject, context.encounter)}\n defaultValue={defaultValue?.value}\n onChange={(newValue) => onChangeAnswer({ valueReference: newValue })}\n />\n );\n case QuestionnaireItemType.quantity:\n return (\n <QuantityInput\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(newValue) => onChangeAnswer({ valueQuantity: newValue })}\n disableWheel\n />\n );\n case QuestionnaireItemType.choice:\n case QuestionnaireItemType.openChoice:\n if (isDropDownChoice(item) && !item.answerValueSet) {\n return (\n <QuestionnaireChoiceDropDownInput\n name={name}\n item={item}\n initial={initial}\n response={response}\n onChangeAnswer={(e) => onChangeAnswer(e)}\n />\n );\n } else {\n return (\n <QuestionnaireChoiceSetInput\n name={name}\n item={item}\n initial={initial}\n response={response}\n onChangeAnswer={(e) => onChangeAnswer(e)}\n />\n );\n }\n default:\n return null;\n }\n}\n\ninterface QuestionnaireChoiceInputProps {\n name: string;\n item: QuestionnaireItem;\n initial: QuestionnaireItemInitial | undefined;\n response: QuestionnaireResponseItem;\n onChangeAnswer: (newResponseAnswer: QuestionnaireResponseItemAnswer | QuestionnaireResponseItemAnswer[]) => void;\n}\n\nfunction QuestionnaireChoiceDropDownInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, response } = props;\n\n if (!item.answerOption?.length) {\n return <NoAnswerDisplay />;\n }\n\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const data = [''];\n\n for (const option of item.answerOption) {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n data.push(typedValueToString(optionValue) as string);\n }\n\n const defaultValue = getCurrentAnswer(response) ?? initialValue;\n\n if (item.repeats) {\n const { propertyName, data } = formatSelectData(props.item);\n const currentAnswer = getCurrentMultiSelectAnswer(response);\n\n return (\n <MultiSelect\n data={data}\n placeholder=\"Select items\"\n searchable\n defaultValue={currentAnswer || [typedValueToString(initialValue)]}\n onChange={(selected) => {\n const values = getNewMultiSelectValues(selected, propertyName, item);\n props.onChangeAnswer(values);\n }}\n />\n );\n }\n\n return (\n <NativeSelect\n id={name}\n name={name}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n const index = e.currentTarget.selectedIndex;\n if (index === 0) {\n props.onChangeAnswer({});\n return;\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[index - 1];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n props.onChangeAnswer({ [propertyName]: optionValue.value });\n }}\n defaultValue={formatCoding(defaultValue?.value) || defaultValue?.value}\n data={data}\n />\n );\n}\n\nfunction QuestionnaireChoiceSetInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer, response } = props;\n\n if (!item.answerOption?.length && !item.answerValueSet) {\n return <NoAnswerDisplay />;\n }\n\n if (item.answerValueSet) {\n return (\n <CodingInput\n name={name}\n binding={item.answerValueSet}\n onChange={(code) => onChangeAnswer({ valueCoding: code })}\n />\n );\n }\n return (\n <QuestionnaireChoiceRadioInput\n name={response?.id ?? name}\n item={item}\n initial={initial}\n response={response}\n onChangeAnswer={onChangeAnswer}\n />\n );\n}\n\nfunction QuestionnaireChoiceRadioInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer, response } = props;\n const valueElementDefinition = getElementDefinition('QuestionnaireItemAnswerOption', 'value[x]');\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const options: [string, TypedValue][] = [];\n let defaultValue = undefined;\n if (item.answerOption) {\n for (let i = 0; i < item.answerOption.length; i++) {\n const option = item.answerOption[i];\n const optionName = `${name}-option-${i}`;\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n\n if (!optionValue?.value) {\n continue;\n }\n\n if (initialValue && stringify(optionValue) === stringify(initialValue)) {\n defaultValue = optionName;\n }\n options.push([optionName, optionValue]);\n }\n }\n\n const defaultAnswer = getCurrentAnswer(response);\n const answerLinkId = getCurrentRadioAnswer(options, defaultAnswer);\n\n return (\n <Radio.Group\n name={name}\n value={answerLinkId ?? defaultValue}\n onChange={(newValue) => {\n const option = options.find((option) => option[0] === newValue);\n if (option) {\n const optionValue = option[1];\n const propertyName = 'value' + capitalize(optionValue.type);\n onChangeAnswer({ [propertyName]: optionValue.value });\n }\n }}\n >\n {options.map(([optionName, optionValue]) => (\n <Radio\n key={optionName}\n id={optionName}\n value={optionName}\n py={4}\n label={\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type}\n value={optionValue.value}\n />\n }\n />\n ))}\n </Radio.Group>\n );\n}\n\nfunction NoAnswerDisplay(): JSX.Element {\n return <TextInput disabled placeholder=\"No Answers Defined\" />;\n}\n\nfunction getItemValue(answer: QuestionnaireResponseItemAnswer): TypedValue {\n const itemValue = getTypedPropertyValue({ type: 'QuestionnaireItemAnswer', value: answer }, 'value') as TypedValue;\n return itemValue;\n}\n\nfunction getCurrentAnswer(response: QuestionnaireResponseItem, index: number = 0): TypedValue {\n const results = response.answer;\n return getItemValue(results?.[index] ?? {});\n}\n\nfunction getCurrentMultiSelectAnswer(response: QuestionnaireResponseItem): string[] {\n const results = response.answer;\n if (!results) {\n return [];\n }\n const typedValues = results.map((a) => getItemValue(a));\n return typedValues.map((type) => formatCoding(type?.value) || type?.value);\n}\n\nfunction getCurrentRadioAnswer(options: [string, TypedValue][], defaultAnswer: TypedValue): string | undefined {\n return options.find((option) => deepEquals(option[1].value, defaultAnswer?.value))?.[0];\n}\n\nfunction typedValueToString(typedValue: TypedValue | undefined): string | undefined {\n if (!typedValue) {\n return undefined;\n }\n if (typedValue.type === 'CodeableConcept') {\n return formatCodeableConcept(typedValue.value);\n }\n if (typedValue.type === 'Coding') {\n return formatCoding(typedValue.value);\n }\n if (typedValue.type === 'Reference') {\n return formatReferenceString(typedValue);\n }\n return typedValue.value.toString();\n}\n\nfunction isDropDownChoice(item: QuestionnaireItem): boolean {\n return !!item.extension?.some(\n (e) =>\n e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl' &&\n e.valueCodeableConcept?.coding?.[0]?.code === 'drop-down'\n );\n}\n\ninterface MultiSelect {\n value: any;\n label: any;\n}\n\ninterface FormattedData {\n propertyName: string;\n data: MultiSelect[];\n}\n\nfunction formatSelectData(item: QuestionnaireItem): FormattedData {\n if (item.answerOption?.length === 0) {\n return { propertyName: '', data: [] };\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[0];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n\n const data = (item.answerOption ?? []).map((a) => ({\n value: getValueAndLabel(a, propertyName),\n label: getValueAndLabel(a, propertyName),\n }));\n return { propertyName, data };\n}\n\nfunction getValueAndLabel(option: QuestionnaireItemAnswerOption, propertyName: string): string | undefined {\n return formatCoding(option.valueCoding) || option[propertyName as keyof QuestionnaireItemAnswerOption]?.toString();\n}\n", "import {\n TypedValue,\n deepClone,\n evalFhirPathTyped,\n formatCoding,\n getExtension,\n getReferenceString,\n getTypedPropertyValue,\n splitN,\n stringify,\n} from '@medplum/core';\nimport {\n Encounter,\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemEnableWhen,\n QuestionnaireItemInitial,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n Reference,\n ResourceType,\n} from '@medplum/fhirtypes';\n\nexport enum QuestionnaireItemType {\n group = 'group',\n display = 'display',\n question = 'question',\n boolean = 'boolean',\n decimal = 'decimal',\n integer = 'integer',\n date = 'date',\n dateTime = 'dateTime',\n time = 'time',\n string = 'string',\n text = 'text',\n url = 'url',\n choice = 'choice',\n openChoice = 'open-choice',\n attachment = 'attachment',\n reference = 'reference',\n quantity = 'quantity',\n}\n\nexport function isChoiceQuestion(item: QuestionnaireItem): boolean {\n return item.type === 'choice' || item.type === 'open-choice';\n}\n\nexport function isQuestionEnabled(item: QuestionnaireItem, responseItems: QuestionnaireResponseItem[]): boolean {\n if (!item.enableWhen) {\n return true;\n }\n\n const enableBehavior = item.enableBehavior ?? 'any';\n\n for (const enableWhen of item.enableWhen) {\n const actualAnswers = getByLinkId(responseItems, enableWhen.question as string);\n\n if (enableWhen.operator === 'exists' && !enableWhen.answerBoolean && !actualAnswers?.length) {\n if (enableBehavior === 'any') {\n return true;\n } else {\n continue;\n }\n }\n const { anyMatch, allMatch } = checkAnswers(enableWhen, actualAnswers, enableBehavior);\n\n if (enableBehavior === 'any' && anyMatch) {\n return true;\n }\n if (enableBehavior === 'all' && !allMatch) {\n return false;\n }\n }\n\n return enableBehavior !== 'any';\n}\n\nexport function getNewMultiSelectValues(\n selected: string[],\n propertyName: string,\n item: QuestionnaireItem\n): QuestionnaireResponseItemAnswer[] {\n return selected.map((o) => {\n const option = item.answerOption?.find(\n (option) =>\n formatCoding(option.valueCoding) === o || option[propertyName as keyof QuestionnaireItemAnswerOption] === o\n );\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n return { [propertyName]: optionValue?.value };\n });\n}\n\nfunction getByLinkId(\n responseItems: QuestionnaireResponseItem[] | undefined,\n linkId: string\n): QuestionnaireResponseItemAnswer[] | undefined {\n if (!responseItems) {\n return undefined;\n }\n\n for (const response of responseItems) {\n if (response.linkId === linkId) {\n return response.answer;\n }\n if (response.item) {\n const nestedAnswer = getByLinkId(response.item, linkId);\n if (nestedAnswer) {\n return nestedAnswer;\n }\n }\n }\n\n return undefined;\n}\n\nfunction evaluateMatch(actualAnswer: TypedValue | undefined, expectedAnswer: TypedValue, operator?: string): boolean {\n // We handle exists separately since its so different in terms of comparisons than the other mathematical operators\n if (operator === 'exists') {\n // if actualAnswer is not undefined, then exists: true passes\n // if actualAnswer is undefined, then exists: false passes\n return !!actualAnswer === expectedAnswer.value;\n } else if (!actualAnswer) {\n return false;\n } else {\n // `=` and `!=` should be treated as the FHIRPath `~` and `!~`\n // All other operators should be unmodified\n const fhirPathOperator = operator === '=' || operator === '!=' ? operator?.replace('=', '~') : operator;\n const [{ value }] = evalFhirPathTyped(`%actualAnswer ${fhirPathOperator} %expectedAnswer`, [actualAnswer], {\n '%actualAnswer': actualAnswer,\n '%expectedAnswer': expectedAnswer,\n });\n return value;\n }\n}\n\nfunction checkAnswers(\n enableWhen: QuestionnaireItemEnableWhen,\n answers: QuestionnaireResponseItemAnswer[] | undefined,\n enableBehavior: 'any' | 'all'\n): { anyMatch: boolean; allMatch: boolean } {\n const actualAnswers = answers || [];\n const expectedAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireItemEnableWhen',\n value: enableWhen,\n },\n 'answer[x]'\n ) as TypedValue;\n\n let anyMatch = false;\n let allMatch = true;\n\n for (const actualAnswerValue of actualAnswers) {\n const actualAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireResponseItemAnswer',\n value: actualAnswerValue,\n },\n 'value[x]'\n ) as TypedValue | undefined; // possibly undefined when question unanswered\n const { operator } = enableWhen;\n const match = evaluateMatch(actualAnswer, expectedAnswer, operator);\n if (match) {\n anyMatch = true;\n } else {\n allMatch = false;\n }\n\n if (enableBehavior === 'any' && anyMatch) {\n break;\n }\n }\n\n return { anyMatch, allMatch };\n}\n\nexport function getQuestionnaireItemReferenceTargetTypes(item: QuestionnaireItem): ResourceType[] | undefined {\n const extension = getExtension(item, 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource');\n if (!extension) {\n return undefined;\n }\n if (extension.valueCode !== undefined) {\n return [extension.valueCode] as ResourceType[];\n }\n if (extension.valueCodeableConcept) {\n return extension.valueCodeableConcept?.coding?.map((c) => c.code) as ResourceType[];\n }\n return undefined;\n}\n\nexport function setQuestionnaireItemReferenceTargetTypes(\n item: QuestionnaireItem,\n targetTypes: ResourceType[] | undefined\n): QuestionnaireItem {\n const result = deepClone(item);\n let extension = getExtension(result, 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource');\n\n if (!targetTypes || targetTypes.length === 0) {\n if (extension) {\n result.extension = result.extension?.filter((e) => e !== extension);\n }\n return result;\n }\n\n if (!extension) {\n if (!result.extension) {\n result.extension = [];\n }\n extension = { url: 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource' };\n result.extension.push(extension);\n }\n\n if (targetTypes.length === 1) {\n extension.valueCode = targetTypes[0];\n delete extension.valueCodeableConcept;\n } else {\n extension.valueCodeableConcept = { coding: targetTypes.map((t) => ({ code: t })) };\n delete extension.valueCode;\n }\n\n return result;\n}\n\n/**\n * Returns the reference filter for the given questionnaire item.\n * @see https://build.fhir.org/ig/HL7/fhir-extensions//StructureDefinition-questionnaire-referenceFilter-definitions.html\n * @param item - The questionnaire item to get the reference filter for.\n * @param subject - Optional subject reference.\n * @param encounter - Optional encounter reference.\n * @returns The reference filter as a map of key/value pairs.\n */\nexport function getQuestionnaireItemReferenceFilter(\n item: QuestionnaireItem,\n subject: Reference | undefined,\n encounter: Reference<Encounter> | undefined\n): Record<string, string> | undefined {\n const extension = getExtension(item, 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceFilter');\n if (!extension?.valueString) {\n return undefined;\n }\n\n // Replace variables\n let filter = extension.valueString;\n if (subject?.reference) {\n filter = filter.replaceAll('$subj', subject.reference);\n }\n if (encounter?.reference) {\n filter = filter.replaceAll('$encounter', encounter.reference);\n }\n\n // Parse the valueString into a map\n const result: Record<string, string> = {};\n const parts = filter.split('&');\n for (const part of parts) {\n const [key, value] = splitN(part, '=', 2);\n result[key] = value;\n }\n return result;\n}\n\nexport function buildInitialResponse(questionnaire: Questionnaire): QuestionnaireResponse {\n const response: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n questionnaire: getReferenceString(questionnaire),\n item: buildInitialResponseItems(questionnaire.item),\n };\n\n return response;\n}\n\nfunction buildInitialResponseItems(items: QuestionnaireItem[] | undefined): QuestionnaireResponseItem[] {\n return items?.map(buildInitialResponseItem) ?? [];\n}\n\nexport function buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem {\n return {\n id: generateId(),\n linkId: item.linkId,\n text: item.text,\n item: buildInitialResponseItems(item.item),\n answer: item.initial?.map(buildInitialResponseAnswer) ?? [],\n };\n}\n\nlet nextId = 1;\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction buildInitialResponseAnswer(answer: QuestionnaireItemInitial): QuestionnaireResponseItemAnswer {\n // This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer\n // have the same properties.\n return { ...answer };\n}\n\nexport function formatReferenceString(typedValue: TypedValue): string {\n return typedValue.value.display || typedValue.value.reference || stringify(typedValue.value);\n}\n\n/**\n * Returns the number of pages in the questionnaire.\n *\n * By default, a questionnaire is represented as a simple single page questionnaire,\n * so the default return value is 1.\n *\n * If the questionnaire has a page extension on the first item, then the number of pages\n * is the number of top level items in the questionnaire.\n *\n * @param questionnaire - The questionnaire to get the number of pages for.\n * @returns The number of pages in the questionnaire. Default is 1.\n */\nexport function getNumberOfPages(questionnaire: Questionnaire): number {\n const firstItem = questionnaire?.item?.[0];\n if (firstItem) {\n const extension = getExtension(firstItem, 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl');\n if (extension?.valueCodeableConcept?.coding?.[0]?.code === 'page') {\n return (questionnaire.item as QuestionnaireItem[]).length;\n }\n }\n return 1;\n}\n", "import { Encounter, Reference } from '@medplum/fhirtypes';\nimport { createContext } from 'react';\n\nexport const QuestionnaireFormContext = createContext<{ subject?: Reference; encounter?: Reference<Encounter> }>({});\n", "import { Title } from '@mantine/core';\nimport { ProfileResource, createReference, getReferenceString } from '@medplum/core';\nimport {\n Encounter,\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n Reference,\n} from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { useEffect, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { buildInitialResponse, getNumberOfPages, isQuestionEnabled } from '../utils/questionnaire';\nimport { QuestionnairePageSequence } from './QuestionnaireFormComponents/QuestionnaireFormPageSequence';\nimport { QuestionnaireFormContext } from './QuestionnaireForm.context';\n\nexport interface QuestionnaireFormProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n subject?: Reference;\n encounter?: Reference<Encounter>;\n submitButtonText?: string;\n onSubmit: (response: QuestionnaireResponse) => void;\n}\n\nexport function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null {\n const medplum = useMedplum();\n const source = medplum.getProfile();\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n const questionnaire = useResource(props.questionnaire);\n const [response, setResponse] = useState<QuestionnaireResponse | undefined>();\n const [activePage, setActivePage] = useState(0);\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => medplum.requestSchema('QuestionnaireResponse'))\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem | QuestionnaireResponseItem[]): void {\n const currentItems = response?.item ?? [];\n const mergedItems = mergeItems(\n currentItems,\n Array.isArray(newResponseItems) ? newResponseItems : [newResponseItems]\n );\n\n const newResponse: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n item: mergedItems,\n };\n\n setResponse(newResponse);\n }\n\n function checkForQuestionEnabled(item: QuestionnaireItem): boolean {\n return isQuestionEnabled(item, response?.item ?? []);\n }\n\n if (!schemaLoaded || !questionnaire) {\n return null;\n }\n\n const numberOfPages = getNumberOfPages(questionnaire);\n const nextStep = (): void => setActivePage((current) => current + 1);\n const prevStep = (): void => setActivePage((current) => current - 1);\n\n return (\n <QuestionnaireFormContext.Provider value={{ subject: props.subject, encounter: props.encounter }}>\n <Form\n testid=\"questionnaire-form\"\n onSubmit={() => {\n if (props.onSubmit && response) {\n props.onSubmit({\n ...response,\n questionnaire: getReferenceString(questionnaire),\n subject: props.subject,\n source: createReference(source as ProfileResource),\n authored: new Date().toISOString(),\n status: 'completed',\n });\n }\n }}\n >\n {questionnaire.title && <Title>{questionnaire.title}</Title>}\n <QuestionnairePageSequence\n items={questionnaire.item ?? []}\n response={response}\n onChange={setItems}\n renderPages={numberOfPages > 1}\n activePage={activePage}\n numberOfPages={numberOfPages}\n submitButtonText={props.submitButtonText}\n checkForQuestionEnabled={checkForQuestionEnabled}\n nextStep={nextStep}\n prevStep={prevStep}\n />\n </Form>\n </QuestionnaireFormContext.Provider>\n );\n}\n\nfunction mergeIndividualItems(\n prevItem: QuestionnaireResponseItem,\n newItem: QuestionnaireResponseItem\n): QuestionnaireResponseItem {\n // Recursively merge the nested items based on their ids.\n const mergedNestedItems = mergeItems(prevItem.item ?? [], newItem.item ?? []);\n\n return {\n ...newItem,\n item: mergedNestedItems.length > 0 ? mergedNestedItems : undefined,\n answer: newItem.answer && newItem.answer.length > 0 ? newItem.answer : prevItem.answer,\n };\n}\n\nfunction mergeItems(\n prevItems: QuestionnaireResponseItem[],\n newItems: QuestionnaireResponseItem[]\n): QuestionnaireResponseItem[] {\n const result: QuestionnaireResponseItem[] = [];\n const usedIds = new Set<string>();\n\n for (const prevItem of prevItems) {\n const itemId = prevItem.id;\n const newItem = newItems.find((item) => item.id === itemId);\n\n if (newItem) {\n result.push(mergeIndividualItems(prevItem, newItem));\n usedIds.add(newItem.id as string);\n } else {\n result.push(prevItem);\n }\n }\n\n // Add items from newItems that were not in prevItems.\n for (const newItem of newItems) {\n if (!usedIds.has(newItem.id as string)) {\n result.push(newItem);\n }\n }\n\n return result;\n}\n", "import { Button, Group, Stack, Stepper } from '@mantine/core';\nimport { QuestionnaireItem, QuestionnaireResponse, QuestionnaireResponseItem } from '@medplum/fhirtypes';\nimport { QuestionnaireItemType } from '../../utils/questionnaire';\nimport { QuestionnaireRepeatableItem } from '../QuestionnaireFormItem/QuestionnaireRepeatableItem';\nimport { QuestionnaireRepeatedGroup } from './QuestionnaireFormGroup';\n\ninterface QuestionnairePageSequenceProps {\n readonly items: QuestionnaireItem[];\n readonly response?: QuestionnaireResponse;\n readonly renderPages: boolean;\n readonly activePage?: number;\n readonly numberOfPages: number;\n readonly submitButtonText?: string;\n readonly checkForQuestionEnabled: (item: QuestionnaireItem) => boolean;\n readonly onChange: (items: QuestionnaireResponseItem | QuestionnaireResponseItem[]) => void;\n readonly nextStep: () => void;\n readonly prevStep: () => void;\n}\n\nexport function QuestionnairePageSequence(props: QuestionnairePageSequenceProps): JSX.Element {\n const {\n items,\n response,\n activePage,\n onChange,\n nextStep,\n prevStep,\n numberOfPages,\n renderPages,\n submitButtonText,\n checkForQuestionEnabled,\n } = props;\n\n const form = items.map((item) => {\n const itemResponse = response?.item?.filter((i) => i.linkId === item.linkId) ?? [];\n\n const repeatedItem =\n item.type === QuestionnaireItemType.group ? (\n <QuestionnaireRepeatedGroup\n key={item.linkId}\n item={item}\n response={itemResponse}\n onChange={onChange}\n checkForQuestionEnabled={checkForQuestionEnabled}\n />\n ) : (\n <QuestionnaireRepeatableItem\n key={item.linkId}\n item={item}\n response={itemResponse?.[0]}\n onChange={onChange}\n checkForQuestionEnabled={checkForQuestionEnabled}\n />\n );\n\n if (renderPages) {\n return (\n <Stepper.Step key={item.linkId} label={item.text}>\n {repeatedItem}\n </Stepper.Step>\n );\n }\n return repeatedItem;\n });\n\n return (\n <>\n {renderPages && (\n <Stepper active={activePage ?? 0} allowNextStepsSelect={false} p={6}>\n {form}\n </Stepper>\n )}\n {!renderPages && <Stack>{form}</Stack>}\n <ButtonGroup\n activePage={activePage ?? 0}\n numberOfPages={numberOfPages}\n nextStep={nextStep}\n prevStep={prevStep}\n submitButtonText={submitButtonText}\n />\n </>\n );\n}\n\ninterface ButtonGroupProps {\n readonly activePage: number;\n readonly numberOfPages: number;\n readonly submitButtonText?: string;\n readonly nextStep: () => void;\n readonly prevStep: () => void;\n}\n\nfunction ButtonGroup(props: ButtonGroupProps): JSX.Element {\n const showBackButton = props.activePage > 0;\n const showNextButton = props.activePage < props.numberOfPages - 1;\n const showSubmitButton = props.activePage === props.numberOfPages - 1;\n\n return (\n <Group position=\"right\" mt=\"xl\" spacing=\"xs\">\n {showBackButton && <Button onClick={props.prevStep}>Back</Button>}\n {showNextButton && (\n <Button\n onClick={(e) => {\n const form = e.currentTarget.closest('form') as HTMLFormElement;\n if (form.reportValidity()) {\n props.nextStep();\n }\n }}\n >\n Next\n </Button>\n )}\n {showSubmitButton && <Button type=\"submit\">{props.submitButtonText ?? 'Submit'}</Button>}\n </Group>\n );\n}\n", "import { Anchor } from '@mantine/core';\nimport { QuestionnaireItem, QuestionnaireResponseItem } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { FormSection } from '../../FormSection/FormSection';\nimport { QuestionnaireItemType } from '../../utils/questionnaire';\nimport { QuestionnaireFormItem } from './QuestionnaireFormItem';\n\ninterface QuestionnaireRepeatableItemProps {\n readonly item: QuestionnaireItem;\n readonly response?: QuestionnaireResponseItem;\n readonly checkForQuestionEnabled: (item: QuestionnaireItem) => boolean;\n readonly onChange: (items: QuestionnaireResponseItem[]) => void;\n}\n\nexport function QuestionnaireRepeatableItem(props: QuestionnaireRepeatableItemProps): JSX.Element | null {\n const { item, response, onChange } = props;\n const [number, setNumber] = useState(getNumberOfRepeats(item, response ?? {}));\n if (!props.checkForQuestionEnabled(item)) {\n return null;\n }\n\n if (!response) {\n return null;\n }\n\n if (item.type === QuestionnaireItemType.display) {\n return <p key={item.linkId}>{item.text}</p>;\n }\n\n const showAddButton =\n item?.repeats && item.type !== QuestionnaireItemType.choice && item.type !== QuestionnaireItemType.openChoice;\n\n // Styling reason to avoid duplicate text\n if (item.type === QuestionnaireItemType.boolean) {\n return (\n <QuestionnaireFormItem\n key={item.linkId}\n item={item}\n response={response}\n onChange={(r) => onChange([r])}\n index={0}\n />\n );\n }\n\n return (\n <FormSection\n key={props.item.linkId}\n htmlFor={props.item.linkId}\n title={props.item.text}\n withAsterisk={props.item.required}\n >\n {[...Array(number)].map((_, index) => (\n <QuestionnaireFormItem\n key={`${item.linkId}-${index}`}\n item={item}\n response={response}\n onChange={(r) => onChange([r])}\n index={index}\n />\n ))}\n {showAddButton && <Anchor onClick={() => setNumber((n) => n + 1)}>Add Item</Anchor>}\n </FormSection>\n );\n}\n\nfunction getNumberOfRepeats(item: QuestionnaireItem, response: QuestionnaireResponseItem): number {\n if (item.type === QuestionnaireItemType.choice || item.type === QuestionnaireItemType.openChoice) {\n return 1;\n }\n const answers = response.answer;\n return answers?.length ? answers.length : 1;\n}\n", "import { Anchor, Stack, Title } from '@mantine/core';\nimport { QuestionnaireItem, QuestionnaireResponseItem } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { QuestionnaireItemType, buildInitialResponseItem } from '../../utils/questionnaire';\nimport { QuestionnaireRepeatableItem } from '../QuestionnaireFormItem/QuestionnaireRepeatableItem';\n\ninterface QuestionnaireRepeatableGroupProps {\n readonly item: QuestionnaireItem;\n readonly response: QuestionnaireResponseItem[];\n readonly checkForQuestionEnabled: (item: QuestionnaireItem) => boolean;\n readonly onChange: (responses: QuestionnaireResponseItem[]) => void;\n}\n\nexport function QuestionnaireRepeatedGroup(props: QuestionnaireRepeatableGroupProps): JSX.Element | null {\n const [responses, setResponses] = useState(props.response);\n\n if (responses.length === 0) {\n return null;\n }\n\n function handleRepeatableGroup(newResponseItems: QuestionnaireResponseItem[], index: number): void {\n const newResponses = responses.map((responses, idx) => (idx === index ? newResponseItems[0] : responses));\n setResponses(newResponses);\n props.onChange(newResponses);\n }\n\n function insertNewGroup(): void {\n const newResponse = buildInitialResponseItem(props.item);\n setResponses([...responses, newResponse]);\n }\n\n return (\n <>\n {responses.map((response, idx) => (\n <QuestionnaireGroup\n key={response.id}\n item={props.item}\n response={response}\n checkForQuestionEnabled={props.checkForQuestionEnabled}\n onChange={(r) => handleRepeatableGroup(r, idx)}\n />\n ))}\n {props.item.repeats && <Anchor onClick={insertNewGroup}>{`Add Group: ${props.item.text}`}</Anchor>}\n </>\n );\n}\n\ninterface QuestionnaireGroupProps {\n readonly item: QuestionnaireItem;\n readonly response: QuestionnaireResponseItem;\n readonly checkForQuestionEnabled: (item: QuestionnaireItem) => boolean;\n readonly onChange: (response: QuestionnaireResponseItem[]) => void;\n}\n\nexport function QuestionnaireGroup(props: QuestionnaireGroupProps): JSX.Element | null {\n const { response, checkForQuestionEnabled, onChange } = props;\n function onSetGroup(newResponseItem: QuestionnaireResponseItem[]): void {\n const newResponse = response.item?.map((current) => {\n const matchingItem = newResponseItem.find((newResponse) => newResponse.id === current.id);\n return matchingItem ?? current;\n }) as QuestionnaireResponseItem[];\n // This checks to see if there were any nested repeated groups that we need to add\n const mergedResponse = newResponse?.concat(newResponseItem.slice(1)) as QuestionnaireResponseItem;\n const groupResponse = { ...response, item: mergedResponse } as QuestionnaireResponseItem;\n onChange([groupResponse]);\n }\n\n if (!props.checkForQuestionEnabled(props.item)) {\n return null;\n }\n\n return (\n <div key={props.item.linkId}>\n {props.item.text && (\n <Title order={3} mb=\"md\">\n {props.item.text}\n </Title>\n )}\n <Stack>\n {props.item.item?.map((item) => {\n if (item.type === QuestionnaireItemType.group) {\n return item.repeats ? (\n <QuestionnaireRepeatedGroup\n key={item.linkId}\n item={item}\n response={response.item?.filter((i) => i.linkId === item.linkId) ?? []}\n checkForQuestionEnabled={checkForQuestionEnabled}\n onChange={onSetGroup}\n />\n ) : (\n <QuestionnaireGroup\n key={item.linkId}\n item={item}\n checkForQuestionEnabled={checkForQuestionEnabled}\n response={response.item?.find((i) => i.linkId === item.linkId) ?? {}}\n onChange={onSetGroup}\n />\n );\n }\n return (\n <QuestionnaireRepeatableItem\n key={item.linkId}\n item={item}\n response={response.item?.find((i) => i.linkId === item.linkId)}\n onChange={onSetGroup}\n checkForQuestionEnabled={checkForQuestionEnabled}\n />\n );\n })}\n </Stack>\n </div>\n );\n}\n", "import { ActionIcon, Button, createStyles, Divider, Group, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { formatRange, getCodeBySystem } from '@medplum/core';\nimport { CodeableConcept, ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons-react';\nimport { MouseEvent, useEffect, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { Form } from '../Form/Form';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { killEvent } from '../utils/dom';\n\nconst useStyles = createStyles((theme) => ({\n section: {\n position: 'relative',\n margin: '4px 4px 8px 0',\n padding: '6px 12px 16px 6px',\n border: `1.5px solid ${theme.colors.gray[3]}`,\n borderRadius: theme.radius.sm,\n transition: 'all 0.1s',\n },\n}));\n\n// Properties of qualified intervals used for grouping\nconst intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo', 'category'] as const;\n\nexport interface ReferenceRangeEditorProps {\n definition: ObservationDefinition;\n onSubmit: (result: ObservationDefinition) => void;\n}\n\n// Helper type that groups of qualified intervals by equal filter criteria\nexport type IntervalGroup = {\n id: string;\n filters: Record<string, any>;\n intervals: ObservationDefinitionQualifiedInterval[];\n};\n\nconst defaultProps: ReferenceRangeEditorProps = {\n definition: { resourceType: 'ObservationDefinition' },\n onSubmit: () => {\n return undefined;\n },\n};\n\nexport function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element {\n props = Object.assign(defaultProps, props);\n const defaultDefinition = props.definition;\n\n const [intervalGroups, setIntervalGroups] = useState<IntervalGroup[]>([]);\n const [groupId, setGroupId] = useState(1);\n const [intervalId, setIntervalId] = useState(1);\n\n useEffect(() => {\n const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);\n setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));\n }, [defaultDefinition]);\n\n return (\n <Form testid=\"reference-range-editor\" onSubmit={submitDefinition}>\n <Stack>\n {intervalGroups.map((intervalGroup) => (\n <ReferenceRangeGroupEditor\n unit={getUnitString(defaultDefinition.quantitativeDetails?.unit)}\n onChange={changeInterval}\n onAdd={addInterval}\n onRemove={removeInterval}\n onRemoveGroup={removeGroup}\n key={`group-${intervalGroup.id}`}\n intervalGroup={intervalGroup}\n />\n ))}\n </Stack>\n <ActionIcon\n title=\"Add Group\"\n size=\"sm\"\n onClick={(e: MouseEvent) => {\n killEvent(e);\n addGroup({ id: `group-id-${groupId}`, filters: {} as IntervalGroup['filters'], intervals: [] });\n setGroupId((id) => id + 1);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n\n <Group position=\"right\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n );\n\n /**\n * Submit qualified intervals\n */\n\n function submitDefinition(): void {\n const qualifiedInterval = intervalGroups\n .flatMap((group) => group.intervals)\n .filter((interval) => !isEmptyInterval(interval));\n props.onSubmit({ ...defaultDefinition, qualifiedInterval });\n }\n\n /**\n * Add Remove Interval Groups\n */\n\n function addGroup(addedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);\n }\n\n function removeGroup(removedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));\n }\n\n /**\n * Add/Remove/Update specific Qualified Intervals\n * @param groupId - The reference range group ID.\n * @param changedInterval - The updated reference range interval.\n */\n function changeInterval(groupId: string, changedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n\n const index = currentGroup?.intervals.findIndex((interval) => interval.id === changedInterval.id);\n if (index !== undefined && currentGroup?.intervals[index]) {\n currentGroup.intervals[index] = changedInterval;\n }\n return groups;\n });\n }\n\n function addInterval(groupId: string, addedInterval: ObservationDefinitionQualifiedInterval): void {\n if (addedInterval.id === undefined) {\n addedInterval.id = `id-${intervalId}`;\n setIntervalId((id) => id + 1);\n }\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroupIndex = groups.findIndex((g) => g.id === groupId);\n\n if (currentGroupIndex !== -1) {\n const currentGroup = { ...groups[currentGroupIndex] };\n addedInterval = { ...addedInterval, ...currentGroup.filters };\n currentGroup.intervals = [...currentGroup.intervals, addedInterval];\n groups[currentGroupIndex] = currentGroup;\n }\n\n return groups;\n });\n }\n\n function removeInterval(groupId: string, removedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n if (currentGroup) {\n currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);\n }\n return groups;\n });\n }\n}\n\n/**\n * Helper component that renders an \"interval group\", which is a set of ObservationDefinitionQualifiedIntervals\n * that have the same filter values\n */\nexport interface ReferenceRangeGroupEditorProps {\n intervalGroup: IntervalGroup;\n unit: string | undefined;\n onChange: (groupId: string, changed: ObservationDefinitionQualifiedInterval) => void;\n onAdd: (groupId: string, added: ObservationDefinitionQualifiedInterval) => void;\n onRemove: (groupId: string, removed: ObservationDefinitionQualifiedInterval) => void;\n onRemoveGroup: (removedGroup: IntervalGroup) => void;\n}\n\nexport function ReferenceRangeGroupEditor(props: ReferenceRangeGroupEditorProps): JSX.Element {\n const { intervalGroup, unit } = props;\n const { classes } = useStyles();\n return (\n <Container data-testid={intervalGroup.id} className={classes.section}>\n <Stack spacing={'lg'}>\n <Group position=\"right\">\n <ActionIcon\n title=\"Remove Group\"\n data-testid={`remove-group-button-${intervalGroup.id}`}\n key={`remove-group-button-${intervalGroup.id}`}\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemoveGroup(intervalGroup);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n <ReferenceRangeGroupFilters intervalGroup={intervalGroup} onChange={props.onChange} />\n <Divider />\n {intervalGroup.intervals.map((interval) => (\n <Stack key={`interval-${interval.id}`} spacing={'xs'}>\n <Group>\n <TextInput\n key={`condition-${interval.id}`}\n data-testid={`condition-${interval.id}`}\n defaultValue={interval.condition}\n label={'Condition: '}\n size={'sm'}\n onChange={(e) => {\n killEvent(e);\n props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });\n }}\n />\n <ActionIcon\n title=\"Remove Interval\"\n size=\"sm\"\n key={`remove-interval-${interval.id}`}\n data-testid={`remove-interval-${interval.id}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemove(intervalGroup.id, interval);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n\n <RangeInput\n onChange={(range) => {\n props.onChange(intervalGroup.id, { ...interval, range });\n }}\n key={`range-${interval.id}`}\n name={`range-${interval.id}`}\n defaultValue={interval.range}\n />\n </Stack>\n ))}\n <ActionIcon\n title=\"Add Interval\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onAdd(intervalGroup.id, {\n range: {\n low: { unit },\n high: { unit },\n },\n });\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </Stack>\n </Container>\n );\n}\n\ninterface ReferenceRangeGroupFiltersProps {\n intervalGroup: IntervalGroup;\n onChange: ReferenceRangeGroupEditorProps['onChange'];\n}\n\n/**\n * Render the \"filters\" section of the IntervalGroup.\n * @param props - The ReferenceRangeGroupFilter React props.\n * @returns The ReferenceRangeGroupFilter React node.\n */\nfunction ReferenceRangeGroupFilters(props: ReferenceRangeGroupFiltersProps): JSX.Element {\n const { intervalGroup, onChange } = props;\n\n // Pre-populate the units of the age filter\n if (!intervalGroup.filters.age) {\n intervalGroup.filters.age = {};\n }\n for (const key of ['low', 'high']) {\n if (!intervalGroup.filters.age[key]?.unit) {\n intervalGroup.filters.age[key] = {\n ...intervalGroup.filters.age[key],\n unit: 'years',\n system: 'http://unitsofmeasure.org',\n };\n }\n }\n\n return (\n <Stack style={{ maxWidth: '50%' }}>\n <Group>\n <NativeSelect\n data={['', 'male', 'female']}\n label=\"Gender:\"\n defaultValue={intervalGroup.filters.gender || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newGender: string | undefined = e.currentTarget.value;\n if (newGender === '') {\n newGender = undefined;\n }\n onChange(intervalGroup.id, {\n ...interval,\n gender: newGender as ObservationDefinitionQualifiedInterval['gender'],\n });\n }\n }}\n />\n </Group>\n <Group spacing={'xs'}>\n <Text component=\"label\" htmlFor={`div-age-${intervalGroup.id}`}>\n Age:\n </Text>\n <div id={`div-age-${intervalGroup.id}`}>\n <RangeInput\n key={`age-${intervalGroup.id}`}\n name={`age-${intervalGroup.id}`}\n defaultValue={intervalGroup.filters['age']}\n onChange={(ageRange) => {\n for (const interval of intervalGroup.intervals) {\n onChange(intervalGroup.id, { ...interval, age: ageRange });\n }\n }}\n />\n </div>\n </Group>\n <NativeSelect\n data={['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal']}\n label=\"Endocrine:\"\n defaultValue={intervalGroup.filters.context?.text || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newEndocrine: string | undefined = e.currentTarget.value;\n if (newEndocrine === '') {\n newEndocrine = undefined;\n onChange(intervalGroup.id, { ...interval, context: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n context: {\n text: newEndocrine,\n coding: [\n { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },\n ],\n },\n });\n }\n }\n }}\n />\n <NativeSelect\n data={['', 'reference', 'critical', 'absolute']}\n label=\"Category: \"\n defaultValue={intervalGroup.filters.category}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n const newCategory: string | undefined = e.currentTarget.value;\n if (newCategory === '') {\n onChange(intervalGroup.id, { ...interval, category: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n category: newCategory as 'reference' | 'critical' | 'absolute',\n });\n }\n }\n }}\n />\n </Stack>\n );\n}\n\n/**\n * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition\n * @param definition - An ObservationDefinition\n * @param setIntervalId - React setState function for the intervalId\n * @returns The updated observation definition.\n */\nfunction ensureQualifiedIntervalKeys(\n definition: ObservationDefinition,\n setIntervalId: (id: number) => void\n): ObservationDefinition {\n const intervals = definition.qualifiedInterval || [];\n // Set the nextId to the max of any existing numeric id\n let nextId =\n Math.max(\n ...intervals.map((interval) => {\n const existingNum = parseInt(interval.id?.substring(3) || '', 10);\n return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;\n })\n ) + 1;\n\n if (!Number.isFinite(nextId)) {\n nextId = 1;\n }\n\n // If an interval doesn't have an id, set it to the nextId\n definition = {\n ...definition,\n qualifiedInterval: intervals.map((interval) => ({\n ...interval,\n id: interval.id || `id-${nextId++}`,\n })),\n };\n setIntervalId(nextId);\n return definition;\n}\n\n/**\n * Group all ObservationDefinitionQualifiedIntervals based on the values of their \"filter\" properties,\n * so that similar ranges can be grouped together.\n * @param intervals - Array of reference range intervals.\n * @param setGroupId - Callback to set the group ID.\n * @returns The grouped intervals.\n */\nfunction groupQualifiedIntervals(\n intervals: ObservationDefinitionQualifiedInterval[],\n setGroupId: (id: number) => void\n): IntervalGroup[] {\n let groupId = 1;\n const groups: Record<string, IntervalGroup> = {};\n for (const interval of intervals) {\n const groupKey = generateGroupKey(interval);\n if (!(groupKey in groups)) {\n groups[groupKey] = {\n id: `group-id-${groupId++}`,\n filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])) as Record<string, any>,\n intervals: [],\n };\n }\n groups[groupKey].intervals.push(interval);\n }\n setGroupId(groupId);\n return Object.values(groups);\n}\n\n/**\n * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together.\n * @param interval - The reference range interval.\n * @returns A \"group key\" that corresponds to the value of the interval filter properties.\n */\nfunction generateGroupKey(interval: ObservationDefinitionQualifiedInterval): string {\n const results = [\n `gender=${interval.gender}`,\n `age=${formatRange(interval.age)}`,\n `gestationalAge=${formatRange(interval.gestationalAge)}`,\n `context=${interval.context?.text}`,\n `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,\n `category=${interval.category}`,\n ];\n\n return results.join(':');\n}\n\nfunction getUnitString(unit: CodeableConcept | undefined): string | undefined {\n return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);\n}\n\nfunction isEmptyInterval(interval: ObservationDefinitionQualifiedInterval): boolean {\n return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;\n}\n", "import { Button, Grid, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Bundle, BundleEntry, Reference, RequestGroup, Resource, Task } from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { IconCheckbox, IconSquare } from '@tabler/icons-react';\nimport { Fragment, useEffect, useState } from 'react';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\n\nexport interface RequestGroupDisplayProps {\n value?: RequestGroup | Reference<RequestGroup>;\n onStart: (task: Task, input: Reference) => void;\n onEdit: (task: Task, input: Reference, output: Reference) => void;\n}\n\nexport function RequestGroupDisplay(props: RequestGroupDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const requestGroup = useResource(props.value);\n const [startedLoading, setStartedLoading] = useState(false);\n const [responseBundle, setResponseBundle] = useState<Bundle>();\n\n useEffect(() => {\n if (requestGroup && !startedLoading) {\n medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log);\n setStartedLoading(true);\n }\n }, [medplum, requestGroup, startedLoading]);\n\n if (!requestGroup || !responseBundle) {\n return null;\n }\n\n return (\n <Grid>\n {requestGroup.action?.map((action, index) => {\n const task = action.resource && findBundleEntry(action.resource as Reference<Task>);\n const taskInput = task?.input?.[0]?.valueReference;\n const taskOutput = task?.output?.[0]?.valueReference;\n return (\n <Fragment key={`action-${index}`}>\n <Grid.Col span={1} p=\"md\">\n {task?.status === 'completed' ? <IconCheckbox /> : <IconSquare color=\"gray\" />}\n </Grid.Col>\n <Grid.Col span={9} p=\"xs\">\n <Text weight={500}>{action.title}</Text>\n {action.description && <div>{action.description}</div>}\n <div>\n Last edited by&nbsp;\n <ResourceName value={task?.meta?.author as Reference} />\n &nbsp;on&nbsp;\n {formatDateTime(task?.meta?.lastUpdated)}\n </div>\n <div>\n Status: <StatusBadge status={task?.status || 'unknown'} />\n </div>\n </Grid.Col>\n <Grid.Col span={2} p=\"md\">\n {taskInput && !taskOutput && <Button onClick={() => props.onStart(task, taskInput)}>Start</Button>}\n {taskInput && taskOutput && (\n <Button onClick={() => props.onEdit(task, taskInput, taskOutput)}>Edit</Button>\n )}\n </Grid.Col>\n </Fragment>\n );\n })}\n </Grid>\n );\n\n function buildBatchRequest(request: RequestGroup): Bundle {\n const batchEntries = [] as BundleEntry[];\n if (request.action) {\n for (const action of request.action) {\n if (action.resource?.reference) {\n batchEntries.push({ request: { method: 'GET', url: action.resource.reference } });\n }\n }\n }\n\n return {\n resourceType: 'Bundle',\n type: 'batch',\n entry: batchEntries,\n };\n }\n\n function findBundleEntry<T extends Resource>(reference: Reference<T>): T | undefined {\n for (const entry of responseBundle?.entry as BundleEntry[]) {\n if (entry.resource && reference.reference === getReferenceString(entry.resource)) {\n return entry.resource as T;\n }\n }\n return undefined;\n }\n}\n", "import { createStyles } from '@mantine/core';\nimport { Bundle, Resource, ResourceType } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { blame } from '../utils/blame';\nimport { getTimeString, getVersionUrl } from './ResourceBlame.utils';\n\nconst useStyles = createStyles((theme) => ({\n container: {\n overflowX: 'auto',\n },\n\n root: {\n border: `0.1px solid ${theme.colors.gray[3]}`,\n borderCollapse: 'collapse',\n borderRadius: theme.radius.sm,\n borderSpacing: 0,\n fontSize: theme.fontSizes.xs,\n width: '100%',\n\n '& td': {\n padding: '2px 4px 0 4px',\n verticalAlign: 'top',\n whiteSpace: 'nowrap',\n },\n },\n\n startRow: {\n borderTop: `0.1px solid ${theme.colors.gray[3]}`,\n },\n\n normalRow: {\n borderTop: 0,\n },\n\n author: {\n lineHeight: '10px',\n },\n\n dateTime: {\n borderRight: `0.1px solid ${theme.colors.gray[3]}`,\n lineHeight: '20px',\n },\n\n lineNumber: {\n backgroundColor: theme.colors.gray[1],\n border: 0,\n color: theme.colors.gray[5],\n fontFamily: theme.fontFamilyMonospace,\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n textAlign: 'right',\n },\n\n line: {\n fontFamily: theme.fontFamilyMonospace,\n fontSize: theme.fontSizes.sm,\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n },\n\n pre: {\n margin: 0,\n },\n}));\n\nexport interface ResourceBlameProps {\n history?: Bundle;\n resourceType?: ResourceType;\n id?: string;\n}\n\nexport function ResourceBlame(props: ResourceBlameProps): JSX.Element | null {\n const { classes } = useStyles();\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum.readHistory(props.resourceType, props.id).then(setValue).catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n const resource = value.entry?.[0]?.resource as Resource;\n\n if (!resource) {\n return null;\n }\n\n const table = blame(value);\n\n return (\n <div className={classes.container}>\n <table className={classes.root}>\n <tbody>\n {table.map((row, index) => (\n <tr key={'row-' + index} className={row.span > 0 ? classes.startRow : classes.normalRow}>\n {row.span > 0 && (\n <>\n <td className={classes.author} rowSpan={row.span}>\n <ResourceBadge value={row.meta.author} link={true} />\n </td>\n <td className={classes.dateTime} rowSpan={row.span}>\n <MedplumLink to={getVersionUrl(resource, row.meta.versionId as string)}>\n {getTimeString(row.meta.lastUpdated as string)}\n </MedplumLink>\n </td>\n </>\n )}\n <td className={classes.lineNumber}>{index + 1}</td>\n <td className={classes.line}>\n <pre className={classes.pre}>{row.value}</pre>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n", "import { stringify } from '@medplum/core';\nimport { Bundle, BundleEntry, Meta } from '@medplum/fhirtypes';\nimport { diff } from './diff';\n\nexport interface BlameRow {\n id: string;\n meta: Meta;\n value: string;\n span: number;\n}\n\nexport function blame(history: Bundle): BlameRow[] {\n // Convert to array of array of lines\n const versions = (history.entry as BundleEntry[])\n .filter((entry) => !!entry.resource)\n .map((entry) => ({\n meta: entry.resource?.meta as Meta,\n lines: stringify(entry.resource, true).match(/[^\\r\\n]+/g) as string[],\n }))\n .sort((a, b) => (a.meta.lastUpdated as string).localeCompare(b.meta.lastUpdated as string));\n\n // Start with array of lines from the first version\n const table: BlameRow[] = versions[0].lines.map((line) => ({\n id: versions[0].meta.versionId as string,\n meta: versions[0].meta,\n value: line,\n span: 1,\n }));\n\n compareVersions(table, versions);\n combineSpans(table);\n return table;\n}\n\n/**\n * For each version, update the blame table with revisions.\n * @param table - The output blame table.\n * @param versions - The array of versions.\n */\nfunction compareVersions(table: BlameRow[], versions: { meta: Meta; lines: string[] }[]): void {\n for (let i = 1; i < versions.length; i++) {\n const revisions = diff(versions[i - 1].lines, versions[i].lines);\n\n for (const revision of revisions) {\n const position = revision.original.position;\n const oldLines = revision.original.lines;\n const newLines = revision.revised.lines;\n\n if (revision.type === 'delete' || revision.type === 'change') {\n // Remove the old rows\n table.splice(position, oldLines.length);\n }\n\n if (revision.type === 'insert' || revision.type === 'change') {\n // Add the new lines\n for (let k = 0; k < revision.revised.lines.length; k++) {\n table.splice(position + k, 0, {\n id: versions[i].meta.versionId as string,\n meta: versions[i].meta,\n value: newLines[k],\n span: 1,\n });\n }\n }\n }\n }\n}\n\n/**\n * Combine adjacent rows into spans.\n * @param table - The output blame table.\n */\nfunction combineSpans(table: BlameRow[]): void {\n let start = 0;\n while (start < table.length) {\n let curr = start;\n while (curr < table.length && table[curr].id === table[start].id) {\n table[curr].span = -1;\n curr++;\n }\n table[start].span = curr - start;\n start = curr;\n }\n}\n", "/*\n * Myers Diff algorithm\n * Based on: https://github.com/KengoTODA/java-diff-utils/blob/master/src/main/java/difflib/myers/MyersDiff.java\n * Apache Software License, Version 1.1\n */\n\nexport function diff(original: string[], revised: string[]): Delta[] {\n const path = buildPath(original, revised) as PathNode;\n return buildRevisions(path, original, revised);\n}\n\nexport interface PathNode {\n readonly i: number;\n readonly j: number;\n readonly prev: PathNode | undefined;\n readonly snake: boolean;\n}\n\nexport interface Delta {\n readonly original: Chunk;\n readonly revised: Chunk;\n readonly type: 'change' | 'delete' | 'insert';\n}\n\nexport interface Chunk {\n readonly position: number;\n readonly lines: string[];\n}\n\nfunction buildPath(orig: string[], rev: string[]): PathNode | undefined {\n const N = orig.length;\n const M = rev.length;\n const MAX = N + M + 1;\n const size = 1 + 2 * MAX;\n const middle = (size / 2) | 0;\n const diagonal: (PathNode | undefined)[] = new Array(size);\n\n diagonal[middle + 1] = {\n i: 0,\n j: -1,\n prev: undefined,\n snake: true,\n };\n\n for (let d = 0; d < MAX; d++) {\n for (let k = -d; k <= d; k += 2) {\n const kmiddle = middle + k;\n const kplus = kmiddle + 1;\n const kminus = kmiddle - 1;\n const kplusNode = diagonal[kplus] as PathNode;\n const kminusNode = diagonal[kminus] as PathNode;\n let prev: PathNode | undefined = undefined;\n let i = 0;\n\n if (k === -d || (k !== d && kminusNode.i < kplusNode.i)) {\n i = kplusNode.i;\n prev = kplusNode;\n } else {\n i = kminusNode.i + 1;\n prev = kminusNode;\n }\n\n diagonal[kminus] = undefined; // no longer used\n\n let j = i - k;\n let node = {\n i,\n j,\n prev: previousSnake(prev),\n snake: false,\n };\n\n // orig and rev are zero-based\n // but the algorithm is one-based\n // that's why there's no +1 when indexing the sequences\n while (i < N && j < M && orig[i] === rev[j]) {\n i++;\n j++;\n }\n\n if (i > node.i) {\n node = {\n i,\n j,\n prev: node,\n snake: true,\n };\n }\n\n diagonal[kmiddle] = node;\n\n if (i >= N && j >= M) {\n return diagonal[kmiddle] as PathNode;\n }\n }\n diagonal[middle + d - 1] = undefined;\n }\n\n // According to Myers, this cannot happen\n return undefined;\n}\n\nfunction buildRevisions(startNode: PathNode, orig: string[], rev: string[]): Delta[] {\n const deltas: Delta[] = [];\n let path: PathNode | undefined = startNode;\n\n if (path.snake) {\n path = path.prev;\n }\n\n while (path?.prev && path.prev.j >= 0) {\n const i = path.i;\n const j = path.j;\n\n path = path.prev;\n const ianchor = path.i;\n const janchor = path.j;\n\n const original = {\n position: ianchor,\n lines: orig.slice(ianchor, i),\n };\n\n const revised = {\n position: janchor,\n lines: rev.slice(janchor, j),\n };\n\n let type: 'insert' | 'delete' | 'change';\n\n if (original.lines.length === 0 && revised.lines.length > 0) {\n type = 'insert';\n } else if (original.lines.length > 0 && revised.lines.length === 0) {\n type = 'delete';\n } else {\n type = 'change';\n }\n\n deltas.push({ original, revised, type });\n\n if (path.snake) {\n path = path.prev;\n }\n }\n\n return deltas;\n}\n\nfunction previousSnake(node: PathNode): PathNode {\n if (node && !node.snake && node.prev) {\n return node.prev;\n }\n return node;\n}\n", "import { Resource } from '@medplum/fhirtypes';\n\nexport function getVersionUrl(resource: Resource, versionId: string): string {\n return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;\n}\n\nexport function getTimeString(lastUpdated: string): string {\n const seconds = Math.floor((Date.now() - Date.parse(lastUpdated)) / 1000);\n\n const years = Math.floor(seconds / 31536000);\n if (years > 0) {\n return pluralizeTime(years, 'year');\n }\n\n const months = Math.floor(seconds / 2592000);\n if (months > 0) {\n return pluralizeTime(months, 'month');\n }\n\n const days = Math.floor(seconds / 86400);\n if (days > 0) {\n return pluralizeTime(days, 'day');\n }\n\n const hours = Math.floor(seconds / 3600);\n if (hours > 0) {\n return pluralizeTime(hours, 'hour');\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes > 0) {\n return pluralizeTime(minutes, 'minute');\n }\n\n return pluralizeTime(seconds, 'second');\n}\n\nfunction pluralizeTime(count: number, noun: string): string {\n return `${count} ${count === 1 ? noun : noun + 's'} ago`;\n}\n", "import { createStyles } from '@mantine/core';\nimport { stringify } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport { Delta, diff } from '../utils/diff';\n\nconst useStyles = createStyles((theme) => ({\n removed: {\n color: theme.colors.red[7],\n textDecoration: 'line-through',\n },\n\n added: {\n color: theme.colors.green[7],\n },\n}));\n\nexport interface ResourceDiffProps {\n original: Resource;\n revised: Resource;\n ignoreMeta?: boolean;\n}\n\nexport function ResourceDiff(props: ResourceDiffProps): JSX.Element {\n let originalResource = props.original;\n let revisedResource = props.revised;\n\n if (props.ignoreMeta) {\n originalResource = { ...originalResource, meta: undefined };\n revisedResource = { ...revisedResource, meta: undefined };\n }\n\n const original = stringify(originalResource, true).match(/[^\\r\\n]+/g) as string[];\n const revised = stringify(revisedResource, true).match(/[^\\r\\n]+/g) as string[];\n const deltas = diff(original, revised);\n return (\n <pre style={{ color: 'gray' }}>\n {deltas.map((delta, index) => (\n <ChangeDiff key={'delta' + index} delta={delta} />\n ))}\n </pre>\n );\n}\n\nfunction ChangeDiff(props: { delta: Delta }): JSX.Element {\n const { classes } = useStyles();\n return (\n <>\n ...\n <br />\n {props.delta.original.lines.length > 0 && (\n <div className={classes.removed}>{props.delta.original.lines.join('\\n')}</div>\n )}\n {props.delta.revised.lines.length > 0 && (\n <div className={classes.added}>{props.delta.revised.lines.join('\\n')}</div>\n )}\n ...\n <br />\n </>\n );\n}\n", "import { Button, Group, Stack, TextInput } from '@mantine/core';\nimport { deepClone, tryGetProfile } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { FormEvent, useEffect, useState } from 'react';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nexport interface ResourceFormProps {\n defaultValue: Resource | Reference;\n outcome?: OperationOutcome;\n onSubmit: (resource: Resource) => void;\n onDelete?: (resource: Resource) => void;\n schemaName?: string;\n /** (optional) URL of the resource profile used to display the form. Takes priority over schemaName. */\n profileUrl?: string;\n}\n\nexport function ResourceForm(props: ResourceFormProps): JSX.Element {\n const { outcome } = props;\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [schemaLoaded, setSchemaLoaded] = useState<string>();\n const [value, setValue] = useState<Resource>();\n\n useEffect(() => {\n if (defaultValue) {\n setValue(deepClone(defaultValue));\n if (props.profileUrl) {\n const profileUrl: string = props.profileUrl;\n medplum\n .requestProfileSchema(props.profileUrl)\n .then(() => {\n const profile = tryGetProfile(profileUrl);\n if (profile) {\n setSchemaLoaded(profile.name);\n } else {\n console.log(`Schema not found for ${profileUrl}`);\n }\n })\n .catch(console.log);\n } else {\n const schemaName = props.schemaName ?? defaultValue?.resourceType;\n medplum\n .requestSchema(schemaName)\n .then(() => setSchemaLoaded(schemaName))\n .catch(console.log);\n }\n }\n }, [medplum, defaultValue, props.schemaName, props.profileUrl]);\n\n if (!schemaLoaded || !value) {\n return <div>Loading...</div>;\n }\n\n return (\n <form\n noValidate\n autoComplete=\"off\"\n onSubmit={(e: FormEvent) => {\n e.preventDefault();\n if (props.onSubmit) {\n props.onSubmit(value);\n }\n }}\n >\n <Stack mb=\"xl\">\n <FormSection title=\"Resource Type\" htmlFor=\"resourceType\" outcome={outcome}>\n <TextInput name=\"resourceType\" defaultValue={value.resourceType} disabled={true} />\n </FormSection>\n <FormSection title=\"ID\" htmlFor=\"id\" outcome={outcome}>\n <TextInput name=\"id\" defaultValue={value.id} disabled={true} />\n </FormSection>\n </Stack>\n <BackboneElementInput\n typeName={schemaLoaded}\n defaultValue={value}\n outcome={outcome}\n onChange={setValue}\n profileUrl={props.profileUrl}\n />\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">OK</Button>\n {props.onDelete && (\n <Button\n variant=\"outline\"\n color=\"red\"\n type=\"button\"\n onClick={() => {\n (props.onDelete as (resource: Resource) => void)(value);\n }}\n >\n Delete\n </Button>\n )}\n </Group>\n </form>\n );\n}\n", "import { Table } from '@mantine/core';\nimport { formatDateTime, normalizeErrorString } from '@medplum/core';\nimport { Bundle, BundleEntry, Resource, ResourceType } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\n\nexport interface ResourceHistoryTableProps {\n history?: Bundle;\n resourceType?: string;\n id?: string;\n}\n\nexport function ResourceHistoryTable(props: ResourceHistoryTableProps): JSX.Element {\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum\n .readHistory(props.resourceType as ResourceType, props.id)\n .then(setValue)\n .catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n return (\n <Table withBorder withColumnBorders>\n <thead>\n <tr>\n <th>Author</th>\n <th>Date</th>\n <th>Version</th>\n </tr>\n </thead>\n <tbody>{value.entry?.map((entry, index) => <HistoryRow key={'entry-' + index} entry={entry} />)}</tbody>\n </Table>\n );\n}\n\ninterface HistoryRowProps {\n entry: BundleEntry;\n}\n\nfunction HistoryRow(props: HistoryRowProps): JSX.Element {\n const { response, resource } = props.entry;\n if (resource) {\n return (\n <tr>\n <td>\n <ResourceBadge value={resource.meta?.author} link={true} />\n </td>\n <td>{formatDateTime(resource.meta?.lastUpdated)}</td>\n <td>\n <MedplumLink to={getVersionUrl(resource)}>{resource.meta?.versionId}</MedplumLink>\n </td>\n </tr>\n );\n } else {\n return (\n <tr>\n <td colSpan={3}>{normalizeErrorString(response?.outcome)}</td>\n </tr>\n );\n }\n}\n\nfunction getVersionUrl(resource: Resource): string {\n return `/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`;\n}\n", "import { Button, createStyles, Stack, Text } from '@mantine/core';\nimport { getReferenceString, isReference } from '@medplum/core';\nimport { Questionnaire, QuestionnaireResponse, Reference, Schedule, Slot } from '@medplum/fhirtypes';\nimport { useResource, useSearchResources } from '@medplum/react-hooks';\nimport { useState } from 'react';\nimport { CalendarInput } from '../CalendarInput/CalendarInput';\nimport { getStartMonth } from '../CalendarInput/CalendarInput.utils';\nimport { QuestionnaireForm } from '../QuestionnaireForm/QuestionnaireForm';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nconst useStyles = createStyles((theme) => ({\n container: {\n display: 'flex',\n minHeight: 400,\n },\n\n info: {\n minWidth: 300,\n padding: 20,\n borderRight: `1px solid ${theme.colors.gray[3]}`,\n },\n\n selection: {\n minWidth: 300,\n padding: 20,\n },\n}));\n\nexport interface SchedulerProps {\n schedule: Schedule | Reference<Schedule>;\n questionnaire: Questionnaire | Reference<Questionnaire>;\n}\n\nexport function Scheduler(props: SchedulerProps): JSX.Element | null {\n const { classes } = useStyles();\n const schedule = useResource(props.schedule);\n const questionnaire = useResource(props.questionnaire);\n\n const [month, setMonth] = useState<Date>(getStartMonth());\n const [date, setDate] = useState<Date>();\n const [slot, setSlot] = useState<Slot>();\n const [response, setResponse] = useState<QuestionnaireResponse>();\n\n const [slots] = useSearchResources(\n 'Slot',\n new URLSearchParams([\n ['_count', (30 * 24).toString()],\n [\n 'schedule',\n isReference(props.schedule)\n ? (props.schedule.reference as string)\n : getReferenceString(props.schedule as Schedule),\n ],\n ['start', 'gt' + getStart(month)],\n ['start', 'lt' + getEnd(month)],\n ])\n );\n\n if (!schedule || !slots || !questionnaire) {\n return null;\n }\n\n const actor = schedule.actor?.[0];\n\n return (\n <div className={classes.container} data-testid=\"scheduler\">\n <div className={classes.info}>\n {actor && <ResourceAvatar value={actor} size=\"xl\" />}\n {actor && (\n <Text size=\"xl\" weight={500}>\n <ResourceName value={actor} />\n </Text>\n )}\n <p>1 hour</p>\n {date && <p>{date.toLocaleDateString()}</p>}\n {slot && <p>{formatTime(new Date(slot.start as string))}</p>}\n </div>\n <div className={classes.selection}>\n {!date && (\n <div>\n <h3>Select date</h3>\n <CalendarInput slots={slots} onChangeMonth={setMonth} onClick={setDate} />\n </div>\n )}\n {date && !slot && (\n <div>\n <h3>Select time</h3>\n <Stack>\n {slots.map((s) => {\n const slotStart = new Date(s.start as string);\n return (\n slotStart.getTime() > date.getTime() &&\n slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (\n <div key={s.id}>\n <Button variant=\"outline\" style={{ width: 150 }} onClick={() => setSlot(s)}>\n {formatTime(slotStart)}\n </Button>\n </div>\n )\n );\n })}\n </Stack>\n </div>\n )}\n {date && slot && !response && (\n <QuestionnaireForm questionnaire={questionnaire} submitButtonText={'Next'} onSubmit={setResponse} />\n )}\n {date && slot && response && (\n <div>\n <h3>You're all set!</h3>\n <p>Check your email for a calendar invite.</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction getStart(month: Date): string {\n return formatSlotInstant(month.getTime());\n}\n\nfunction getEnd(month: Date): string {\n return formatSlotInstant(month.getTime() + 31 * 24 * 60 * 60 * 1000);\n}\n\nfunction formatSlotInstant(time: number): string {\n const date = new Date(Math.max(Date.now(), time));\n date.setHours(0, 0, 0, 0);\n return date.toISOString();\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n}\n", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Group, Patient, Reference, ResourceType, ServiceRequest } from '@medplum/fhirtypes';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface ServiceRequestTimelineProps {\n serviceRequest: ServiceRequest | Reference<ServiceRequest>;\n}\n\nexport function ServiceRequestTimeline(props: ServiceRequestTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.serviceRequest}\n loadTimelineResources={async (medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory('ServiceRequest', id),\n medplum.search('Communication', { 'based-on': ref, _count }),\n medplum.search('DiagnosticReport', { 'based-on': ref, _count }),\n medplum.search('Media', { 'based-on': ref, _count }),\n medplum.search('DocumentReference', { related: ref, _count }),\n medplum.search('Task', { _filter: `based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`, _count }),\n ]);\n }}\n createCommunication={(resource: ServiceRequest, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject as Reference<Group | Patient>,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: ServiceRequest, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { Anchor, AnchorProps } from '@mantine/core';\nimport { showNotification } from '@mantine/notifications';\nimport { normalizeErrorString } from '@medplum/core';\nimport { ClientApplication, Encounter, Patient, Reference, SmartAppLaunch } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ReactNode } from 'react';\n\nexport interface SmartAppLaunchLinkProps extends AnchorProps {\n readonly client: ClientApplication;\n readonly patient?: Reference<Patient>;\n readonly encounter?: Reference<Encounter>;\n readonly children?: ReactNode;\n}\n\nexport function SmartAppLaunchLink(props: SmartAppLaunchLinkProps): JSX.Element | null {\n const medplum = useMedplum();\n const { client, patient, encounter, children, ...rest } = props;\n\n function launchApp(): void {\n medplum\n .createResource<SmartAppLaunch>({\n resourceType: 'SmartAppLaunch',\n patient,\n encounter,\n })\n .then((result) => {\n const url = new URL(client.launchUri as string);\n url.searchParams.set('iss', medplum.getBaseUrl() + 'fhir/R4');\n url.searchParams.set('launch', result.id as string);\n window.location.assign(url.toString());\n })\n .catch((err) => showNotification({ color: 'red', message: normalizeErrorString(err), autoClose: false }));\n }\n\n return (\n <Anchor onClick={() => launchApp()} {...rest}>\n {children}\n </Anchor>\n );\n}\n", "import { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ReactNode, useEffect, useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { NewProjectForm } from './NewProjectForm';\nimport { NewUserForm } from './NewUserForm';\n\nexport interface RegisterFormProps {\n readonly type: 'patient' | 'project';\n readonly projectId?: string;\n readonly clientId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey?: string;\n readonly children?: ReactNode;\n readonly onSuccess: () => void;\n}\n\nexport function RegisterForm(props: RegisterFormProps): JSX.Element {\n const { type, projectId, clientId, googleClientId, recaptchaSiteKey, onSuccess } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string>();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n\n useEffect(() => {\n if (type === 'patient' && login) {\n medplum\n .startNewPatient({ login, projectId: projectId as string })\n .then((response) => medplum.processCode(response.code as string))\n .then(() => onSuccess())\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }\n }, [medplum, type, projectId, login, onSuccess]);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n if (response.code) {\n medplum\n .processCode(response.code)\n .then(() => onSuccess())\n .catch(console.log);\n } else if (response.login) {\n setLogin(response.login);\n }\n }\n\n return (\n <Document width={450}>\n {outcome && <pre>{JSON.stringify(outcome, null, 2)}</pre>}\n {!login && (\n <NewUserForm\n projectId={projectId as string}\n clientId={clientId}\n googleClientId={googleClientId}\n recaptchaSiteKey={recaptchaSiteKey}\n handleAuthResponse={handleAuthResponse}\n >\n {props.children}\n </NewUserForm>\n )}\n {login && type === 'project' && <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />}\n </Document>\n );\n}\n", "import { Anchor, Button, Center, Group, Stack, Text, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface NewProjectFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewProjectForm(props: NewProjectFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n props.handleAuthResponse(\n await medplum.startNewProject({\n login: props.login,\n projectName: formData.projectName,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Create project</Title>\n </Center>\n <Stack spacing=\"xl\">\n <TextInput\n name=\"projectName\"\n label=\"Project Name\"\n placeholder=\"My Project\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy&nbsp;Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms&nbsp;of&nbsp;Service</Anchor>.\n </Text>\n </Stack>\n <Group position=\"right\" mt=\"xl\" noWrap>\n <Button type=\"submit\">Create project</Button>\n </Group>\n </Form>\n );\n}\n", "import { Anchor, Button, Center, Checkbox, Divider, Group, PasswordInput, Stack, Text, TextInput } from '@mantine/core';\nimport { GoogleCredentialResponse, LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ReactNode, useEffect, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { GoogleButton } from '../GoogleButton/GoogleButton';\nimport { getGoogleClientId } from '../GoogleButton/GoogleButton.utils';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\nimport { getRecaptcha, initRecaptcha } from '../utils/recaptcha';\n\nexport interface NewUserFormProps {\n readonly projectId: string;\n readonly clientId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey?: string;\n readonly children?: ReactNode;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewUserForm(props: NewUserFormProps): JSX.Element {\n const googleClientId = getGoogleClientId(props.googleClientId);\n const recaptchaSiteKey = props.recaptchaSiteKey;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n useEffect(() => {\n if (recaptchaSiteKey) {\n initRecaptcha(recaptchaSiteKey);\n }\n }, [recaptchaSiteKey]);\n\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n let recaptchaToken = '';\n if (recaptchaSiteKey) {\n recaptchaToken = await getRecaptcha(recaptchaSiteKey);\n }\n props.handleAuthResponse(\n await medplum.startNewUser({\n projectId: props.projectId,\n clientId: props.clientId,\n firstName: formData.firstName,\n lastName: formData.lastName,\n email: formData.email,\n password: formData.password,\n remember: formData.remember === 'true',\n recaptchaSiteKey,\n recaptchaToken,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n >\n <Center sx={{ flexDirection: 'column' }}>{props.children}</Center>\n <OperationOutcomeAlert issues={issues} />\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton\n googleClientId={googleClientId}\n handleGoogleCredential={async (response: GoogleCredentialResponse) => {\n try {\n props.handleAuthResponse(\n await medplum.startGoogleLogin({\n googleClientId: response.clientId,\n googleCredential: response.credential,\n createUser: true,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n />\n </Group>\n <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />\n </>\n )}\n <Stack spacing=\"xl\">\n <TextInput\n name=\"firstName\"\n type=\"text\"\n label=\"First name\"\n placeholder=\"First name\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <TextInput\n name=\"lastName\"\n type=\"text\"\n label=\"Last name\"\n placeholder=\"Last name\"\n required={true}\n error={getErrorsForInput(outcome, 'lastName')}\n />\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n error={getErrorsForInput(outcome, 'email')}\n />\n <PasswordInput\n name=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy&nbsp;Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms&nbsp;of&nbsp;Service</Anchor>.\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n This site is protected by reCAPTCHA and the Google{' '}\n <Anchor href=\"https://policies.google.com/privacy\">Privacy&nbsp;Policy</Anchor>\n {' and '}\n <Anchor href=\"https://policies.google.com/terms\">Terms&nbsp;of&nbsp;Service</Anchor> apply.\n </Text>\n </Stack>\n <Group position=\"apart\" mt=\"xl\" noWrap>\n <Checkbox name=\"remember\" label=\"Remember me\" size=\"xs\" />\n <Button type=\"submit\">Create account</Button>\n </Group>\n </Form>\n );\n}\n", "import { GoogleCredentialResponse } from '@medplum/core';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useEffect, useRef, useState } from 'react';\nimport { createScriptTag } from '../utils/script';\n\ninterface GoogleApi {\n accounts: {\n id: {\n initialize: (args: any) => void;\n renderButton: (parent: HTMLElement, args: any) => void;\n };\n };\n}\n\ndeclare const google: GoogleApi;\n\nexport interface GoogleButtonProps {\n readonly googleClientId?: string;\n readonly handleGoogleCredential: (response: GoogleCredentialResponse) => void;\n}\n\nexport function GoogleButton(props: GoogleButtonProps): JSX.Element | null {\n const medplum = useMedplum();\n const { googleClientId, handleGoogleCredential } = props;\n const parentRef = useRef<HTMLDivElement>(null);\n const [scriptLoaded, setScriptLoaded] = useState<boolean>(typeof google !== 'undefined');\n const [initialized, setInitialized] = useState(false);\n const [buttonRendered, setButtonRendered] = useState(false);\n\n useEffect(() => {\n if (typeof google === 'undefined') {\n createScriptTag('https://accounts.google.com/gsi/client', () => setScriptLoaded(true));\n return;\n }\n\n if (!initialized) {\n google.accounts.id.initialize({\n client_id: googleClientId,\n callback: handleGoogleCredential,\n });\n setInitialized(true);\n }\n\n if (parentRef.current && !buttonRendered) {\n google.accounts.id.renderButton(parentRef.current, {});\n setButtonRendered(true);\n }\n }, [medplum, googleClientId, initialized, scriptLoaded, parentRef, buttonRendered, handleGoogleCredential]);\n\n if (!googleClientId) {\n return null;\n }\n\n return <div ref={parentRef} />;\n}\n", "/**\n * Dynamically creates a script tag for the specified JavaScript file.\n * @param src - The JavaScript file URL.\n * @param onload - Optional callback for the onload event.\n */\nexport function createScriptTag(src: string, onload?: () => void): void {\n const head = document.getElementsByTagName('head')[0];\n const script = document.createElement('script');\n script.async = true;\n script.src = src;\n script.onload = onload ?? null;\n head.appendChild(script);\n}\n", "export function getGoogleClientId(clientId: string | undefined): string | undefined {\n if (clientId) {\n return clientId;\n }\n\n if (typeof window !== 'undefined') {\n const origin = window.location.protocol + '//' + window.location.host;\n const authorizedOrigins = import.meta.env.GOOGLE_AUTH_ORIGINS?.split(',') ?? [];\n if (authorizedOrigins.includes(origin)) {\n return import.meta.env.GOOGLE_CLIENT_ID;\n }\n }\n\n return undefined;\n}\n", "import { createScriptTag } from './script';\n\n// reCAPTCHA type definitions do not work with Vite project aliasing.\n// Project aliasing is more valuable than type definitions,\n// so cheating and using `any` here.\ndeclare let grecaptcha: any;\n\n/**\n * Dynamically loads the recaptcha script.\n * We do not want to load the script on page load unless the user needs it.\n * @param siteKey - The reCAPTCHA site key, available from the reCAPTCHA admin page.\n */\nexport function initRecaptcha(siteKey: string): void {\n if (typeof grecaptcha === 'undefined') {\n createScriptTag('https://www.google.com/recaptcha/api.js?render=' + siteKey);\n }\n}\n\n/**\n * Starts a request to generate a recapcha token.\n * @param siteKey - The reCAPTCHA site key, available from the reCAPTCHA admin page.\n * @returns Promise to a recaptcha token for the current user.\n */\nexport function getRecaptcha(siteKey: string): Promise<string> {\n return new Promise((resolve, reject) => {\n grecaptcha.ready(async () => {\n try {\n resolve(await grecaptcha.execute(siteKey, { action: 'submit' }));\n } catch (err) {\n reject(err);\n }\n });\n });\n}\n", "import { showNotification } from '@mantine/notifications';\nimport { BaseLoginRequest, LoginAuthenticationResponse, normalizeErrorString } from '@medplum/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { AuthenticationForm } from './AuthenticationForm';\nimport { ChooseProfileForm } from './ChooseProfileForm';\nimport { ChooseScopeForm } from './ChooseScopeForm';\nimport { MfaForm } from './MfaForm';\nimport { NewProjectForm } from './NewProjectForm';\n\nexport interface SignInFormProps extends BaseLoginRequest {\n readonly login?: string;\n readonly chooseScopes?: boolean;\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onSuccess?: () => void;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly onCode?: (code: string) => void;\n readonly children?: ReactNode;\n}\n\n/**\n * The SignInForm component allows users to sign in to Medplum.\n *\n * \"Signing in\" is a multi-step process:\n * 1) Authentication - identify the user\n * 2) MFA - If MFA is enabled, prompt for MFA code\n * 3) Choose profile - If the user has multiple profiles, prompt to choose one\n * 4) Choose scope - If the user has multiple scopes, prompt to choose one\n * 5) Success - Return to the caller with either a code or a redirect\n * @param props - The SignInForm React props.\n * @returns The SignInForm React node.\n */\nexport function SignInForm(props: SignInFormProps): JSX.Element {\n const {\n login: loginCode,\n chooseScopes,\n onSuccess,\n onForgotPassword,\n onRegister,\n onCode,\n ...baseLoginRequest\n } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string>();\n const [mfaRequired, setAuthenticatorRequired] = useState(false);\n const [memberships, setMemberships] = useState<ProjectMembership[]>();\n\n const handleCode = useCallback(\n (code: string): void => {\n if (onCode) {\n onCode(code);\n } else {\n medplum\n .processCode(code)\n .then(() => {\n if (onSuccess) {\n onSuccess();\n }\n })\n .catch((err) => showNotification({ color: 'red', message: normalizeErrorString(err) }));\n }\n },\n [medplum, onCode, onSuccess]\n );\n\n const handleAuthResponse = useCallback(\n (response: LoginAuthenticationResponse): void => {\n setAuthenticatorRequired(!!response.mfaRequired);\n\n if (response.login) {\n setLogin(response.login);\n }\n\n if (response.memberships) {\n setMemberships(response.memberships);\n }\n\n if (response.code) {\n if (chooseScopes) {\n setMemberships(undefined);\n } else {\n handleCode(response.code as string);\n }\n }\n },\n [chooseScopes, handleCode]\n );\n\n const handleScopeResponse = useCallback(\n (response: LoginAuthenticationResponse): void => {\n handleCode(response.code as string);\n },\n [handleCode]\n );\n\n useEffect(() => {\n // Beware the race condition here\n // The `useMedplum` hook will return a new instance of the MedplumClient on login\n // We do not want to request the login status again in that case\n // Only request login status once\n if (loginCode && !login) {\n medplum\n .get('auth/login/' + loginCode)\n .then(handleAuthResponse)\n .catch((err) => showNotification({ color: 'red', message: normalizeErrorString(err) }));\n }\n }, [medplum, loginCode, login, handleAuthResponse]);\n\n return (\n <Document width={450}>\n {(() => {\n if (!login) {\n return (\n <AuthenticationForm\n onForgotPassword={onForgotPassword}\n onRegister={onRegister}\n handleAuthResponse={handleAuthResponse}\n disableGoogleAuth={props.disableGoogleAuth}\n disableEmailAuth={props.disableEmailAuth}\n {...baseLoginRequest}\n >\n {props.children}\n </AuthenticationForm>\n );\n } else if (mfaRequired) {\n return <MfaForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (memberships) {\n return <ChooseProfileForm login={login} memberships={memberships} handleAuthResponse={handleAuthResponse} />;\n } else if (props.projectId === 'new') {\n return <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (props.chooseScopes) {\n return <ChooseScopeForm login={login} scope={props.scope} handleAuthResponse={handleScopeResponse} />;\n } else {\n return <div>Success</div>;\n }\n })()}\n </Document>\n );\n}\n", "import { Anchor, Button, Center, Checkbox, Divider, Group, PasswordInput, Stack, TextInput } from '@mantine/core';\nimport {\n BaseLoginRequest,\n GoogleCredentialResponse,\n GoogleLoginRequest,\n LoginAuthenticationResponse,\n normalizeOperationOutcome,\n} from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ReactNode, useCallback, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { GoogleButton } from '../GoogleButton/GoogleButton';\nimport { getGoogleClientId } from '../GoogleButton/GoogleButton.utils';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\n\nexport interface AuthenticationFormProps extends BaseLoginRequest {\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: ReactNode;\n}\n\nexport function AuthenticationForm(props: AuthenticationFormProps): JSX.Element {\n const [email, setEmail] = useState<string>();\n\n if (!email) {\n return <EmailForm setEmail={setEmail} {...props} />;\n } else {\n return <PasswordForm email={email} {...props} />;\n }\n}\n\nexport interface EmailFormProps extends BaseLoginRequest {\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly setEmail: (email: string) => void;\n readonly children?: ReactNode;\n}\n\nexport function EmailForm(props: EmailFormProps): JSX.Element {\n const { setEmail, onRegister, handleAuthResponse, children, disableEmailAuth, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const googleClientId = !props.disableGoogleAuth && getGoogleClientId(props.googleClientId);\n\n const isExternalAuth = useCallback(\n async (authMethod: any): Promise<boolean> => {\n if (!authMethod.authorizeUrl) {\n return false;\n }\n\n const state = JSON.stringify({\n ...(await medplum.ensureCodeChallenge(baseLoginRequest)),\n domain: authMethod.domain,\n });\n const url = new URL(authMethod.authorizeUrl);\n url.searchParams.set('state', state);\n window.location.assign(url.toString());\n return true;\n },\n [medplum, baseLoginRequest]\n );\n\n const handleSubmit = useCallback(\n async (formData: Record<string, string>) => {\n const authMethod = await medplum.post('auth/method', { email: formData.email });\n if (!(await isExternalAuth(authMethod))) {\n setEmail(formData.email);\n }\n },\n [medplum, isExternalAuth, setEmail]\n );\n\n const handleGoogleCredential = useCallback(\n async (response: GoogleCredentialResponse) => {\n const authResponse = await medplum.startGoogleLogin({\n ...baseLoginRequest,\n googleCredential: response.credential,\n } as GoogleLoginRequest);\n if (!(await isExternalAuth(authResponse))) {\n handleAuthResponse(authResponse);\n }\n },\n [medplum, baseLoginRequest, isExternalAuth, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton googleClientId={googleClientId} handleGoogleCredential={handleGoogleCredential} />\n </Group>\n {!disableEmailAuth && <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />}\n </>\n )}\n {!disableEmailAuth && (\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n autoFocus={true}\n />\n )}\n <Group position=\"apart\" mt=\"xl\" spacing={0} noWrap>\n <div>\n {onRegister && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onRegister} size=\"xs\">\n Register\n </Anchor>\n )}\n </div>\n {!disableEmailAuth && <Button type=\"submit\">Next</Button>}\n </Group>\n </Form>\n );\n}\n\nexport interface PasswordFormProps extends BaseLoginRequest {\n readonly email: string;\n readonly onForgotPassword?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: ReactNode;\n}\n\nexport function PasswordForm(props: PasswordFormProps): JSX.Element {\n const { onForgotPassword, handleAuthResponse, children, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .startLogin({\n ...baseLoginRequest,\n password: formData.password,\n remember: formData.remember === 'on',\n })\n .then(handleAuthResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n },\n [medplum, baseLoginRequest, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center sx={{ flexDirection: 'column' }}>{children}</Center>\n <OperationOutcomeAlert issues={issues} />\n <Stack spacing=\"xl\">\n <PasswordInput\n name=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n </Stack>\n <Group position=\"apart\" mt=\"xl\" spacing={0} noWrap>\n {onForgotPassword && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onForgotPassword} size=\"xs\">\n Forgot password\n </Anchor>\n )}\n <Checkbox id=\"remember\" name=\"remember\" label=\"Remember me\" size=\"xs\" sx={{ lineHeight: 1 }} />\n <Button type=\"submit\">Sign in</Button>\n </Group>\n </Form>\n );\n}\n", "import { Avatar, Center, Group, Stack, Text, Title, UnstyledButton } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome, ProjectMembership } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\n\nexport interface ChooseProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseProfileForm(props: ChooseProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n return (\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title order={3}>Choose profile</Title>\n </Center>\n <OperationOutcomeAlert outcome={outcome} />\n {props.memberships.map((membership: ProjectMembership) => (\n <UnstyledButton\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {membership.profile?.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {membership.project?.display}\n </Text>\n </div>\n </Group>\n </UnstyledButton>\n ))}\n </Stack>\n );\n}\n", "import { Button, Center, Checkbox, Group, Stack, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '@medplum/react-hooks';\n\nexport interface ChooseScopeFormProps {\n login: string;\n scope: string | undefined;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseScopeForm(props: ChooseScopeFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n medplum\n .post('auth/scope', {\n login: props.login,\n scope: Object.keys(formData).join(' '),\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose scope</Title>\n </Center>\n <Stack>\n {(props.scope ?? 'openid').split(' ').map((scopeName: string) => (\n <Checkbox key={scopeName} id={scopeName} name={scopeName} label={scopeName} defaultChecked />\n ))}\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Set scope</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n", "import { Alert, Button, Center, Group, Stack, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '@medplum/react-hooks';\n\nexport interface MfaFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function MfaForm(props: MfaFormProps): JSX.Element {\n const medplum = useMedplum();\n const [errorMessage, setErrorMessage] = useState<string>();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n setErrorMessage(undefined);\n medplum\n .post('auth/mfa/verify', {\n login: props.login,\n token: formData.token,\n })\n .then(props.handleAuthResponse)\n .catch((err) => setErrorMessage(normalizeErrorString(err)));\n }}\n >\n <Stack>\n <Center sx={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Enter MFA code</Title>\n </Center>\n {errorMessage && (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Error\" color=\"red\">\n {errorMessage}\n </Alert>\n )}\n <Stack>\n <TextInput name=\"token\" label=\"MFA code\" required />\n </Stack>\n <Group position=\"right\" mt=\"xl\">\n <Button type=\"submit\">Submit code</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n"],
5
- "mappings": "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",
6
- "names": ["require_pointer", "__commonJSMin", "exports", "unescape", "token", "escape", "Pointer", "tokens", "path", "object", "parent", "key", "value", "i", "endpoint", "require_util", "__commonJSMin", "exports", "objectType", "object", "isNonPrimitive", "value", "clone", "source", "length_1", "arrayTarget", "i", "dateTarget", "objectTarget", "key", "require_diff", "__commonJSMin", "exports", "util_1", "isDestructive", "_a", "op", "subtract", "minuend", "subtrahend", "obj", "add_key", "del_key", "intersection", "objects", "length", "counter", "i", "object", "key", "isArrayAdd", "array_operation", "isArrayRemove", "appendArrayOperation", "base", "operation", "diffArrays", "input", "output", "ptr", "diff", "diffAny", "memo", "dist", "j", "memo_key", "memoized", "alternatives", "remove_base", "remove_operation", "add_base", "add_operation", "replace_base", "replace_operation", "best", "a", "b", "input_length", "output_length", "array_operations", "padded_operations", "operations", "padding", "padded_index", "index_token", "replace_ptr", "replace_operations", "diffObjects", "input_type", "output_type", "require_patch", "__commonJSMin", "exports", "__extends", "extendStatics", "d", "b", "p", "__", "pointer_1", "util_1", "diff_1", "MissingError", "_super", "path", "_this", "TestError", "actual", "expected", "_add", "object", "key", "value", "index", "_remove", "add", "operation", "endpoint", "remove", "replace", "move", "from_endpoint", "copy", "test", "InvalidOperationError", "apply", "require_rfc6902", "__commonJSMin", "exports", "pointer_1", "patch_1", "diff_1", "applyPatch", "object", "patch", "operation", "wrapVoidableDiff", "diff", "wrappedDiff", "input", "output", "ptr", "custom_patch", "createPatch", "createTest", "path", "endpoint", "createTests", "tests", "pathTest", "fromTest", "useEffect", "useMemo", "useState", "createContext", "useContext", "jsx", "deepEquals", "isReference", "isResource", "normalizeOperationOutcome", "useCallback", "allOk", "reactContext", "useMedplumContext", "useMedplum", "useMedplumNavigate", "useMedplumProfile", "MedplumProvider", "props", "medplum", "navigate", "defaultNavigate", "state", "setState", "s", "eventListener", "medplumContext", "path", "useResource", "value", "setOutcome", "resource", "setResource", "getInitialResource", "setResourceIfChanged", "r", "subscribed", "err", "useSearch", "resourceType", "query", "useSearchImpl", "useSearchOne", "useSearchResources", "searchFn", "searchKey", "setSearchKey", "loading", "setLoading", "result", "setResult", "outcome", "key", "res", "formatAddress", "Fragment", "jsx", "AddressDisplay", "props", "address", "Group", "NativeSelect", "TextInput", "useRef", "useState", "jsx", "jsxs", "getLine", "address", "index", "setLine", "str", "line", "AddressInput", "props", "value", "setValue", "valueRef", "setValueWrapper", "newValue", "setUse", "use", "setType", "type", "setLine1", "line1", "setLine2", "line2", "setCity", "city", "setState", "state", "setPostalCode", "postalCode", "e", "TextInput", "createReference", "useRef", "useState", "jsx", "AnnotationInput", "props", "author", "w", "value", "setValue", "valueRef", "setText", "text", "newValue", "createReference", "TextInput", "e", "MantineAppShell", "useMantineTheme", "showNotification", "Suspense", "useEffect", "useState", "Alert", "normalizeErrorString", "defaultAttributes", "createReactComponent", "iconName", "iconNamePascal", "iconNode", "Component", "forwardRef", "_a", "ref", "_b", "color", "size", "stroke", "children", "rest", "__objRest", "createElement", "__spreadValues", "__spreadProps", "defaultAttributes", "tag", "attrs", "PropTypes", "IconAdjustmentsHorizontal", "createReactComponent", "IconAlertCircle", "createReactComponent", "IconArrowDown", "createReactComponent", "IconArrowUp", "createReactComponent", "IconBleachOff", "createReactComponent", "IconBleach", "createReactComponent", "IconBoxMultiple", "createReactComponent", "IconBracketsContain", "createReactComponent", "IconBucketOff", "createReactComponent", "IconBucket", "createReactComponent", "IconCalendar", "createReactComponent", "IconCheck", "createReactComponent", "IconCheckbox", "createReactComponent", "IconChevronDown", "createReactComponent", "IconCircleMinus", "createReactComponent", "IconCirclePlus", "createReactComponent", "IconCloudUpload", "createReactComponent", "IconColumns", "createReactComponent", "IconCopy", "createReactComponent", "IconCurrencyDollar", "createReactComponent", "IconDots", "createReactComponent", "IconEdit", "createReactComponent", "IconEqualNot", "createReactComponent", "IconEqual", "createReactComponent", "IconFileAlert", "createReactComponent", "IconFilePlus", "createReactComponent", "IconFilter", "createReactComponent", "IconGenderFemale", "createReactComponent", "IconListDetails", "createReactComponent", "IconLogout", "createReactComponent", "IconMathGreater", "createReactComponent", "IconMathLower", "createReactComponent", "IconMessage", "createReactComponent", "IconPin", "createReactComponent", "IconPinnedOff", "createReactComponent", "IconPlus", "createReactComponent", "IconRefresh", "createReactComponent", "IconSearch", "createReactComponent", "IconSettings", "createReactComponent", "IconSortAscending", "createReactComponent", "IconSortDescending", "createReactComponent", "IconSquare", "createReactComponent", "IconStethoscope", "createReactComponent", "IconSwitchHorizontal", "createReactComponent", "IconTableExport", "createReactComponent", "IconTrash", "createReactComponent", "IconUserSquare", "createReactComponent", "IconX", "createReactComponent", "Component", "jsx", "ErrorBoundary", "props", "error", "_prevProps", "_prevState", "nextProps", "nextState", "errorInfo", "Alert", "IconAlertCircle", "normalizeErrorString", "Center", "Loader", "jsx", "Loading", "Avatar", "createStyles", "Group", "MantineHeader", "Menu", "Stack", "Text", "UnstyledButton", "formatHumanName", "getReferenceString", "useState", "formatHumanName", "Fragment", "jsx", "HumanNameDisplay", "props", "name", "Avatar", "getDisplayString", "getImageSrc", "Anchor", "isReference", "isResource", "killEvent", "isCheckboxCell", "el", "isCheckboxElement", "children", "jsx", "MedplumLink", "props", "navigate", "B", "to", "suffix", "label", "onClick", "children", "rest", "href", "getHref", "Anchor", "e", "killEvent", "getStringHref", "isResource", "getResourceHref", "isReference", "getReferenceHref", "jsx", "ResourceAvatar", "props", "resource", "j", "text", "getDisplayString", "imageUrl", "getImageSrc", "radius", "avatarProps", "MedplumLink", "Avatar", "createStyles", "Group", "Text", "formatHumanName", "getDisplayString", "getReferenceString", "isUUID", "forwardRef", "useCallback", "Loader", "MultiSelect", "showNotification", "normalizeErrorString", "useCallback", "useEffect", "useRef", "useState", "jsx", "AsyncAutocomplete", "props", "defaultValue", "toKey", "toOption", "loadOptions", "onChange", "onCreate", "creatable", "rest", "defaultItems", "toDefaultItems", "inputRef", "useRef", "timer", "setTimer", "useState", "abortController", "setAbortController", "autoSubmit", "setAutoSubmit", "selected", "setSelected", "options", "setOptions", "lastLoadOptionsRef", "lastValueRef", "timerRef", "abortControllerRef", "autoSubmitRef", "optionsRef", "handleTimer", "useCallback", "value", "newAbortController", "newValues", "err", "showNotification", "normalizeErrorString", "handleSearchChange", "newTimer", "handleChange", "values", "result", "newSelected", "option", "item", "handleKeyDown", "e", "killEvent", "handleCreate", "input", "handleFilter", "_value", "useEffect", "MultiSelect", "Loader", "jsx", "jsxs", "useStyles", "createStyles", "toKey", "resource", "toOption", "getDisplayString", "HeaderSearchInput", "props", "classes", "navigate", "B", "medplum", "s", "loadData", "useCallback", "input", "signal", "query", "buildGraphQLQuery", "options", "response", "getResourcesFromResponse", "handleSelect", "item", "getReferenceString", "AsyncAutocomplete", "IconSearch", "ItemComponent", "forwardRef", "others", "ref", "helpText", "Group", "ResourceAvatar", "Text", "escaped", "isUUID", "resources", "sortByRelevance", "dedupeResources", "ids", "result", "a", "b", "getResourceScore", "bestScore", "identifier", "getStringScore", "name", "formatHumanName", "str", "index", "jsx", "jsxs", "useStyles", "createStyles", "theme", "Header", "props", "context", "m", "medplum", "profile", "navigate", "logins", "classes", "cx", "userMenuOpened", "setUserMenuOpened", "useState", "MantineHeader", "Group", "UnstyledButton", "HeaderSearchInput", "Menu", "o", "ResourceAvatar", "Text", "formatHumanName", "IconChevronDown", "Stack", "HumanNameDisplay", "login", "getReferenceString", "Avatar", "IconSwitchHorizontal", "IconSettings", "IconLogout", "Button", "createStyles", "MantineNavbar", "ScrollArea", "Space", "Text", "Fragment", "useState", "Button", "Group", "Modal", "NativeSelect", "Stack", "TextInput", "showNotification", "deepClone", "normalizeErrorString", "parseForm", "form", "result", "element", "parseInputElement", "parseSelectElement", "el", "jsx", "Form", "props", "e", "formData", "parseForm", "jsx", "jsxs", "BookmarkDialog", "props", "medplum", "s", "config", "submitHandler", "formData", "menuname", "name", "target", "newConfig", "deepClone", "title", "res", "showNotification", "err", "normalizeErrorString", "Modal", "Form", "Stack", "SelectMenu", "TextInput", "Group", "Button", "userConfigToMenu", "menu", "menus", "NativeSelect", "useCallback", "useState", "useState", "useCallback", "jsx", "toKey", "element", "getDisplay", "item", "toOption", "createValue", "input", "ValueSetAutocomplete", "props", "medplum", "s", "binding", "creatable", "clearable", "expandParams", "rest", "loadValues", "useCallback", "signal", "valueSetElements", "newData", "valueSetElement", "AsyncAutocomplete", "query", "jsx", "CodeInput", "props", "defaultValue", "onChange", "rest", "value", "setValue", "useState", "handleChange", "newValues", "newValue", "newCode", "valueSetElementToCode", "ValueSetAutocomplete", "codeToValueSetElement", "code", "element", "jsx", "ResourceTypeInput", "props", "resourceType", "setResourceType", "useState", "onChange", "setResourceTypeWrapper", "useCallback", "newResourceType", "CodeInput", "Fragment", "jsx", "jsxs", "useStyles", "createStyles", "theme", "Navbar", "props", "classes", "navigate", "B", "activeLink", "getActiveLink", "bookmarkDialogVisible", "setBookmarkDialogVisible", "useState", "onLinkClick", "e", "to", "navigateResourceType", "resourceType", "MantineNavbar", "ScrollArea", "ResourceTypeInput", "newValue", "menu", "Text", "link", "NavbarLink", "NavLinkIcon", "Button", "IconPlus", "BookmarkDialog", "cx", "MedplumLink", "Space", "currentPathname", "currentSearchParams", "menus", "bestLink", "bestScore", "score", "getLinkScore", "linkHref", "linkUrl", "ignoredParams", "key", "value", "count", "jsx", "AppShell", "props", "theme", "useMantineTheme", "navbarOpen", "setNavbarOpen", "useState", "medplum", "s", "profile", "w", "useEffect", "eventListener", "showNotification", "setNavbarOpenWrapper", "open", "closeNavbar", "toggleNavbar", "Loading", "MantineAppShell", "Header", "Navbar", "ErrorBoundary", "Suspense", "Anchor", "jsx", "jsxs", "AttachmentDisplay", "props", "contentType", "url", "title", "getDownloadName", "jsx", "AttachmentArrayDisplay", "props", "v", "index", "AttachmentDisplay", "ActionIcon", "useRef", "useState", "useRef", "normalizeOperationOutcome", "Fragment", "jsx", "jsxs", "AttachmentButton", "props", "medplum", "s", "fileInputRef", "useRef", "onClick", "e", "killEvent", "onFileChange", "files", "processFile", "file", "filename", "contentType", "binary", "err", "jsx", "jsxs", "AttachmentArrayInput", "props", "values", "setValues", "useState", "valuesRef", "useRef", "setValuesWrapper", "newValues", "v", "index", "AttachmentDisplay", "ActionIcon", "e", "killEvent", "copy", "IconCircleMinus", "AttachmentButton", "attachment", "IconCloudUpload", "Button", "useState", "Fragment", "jsx", "jsxs", "AttachmentInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "AttachmentDisplay", "Button", "e", "killEvent", "AttachmentButton", "getPathDisplayName", "tryGetDataType", "DEFAULT_IGNORED_PROPERTIES", "DEFAULT_IGNORED_NON_NESTED_PROPERTIES", "createStyles", "Fragment", "jsx", "jsxs", "useStyles", "theme", "DescriptionList", "props", "children", "compact", "classes", "cx", "DescriptionListEntry", "ActionIcon", "Box", "CopyButton", "Tooltip", "PropertyType", "formatDateTime", "formatPeriod", "formatTiming", "isEmpty", "formatCodeableConcept", "Fragment", "jsx", "CodeableConceptDisplay", "props", "formatCoding", "Fragment", "jsx", "CodingDisplay", "props", "Fragment", "jsx", "ContactPointDisplay", "props", "contactPoint", "builder", "Fragment", "jsx", "jsxs", "ContactDetailDisplay", "props", "contactDetail", "telecom", "ContactPointDisplay", "jsxs", "IdentifierDisplay", "props", "formatMoney", "Fragment", "jsx", "MoneyDisplay", "props", "formatQuantity", "Fragment", "jsx", "QuantityDisplay", "props", "formatRange", "Fragment", "jsx", "RangeDisplay", "props", "Fragment", "jsx", "jsxs", "RatioDisplay", "props", "value", "QuantityDisplay", "stringify", "Fragment", "jsx", "ReferenceDisplay", "props", "displayString", "stringify", "MedplumLink", "Fragment", "jsx", "ResourceArrayDisplay", "props", "property", "values", "propertyType", "v", "index", "ResourcePropertyDisplay", "Fragment", "jsx", "jsxs", "ResourcePropertyDisplay", "props", "property", "propertyType", "value", "Box", "isEmpty", "CopyButton", "copied", "copy", "Tooltip", "ActionIcon", "IconCheck", "IconCopy", "PropertyType", "AttachmentArrayDisplay", "ResourceArrayDisplay", "ReferenceDisplay", "formatDateTime", "AddressDisplay", "AttachmentDisplay", "CodeableConceptDisplay", "CodingDisplay", "ContactDetailDisplay", "ContactPointDisplay", "HumanNameDisplay", "IdentifierDisplay", "MoneyDisplay", "formatPeriod", "QuantityDisplay", "RangeDisplay", "RatioDisplay", "formatTiming", "BackboneElementDisplay", "getTypedPropertyValue", "getTypedPropertyValueWithSchema", "getValueAndType", "context", "path", "typedResult", "e", "getValueAndTypeFromElement", "value", "element", "jsx", "jsxs", "BackboneElementDisplay", "props", "typedValue", "value", "typeName", "typeSchema", "tryGetDataType", "DescriptionList", "entry", "key", "property", "DEFAULT_IGNORED_PROPERTIES", "DEFAULT_IGNORED_NON_NESTED_PROPERTIES", "propertyValue", "propertyType", "getValueAndType", "DescriptionListEntry", "getPathDisplayName", "ResourcePropertyDisplay", "tryGetDataType", "useContext", "useMemo", "useState", "Stack", "getPathDisplayName", "isPopulated", "useMemo", "useState", "Group", "Input", "useContext", "React", "splitOnceRight", "str", "delim", "delimIndex", "beginning", "last", "BackboneElementContext", "buildBackboneElementContext", "typeSchema", "profileUrl", "debugMode", "nestedPaths", "getModifiedNestedElement", "nestedElementPath", "elements", "seenKeys", "key", "property", "_last", "jsx", "jsxs", "CheckboxFormSection", "props", "debugMode", "useContext", "BackboneElementContext", "label", "Group", "Input", "Input", "useContext", "getErrorsForInput", "outcome", "expression", "issue", "isExpressionMatch", "getIssuesForExpression", "expr1", "expr2", "dot1", "dot2", "jsx", "FormSection", "props", "debugMode", "useContext", "BackboneElementContext", "label", "Input", "getErrorsForInput", "capitalize", "isEmpty", "setPropertyValue", "obj", "key", "propName", "elementDefinition", "value", "types", "type", "compoundKey", "isSupportedProfileStructureDefinition", "profile", "Checkbox", "Group", "NativeSelect", "Textarea", "TextInput", "capitalize", "HTTP_HL7_ORG", "PropertyType", "useState", "useState", "jsx", "CodeableConceptInput", "props", "defaultValue", "onChange", "rest", "value", "setValue", "useState", "handleChange", "newValues", "newConcept", "valueSetElementToCodeableConcept", "ValueSetAutocomplete", "codeableConceptToValueSetElement", "concept", "c", "elements", "e", "useState", "jsx", "CodingInput", "props", "defaultValue", "onChange", "rest", "value", "setValue", "useState", "handleChange", "newValues", "newValue", "newConcept", "valueSetElementToCoding", "ValueSetAutocomplete", "codingToValueSetElement", "coding", "element", "Group", "TextInput", "useRef", "useState", "Group", "NativeSelect", "TextInput", "useContext", "useMemo", "useRef", "useState", "jsx", "jsxs", "ContactPointInput", "props", "path", "outcome", "getModifiedNestedElement", "useContext", "BackboneElementContext", "contactPoint", "setContactPoint", "useState", "ref", "useRef", "systemElement", "useElement", "valueElement", "useMemo", "field", "setContactPointWrapper", "newValue", "setSystem", "system", "setUse", "use", "setValue", "value", "Group", "NativeSelect", "e", "getErrorsForInput", "TextInput", "jsx", "jsxs", "ContactDetailInput", "props", "contactPoint", "setContactDetail", "useState", "ref", "useRef", "setContactDetailWrapper", "newValue", "setName", "name", "setTelecom", "telecom", "Group", "TextInput", "e", "ContactPointInput", "TextInput", "isValidDate", "convertIsoToLocal", "isoString", "date", "convertLocalToIso", "localString", "jsx", "DateTimeInput", "props", "TextInput", "getInputType", "convertIsoToLocal", "getErrorsForInput", "e", "newValue", "convertLocalToIso", "JsonInput", "stringify", "tryGetProfile", "useEffect", "useMemo", "useState", "jsx", "jsxs", "ExtensionInput", "props", "propertyType", "medplum", "s", "loading", "setLoading", "useState", "typeSchema", "setTypeSchema", "profileUrl", "useMemo", "useEffect", "profile", "tryGetProfile", "reason", "onChange", "newValue", "BackboneElementInput", "ExtensionJsonInput", "JsonInput", "stringify", "Group", "NativeSelect", "TextInput", "useState", "jsx", "jsxs", "HumanNameInput", "props", "outcome", "path", "value", "setValue", "useState", "setValueWrapper", "newValue", "setUse", "use", "setPrefix", "prefix", "setGiven", "given", "setFamily", "family", "setSuffix", "suffix", "Group", "NativeSelect", "e", "getErrorsForInput", "TextInput", "Group", "TextInput", "useContext", "useMemo", "useState", "jsx", "jsxs", "IdentifierInput", "props", "path", "outcome", "value", "setValue", "useState", "getModifiedNestedElement", "useContext", "BackboneElementContext", "systemElement", "valueElement", "useMemo", "field", "setValueWrapper", "newValue", "Group", "TextInput", "e", "getErrorsForInput", "NativeSelect", "TextInput", "useCallback", "useState", "jsx", "data", "MoneyInput", "props", "onChange", "value", "setValue", "setValueWrapper", "newValue", "handleCurrencyChange", "e", "handleValueChange", "select", "NativeSelect", "TextInput", "IconCurrencyDollar", "Group", "useState", "jsx", "jsxs", "PeriodInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "Group", "DateTimeInput", "Group", "NativeSelect", "TextInput", "useState", "jsx", "jsxs", "QuantityInput", "props", "value", "setValue", "setValueWrapper", "newValue", "e", "tryParseNumber", "str", "Group", "useState", "jsx", "jsxs", "RangeInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "Group", "QuantityInput", "v", "Group", "useState", "jsx", "jsxs", "RatioInput", "props", "value", "setValue", "useState", "setValueWrapper", "newValue", "Group", "QuantityInput", "v", "Group", "NativeSelect", "LRUCache", "ReadablePromise", "createReference", "isEmpty", "isPopulated", "tryGetProfile", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Group", "Text", "getDisplayString", "getReferenceString", "forwardRef", "useCallback", "useState", "jsx", "jsxs", "SEARCH_CODES", "NAME_RESOURCE_TYPES", "toOption", "resource", "getReferenceString", "getDisplayString", "ResourceInput", "props", "medplum", "s", "resourceType", "searchCriteria", "outcome", "setOutcome", "useState", "defaultValue", "j", "onChange", "loadValues", "useCallback", "input", "signal", "searchCode", "getSearchParamForResourceType", "searchParams", "handleChange", "newResources", "AsyncAutocomplete", "ItemComponent", "forwardRef", "label", "others", "ref", "Group", "ResourceAvatar", "Text", "jsx", "jsxs", "ReferenceInput", "props", "onChange", "medplum", "s", "value", "setValue", "useState", "targetTypes", "setTargetTypes", "createTargetTypes", "targetType", "setTargetType", "getInitialTargetType", "promiseCache", "useRef", "LRUCache", "searchCriteria", "useMemo", "useEffect", "anyToFetch", "newTargetTypePromises", "tt", "shouldFetchResourceType", "cacheKey", "cached", "promise", "fetchResourceTypeOfProfile", "profile", "newTargetType", "isPopulated", "reason", "readablePromise", "ReadablePromise", "newTargetTypes", "index", "setValueHelper", "useCallback", "item", "newValue", "createReference", "typeSelectOptions", "Group", "NativeSelect", "e", "ResourceTypeInput", "newResourceType", "ResourceInput", "resourceTypesAndProfileUrls", "results", "defaultValue", "defaultValueResourceType", "profileUrl", "tryGetProfile", "query", "isEmpty", "ActionIcon", "Button", "Group", "Stack", "createStyles", "getPathDisplayName", "getPropertyDisplayName", "isEmpty", "tryGetProfile", "useEffect", "useState", "arrayify", "getElementDefinitionFromElements", "getTypedPropertyValueWithSchema", "isPopulated", "matchDiscriminant", "isDiscriminatorComponentMatch", "typedValue", "discriminator", "slice", "elementList", "nestedProp", "ed", "v", "getValueSliceName", "value", "slices", "discriminators", "d", "assignValuesIntoSlices", "values", "slicing", "slicedValues", "i", "sliceName", "sliceIndex", "isSupportedSliceDefinition", "jsx", "jsxs", "useStyles", "createStyles", "theme", "ResourceArrayInput", "props", "property", "medplum", "s", "loading", "setLoading", "useState", "slices", "setSlices", "defaultValue", "slicedValues", "setSlicedValues", "classes", "propertyTypeCode", "useEffect", "emptySlices", "results", "assignValuesIntoSlices", "supportedSlices", "profileUrls", "promises", "slice", "isSupportedSliceDefinition", "sliceType", "profileUrl", "isEmpty", "i", "typeSchema", "tryGetProfile", "reason", "setValuesWrapper", "newValues", "sliceIndex", "newSlicedValues", "cleaned", "val", "nonSliceIndex", "nonSliceValues", "showNonSliceValues", "propertyDisplayName", "getPathDisplayName", "Stack", "SliceInput", "newValue", "value", "valueIndex", "Group", "ResourcePropertyInput", "newNonSliceValues", "RemoveButton", "e", "killEvent", "AddButton", "values", "setValues", "v", "required", "indentedStack", "getPropertyDisplayName", "FormSection", "ElementDefinitionTypeInput", "ElementsInput", "onClick", "testId", "text", "Button", "IconCirclePlus", "ActionIcon", "IconCircleMinus", "ActionIcon", "Flex", "Textarea", "useClipboard", "showNotification", "useRef", "useState", "jsx", "jsxs", "SensitiveTextarea", "props", "revealed", "setRevealed", "clipboard", "useClipboard", "ref", "styles", "Flex", "Textarea", "ActionIcon", "showNotification", "IconCopy", "Button", "Chip", "Group", "Modal", "NativeSelect", "Stack", "Switch", "TextInput", "formatTiming", "useRef", "useState", "Fragment", "jsx", "jsxs", "daysOfWeek", "TimingInput", "props", "value", "setValue", "useState", "open", "setOpen", "valueRef", "useRef", "Group", "formatTiming", "Button", "TimingEditorDialog", "newValue", "defaultValue", "setStart", "newStart", "setRepeat", "repeat", "setPeriod", "newPeriod", "setPeriodUnit", "newPeriodUnit", "setDaysOfWeek", "newDaysOfWeek", "Modal", "Stack", "FormSection", "DateTimeInput", "Switch", "e", "TextInput", "NativeSelect", "Chip", "day", "jsx", "jsxs", "ResourcePropertyInput", "props", "property", "name", "defaultValue", "onChange", "defaultPropertyType", "propertyTypes", "PropertyType", "AttachmentArrayInput", "indent", "ResourceArrayInput", "ElementDefinitionInputSelector", "ElementDefinitionTypeInput", "newValue", "newPropName", "capitalize", "initialPropertyType", "t", "selectedType", "setSelectedType", "useState", "Group", "NativeSelect", "e", "type", "outcome", "binding", "path", "required", "propertyType", "properties", "SensitiveTextarea", "getErrorsForInput", "TextInput", "DateTimeInput", "CodeInput", "Checkbox", "Textarea", "AddressInput", "AnnotationInput", "AttachmentInput", "CodeableConceptInput", "CodingInput", "ContactDetailInput", "ContactPointInput", "ExtensionInput", "HumanNameInput", "IdentifierInput", "MoneyInput", "PeriodInput", "QuantityInput", "RangeInput", "RatioInput", "ReferenceInput", "getTargetTypes", "TimingInput", "BackboneElementInput", "RESOURCE_TYPE_URL_PREFIXES", "HTTP_HL7_ORG", "elementDefinitionType", "p", "resourceTypePrefix", "prefix", "jsx", "EXTENSION_KEYS", "IGNORED_PROPERTIES", "DEFAULT_IGNORED_PROPERTIES", "prop", "ElementsInput", "props", "elements", "value", "setValue", "useState", "fixedProperties", "useMemo", "result", "key", "property", "setValueWrapper", "newValue", "setPropertyValue", "Stack", "element", "isPopulated", "DEFAULT_IGNORED_NON_NESTED_PROPERTIES", "propertyValue", "propertyType", "getValueAndTypeFromElement", "required", "resourcePropertyInput", "ResourcePropertyInput", "propName", "CheckboxFormSection", "getPathDisplayName", "FormSection", "jsx", "jsxs", "BackboneElementInput", "props", "typeName", "value", "setValue", "useState", "backboneContext", "useContext", "BackboneElementContext", "profileUrl", "typeSchema", "useMemo", "tryGetDataType", "context", "buildBackboneElementContext", "setValueWrapper", "newValue", "ElementsInput", "Button", "createStyles", "Group", "useMemo", "useState", "getMonthString", "date", "getStartMonth", "result", "jsx", "jsxs", "useStyles", "createStyles", "theme", "CalendarInput", "props", "classes", "onChangeMonth", "onClick", "month", "setMonth", "useState", "getStartMonth", "moveMonth", "delta", "currMonth", "newMonth", "grid", "useMemo", "buildGrid", "Group", "getMonthString", "Button", "week", "weekIndex", "day", "dayIndex", "startDate", "slots", "d", "row", "i", "isDayAvailable", "slot", "slotStart", "MantineContainer", "createStyles", "jsx", "useStyles", "Container", "props", "children", "others", "classes", "ActionIcon", "Center", "createStyles", "Group", "Loader", "Menu", "ScrollArea", "TextInput", "showNotification", "updateNotification", "getReferenceString", "normalizeErrorString", "useCallback", "useEffect", "useRef", "useState", "createStyles", "Group", "List", "Stack", "Text", "Title", "capitalize", "formatCodeableConcept", "formatDateTime", "formatObservationValue", "isReference", "useEffect", "useState", "Blockquote", "createStyles", "Stack", "jsx", "useStyles", "theme", "NoteDisplay", "value", "classes", "note", "Group", "Text", "getDisplayString", "isOk", "normalizeErrorString", "useState", "jsx", "ResourceName", "props", "value", "link", "rest", "outcome", "setOutcome", "useState", "resource", "j", "text", "isOk", "normalizeErrorString", "getDisplayString", "MedplumLink", "Text", "jsx", "jsxs", "ResourceBadge", "props", "Group", "ResourceAvatar", "ResourceName", "Badge", "jsx", "statusToColor", "StatusBadge", "props", "Fragment", "jsx", "jsxs", "useStyles", "createStyles", "theme", "DiagnosticReportDisplay", "props", "medplum", "s", "diagnosticReport", "j", "specimens", "setSpecimens", "useState", "useEffect", "ref", "outcomes", "outcome", "specimenNotes", "spec", "pf", "Stack", "Title", "DiagnosticReportHeader", "SpecimenInfo", "ObservationTable", "NoteDisplay", "value", "Group", "Text", "ResourceBadge", "interpreter", "performer", "formatDateTime", "capitalize", "List", "specimen", "classes", "ObservationRowGroup", "observation", "ObservationRow", "isReference", "cx", "displayNotes", "critical", "isCritical", "MedplumLink", "CodeableConceptDisplay", "ObservationValueDisplay", "ReferenceRangeDisplay", "concept", "formatCodeableConcept", "ReferenceDisplay", "StatusBadge", "obs", "formatObservationValue", "range", "RangeDisplay", "code", "createStyles", "Paper", "useComponentDefaultProps", "jsx", "useStyles", "theme", "width", "fill", "defaultProps", "Panel", "props", "className", "children", "unstyled", "others", "classes", "cx", "createStyles", "capitalize", "evalFhirPathTyped", "getSearchParameterDetails", "toTypedValue", "import_rfc6902", "useEffect", "useState", "jsx", "jsxs", "useStyles", "createStyles", "theme", "ResourceDiffTable", "props", "classes", "medplum", "s", "schemaLoaded", "setSchemaLoaded", "useState", "useEffect", "patch", "typedOriginal", "toTypedValue", "typedRevised", "op", "path", "fhirPath", "jsonPathToFhirPath", "property", "getSearchParameterDetails", "isArray", "originalValue", "evalFhirPathTyped", "revisedValue", "capitalize", "ResourcePropertyDisplay", "fixArray", "parts", "result", "i", "part", "inputValue", "useEffect", "useState", "jsx", "ResourceTable", "props", "medplum", "s", "value", "j", "schemaLoaded", "setSchemaLoaded", "useState", "useEffect", "BackboneElementDisplay", "ActionIcon", "Group", "Menu", "Text", "formatDateTime", "getReferenceString", "Fragment", "jsx", "jsxs", "Timeline", "props", "Container", "TimelineItem", "resource", "profile", "padding", "popupMenuItems", "others", "author", "dateTime", "Panel", "Group", "ResourceAvatar", "Text", "ResourceName", "MedplumLink", "formatDateTime", "Menu", "ActionIcon", "getReferenceString", "IconDots", "ErrorBoundary", "sortByDateAndPriority", "resources", "timelineResource", "a", "b", "priority1", "getPriorityScore", "priority2", "getTime", "resource", "isSameResourceType", "priority", "dateTime", "Fragment", "jsx", "jsxs", "useStyles", "createStyles", "theme", "ResourceTimeline", "props", "medplum", "s", "navigate", "B", "sender", "inputRef", "useRef", "resource", "j", "history", "setHistory", "useState", "items", "setItems", "loadTimelineResources", "itemsRef", "sortAndSetItems", "useCallback", "newItmes", "sortByDateAndPriority", "handleBatchResponse", "batchResponse", "newItems", "settledResult", "bundle", "entry", "addResource", "loadTimeline", "resourceType", "id", "useEffect", "createComment", "contentString", "result", "createMedia", "attachment", "updateNotification", "IconCheck", "reason", "normalizeErrorString", "IconFileAlert", "setPriority", "communication", "priority", "onPin", "onUnpin", "onDetails", "timelineItem", "onEdit", "onDelete", "onVersionDetails", "version", "onUploadStart", "showNotification", "onUploadProgress", "e", "getProgressMessage", "onUploadError", "outcome", "Timeline", "Panel", "Form", "formData", "input", "Group", "ResourceAvatar", "TextInput", "ActionIcon", "IconMessage", "AttachmentButton", "IconCloudUpload", "item", "key", "HistoryTimelineItem", "AuditEventTimelineItem", "CommunicationTimelineItem", "DiagnosticReportTimelineItem", "MediaTimelineItem", "TimelineItem", "ResourceTable", "Center", "Loader", "TimelineItemPopupMenu", "Menu", "IconPin", "getReferenceString", "IconPinnedOff", "IconListDetails", "IconEdit", "IconTrash", "previous", "getPrevious", "ResourceDiffTable", "entries", "index", "classes", "className", "contentType", "padding", "AttachmentDisplay", "ScrollArea", "DiagnosticReportDisplay", "percent", "formatFileSize", "bytes", "jsx", "DefaultResourceTimeline", "props", "ResourceTimeline", "medplum", "resourceType", "id", "ref", "jsx", "Document", "props", "children", "others", "Container", "Panel", "createReference", "jsx", "EncounterTimeline", "props", "ResourceTimeline", "medplum", "_resourceType", "id", "resource", "sender", "text", "createReference", "operator", "content", "Button", "Loader", "Table", "normalizeOperationOutcome", "memo", "useEffect", "useRef", "useState", "evalFhirPath", "jsx", "FhirPathDisplay", "props", "value", "evalFhirPath", "err", "ResourcePropertyDisplay", "ActionIcon", "Button", "Center", "createStyles", "Group", "Loader", "Menu", "Pagination", "Table", "Text", "UnstyledButton", "DEFAULT_SEARCH_COUNT", "formatSearchQuery", "memo", "useCallback", "useEffect", "useRef", "useState", "Box", "Button", "Modal", "Text", "jsx", "jsxs", "SearchExportDialog", "props", "ExportButton", "Button", "Group", "Modal", "MultiSelect", "Stack", "getDataType", "getSearchParameters", "stringify", "useEffect", "useMemo", "useRef", "useState", "capitalize", "DEFAULT_SEARCH_COUNT", "evalFhirPathTyped", "formatDateTime", "Operator", "Fragment", "jsx", "searchParamToOperators", "Operator", "operatorNames", "setFilters", "definition", "filters", "clearFilters", "clearFiltersOnField", "code", "f", "addFilter", "field", "op", "value", "opt_clear", "nextFilters", "addField", "newFields", "deleteFilter", "index", "newFilters", "addYesterdayFilter", "addDayFilter", "addTodayFilter", "addTomorrowFilter", "delta", "startTime", "endTime", "addDateFilterBetween", "addLastMonthFilter", "addMonthFilter", "addThisMonthFilter", "addNextMonthFilter", "addYearToDateFilter", "d1", "d2", "addDateFilterImpl", "addMissingFilter", "setOffset", "offset", "setPage", "page", "count", "DEFAULT_SEARCH_COUNT", "newOffset", "setSort", "sort", "desc", "getSortField", "isSortDescending", "toggleSort", "key", "sortRules", "getSearchOperators", "searchParam", "getOpString", "buildFieldNameString", "tmp", "capitalize", "renderValue", "resource", "formatDateTime", "renderPropertyValue", "renderSearchParameterValue", "elementDefinition", "path", "propertyType", "getValueAndType", "ResourcePropertyDisplay", "evalFhirPathTyped", "v", "jsx", "jsxs", "SearchFieldEditor", "props", "wasDropdownOpen", "useRef", "state", "setState", "useState", "stringify", "isDropdownOpen", "setIsDropdownOpen", "useEffect", "allFields", "useMemo", "resourceType", "typeSchema", "getDataType", "searchParams", "getSearchParameters", "getFieldsList", "a", "b", "field", "buildFieldNameString", "handleChange", "newFields", "Modal", "Stack", "MultiSelect", "Group", "Button", "result", "keys", "names", "key", "code", "name", "Button", "Group", "Modal", "NativeSelect", "getSearchParameters", "stringify", "useEffect", "useRef", "useState", "formatDateTime", "getSearchParameterDetails", "globalSchema", "Operator", "SearchParameterType", "Fragment", "jsx", "SearchFilterValueDisplay", "props", "resourceType", "filter", "searchParam", "globalSchema", "Operator", "ResourceName", "searchParamDetails", "getSearchParameterDetails", "SearchParameterType", "formatDateTime", "Checkbox", "TextInput", "getSearchParameterDetails", "SearchParameterType", "jsx", "SearchFilterValueInput", "props", "details", "getSearchParameterDetails", "name", "SearchParameterType", "ReferenceInput", "newReference", "Checkbox", "e", "TextInput", "DateTimeInput", "QuantityInput", "tryParseQuantity", "newQuantity", "value", "valueString", "systemString", "unitString", "jsx", "jsxs", "SearchFilterEditor", "props", "search", "setSearch", "useState", "stringify", "editingIndex", "setEditingIndex", "searchRef", "useRef", "useEffect", "onAddFilter", "filter", "addFilter", "resourceType", "searchParams", "getSearchParameters", "filters", "Modal", "index", "FilterRowInput", "newFilter", "newFilters", "setFilters", "FilterRowDisplay", "deleteFilter", "Group", "Button", "buildFieldNameString", "getOpString", "SearchFilterValueDisplay", "value", "setValue", "valueRef", "setFilterCode", "newCode", "setFilterOperator", "newOperator", "setFilterValue", "newFilterValue", "searchParam", "operators", "getSearchOperators", "NativeSelect", "e", "param", "op", "SearchFilterValueInput", "Button", "Grid", "Modal", "useState", "jsx", "jsxs", "SearchFilterValueDialog", "props", "value", "setValue", "useState", "onOk", "Modal", "Form", "Grid", "SearchFilterValueInput", "Button", "Menu", "Operator", "Fragment", "jsx", "jsxs", "SearchPopupMenu", "props", "onSort", "searchParam", "desc", "onChange", "setSort", "onClear", "clearFiltersOnField", "onPrompt", "operator", "definition", "SearchParameterSubMenu", "Menu", "buildFieldNameString", "DateFilterSubMenu", "NumericFilterSubMenu", "ReferenceFilterSubMenu", "TextFilterSubMenu", "code", "IconSortAscending", "IconSortDescending", "IconEqual", "Operator", "IconEqualNot", "IconMathLower", "IconMathGreater", "IconBracketsContain", "IconCalendar", "addTomorrowFilter", "addTodayFilter", "addYesterdayFilter", "addNextMonthFilter", "addThisMonthFilter", "addLastMonthFilter", "addYearToDateFilter", "CommonMenuItems", "IconSettings", "IconBucket", "IconBucketOff", "IconBleach", "addMissingFilter", "IconBleachOff", "IconX", "getElementDefinition", "getSearchParameter", "getSearchParameterDetails", "getSearchParameters", "getFieldDefinitions", "search", "resourceType", "fields", "name", "getFieldDefinition", "exactElementDefinition", "exactSearchParam", "allSearchParams", "searchParams", "pathRegex", "p", "details", "Fragment", "jsx", "jsxs", "SearchChangeEvent", "definition", "SearchLoadEvent", "response", "SearchClickEvent", "resource", "browserEvent", "useStyles", "createStyles", "theme", "SearchControl", "props", "classes", "medplum", "s", "schemaLoaded", "setSchemaLoaded", "useState", "outcome", "setOutcome", "search", "onLoad", "state", "setState", "stateRef", "useRef", "totalType", "loadResults", "useCallback", "options", "formatSearchQuery", "reason", "refreshResults", "useEffect", "handleSingleCheckboxClick", "e", "id", "checked", "newSelected", "handleAllCheckboxClick", "searchResponse", "entry", "isAllSelected", "emitSearchChange", "newSearch", "handleRowClick", "isCheckboxCell", "killEvent", "isAux", "isExportPassed", "Center", "Loader", "checkboxColumn", "fields", "getFieldDefinitions", "resourceType", "lastResult", "resources", "buttonVariant", "buttonColor", "iconSize", "isMobile", "Group", "Button", "IconColumns", "IconFilter", "IconFilePlus", "IconTableExport", "IconTrash", "IconBoxMultiple", "Text", "getStart", "getEnd", "ActionIcon", "IconRefresh", "Table", "field", "Menu", "UnstyledButton", "buildFieldNameString", "IconAdjustmentsHorizontal", "SearchPopupMenu", "searchParam", "filter", "result", "FilterDescription", "renderValue", "Container", "Pagination", "getPage", "getTotalPages", "newPage", "setPage", "control", "SearchFieldEditor", "SearchFilterEditor", "SearchExportDialog", "SearchFilterValueDialog", "addFilter", "MemoizedSearchControl", "memo", "filters", "f", "p", "getOpString", "SearchFilterValueDisplay", "DEFAULT_SEARCH_COUNT", "total", "pageSize", "jsx", "jsxs", "FhirPathTable", "props", "medplum", "s", "schemaLoaded", "setSchemaLoaded", "useState", "outcome", "setOutcome", "query", "fields", "response", "setResponse", "selected", "setSelected", "responseRef", "useRef", "selectedRef", "useEffect", "err", "normalizeOperationOutcome", "handleSingleCheckboxClick", "e", "id", "checked", "newSelected", "handleAllCheckboxClick", "resources", "resource", "isAllSelected", "handleRowClick", "isCheckboxCell", "killEvent", "SearchClickEvent", "Loader", "checkboxColumn", "Table", "field", "FhirPathDisplay", "Button", "MemoizedFhirPathTable", "memo", "jsx", "jsxs", "Logo", "props", "Box", "SimpleGrid", "Box", "Flex", "Group", "Paper", "RingProgress", "Text", "Title", "formatCodeableConcept", "Fragment", "jsx", "jsxs", "MeasureReportGroupDisplay", "props", "group", "Paper", "Group", "MeasureScore", "MeasureReportPopulation", "MeasureTitle", "measure", "Text", "populations", "numerator", "p", "formatCodeableConcept", "denominator", "numeratorCount", "denominatorCount", "Box", "Title", "value", "RingProgress", "groupColor", "Flex", "unit", "groupValue", "QuantityDisplay", "score", "jsx", "jsxs", "MeasureReportDisplay", "props", "report", "j", "measure", "ie", "Box", "MeasureTitle", "SimpleGrid", "group", "idx", "MeasureReportGroupDisplay", "Alert", "operationOutcomeIssueToString", "jsx", "OperationOutcomeAlert", "props", "issues", "Alert", "IconAlertCircle", "issue", "operationOutcomeIssueToString", "Anchor", "Card", "Divider", "Flex", "Group", "Paper", "Stack", "Text", "calculateAgeString", "formatHumanName", "resolveId", "useEffect", "useState", "Anchor", "Badge", "Box", "Button", "Group", "Modal", "NativeSelect", "Stack", "Text", "TextInput", "useDisclosure", "createReference", "useCallback", "useState", "Fragment", "jsx", "jsxs", "Allergies", "props", "medplum", "s", "patient", "encounter", "allergies", "setAllergies", "useState", "opened", "open", "close", "useDisclosure", "code", "setCode", "handleSubmit", "useCallback", "formData", "createReference", "newAllergy", "Group", "Text", "Anchor", "e", "killEvent", "Box", "allergy", "Badge", "CodeableConceptDisplay", "Modal", "Form", "Stack", "CodeableConceptInput", "TextInput", "NativeSelect", "Button", "Anchor", "Badge", "Box", "Button", "Group", "Modal", "Radio", "Stack", "Text", "useDisclosure", "createReference", "useCallback", "useState", "Fragment", "jsx", "jsxs", "Medications", "props", "medplum", "s", "medicationRequests", "setMedicationRequests", "useState", "opened", "open", "close", "useDisclosure", "code", "setCode", "handleSubmit", "useCallback", "formData", "status", "createReference", "newRequest", "Group", "Text", "Anchor", "e", "killEvent", "Box", "request", "Badge", "CodeableConceptDisplay", "Modal", "Form", "Stack", "CodeableConceptInput", "Radio", "Button", "Anchor", "Badge", "Button", "Grid", "Group", "Modal", "NativeSelect", "Stack", "Text", "Textarea", "TextInput", "useDisclosure", "createReference", "Fragment", "useCallback", "useState", "Fragment", "jsx", "jsxs", "ProblemList", "props", "medplum", "s", "patient", "encounter", "problems", "setProblems", "useState", "opened", "open", "close", "useDisclosure", "handleSubmit", "useCallback", "formData", "createReference", "newProblem", "Group", "Text", "Anchor", "e", "killEvent", "Grid", "problem", "Badge", "CodeableConceptDisplay", "Modal", "Form", "Stack", "TextInput", "NativeSelect", "Textarea", "Button", "Anchor", "Badge", "Box", "Button", "Group", "Modal", "Radio", "Stack", "Text", "useDisclosure", "HTTP_HL7_ORG", "LOINC", "SNOMED", "createReference", "useCallback", "useState", "Fragment", "jsx", "jsxs", "smokingStatusOptions", "SmokingStatus", "props", "medplum", "s", "patient", "encounter", "smokingStatus", "setSmokingStatus", "useState", "opened", "open", "close", "useDisclosure", "handleSubmit", "useCallback", "formData", "HTTP_HL7_ORG", "LOINC", "createReference", "SNOMED", "newSmokingStatus", "Group", "Text", "Anchor", "e", "killEvent", "Box", "Badge", "CodeableConceptDisplay", "Modal", "Form", "Stack", "Radio", "code", "text", "Button", "Anchor", "Button", "Grid", "Group", "Modal", "Stack", "Text", "Textarea", "TextInput", "useDisclosure", "useCallback", "useState", "LOINC", "UCUM", "createReference", "getObservationValue", "observations", "code", "o", "getCompoundObservationValue", "innerCode", "c", "createObservation", "patient", "encounter", "title", "valueQuantity", "isValidNumber", "createBaseObservation", "createCompoundObservation", "components", "component", "createLoincCode", "display", "createQuantity", "value", "unit", "Fragment", "jsx", "jsxs", "LOINC_CODES", "SYSTOLIC", "DIASTOLIC", "Vitals", "props", "medplum", "s", "patient", "encounter", "vitals", "setVitals", "useState", "opened", "open", "close", "useDisclosure", "handleSubmit", "useCallback", "formData", "newObservations", "name", "meta", "createCompoundObservation", "createLoincCode", "createQuantity", "createObservation", "obs", "newVitals", "Group", "Text", "Anchor", "e", "killEvent", "Grid", "QuantityDisplay", "getCompoundObservationValue", "getObservationValue", "Modal", "Form", "Stack", "TextInput", "Textarea", "Button", "jsx", "jsxs", "PatientSummary", "props", "medplum", "s", "propsPatient", "background", "rest", "patient", "setPatient", "useState", "allergies", "setAllergies", "problems", "setProblems", "smokingStatus", "setSmokingStatus", "vitals", "setVitals", "medicationRequest", "setMedicationRequest", "useEffect", "id", "resolveId", "ref", "searchMeta", "results", "observations", "obs", "Card", "ResourceAvatar", "Text", "formatHumanName", "calculateAgeString", "Paper", "Group", "Flex", "IconUserSquare", "IconStethoscope", "IconGenderFemale", "Stack", "Anchor", "Divider", "Allergies", "ProblemList", "Medications", "SmokingStatus", "Vitals", "createReference", "useCallback", "jsx", "PatientTimeline", "props", "loadTimelineResources", "useCallback", "medplum", "resourceType", "id", "ref", "_count", "ResourceTimeline", "resource", "sender", "text", "createReference", "operator", "content", "Anchor", "Button", "createStyles", "NativeSelect", "Stack", "TextInput", "getReferenceString", "useEffect", "useRef", "useState", "jsx", "jsxs", "useStyles", "createStyles", "theme", "PlanDefinitionBuilder", "props", "medplum", "s", "defaultValue", "j", "schemaLoaded", "setSchemaLoaded", "useState", "selectedKey", "setSelectedKey", "hoverKey", "setHoverKey", "value", "setValue", "handleDocumentMouseOver", "handleDocumentClick", "valueRef", "useRef", "useEffect", "ensurePlanDefinitionKeys", "changeProperty", "property", "newValue", "Form", "TextInput", "e", "ActionArrayBuilder", "Button", "classes", "actionsRef", "changeAction", "changedAction", "i", "addAction", "addedAction", "removeAction", "removedAction", "action", "ActionBuilder", "Anchor", "killEvent", "generateId", "cx", "actionType", "getInitialActionType", "editing", "hovering", "onClick", "onHover", "className", "ActionEditor", "ActionDisplay", "timingProperty", "t", "propertyValue", "propertyType", "getActionTiming", "ReferenceDisplay", "ResourcePropertyDisplay", "setActionType", "Stack", "NativeSelect", "x", "ActionResourceTypeBuilder", "FormSection", "ActionTimingInput", "id", "definitionCanonical", "reference", "ResourceInput", "getReferenceString", "key", "ResourcePropertyInput", "propName", "setPropertyValue", "getValueAndType", "nextId", "existing", "existingNum", "planDefinition", "ensurePlanDefinitionActionKeys", "actions", "Anchor", "Box", "Button", "createStyles", "Group", "NativeSelect", "Space", "Textarea", "TextInput", "Title", "getElementDefinition", "isResourceType", "useEffect", "useRef", "useState", "Checkbox", "Group", "MultiSelect", "NativeSelect", "Radio", "Textarea", "TextInput", "capitalize", "deepEquals", "formatCodeableConcept", "formatCoding", "getElementDefinition", "getTypedPropertyValue", "stringify", "useContext", "deepClone", "evalFhirPathTyped", "formatCoding", "getExtension", "getReferenceString", "getTypedPropertyValue", "splitN", "stringify", "QuestionnaireItemType", "isChoiceQuestion", "item", "isQuestionEnabled", "responseItems", "enableBehavior", "enableWhen", "actualAnswers", "getByLinkId", "anyMatch", "allMatch", "checkAnswers", "getNewMultiSelectValues", "selected", "propertyName", "o", "option", "optionValue", "linkId", "response", "nestedAnswer", "evaluateMatch", "actualAnswer", "expectedAnswer", "operator", "fhirPathOperator", "value", "answers", "actualAnswerValue", "getQuestionnaireItemReferenceTargetTypes", "extension", "c", "setQuestionnaireItemReferenceTargetTypes", "targetTypes", "result", "e", "t", "getQuestionnaireItemReferenceFilter", "subject", "encounter", "filter", "parts", "part", "key", "buildInitialResponse", "questionnaire", "buildInitialResponseItems", "items", "buildInitialResponseItem", "generateId", "buildInitialResponseAnswer", "nextId", "answer", "formatReferenceString", "typedValue", "getNumberOfPages", "firstItem", "createContext", "QuestionnaireFormContext", "jsx", "QuestionnaireFormItem", "props", "context", "useContext", "QuestionnaireFormContext", "item", "response", "onChangeAnswer", "newResponseAnswer", "updatedAnswers", "a", "idx", "type", "name", "initial", "defaultValue", "getCurrentAnswer", "getTypedPropertyValue", "CheckboxFormSection", "Checkbox", "e", "TextInput", "DateTimeInput", "newValue", "Textarea", "Group", "AttachmentInput", "ReferenceInput", "getQuestionnaireItemReferenceTargetTypes", "getQuestionnaireItemReferenceFilter", "QuantityInput", "isDropDownChoice", "QuestionnaireChoiceDropDownInput", "QuestionnaireChoiceSetInput", "NoAnswerDisplay", "initialValue", "data", "option", "optionValue", "typedValueToString", "propertyName", "formatSelectData", "currentAnswer", "getCurrentMultiSelectAnswer", "MultiSelect", "selected", "values", "getNewMultiSelectValues", "NativeSelect", "index", "capitalize", "formatCoding", "CodingInput", "code", "QuestionnaireChoiceRadioInput", "valueElementDefinition", "getElementDefinition", "options", "i", "optionName", "stringify", "defaultAnswer", "answerLinkId", "getCurrentRadioAnswer", "Radio", "ResourcePropertyDisplay", "getItemValue", "answer", "results", "deepEquals", "typedValue", "formatCodeableConcept", "formatReferenceString", "getValueAndLabel", "Fragment", "jsx", "jsxs", "useStyles", "createStyles", "theme", "QuestionnaireBuilder", "props", "medplum", "s", "defaultValue", "j", "schemaLoaded", "setSchemaLoaded", "useState", "value", "setValue", "selectedKey", "setSelectedKey", "hoverKey", "setHoverKey", "handleDocumentMouseOver", "handleDocumentClick", "useEffect", "ensureQuestionnaireKeys", "handleChange", "questionnaire", "disableSubmit", "Form", "ItemBuilder", "Button", "classes", "cx", "resource", "item", "isResource", "isResourceType", "isContainer", "linkId", "editing", "hovering", "itemRef", "useRef", "onClick", "e", "killEvent", "onHover", "changeItem", "changedItem", "curr", "i", "addItem", "addedItem", "removeItem", "removedItem", "changeProperty", "property", "updateItem", "updatedItem", "toggleRepeatable", "moveItem", "itemIndex", "delta", "updatedItems", "reorderItems", "className", "TextInput", "Textarea", "ReferenceProfiles", "isChoiceQuestion", "AnswerBuilder", "Title", "QuestionnaireFormItem", "NativeSelect", "Box", "Anchor", "IconArrowUp", "IconArrowDown", "generateId", "generateLinkId", "createPage", "getElementDefinition", "options", "AnswerOptionsInput", "Space", "option", "propertyValue", "propertyType", "getValueAndType", "ResourcePropertyInput", "newValue", "propName", "newOptions", "index", "o", "targetTypes", "getQuestionnaireItemReferenceTargetTypes", "targetType", "Group", "ResourceTypeInput", "setQuestionnaireItemReferenceTargetTypes", "t", "nextLinkId", "nextId", "prefix", "ensureQuestionnaireItemKeys", "items", "ensureQuestionnaireOptionKeys", "currentItems", "newIndex", "Title", "createReference", "getReferenceString", "useEffect", "useState", "Button", "Group", "Stack", "Stepper", "Anchor", "useState", "jsx", "jsxs", "QuestionnaireRepeatableItem", "props", "item", "response", "onChange", "number", "setNumber", "useState", "getNumberOfRepeats", "showAddButton", "QuestionnaireFormItem", "r", "FormSection", "_", "index", "Anchor", "n", "answers", "Anchor", "Stack", "Title", "useState", "Fragment", "jsx", "jsxs", "QuestionnaireRepeatedGroup", "props", "responses", "setResponses", "useState", "handleRepeatableGroup", "newResponseItems", "index", "newResponses", "idx", "insertNewGroup", "newResponse", "buildInitialResponseItem", "response", "QuestionnaireGroup", "r", "Anchor", "checkForQuestionEnabled", "onChange", "onSetGroup", "newResponseItem", "mergedResponse", "current", "groupResponse", "Title", "Stack", "item", "i", "QuestionnaireRepeatableItem", "Fragment", "jsx", "jsxs", "QuestionnairePageSequence", "props", "items", "response", "activePage", "onChange", "nextStep", "prevStep", "numberOfPages", "renderPages", "submitButtonText", "checkForQuestionEnabled", "form", "item", "itemResponse", "i", "repeatedItem", "QuestionnaireRepeatedGroup", "QuestionnaireRepeatableItem", "Stepper", "Stack", "ButtonGroup", "showBackButton", "showNextButton", "showSubmitButton", "Group", "Button", "e", "jsx", "jsxs", "QuestionnaireForm", "props", "medplum", "s", "source", "schemaLoaded", "setSchemaLoaded", "useState", "questionnaire", "j", "response", "setResponse", "activePage", "setActivePage", "useEffect", "buildInitialResponse", "setItems", "newResponseItems", "currentItems", "newResponse", "mergeItems", "checkForQuestionEnabled", "item", "isQuestionEnabled", "numberOfPages", "getNumberOfPages", "nextStep", "current", "prevStep", "QuestionnaireFormContext", "Form", "getReferenceString", "createReference", "Title", "QuestionnairePageSequence", "mergeIndividualItems", "prevItem", "newItem", "mergedNestedItems", "prevItems", "newItems", "result", "usedIds", "itemId", "ActionIcon", "Button", "createStyles", "Divider", "Group", "NativeSelect", "Stack", "Text", "TextInput", "formatRange", "getCodeBySystem", "useEffect", "useState", "jsx", "jsxs", "useStyles", "createStyles", "theme", "intervalFilters", "defaultProps", "ReferenceRangeEditor", "props", "defaultDefinition", "intervalGroups", "setIntervalGroups", "useState", "groupId", "setGroupId", "intervalId", "setIntervalId", "useEffect", "definition", "ensureQualifiedIntervalKeys", "groupQualifiedIntervals", "Form", "submitDefinition", "Stack", "intervalGroup", "ReferenceRangeGroupEditor", "getUnitString", "changeInterval", "addInterval", "removeInterval", "removeGroup", "ActionIcon", "e", "killEvent", "addGroup", "id", "IconCirclePlus", "Group", "Button", "qualifiedInterval", "group", "interval", "isEmptyInterval", "addedGroup", "currentGroups", "removedGroup", "changedInterval", "groups", "currentGroup", "g", "index", "addedInterval", "currentGroupIndex", "removedInterval", "unit", "classes", "Container", "IconCircleMinus", "ReferenceRangeGroupFilters", "Divider", "TextInput", "RangeInput", "range", "onChange", "key", "NativeSelect", "newGender", "Text", "ageRange", "newEndocrine", "newCategory", "intervals", "nextId", "existingNum", "groupKey", "generateGroupKey", "f", "formatRange", "c", "getCodeBySystem", "Button", "Grid", "Text", "formatDateTime", "getReferenceString", "Fragment", "useEffect", "useState", "jsx", "jsxs", "RequestGroupDisplay", "props", "medplum", "s", "requestGroup", "j", "startedLoading", "setStartedLoading", "useState", "responseBundle", "setResponseBundle", "useEffect", "buildBatchRequest", "Grid", "action", "index", "task", "findBundleEntry", "taskInput", "taskOutput", "Fragment", "IconCheckbox", "IconSquare", "Text", "ResourceName", "formatDateTime", "StatusBadge", "Button", "request", "batchEntries", "reference", "entry", "getReferenceString", "createStyles", "useEffect", "useState", "stringify", "diff", "original", "revised", "path", "buildPath", "buildRevisions", "orig", "rev", "N", "M", "MAX", "size", "middle", "diagonal", "d", "k", "kmiddle", "kplus", "kminus", "kplusNode", "kminusNode", "prev", "i", "j", "node", "previousSnake", "startNode", "deltas", "ianchor", "janchor", "type", "blame", "history", "versions", "entry", "stringify", "a", "b", "table", "line", "compareVersions", "combineSpans", "i", "revisions", "diff", "revision", "position", "oldLines", "newLines", "k", "start", "curr", "getVersionUrl", "resource", "versionId", "getTimeString", "lastUpdated", "seconds", "years", "pluralizeTime", "months", "days", "hours", "minutes", "count", "noun", "Fragment", "jsx", "jsxs", "useStyles", "createStyles", "theme", "ResourceBlame", "props", "classes", "medplum", "s", "value", "setValue", "useState", "useEffect", "resource", "table", "blame", "row", "index", "ResourceBadge", "MedplumLink", "getVersionUrl", "getTimeString", "createStyles", "stringify", "Fragment", "jsx", "jsxs", "useStyles", "createStyles", "theme", "ResourceDiff", "props", "originalResource", "revisedResource", "original", "stringify", "revised", "deltas", "diff", "delta", "index", "ChangeDiff", "classes", "Button", "Group", "Stack", "TextInput", "deepClone", "tryGetProfile", "useEffect", "useState", "jsx", "jsxs", "ResourceForm", "props", "outcome", "medplum", "s", "defaultValue", "j", "schemaLoaded", "setSchemaLoaded", "useState", "value", "setValue", "useEffect", "deepClone", "profileUrl", "profile", "tryGetProfile", "schemaName", "e", "Stack", "FormSection", "TextInput", "BackboneElementInput", "Group", "Button", "Table", "formatDateTime", "normalizeErrorString", "useEffect", "useState", "jsx", "jsxs", "ResourceHistoryTable", "props", "medplum", "s", "value", "setValue", "useState", "useEffect", "Table", "entry", "index", "HistoryRow", "response", "resource", "ResourceBadge", "formatDateTime", "MedplumLink", "getVersionUrl", "normalizeErrorString", "Button", "createStyles", "Stack", "Text", "getReferenceString", "isReference", "useState", "jsx", "jsxs", "useStyles", "createStyles", "theme", "Scheduler", "props", "classes", "schedule", "j", "questionnaire", "month", "setMonth", "useState", "getStartMonth", "date", "setDate", "slot", "setSlot", "response", "setResponse", "slots", "ce", "isReference", "getReferenceString", "getStart", "getEnd", "actor", "ResourceAvatar", "Text", "ResourceName", "formatTime", "CalendarInput", "Stack", "s", "slotStart", "Button", "QuestionnaireForm", "formatSlotInstant", "time", "createReference", "jsx", "ServiceRequestTimeline", "props", "ResourceTimeline", "medplum", "resourceType", "id", "ref", "_count", "resource", "sender", "text", "createReference", "operator", "content", "Anchor", "showNotification", "normalizeErrorString", "jsx", "SmartAppLaunchLink", "props", "medplum", "s", "client", "patient", "encounter", "children", "rest", "launchApp", "result", "url", "err", "showNotification", "normalizeErrorString", "Anchor", "normalizeOperationOutcome", "useEffect", "useState", "Anchor", "Button", "Center", "Group", "Stack", "Text", "TextInput", "Title", "normalizeOperationOutcome", "useState", "jsx", "jsxs", "NewProjectForm", "props", "medplum", "s", "outcome", "setOutcome", "useState", "Form", "formData", "err", "normalizeOperationOutcome", "Center", "Logo", "Title", "Stack", "TextInput", "getErrorsForInput", "Text", "Anchor", "Group", "Button", "Anchor", "Button", "Center", "Checkbox", "Divider", "Group", "PasswordInput", "Stack", "Text", "TextInput", "normalizeOperationOutcome", "useEffect", "useState", "useEffect", "useRef", "useState", "createScriptTag", "src", "onload", "head", "script", "jsx", "GoogleButton", "props", "medplum", "s", "googleClientId", "handleGoogleCredential", "parentRef", "useRef", "scriptLoaded", "setScriptLoaded", "useState", "initialized", "setInitialized", "buttonRendered", "setButtonRendered", "useEffect", "createScriptTag", "getGoogleClientId", "clientId", "origin", "initRecaptcha", "siteKey", "createScriptTag", "getRecaptcha", "resolve", "reject", "err", "Fragment", "jsx", "jsxs", "NewUserForm", "props", "googleClientId", "getGoogleClientId", "recaptchaSiteKey", "medplum", "s", "outcome", "setOutcome", "useState", "issues", "getIssuesForExpression", "useEffect", "initRecaptcha", "Form", "formData", "recaptchaToken", "getRecaptcha", "err", "normalizeOperationOutcome", "Center", "OperationOutcomeAlert", "Group", "GoogleButton", "response", "Divider", "Stack", "TextInput", "getErrorsForInput", "PasswordInput", "Text", "Anchor", "Checkbox", "Button", "jsx", "jsxs", "RegisterForm", "props", "type", "projectId", "clientId", "googleClientId", "recaptchaSiteKey", "onSuccess", "medplum", "s", "login", "setLogin", "useState", "outcome", "setOutcome", "useEffect", "response", "err", "normalizeOperationOutcome", "handleAuthResponse", "Document", "NewUserForm", "NewProjectForm", "showNotification", "normalizeErrorString", "useCallback", "useEffect", "useState", "Anchor", "Button", "Center", "Checkbox", "Divider", "Group", "PasswordInput", "Stack", "TextInput", "normalizeOperationOutcome", "useCallback", "useState", "Fragment", "jsx", "jsxs", "AuthenticationForm", "props", "email", "setEmail", "useState", "PasswordForm", "EmailForm", "onRegister", "handleAuthResponse", "children", "disableEmailAuth", "baseLoginRequest", "medplum", "s", "googleClientId", "getGoogleClientId", "isExternalAuth", "useCallback", "authMethod", "state", "url", "handleSubmit", "formData", "handleGoogleCredential", "response", "authResponse", "Form", "Center", "Group", "GoogleButton", "Divider", "TextInput", "Anchor", "Button", "onForgotPassword", "outcome", "setOutcome", "issues", "getIssuesForExpression", "err", "normalizeOperationOutcome", "OperationOutcomeAlert", "Stack", "PasswordInput", "getErrorsForInput", "Checkbox", "Avatar", "Center", "Group", "Stack", "Text", "Title", "UnstyledButton", "normalizeOperationOutcome", "useState", "jsx", "jsxs", "ChooseProfileForm", "props", "medplum", "s", "outcome", "setOutcome", "useState", "Stack", "Center", "Logo", "Title", "OperationOutcomeAlert", "membership", "UnstyledButton", "err", "normalizeOperationOutcome", "Group", "Avatar", "Text", "Button", "Center", "Checkbox", "Group", "Stack", "Title", "jsx", "jsxs", "ChooseScopeForm", "props", "medplum", "s", "Form", "formData", "Stack", "Center", "Logo", "Title", "scopeName", "Checkbox", "Group", "Button", "Alert", "Button", "Center", "Group", "Stack", "TextInput", "Title", "normalizeErrorString", "useState", "jsx", "jsxs", "MfaForm", "props", "medplum", "s", "errorMessage", "setErrorMessage", "useState", "Form", "formData", "err", "normalizeErrorString", "Stack", "Center", "Logo", "Title", "Alert", "IconAlertCircle", "TextInput", "Group", "Button", "jsx", "SignInForm", "props", "loginCode", "chooseScopes", "onSuccess", "onForgotPassword", "onRegister", "onCode", "baseLoginRequest", "medplum", "s", "login", "setLogin", "useState", "mfaRequired", "setAuthenticatorRequired", "memberships", "setMemberships", "handleCode", "useCallback", "code", "err", "showNotification", "normalizeErrorString", "handleAuthResponse", "response", "handleScopeResponse", "useEffect", "Document", "MfaForm", "ChooseProfileForm", "NewProjectForm", "ChooseScopeForm", "AuthenticationForm"]
3
+ "sources": ["../../../../node_modules/rfc6902/pointer.js", "../../../../node_modules/rfc6902/util.js", "../../../../node_modules/rfc6902/diff.js", "../../../../node_modules/rfc6902/patch.js", "../../../../node_modules/rfc6902/index.js", "../../../react-hooks/src/MedplumProvider/MedplumProvider.tsx", "../../../react-hooks/src/MedplumProvider/MedplumProvider.context.ts", "../../../react-hooks/src/useResource/useResource.ts", "../../../react-hooks/src/useSearch/useSearch.ts", "../../src/AddressDisplay/AddressDisplay.tsx", "../../src/AddressInput/AddressInput.tsx", "../../src/AnnotationInput/AnnotationInput.tsx", "../../src/AppShell/AppShell.tsx", "../../src/ErrorBoundary/ErrorBoundary.tsx", "../../../../node_modules/@tabler/icons-react/src/defaultAttributes.js", "../../../../node_modules/@tabler/icons-react/src/createReactComponent.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconAdjustmentsHorizontal.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconAlertCircle.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconArrowDown.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconArrowUp.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBleachOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBleach.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBoxMultiple.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBracketsContain.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBucketOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconBucket.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCalendar.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCheck.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCheckbox.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconChevronDown.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCircleMinus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCirclePlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCloudUpload.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconColumns.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCopy.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconCurrencyDollar.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconDots.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEdit.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEqualNot.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconEqual.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFileAlert.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFilePlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconFilter.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconGenderFemale.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconListDetails.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconLogout.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMathGreater.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMathLower.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconMessage.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPin.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPinnedOff.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconPlus.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconRefresh.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSearch.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSettings.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSortAscending.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSortDescending.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSquare.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconStethoscope.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconSwitchHorizontal.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconTableExport.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconTrash.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconUserSquare.js", "../../../../node_modules/@tabler/icons-react/src/icons/IconX.js", "../../src/Loading/Loading.tsx", "../../src/AppShell/AppShell.module.css", "../../src/AppShell/Header.tsx", "../../../../node_modules/clsx/dist/clsx.mjs", "../../src/HumanNameDisplay/HumanNameDisplay.tsx", "../../src/ResourceAvatar/ResourceAvatar.tsx", "../../src/MedplumLink/MedplumLink.tsx", "../../src/utils/dom.ts", "../../src/AppShell/Header.module.css", "../../src/AppShell/HeaderSearchInput.tsx", "../../src/AsyncAutocomplete/AsyncAutocomplete.tsx", "../../src/AppShell/HeaderSearchInput.module.css", "../../src/AppShell/Navbar.tsx", "../../src/BookmarkDialog/BookmarkDialog.tsx", "../../src/Form/FormUtils.ts", "../../src/Form/Form.tsx", "../../src/ResourceTypeInput/ResourceTypeInput.tsx", "../../src/CodeInput/CodeInput.tsx", "../../src/ValueSetAutocomplete/ValueSetAutocomplete.tsx", "../../src/AppShell/Navbar.module.css", "../../src/AttachmentDisplay/AttachmentDisplay.tsx", "../../src/AttachmentArrayDisplay/AttachmentArrayDisplay.tsx", "../../src/AttachmentArrayInput/AttachmentArrayInput.tsx", "../../src/AttachmentButton/AttachmentButton.tsx", "../../src/AttachmentInput/AttachmentInput.tsx", "../../src/BackboneElementDisplay/BackboneElementDisplay.tsx", "../../src/constants.ts", "../../src/DescriptionList/DescriptionList.module.css", "../../src/DescriptionList/DescriptionList.tsx", "../../src/ResourcePropertyDisplay/ResourcePropertyDisplay.tsx", "../../src/CodeableConceptDisplay/CodeableConceptDisplay.tsx", "../../src/CodingDisplay/CodingDisplay.tsx", "../../src/ContactPointDisplay/ContactPointDisplay.tsx", "../../src/ContactDetailDisplay/ContactDetailDisplay.tsx", "../../src/IdentifierDisplay/IdentifierDisplay.tsx", "../../src/MoneyDisplay/MoneyDisplay.tsx", "../../src/QuantityDisplay/QuantityDisplay.tsx", "../../src/RangeDisplay/RangeDisplay.tsx", "../../src/RatioDisplay/RatioDisplay.tsx", "../../src/ReferenceDisplay/ReferenceDisplay.tsx", "../../src/ResourceArrayDisplay/ResourceArrayDisplay.tsx", "../../src/ResourcePropertyDisplay/ResourcePropertyDisplay.utils.ts", "../../src/BackboneElementInput/BackboneElementInput.tsx", "../../src/ElementsInput/ElementsInput.tsx", "../../src/CheckboxFormSection/CheckboxFormSection.tsx", "../../src/BackboneElementInput/BackboneElementInput.utils.ts", "../../src/FormSection/FormSection.tsx", "../../src/utils/outcomes.ts", "../../src/ResourceForm/ResourceForm.utils.ts", "../../src/ResourcePropertyInput/ResourcePropertyInput.tsx", "../../src/CodeableConceptInput/CodeableConceptInput.tsx", "../../src/CodingInput/CodingInput.tsx", "../../src/ContactDetailInput/ContactDetailInput.tsx", "../../src/ContactPointInput/ContactPointInput.tsx", "../../src/DateTimeInput/DateTimeInput.tsx", "../../src/DateTimeInput/DateTimeInput.utils.ts", "../../src/ExtensionInput/ExtensionInput.tsx", "../../src/HumanNameInput/HumanNameInput.tsx", "../../src/IdentifierInput/IdentifierInput.tsx", "../../src/MoneyInput/MoneyInput.tsx", "../../src/PeriodInput/PeriodInput.tsx", "../../src/QuantityInput/QuantityInput.tsx", "../../src/RangeInput/RangeInput.tsx", "../../src/RatioInput/RatioInput.tsx", "../../src/ReferenceInput/ReferenceInput.tsx", "../../src/ResourceInput/ResourceInput.tsx", "../../src/ResourceArrayInput/ResourceArrayInput.tsx", "../../src/ResourceArrayInput/ResourceArrayInput.module.css", "../../src/ResourceArrayInput/ResourceArrayInput.utils.ts", "../../src/SensitiveTextarea/SensitiveTextarea.tsx", "../../src/TimingInput/TimingInput.tsx", "../../src/CalendarInput/CalendarInput.tsx", "../../src/CalendarInput/CalendarInput.module.css", "../../src/CalendarInput/CalendarInput.utils.ts", "../../src/Container/Container.tsx", "../../src/Container/Container.module.css", "../../src/ResourceTimeline/ResourceTimeline.tsx", "../../src/DiagnosticReportDisplay/DiagnosticReportDisplay.tsx", "../../src/NoteDisplay/NoteDisplay.tsx", "../../src/NoteDisplay/NoteDisplay.module.css", "../../src/ResourceBadge/ResourceBadge.tsx", "../../src/ResourceName/ResourceName.tsx", "../../src/StatusBadge/StatusBadge.tsx", "../../src/DiagnosticReportDisplay/DiagnosticReportDisplay.module.css", "../../src/Panel/Panel.tsx", "../../src/Panel/Panel.module.css", "../../src/ResourceDiffTable/ResourceDiffTable.tsx", "../../src/ResourceDiffTable/ResourceDiffTable.module.css", "../../src/ResourceTable/ResourceTable.tsx", "../../src/Timeline/Timeline.tsx", "../../src/utils/date.ts", "../../src/ResourceTimeline/ResourceTimeline.module.css", "../../src/DefaultResourceTimeline/DefaultResourceTimeline.tsx", "../../src/Document/Document.tsx", "../../src/EncounterTimeline/EncounterTimeline.tsx", "../../src/FhirPathTable/FhirPathTable.tsx", "../../src/FhirPathDisplay/FhirPathDisplay.tsx", "../../src/SearchControl/SearchControl.tsx", "../../src/SearchExportDialog/SearchExportDialog.tsx", "../../src/SearchFieldEditor/SearchFieldEditor.tsx", "../../src/SearchControl/SearchUtils.tsx", "../../src/SearchFilterEditor/SearchFilterEditor.tsx", "../../src/SearchFilterValueDisplay/SearchFilterValueDisplay.tsx", "../../src/SearchFilterValueInput/SearchFilterValueInput.tsx", "../../src/SearchFilterValueDialog/SearchFilterValueDialog.tsx", "../../src/SearchPopupMenu/SearchPopupMenu.tsx", "../../src/SearchControl/SearchControl.module.css", "../../src/SearchControl/SearchControlField.ts", "../../src/Logo/Logo.tsx", "../../src/MeasureReportDisplay/MeasureReportDisplay.tsx", "../../src/MeasureReportDisplay/MeasureReportGroupDisplay/MeasureReportGroupDisplay.tsx", "../../src/OperationOutcomeAlert/OperationOutcomeAlert.tsx", "../../src/PatientSummary/PatientSummary.tsx", "../../src/PatientSummary/Allergies.tsx", "../../src/PatientSummary/Medications.tsx", "../../src/PatientSummary/ProblemList.tsx", "../../src/PatientSummary/SmokingStatus.tsx", "../../src/PatientSummary/Vitals.tsx", "../../src/PatientSummary/Vitals.utils.ts", "../../src/PatientTimeline/PatientTimeline.tsx", "../../src/PlanDefinitionBuilder/PlanDefinitionBuilder.tsx", "../../src/PlanDefinitionBuilder/PlanDefinitionBuilder.module.css", "../../src/QuestionnaireBuilder/QuestionnaireBuilder.tsx", "../../src/QuestionnaireForm/QuestionnaireFormItem/QuestionnaireFormItem.tsx", "../../src/utils/questionnaire.ts", "../../src/QuestionnaireForm/QuestionnaireForm.context.ts", "../../src/QuestionnaireBuilder/QuestionnaireBuilder.module.css", "../../src/QuestionnaireForm/QuestionnaireForm.tsx", "../../src/QuestionnaireForm/QuestionnaireFormComponents/QuestionnaireFormPageSequence.tsx", "../../src/QuestionnaireForm/QuestionnaireFormItem/QuestionnaireRepeatableItem.tsx", "../../src/QuestionnaireForm/QuestionnaireFormComponents/QuestionnaireFormGroup.tsx", "../../src/ReferenceRangeEditor/ReferenceRangeEditor.tsx", "../../src/ReferenceRangeEditor/ReferenceRangeEditor.module.css", "../../src/RequestGroupDisplay/RequestGroupDisplay.tsx", "../../src/ResourceBlame/ResourceBlame.tsx", "../../src/utils/blame.ts", "../../src/utils/diff.ts", "../../src/ResourceBlame/ResourceBlame.module.css", "../../src/ResourceBlame/ResourceBlame.utils.ts", "../../src/ResourceDiff/ResourceDiff.tsx", "../../src/ResourceDiff/ResourceDiff.module.css", "../../src/ResourceForm/ResourceForm.tsx", "../../src/ResourceHistoryTable/ResourceHistoryTable.tsx", "../../src/Scheduler/Scheduler.tsx", "../../src/Scheduler/Scheduler.module.css", "../../src/ServiceRequestTimeline/ServiceRequestTimeline.tsx", "../../src/SmartAppLaunchLink/SmartAppLaunchLink.tsx", "../../src/auth/RegisterForm.tsx", "../../src/auth/NewProjectForm.tsx", "../../src/auth/NewUserForm.tsx", "../../src/GoogleButton/GoogleButton.tsx", "../../src/utils/script.ts", "../../src/GoogleButton/GoogleButton.utils.ts", "../../src/utils/recaptcha.ts", "../../src/auth/SignInForm.tsx", "../../src/auth/AuthenticationForm.tsx", "../../src/auth/ChooseProfileForm.tsx", "../../src/auth/ChooseScopeForm.tsx", "../../src/auth/MfaForm.tsx"],
4
+ "sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Pointer = void 0;\n/**\nUnescape token part of a JSON Pointer string\n\n`token` should *not* contain any '/' characters.\n\n> Evaluation of each reference token begins by decoding any escaped\n> character sequence. This is performed by first transforming any\n> occurrence of the sequence '~1' to '/', and then transforming any\n> occurrence of the sequence '~0' to '~'. By performing the\n> substitutions in this order, an implementation avoids the error of\n> turning '~01' first into '~1' and then into '/', which would be\n> incorrect (the string '~01' correctly becomes '~1' after\n> transformation).\n\nHere's my take:\n\n~1 is unescaped with higher priority than ~0 because it is a lower-order escape character.\nI say \"lower order\" because '/' needs escaping due to the JSON Pointer serialization technique.\nWhereas, '~' is escaped because escaping '/' uses the '~' character.\n*/\nfunction unescape(token) {\n return token.replace(/~1/g, '/').replace(/~0/g, '~');\n}\n/** Escape token part of a JSON Pointer string\n\n> '~' needs to be encoded as '~0' and '/'\n> needs to be encoded as '~1' when these characters appear in a\n> reference token.\n\nThis is the exact inverse of `unescape()`, so the reverse replacements must take place in reverse order.\n*/\nfunction escape(token) {\n return token.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n/**\nJSON Pointer representation\n*/\nvar Pointer = /** @class */ (function () {\n function Pointer(tokens) {\n if (tokens === void 0) { tokens = ['']; }\n this.tokens = tokens;\n }\n /**\n `path` *must* be a properly escaped string.\n */\n Pointer.fromJSON = function (path) {\n var tokens = path.split('/').map(unescape);\n if (tokens[0] !== '')\n throw new Error(\"Invalid JSON Pointer: \".concat(path));\n return new Pointer(tokens);\n };\n Pointer.prototype.toString = function () {\n return this.tokens.map(escape).join('/');\n };\n /**\n Returns an object with 'parent', 'key', and 'value' properties.\n In the special case that this Pointer's path == \"\",\n this object will be {parent: null, key: '', value: object}.\n Otherwise, parent and key will have the property such that parent[key] == value.\n */\n Pointer.prototype.evaluate = function (object) {\n var parent = null;\n var key = '';\n var value = object;\n for (var i = 1, l = this.tokens.length; i < l; i++) {\n parent = value;\n key = this.tokens[i];\n if (key == '__proto__' || key == 'constructor' || key == 'prototype') {\n continue;\n }\n // not sure if this the best way to handle non-existant paths...\n value = (parent || {})[key];\n }\n return { parent: parent, key: key, value: value };\n };\n Pointer.prototype.get = function (object) {\n return this.evaluate(object).value;\n };\n Pointer.prototype.set = function (object, value) {\n var endpoint = this.evaluate(object);\n if (endpoint.parent) {\n endpoint.parent[endpoint.key] = value;\n }\n };\n Pointer.prototype.push = function (token) {\n // mutable\n this.tokens.push(token);\n };\n /**\n `token` should be a String. It'll be coerced to one anyway.\n \n immutable (shallowly)\n */\n Pointer.prototype.add = function (token) {\n var tokens = this.tokens.concat(String(token));\n return new Pointer(tokens);\n };\n return Pointer;\n}());\nexports.Pointer = Pointer;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.clone = exports.objectType = exports.hasOwnProperty = void 0;\nexports.hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction objectType(object) {\n if (object === undefined) {\n return 'undefined';\n }\n if (object === null) {\n return 'null';\n }\n if (Array.isArray(object)) {\n return 'array';\n }\n return typeof object;\n}\nexports.objectType = objectType;\nfunction isNonPrimitive(value) {\n // loose-equality checking for null is faster than strict checking for each of null/undefined/true/false\n // checking null first, then calling typeof, is faster than vice-versa\n return value != null && typeof value == 'object';\n}\n/**\nRecursively copy a value.\n\n@param source - should be a JavaScript primitive, Array, Date, or (plain old) Object.\n@returns copy of source where every Array and Object have been recursively\n reconstructed from their constituent elements\n*/\nfunction clone(source) {\n if (!isNonPrimitive(source)) {\n // short-circuiting is faster than a single return\n return source;\n }\n // x.constructor == Array is the fastest way to check if x is an Array\n if (source.constructor == Array) {\n // construction via imperative for-loop is faster than source.map(arrayVsObject)\n var length_1 = source.length;\n // setting the Array length during construction is faster than just `[]` or `new Array()`\n var arrayTarget = new Array(length_1);\n for (var i = 0; i < length_1; i++) {\n arrayTarget[i] = clone(source[i]);\n }\n return arrayTarget;\n }\n // Date\n if (source.constructor == Date) {\n var dateTarget = new Date(+source);\n return dateTarget;\n }\n // Object\n var objectTarget = {};\n // declaring the variable (with const) inside the loop is faster\n for (var key in source) {\n // hasOwnProperty costs a bit of performance, but it's semantically necessary\n // using a global helper is MUCH faster than calling source.hasOwnProperty(key)\n if (exports.hasOwnProperty.call(source, key)) {\n objectTarget[key] = clone(source[key]);\n }\n }\n return objectTarget;\n}\nexports.clone = clone;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.diffAny = exports.diffObjects = exports.diffArrays = exports.intersection = exports.subtract = exports.isDestructive = void 0;\nvar util_1 = require(\"./util\");\nfunction isDestructive(_a) {\n var op = _a.op;\n return op === 'remove' || op === 'replace' || op === 'copy' || op === 'move';\n}\nexports.isDestructive = isDestructive;\n/**\nList the keys in `minuend` that are not in `subtrahend`.\n\nA key is only considered if it is both 1) an own-property (o.hasOwnProperty(k))\nof the object, and 2) has a value that is not undefined. This is to match JSON\nsemantics, where JSON object serialization drops keys with undefined values.\n\n@param minuend Object of interest\n@param subtrahend Object of comparison\n@returns Array of keys that are in `minuend` but not in `subtrahend`.\n*/\nfunction subtract(minuend, subtrahend) {\n // initialize empty object; we only care about the keys, the values can be anything\n var obj = {};\n // build up obj with all the properties of minuend\n for (var add_key in minuend) {\n if (util_1.hasOwnProperty.call(minuend, add_key) && minuend[add_key] !== undefined) {\n obj[add_key] = 1;\n }\n }\n // now delete all the properties of subtrahend from obj\n // (deleting a missing key has no effect)\n for (var del_key in subtrahend) {\n if (util_1.hasOwnProperty.call(subtrahend, del_key) && subtrahend[del_key] !== undefined) {\n delete obj[del_key];\n }\n }\n // finally, extract whatever keys remain in obj\n return Object.keys(obj);\n}\nexports.subtract = subtract;\n/**\nList the keys that shared by all `objects`.\n\nThe semantics of what constitutes a \"key\" is described in {@link subtract}.\n\n@param objects Array of objects to compare\n@returns Array of keys that are in (\"own-properties\" of) every object in `objects`.\n*/\nfunction intersection(objects) {\n var length = objects.length;\n // prepare empty counter to keep track of how many objects each key occurred in\n var counter = {};\n // go through each object and increment the counter for each key in that object\n for (var i = 0; i < length; i++) {\n var object = objects[i];\n for (var key in object) {\n if (util_1.hasOwnProperty.call(object, key) && object[key] !== undefined) {\n counter[key] = (counter[key] || 0) + 1;\n }\n }\n }\n // now delete all keys from the counter that were not seen in every object\n for (var key in counter) {\n if (counter[key] < length) {\n delete counter[key];\n }\n }\n // finally, extract whatever keys remain in the counter\n return Object.keys(counter);\n}\nexports.intersection = intersection;\nfunction isArrayAdd(array_operation) {\n return array_operation.op === 'add';\n}\nfunction isArrayRemove(array_operation) {\n return array_operation.op === 'remove';\n}\nfunction appendArrayOperation(base, operation) {\n return {\n // the new operation must be pushed on the end\n operations: base.operations.concat(operation),\n cost: base.cost + 1,\n };\n}\n/**\nCalculate the shortest sequence of operations to get from `input` to `output`,\nusing a dynamic programming implementation of the Levenshtein distance algorithm.\n\nTo get from the input ABC to the output AZ we could just delete all the input\nand say \"insert A, insert Z\" and be done with it. That's what we do if the\ninput is empty. But we can be smarter.\n\n output\n A Z\n - -\n [0] 1 2\ninput A | 1 [0] 1\n B | 2 [1] 1\n C | 3 2 [2]\n\n1) start at 0,0 (+0)\n2) keep A (+0)\n3) remove B (+1)\n4) replace C with Z (+1)\n\nIf the `input` (source) is empty, they'll all be in the top row, resulting in an\narray of 'add' operations.\nIf the `output` (target) is empty, everything will be in the left column,\nresulting in an array of 'remove' operations.\n\n@returns A list of add/remove/replace operations.\n*/\nfunction diffArrays(input, output, ptr, diff) {\n if (diff === void 0) { diff = diffAny; }\n // set up cost matrix (very simple initialization: just a map)\n var memo = {\n '0,0': { operations: [], cost: 0 },\n };\n /**\n Calculate the cheapest sequence of operations required to get from\n input.slice(0, i) to output.slice(0, j).\n There may be other valid sequences with the same cost, but none cheaper.\n \n @param i The row in the layout above\n @param j The column in the layout above\n @returns An object containing a list of operations, along with the total cost\n of applying them (+1 for each add/remove/replace operation)\n */\n function dist(i, j) {\n // memoized\n var memo_key = \"\".concat(i, \",\").concat(j);\n var memoized = memo[memo_key];\n if (memoized === undefined) {\n // TODO: this !diff(...).length usage could/should be lazy\n if (i > 0 && j > 0 && !diff(input[i - 1], output[j - 1], ptr.add(String(i - 1))).length) {\n // equal (no operations => no cost)\n memoized = dist(i - 1, j - 1);\n }\n else {\n var alternatives = [];\n if (i > 0) {\n // NOT topmost row\n var remove_base = dist(i - 1, j);\n var remove_operation = {\n op: 'remove',\n index: i - 1,\n };\n alternatives.push(appendArrayOperation(remove_base, remove_operation));\n }\n if (j > 0) {\n // NOT leftmost column\n var add_base = dist(i, j - 1);\n var add_operation = {\n op: 'add',\n index: i - 1,\n value: output[j - 1],\n };\n alternatives.push(appendArrayOperation(add_base, add_operation));\n }\n if (i > 0 && j > 0) {\n // TABLE MIDDLE\n // supposing we replaced it, compute the rest of the costs:\n var replace_base = dist(i - 1, j - 1);\n // okay, the general plan is to replace it, but we can be smarter,\n // recursing into the structure and replacing only part of it if\n // possible, but to do so we'll need the original value\n var replace_operation = {\n op: 'replace',\n index: i - 1,\n original: input[i - 1],\n value: output[j - 1],\n };\n alternatives.push(appendArrayOperation(replace_base, replace_operation));\n }\n // the only other case, i === 0 && j === 0, has already been memoized\n // the meat of the algorithm:\n // sort by cost to find the lowest one (might be several ties for lowest)\n // [4, 6, 7, 1, 2].sort((a, b) => a - b) -> [ 1, 2, 4, 6, 7 ]\n var best = alternatives.sort(function (a, b) { return a.cost - b.cost; })[0];\n memoized = best;\n }\n memo[memo_key] = memoized;\n }\n return memoized;\n }\n // handle weird objects masquerading as Arrays that don't have proper length\n // properties by using 0 for everything but positive numbers\n var input_length = (isNaN(input.length) || input.length <= 0) ? 0 : input.length;\n var output_length = (isNaN(output.length) || output.length <= 0) ? 0 : output.length;\n var array_operations = dist(input_length, output_length).operations;\n var padded_operations = array_operations.reduce(function (_a, array_operation) {\n var operations = _a[0], padding = _a[1];\n if (isArrayAdd(array_operation)) {\n var padded_index = array_operation.index + 1 + padding;\n var index_token = padded_index < (input_length + padding) ? String(padded_index) : '-';\n var operation = {\n op: array_operation.op,\n path: ptr.add(index_token).toString(),\n value: array_operation.value,\n };\n // padding++ // maybe only if array_operation.index > -1 ?\n return [operations.concat(operation), padding + 1];\n }\n else if (isArrayRemove(array_operation)) {\n var operation = {\n op: array_operation.op,\n path: ptr.add(String(array_operation.index + padding)).toString(),\n };\n // padding--\n return [operations.concat(operation), padding - 1];\n }\n else { // replace\n var replace_ptr = ptr.add(String(array_operation.index + padding));\n var replace_operations = diff(array_operation.original, array_operation.value, replace_ptr);\n return [operations.concat.apply(operations, replace_operations), padding];\n }\n }, [[], 0])[0];\n return padded_operations;\n}\nexports.diffArrays = diffArrays;\nfunction diffObjects(input, output, ptr, diff) {\n if (diff === void 0) { diff = diffAny; }\n // if a key is in input but not output -> remove it\n var operations = [];\n subtract(input, output).forEach(function (key) {\n operations.push({ op: 'remove', path: ptr.add(key).toString() });\n });\n // if a key is in output but not input -> add it\n subtract(output, input).forEach(function (key) {\n operations.push({ op: 'add', path: ptr.add(key).toString(), value: output[key] });\n });\n // if a key is in both, diff it recursively\n intersection([input, output]).forEach(function (key) {\n operations.push.apply(operations, diff(input[key], output[key], ptr.add(key)));\n });\n return operations;\n}\nexports.diffObjects = diffObjects;\n/**\n`diffAny()` returns an empty array if `input` and `output` are materially equal\n(i.e., would produce equivalent JSON); otherwise it produces an array of patches\nthat would transform `input` into `output`.\n\n> Here, \"equal\" means that the value at the target location and the\n> value conveyed by \"value\" are of the same JSON type, and that they\n> are considered equal by the following rules for that type:\n> o strings: are considered equal if they contain the same number of\n> Unicode characters and their code points are byte-by-byte equal.\n> o numbers: are considered equal if their values are numerically\n> equal.\n> o arrays: are considered equal if they contain the same number of\n> values, and if each value can be considered equal to the value at\n> the corresponding position in the other array, using this list of\n> type-specific rules.\n> o objects: are considered equal if they contain the same number of\n> members, and if each member can be considered equal to a member in\n> the other object, by comparing their keys (as strings) and their\n> values (using this list of type-specific rules).\n> o literals (false, true, and null): are considered equal if they are\n> the same.\n*/\nfunction diffAny(input, output, ptr, diff) {\n if (diff === void 0) { diff = diffAny; }\n // strict equality handles literals, numbers, and strings (a sufficient but not necessary cause)\n if (input === output) {\n return [];\n }\n var input_type = (0, util_1.objectType)(input);\n var output_type = (0, util_1.objectType)(output);\n if (input_type == 'array' && output_type == 'array') {\n return diffArrays(input, output, ptr, diff);\n }\n if (input_type == 'object' && output_type == 'object') {\n return diffObjects(input, output, ptr, diff);\n }\n // at this point we know that input and output are materially different;\n // could be array -> object, object -> array, boolean -> undefined,\n // number -> string, or some other combination, but nothing that can be split\n // up into multiple patches: so `output` must replace `input` wholesale.\n return [{ op: 'replace', path: ptr.toString(), value: output }];\n}\nexports.diffAny = diffAny;\n", "\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.apply = exports.InvalidOperationError = exports.test = exports.copy = exports.move = exports.replace = exports.remove = exports.add = exports.TestError = exports.MissingError = void 0;\nvar pointer_1 = require(\"./pointer\");\nvar util_1 = require(\"./util\");\nvar diff_1 = require(\"./diff\");\nvar MissingError = /** @class */ (function (_super) {\n __extends(MissingError, _super);\n function MissingError(path) {\n var _this = _super.call(this, \"Value required at path: \".concat(path)) || this;\n _this.path = path;\n _this.name = 'MissingError';\n return _this;\n }\n return MissingError;\n}(Error));\nexports.MissingError = MissingError;\nvar TestError = /** @class */ (function (_super) {\n __extends(TestError, _super);\n function TestError(actual, expected) {\n var _this = _super.call(this, \"Test failed: \".concat(actual, \" != \").concat(expected)) || this;\n _this.actual = actual;\n _this.expected = expected;\n _this.name = 'TestError';\n return _this;\n }\n return TestError;\n}(Error));\nexports.TestError = TestError;\nfunction _add(object, key, value) {\n if (Array.isArray(object)) {\n // `key` must be an index\n if (key == '-') {\n object.push(value);\n }\n else {\n var index = parseInt(key, 10);\n object.splice(index, 0, value);\n }\n }\n else {\n object[key] = value;\n }\n}\nfunction _remove(object, key) {\n if (Array.isArray(object)) {\n // '-' syntax doesn't make sense when removing\n var index = parseInt(key, 10);\n object.splice(index, 1);\n }\n else {\n // not sure what the proper behavior is when path = ''\n delete object[key];\n }\n}\n/**\n> o If the target location specifies an array index, a new value is\n> inserted into the array at the specified index.\n> o If the target location specifies an object member that does not\n> already exist, a new member is added to the object.\n> o If the target location specifies an object member that does exist,\n> that member's value is replaced.\n*/\nfunction add(object, operation) {\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n // it's not exactly a \"MissingError\" in the same way that `remove` is -- more like a MissingParent, or something\n if (endpoint.parent === undefined) {\n return new MissingError(operation.path);\n }\n _add(endpoint.parent, endpoint.key, (0, util_1.clone)(operation.value));\n return null;\n}\nexports.add = add;\n/**\n> The \"remove\" operation removes the value at the target location.\n> The target location MUST exist for the operation to be successful.\n*/\nfunction remove(object, operation) {\n // endpoint has parent, key, and value properties\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n if (endpoint.value === undefined) {\n return new MissingError(operation.path);\n }\n // not sure what the proper behavior is when path = ''\n _remove(endpoint.parent, endpoint.key);\n return null;\n}\nexports.remove = remove;\n/**\n> The \"replace\" operation replaces the value at the target location\n> with a new value. The operation object MUST contain a \"value\" member\n> whose content specifies the replacement value.\n> The target location MUST exist for the operation to be successful.\n\n> This operation is functionally identical to a \"remove\" operation for\n> a value, followed immediately by an \"add\" operation at the same\n> location with the replacement value.\n\nEven more simply, it's like the add operation with an existence check.\n*/\nfunction replace(object, operation) {\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n if (endpoint.parent === null) {\n return new MissingError(operation.path);\n }\n // this existence check treats arrays as a special case\n if (Array.isArray(endpoint.parent)) {\n if (parseInt(endpoint.key, 10) >= endpoint.parent.length) {\n return new MissingError(operation.path);\n }\n }\n else if (endpoint.value === undefined) {\n return new MissingError(operation.path);\n }\n endpoint.parent[endpoint.key] = (0, util_1.clone)(operation.value);\n return null;\n}\nexports.replace = replace;\n/**\n> The \"move\" operation removes the value at a specified location and\n> adds it to the target location.\n> The operation object MUST contain a \"from\" member, which is a string\n> containing a JSON Pointer value that references the location in the\n> target document to move the value from.\n> This operation is functionally identical to a \"remove\" operation on\n> the \"from\" location, followed immediately by an \"add\" operation at\n> the target location with the value that was just removed.\n\n> The \"from\" location MUST NOT be a proper prefix of the \"path\"\n> location; i.e., a location cannot be moved into one of its children.\n\nTODO: throw if the check described in the previous paragraph fails.\n*/\nfunction move(object, operation) {\n var from_endpoint = pointer_1.Pointer.fromJSON(operation.from).evaluate(object);\n if (from_endpoint.value === undefined) {\n return new MissingError(operation.from);\n }\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n if (endpoint.parent === undefined) {\n return new MissingError(operation.path);\n }\n _remove(from_endpoint.parent, from_endpoint.key);\n _add(endpoint.parent, endpoint.key, from_endpoint.value);\n return null;\n}\nexports.move = move;\n/**\n> The \"copy\" operation copies the value at a specified location to the\n> target location.\n> The operation object MUST contain a \"from\" member, which is a string\n> containing a JSON Pointer value that references the location in the\n> target document to copy the value from.\n> The \"from\" location MUST exist for the operation to be successful.\n\n> This operation is functionally identical to an \"add\" operation at the\n> target location using the value specified in the \"from\" member.\n\nAlternatively, it's like 'move' without the 'remove'.\n*/\nfunction copy(object, operation) {\n var from_endpoint = pointer_1.Pointer.fromJSON(operation.from).evaluate(object);\n if (from_endpoint.value === undefined) {\n return new MissingError(operation.from);\n }\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n if (endpoint.parent === undefined) {\n return new MissingError(operation.path);\n }\n _add(endpoint.parent, endpoint.key, (0, util_1.clone)(from_endpoint.value));\n return null;\n}\nexports.copy = copy;\n/**\n> The \"test\" operation tests that a value at the target location is\n> equal to a specified value.\n> The operation object MUST contain a \"value\" member that conveys the\n> value to be compared to the target location's value.\n> The target location MUST be equal to the \"value\" value for the\n> operation to be considered successful.\n*/\nfunction test(object, operation) {\n var endpoint = pointer_1.Pointer.fromJSON(operation.path).evaluate(object);\n // TODO: this diffAny(...).length usage could/should be lazy\n if ((0, diff_1.diffAny)(endpoint.value, operation.value, new pointer_1.Pointer()).length) {\n return new TestError(endpoint.value, operation.value);\n }\n return null;\n}\nexports.test = test;\nvar InvalidOperationError = /** @class */ (function (_super) {\n __extends(InvalidOperationError, _super);\n function InvalidOperationError(operation) {\n var _this = _super.call(this, \"Invalid operation: \".concat(operation.op)) || this;\n _this.operation = operation;\n _this.name = 'InvalidOperationError';\n return _this;\n }\n return InvalidOperationError;\n}(Error));\nexports.InvalidOperationError = InvalidOperationError;\n/**\nSwitch on `operation.op`, applying the corresponding patch function for each\ncase to `object`.\n*/\nfunction apply(object, operation) {\n // not sure why TypeScript can't infer typesafety of:\n // {add, remove, replace, move, copy, test}[operation.op](object, operation)\n // (seems like a bug)\n switch (operation.op) {\n case 'add': return add(object, operation);\n case 'remove': return remove(object, operation);\n case 'replace': return replace(object, operation);\n case 'move': return move(object, operation);\n case 'copy': return copy(object, operation);\n case 'test': return test(object, operation);\n }\n return new InvalidOperationError(operation);\n}\nexports.apply = apply;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createTests = exports.createPatch = exports.applyPatch = exports.Pointer = void 0;\nvar pointer_1 = require(\"./pointer\");\nObject.defineProperty(exports, \"Pointer\", { enumerable: true, get: function () { return pointer_1.Pointer; } });\nvar patch_1 = require(\"./patch\");\nvar diff_1 = require(\"./diff\");\n/**\nApply a 'application/json-patch+json'-type patch to an object.\n\n`patch` *must* be an array of operations.\n\n> Operation objects MUST have exactly one \"op\" member, whose value\n> indicates the operation to perform. Its value MUST be one of \"add\",\n> \"remove\", \"replace\", \"move\", \"copy\", or \"test\"; other values are\n> errors.\n\nThis method mutates the target object in-place.\n\n@returns list of results, one for each operation: `null` indicated success,\n otherwise, the result will be an instance of one of the Error classes:\n MissingError, InvalidOperationError, or TestError.\n*/\nfunction applyPatch(object, patch) {\n return patch.map(function (operation) { return (0, patch_1.apply)(object, operation); });\n}\nexports.applyPatch = applyPatch;\nfunction wrapVoidableDiff(diff) {\n function wrappedDiff(input, output, ptr) {\n var custom_patch = diff(input, output, ptr);\n // ensure an array is always returned\n return Array.isArray(custom_patch) ? custom_patch : (0, diff_1.diffAny)(input, output, ptr, wrappedDiff);\n }\n return wrappedDiff;\n}\n/**\nProduce a 'application/json-patch+json'-type patch to get from one object to\nanother.\n\nThis does not alter `input` or `output` unless they have a property getter with\nside-effects (which is not a good idea anyway).\n\n`diff` is called on each pair of comparable non-primitive nodes in the\n`input`/`output` object trees, producing nested patches. Return `undefined`\nto fall back to default behaviour.\n\nReturns list of operations to perform on `input` to produce `output`.\n*/\nfunction createPatch(input, output, diff) {\n var ptr = new pointer_1.Pointer();\n // a new Pointer gets a default path of [''] if not specified\n return (diff ? wrapVoidableDiff(diff) : diff_1.diffAny)(input, output, ptr);\n}\nexports.createPatch = createPatch;\n/**\nCreate a test operation based on `input`'s current evaluation of the JSON\nPointer `path`; if such a pointer cannot be resolved, returns undefined.\n*/\nfunction createTest(input, path) {\n var endpoint = pointer_1.Pointer.fromJSON(path).evaluate(input);\n if (endpoint !== undefined) {\n return { op: 'test', path: path, value: endpoint.value };\n }\n}\n/**\nProduce an 'application/json-patch+json'-type list of tests, to verify that\nexisting values in an object are identical to the those captured at some\ncheckpoint (whenever this function is called).\n\nThis does not alter `input` or `output` unless they have a property getter with\nside-effects (which is not a good idea anyway).\n\nReturns list of test operations.\n*/\nfunction createTests(input, patch) {\n var tests = new Array();\n patch.filter(diff_1.isDestructive).forEach(function (operation) {\n var pathTest = createTest(input, operation.path);\n if (pathTest)\n tests.push(pathTest);\n if ('from' in operation) {\n var fromTest = createTest(input, operation.from);\n if (fromTest)\n tests.push(fromTest);\n }\n });\n return tests;\n}\nexports.createTests = createTests;\n", "import { MedplumClient } from '@medplum/core';\nimport { ReactNode, useEffect, useMemo, useState } from 'react';\nimport { MepdlumNavigateFunction, reactContext } from './MedplumProvider.context';\n\nexport interface MedplumProviderProps {\n medplum: MedplumClient;\n navigate?: MepdlumNavigateFunction;\n children: ReactNode;\n}\n\n/**\n * The MedplumProvider component provides Medplum context state.\n *\n * Medplum context includes:\n * 1) medplum - Medplum client library\n * 2) profile - The current user profile (if signed in)\n * @param props - The MedplumProvider React props.\n * @returns The MedplumProvider React node.\n */\nexport function MedplumProvider(props: MedplumProviderProps): JSX.Element {\n const medplum = props.medplum;\n const navigate = props.navigate ?? defaultNavigate;\n\n const [state, setState] = useState({\n profile: medplum.getProfile(),\n loading: !medplum.isInitialized,\n });\n\n useEffect(() => {\n if (!medplum) {\n return;\n }\n if (!medplum.isInitialized) {\n setState((s) => ({ ...s, loading: true }));\n medplum\n .getInitPromise()\n .then(() => setState((s) => ({ ...s, loading: false })))\n .catch(console.error);\n }\n }, [medplum, medplum.isInitialized]);\n\n useEffect(() => {\n function eventListener(): void {\n setState({\n ...state,\n profile: medplum.getProfile(),\n });\n }\n\n medplum.addEventListener('change', eventListener);\n return () => medplum.removeEventListener('change', eventListener);\n }, [medplum, state]);\n\n const medplumContext = useMemo(\n () => ({\n ...state,\n medplum,\n navigate,\n }),\n [state, medplum, navigate]\n );\n\n return <reactContext.Provider value={medplumContext}>{props.children}</reactContext.Provider>;\n}\n\n/**\n * The default \"navigate\" function which simply uses window.location.href.\n * @param path - The path to navigate to.\n */\nfunction defaultNavigate(path: string): void {\n window.location.assign(path);\n}\n", "import { MedplumClient, ProfileResource } from '@medplum/core';\nimport { createContext, useContext } from 'react';\n\nexport const reactContext = createContext(undefined as MedplumContext | undefined);\n\nexport type MepdlumNavigateFunction = (path: string) => void;\n\nexport interface MedplumContext {\n medplum: MedplumClient;\n navigate: MepdlumNavigateFunction;\n profile?: ProfileResource;\n loading: boolean;\n}\n\n/**\n * Returns the MedplumContext instance.\n * @returns The MedplumContext instance.\n */\nexport function useMedplumContext(): MedplumContext {\n return useContext(reactContext) as MedplumContext;\n}\n\n/**\n * Returns the MedplumClient instance.\n * This is a shortcut for useMedplumContext().medplum.\n * @returns The MedplumClient instance.\n */\nexport function useMedplum(): MedplumClient {\n return useMedplumContext().medplum;\n}\n\n/**\n * Returns the Medplum navigate function.\n * @returns The Medplum navigate function.\n */\nexport function useMedplumNavigate(): MepdlumNavigateFunction {\n return useMedplumContext().navigate;\n}\n\n/**\n * Returns the current Medplum user profile (if signed in).\n * This is a shortcut for useMedplumContext().profile.\n * @returns The current user profile.\n */\nexport function useMedplumProfile(): ProfileResource | undefined {\n return useMedplumContext().profile;\n}\n", "import { deepEquals, isReference, isResource, MedplumClient, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider.context';\n\n/**\n * React Hook to use a FHIR reference.\n * Handles the complexity of resolving references and caching resources.\n * @param value - The resource or reference to resource.\n * @param setOutcome - Optional callback to set the OperationOutcome.\n * @returns The resolved resource.\n */\nexport function useResource<T extends Resource>(\n value: Reference<T> | Partial<T> | undefined,\n setOutcome?: (outcome: OperationOutcome) => void\n): T | undefined {\n const medplum = useMedplum();\n const [resource, setResource] = useState<T | undefined>(getInitialResource(medplum, value));\n\n const setResourceIfChanged = useCallback(\n (r: T | undefined) => {\n if (!deepEquals(r, resource)) {\n setResource(r);\n }\n },\n [resource, setResource]\n );\n\n useEffect(() => {\n setResourceIfChanged(getInitialResource(medplum, value));\n }, [medplum, value, setResourceIfChanged]);\n\n useEffect(() => {\n let subscribed = true;\n\n if (isReference(value)) {\n medplum\n .readReference(value as Reference<T>)\n .then((r) => {\n if (subscribed) {\n setResourceIfChanged(r);\n }\n })\n .catch((err) => {\n if (subscribed) {\n setResourceIfChanged(undefined);\n if (setOutcome) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }\n });\n }\n\n return (() => (subscribed = false)) as () => void;\n }, [medplum, resource, value, setResourceIfChanged, setOutcome]);\n\n return resource;\n}\n\n/**\n * Returns the initial resource value based on the input value.\n * If the input value is a resource, returns the resource.\n * If the input value is a reference to a resource available in the cache, returns the resource.\n * Otherwise, returns undefined.\n * @param medplum - The medplum client.\n * @param value - The resource or reference to resource.\n * @returns An initial resource if available; undefined otherwise.\n */\nfunction getInitialResource<T extends Resource>(\n medplum: MedplumClient,\n value: Reference<T> | Partial<T> | undefined\n): T | undefined {\n if (value) {\n if (isResource(value)) {\n return value as T;\n }\n\n if (isReference(value)) {\n return medplum.getCachedReference(value as Reference<T>);\n }\n }\n\n return undefined;\n}\n", "import { allOk, normalizeOperationOutcome, QueryTypes, ResourceArray } from '@medplum/core';\nimport { Bundle, ExtractResource, OperationOutcome, ResourceType } from '@medplum/fhirtypes';\nimport { useEffect, useState } from 'react';\nimport { useMedplum } from '../MedplumProvider/MedplumProvider.context';\n\ntype SearchFn = 'search' | 'searchOne' | 'searchResources';\n\n/**\n * React hook for searching FHIR resources.\n *\n * This is a convenience hook for calling the MedplumClient.search() method.\n *\n * @param resourceType - The FHIR resource type to search.\n * @param query - Optional search parameters.\n * @returns A 3-element tuple containing the search result, loading flag, and operation outcome.\n */\nexport function useSearch<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes\n): [Bundle<ExtractResource<K>> | undefined, boolean, OperationOutcome | undefined] {\n return useSearchImpl<K, Bundle<ExtractResource<K>>>('search', resourceType, query);\n}\n\n/**\n * React hook for searching for a single FHIR resource.\n *\n * This is a convenience hook for calling the MedplumClient.searchOne() method.\n *\n * @param resourceType - The FHIR resource type to search.\n * @param query - Optional search parameters.\n * @returns A 3-element tuple containing the search result, loading flag, and operation outcome.\n */\nexport function useSearchOne<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes\n): [ExtractResource<K> | undefined, boolean, OperationOutcome | undefined] {\n return useSearchImpl<K, ExtractResource<K>>('searchOne', resourceType, query);\n}\n\n/**\n * React hook for searching for an array of FHIR resources.\n *\n * This is a convenience hook for calling the MedplumClient.searchResources() method.\n *\n * @param resourceType - The FHIR resource type to search.\n * @param query - Optional search parameters.\n * @returns A 3-element tuple containing the search result, loading flag, and operation outcome.\n */\nexport function useSearchResources<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes\n): [ResourceArray<ExtractResource<K>> | undefined, boolean, OperationOutcome | undefined] {\n return useSearchImpl<K, ResourceArray<ExtractResource<K>>>('searchResources', resourceType, query);\n}\n\nfunction useSearchImpl<K extends ResourceType, ReturnType>(\n searchFn: SearchFn,\n resourceType: K,\n query: QueryTypes | undefined\n): [ReturnType | undefined, boolean, OperationOutcome | undefined] {\n const medplum = useMedplum();\n const [searchKey, setSearchKey] = useState<string>();\n const [loading, setLoading] = useState<boolean>(false);\n const [result, setResult] = useState<ReturnType>();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n\n useEffect(() => {\n const key = medplum.fhirSearchUrl(resourceType, query).toString();\n if (key !== searchKey) {\n setSearchKey(key);\n medplum[searchFn](resourceType, query)\n .then((res) => {\n setLoading(false);\n setResult(res as ReturnType);\n setOutcome(allOk);\n })\n .catch((err) => {\n setLoading(false);\n setResult(undefined);\n setOutcome(normalizeOperationOutcome(err));\n });\n }\n }, [medplum, searchFn, resourceType, query, searchKey, setResult]);\n\n return [result, loading, outcome];\n}\n", "import { formatAddress } from '@medplum/core';\nimport { Address } from '@medplum/fhirtypes';\n\nexport interface AddressDisplayProps {\n value?: Address;\n}\n\nexport function AddressDisplay(props: AddressDisplayProps): JSX.Element | null {\n const address = props.value;\n if (!address) {\n return null;\n }\n\n return <>{formatAddress(address)}</>;\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Address } from '@medplum/fhirtypes';\nimport { useRef, useState } from 'react';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\n\nfunction getLine(address: Address, index: number): string {\n return address.line && address.line.length > index ? address.line[index] : '';\n}\n\nfunction setLine(address: Address, index: number, str: string): Address {\n const line: string[] = address.line || [];\n while (line.length <= index) {\n line.push('');\n }\n line[index] = str;\n return { ...address, line };\n}\n\nexport type AddressInputProps = ComplexTypeInputProps<Address>;\n\nexport function AddressInput(props: AddressInputProps): JSX.Element {\n const [value, setValue] = useState<Address>(props.defaultValue || {});\n\n const valueRef = useRef<Address>();\n valueRef.current = value;\n\n // const stateElement = useMemo(\n // () => getModifiedNestedElement(props.path + '.state'),\n // [getModifiedNestedElement, props.path]\n // );\n // TODO{profiles} is it worth the complexity of subbing in an autocomplete input when\n // a binding is defined in a profile? If so, it should go in a new wrapper around TextInput\n // e.g. US Core Patient Profile\n\n function setValueWrapper(newValue: Address): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'billing'): void {\n setValueWrapper({ ...valueRef.current, use });\n }\n\n function setType(type: 'postal' | 'physical' | 'both'): void {\n setValueWrapper({ ...valueRef.current, type });\n }\n\n function setLine1(line1: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 0, line1));\n }\n\n function setLine2(line2: string): void {\n setValueWrapper(setLine(valueRef.current || {}, 1, line2));\n }\n\n function setCity(city: string): void {\n setValueWrapper({ ...valueRef.current, city });\n }\n\n function setState(state: string): void {\n setValueWrapper({ ...valueRef.current, state });\n }\n\n function setPostalCode(postalCode: string): void {\n setValueWrapper({ ...valueRef.current, postalCode });\n }\n\n return (\n <Group gap=\"xs\" wrap=\"nowrap\" grow>\n <NativeSelect\n data-testid=\"address-use\"\n defaultValue={value.use}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'billing')}\n data={['', 'home', 'work', 'temp', 'old', 'billing']}\n />\n <NativeSelect\n data-testid=\"address-type\"\n defaultValue={value.type}\n onChange={(e) => setType(e.currentTarget.value as 'postal' | 'physical' | 'both')}\n data={['', 'postal', 'physical', 'both']}\n />\n <TextInput\n placeholder=\"Line 1\"\n defaultValue={getLine(value, 0)}\n onChange={(e) => setLine1(e.currentTarget.value)}\n />\n <TextInput\n placeholder=\"Line 2\"\n defaultValue={getLine(value, 1)}\n onChange={(e) => setLine2(e.currentTarget.value)}\n />\n <TextInput placeholder=\"City\" defaultValue={value.city} onChange={(e) => setCity(e.currentTarget.value)} />\n <TextInput placeholder=\"State\" defaultValue={value.state} onChange={(e) => setState(e.currentTarget.value)} />\n <TextInput\n placeholder=\"Postal Code\"\n defaultValue={value.postalCode}\n onChange={(e) => setPostalCode(e.currentTarget.value)}\n />\n </Group>\n );\n}\n", "import { TextInput } from '@mantine/core';\nimport { createReference } from '@medplum/core';\nimport { Annotation } from '@medplum/fhirtypes';\nimport { useMedplumProfile } from '@medplum/react-hooks';\nimport { useState } from 'react';\n\nexport interface AnnotationInputProps {\n name: string;\n defaultValue?: Annotation;\n onChange?: (value: Annotation) => void;\n}\n\nexport function AnnotationInput(props: AnnotationInputProps): JSX.Element {\n const author = useMedplumProfile();\n const [value, setValue] = useState<Annotation>(props.defaultValue || ({} as Annotation));\n\n function setText(text: string): void {\n const newValue: Annotation = text\n ? {\n text,\n authorReference: author && createReference(author),\n time: new Date().toISOString(),\n }\n : ({} as Annotation);\n\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <TextInput\n name={props.name}\n placeholder=\"Annotation text\"\n defaultValue={value.text}\n onChange={(e) => setText(e.currentTarget.value)}\n />\n );\n}\n", "import { AppShell as MantineAppShell } from '@mantine/core';\nimport { showNotification } from '@mantine/notifications';\nimport { useMedplum, useMedplumProfile } from '@medplum/react-hooks';\nimport { ReactNode, Suspense, useEffect, useState } from 'react';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { Loading } from '../Loading/Loading';\nimport classes from './AppShell.module.css';\nimport { Header } from './Header';\nimport { Navbar, NavbarMenu } from './Navbar';\n\nexport interface AppShellProps {\n logo: ReactNode;\n pathname?: string;\n searchParams?: URLSearchParams;\n headerSearchDisabled?: boolean;\n version?: string;\n menus?: NavbarMenu[];\n children: ReactNode;\n displayAddBookmark?: boolean;\n resourceTypeSearchDisabled?: boolean;\n}\n\nexport function AppShell(props: AppShellProps): JSX.Element {\n const [navbarOpen, setNavbarOpen] = useState(localStorage['navbarOpen'] === 'true');\n const medplum = useMedplum();\n const profile = useMedplumProfile();\n\n useEffect(() => {\n function eventListener(): void {\n showNotification({ color: 'red', message: 'No connection to server', autoClose: false });\n }\n medplum.addEventListener('offline', eventListener);\n return () => medplum.removeEventListener('offline', eventListener);\n }, [medplum]);\n\n function setNavbarOpenWrapper(open: boolean): void {\n localStorage['navbarOpen'] = open.toString();\n setNavbarOpen(open);\n }\n\n function closeNavbar(): void {\n setNavbarOpenWrapper(false);\n }\n\n function toggleNavbar(): void {\n setNavbarOpenWrapper(!navbarOpen);\n }\n\n if (medplum.isLoading()) {\n return <Loading />;\n }\n\n return (\n <MantineAppShell\n header={{ height: 60 }}\n navbar={{\n width: 250,\n breakpoint: 'sm',\n collapsed: {\n desktop: !profile || !navbarOpen,\n mobile: !profile || !navbarOpen,\n },\n }}\n padding={0}\n >\n {profile && (\n <Header\n pathname={props.pathname}\n searchParams={props.searchParams}\n headerSearchDisabled={props.headerSearchDisabled}\n logo={props.logo}\n version={props.version}\n navbarToggle={toggleNavbar}\n />\n )}\n {profile && navbarOpen ? (\n <Navbar\n pathname={props.pathname}\n searchParams={props.searchParams}\n menus={props.menus}\n closeNavbar={closeNavbar}\n displayAddBookmark={props.displayAddBookmark}\n resourceTypeSearchDisabled={props.resourceTypeSearchDisabled}\n />\n ) : undefined}\n <MantineAppShell.Main className={classes.main}>\n <ErrorBoundary>\n <Suspense fallback={<Loading />}>{props.children}</Suspense>\n </ErrorBoundary>\n </MantineAppShell.Main>\n </MantineAppShell>\n );\n}\n", "import { Alert } from '@mantine/core';\nimport { normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { Component, ErrorInfo, ReactNode } from 'react';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n}\n\nexport interface ErrorBoundaryState {\n error?: Error;\n lastLocation: string;\n}\n\n/**\n * ErrorBoundary is a React component that handles errors in its child components.\n * See: https://reactjs.org/docs/error-boundaries.html\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState;\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { lastLocation: window.location.toString() };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error, lastLocation: window.location.toString() };\n }\n\n componentDidUpdate(_prevProps: Readonly<ErrorBoundaryProps>, _prevState: Readonly<ErrorBoundaryState>): void {\n if (window.location.toString() !== this.state.lastLocation) {\n this.setState({\n lastLocation: window.location.toString(),\n error: undefined,\n });\n }\n }\n\n shouldComponentUpdate(nextProps: Readonly<ErrorBoundaryProps>, nextState: Readonly<ErrorBoundaryState>): boolean {\n if (this.props.children !== nextProps.children) {\n return true;\n }\n if (nextState.error && !this.state.error) {\n return true;\n }\n if (this.state.lastLocation !== window.location.toString()) {\n return true;\n }\n return false;\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n render(): ReactNode {\n if (this.state.error) {\n return (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Something went wrong\" color=\"red\">\n {normalizeErrorString(this.state.error)}\n </Alert>\n );\n }\n\n return this.props.children;\n }\n}\n", "export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n", "import { forwardRef, createElement } from 'react';\nimport PropTypes from 'prop-types';\nimport defaultAttributes from './defaultAttributes';\n\nexport default (iconName, iconNamePascal, iconNode) => {\n const Component = forwardRef(\n ({ color = 'currentColor', size = 24, stroke = 2, children, ...rest }, ref) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: stroke,\n className: `tabler-icon tabler-icon-${iconName}`,\n ...rest,\n },\n [...iconNode.map(([tag, attrs]) => createElement(tag, attrs)), ...(children || [])],\n ),\n );\n\n Component.propTypes = {\n color: PropTypes.string,\n size: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n stroke: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n };\n\n Component.displayName = `${iconNamePascal}`;\n\n return Component;\n};\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent(\n 'adjustments-horizontal',\n 'IconAdjustmentsHorizontal',\n [\n ['path', { d: 'M14 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-0' }],\n ['path', { d: 'M4 6l8 0', key: 'svg-1' }],\n ['path', { d: 'M16 6l4 0', key: 'svg-2' }],\n ['path', { d: 'M8 12m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-3' }],\n ['path', { d: 'M4 12l2 0', key: 'svg-4' }],\n ['path', { d: 'M10 12l10 0', key: 'svg-5' }],\n ['path', { d: 'M17 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-6' }],\n ['path', { d: 'M4 18l11 0', key: 'svg-7' }],\n ['path', { d: 'M19 18l1 0', key: 'svg-8' }],\n ],\n);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('alert-circle', 'IconAlertCircle', [\n ['path', { d: 'M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0', key: 'svg-0' }],\n ['path', { d: 'M12 8v4', key: 'svg-1' }],\n ['path', { d: 'M12 16h.01', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('arrow-down', 'IconArrowDown', [\n ['path', { d: 'M12 5l0 14', key: 'svg-0' }],\n ['path', { d: 'M18 13l-6 6', key: 'svg-1' }],\n ['path', { d: 'M6 13l6 6', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('arrow-up', 'IconArrowUp', [\n ['path', { d: 'M12 5l0 14', key: 'svg-0' }],\n ['path', { d: 'M18 11l-6 -6', key: 'svg-1' }],\n ['path', { d: 'M6 11l6 -6', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bleach-off', 'IconBleachOff', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M3 3l18 18', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bleach', 'IconBleach', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('box-multiple', 'IconBoxMultiple', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M17 17v2a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('brackets-contain', 'IconBracketsContain', [\n ['path', { d: 'M7 4h-4v16h4', key: 'svg-0' }],\n ['path', { d: 'M17 4h4v16h-4', key: 'svg-1' }],\n ['path', { d: 'M8 16h.01', key: 'svg-2' }],\n ['path', { d: 'M12 16h.01', key: 'svg-3' }],\n ['path', { d: 'M16 16h.01', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bucket-off', 'IconBucketOff', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n 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',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M3 3l18 18', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('bucket', 'IconBucket', [\n ['path', { d: 'M12 7m-8 0a8 4 0 1 0 16 0a8 4 0 1 0 -16 0', key: 'svg-0' }],\n [\n 'path',\n {\n 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',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('calendar', 'IconCalendar', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M16 3v4', key: 'svg-1' }],\n ['path', { d: 'M8 3v4', key: 'svg-2' }],\n ['path', { d: 'M4 11h16', key: 'svg-3' }],\n ['path', { d: 'M11 15h1', key: 'svg-4' }],\n ['path', { d: 'M12 15v3', key: 'svg-5' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('check', 'IconCheck', [\n ['path', { d: 'M5 12l5 5l10 -10', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('checkbox', 'IconCheckbox', [\n ['path', { d: 'M9 11l3 3l8 -8', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M20 12v6a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h9',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('chevron-down', 'IconChevronDown', [\n ['path', { d: 'M6 9l6 6l6 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('circle-minus', 'IconCircleMinus', [\n ['path', { d: 'M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0', key: 'svg-0' }],\n ['path', { d: 'M9 12l6 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('circle-plus', 'IconCirclePlus', [\n ['path', { d: 'M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0', key: 'svg-0' }],\n ['path', { d: 'M9 12h6', key: 'svg-1' }],\n ['path', { d: 'M12 9v6', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('cloud-upload', 'IconCloudUpload', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 15l3 -3l3 3', key: 'svg-1' }],\n ['path', { d: 'M12 12l0 9', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('columns', 'IconColumns', [\n ['path', { d: 'M4 6l5.5 0', key: 'svg-0' }],\n ['path', { d: 'M4 10l5.5 0', key: 'svg-1' }],\n ['path', { d: 'M4 14l5.5 0', key: 'svg-2' }],\n ['path', { d: 'M4 18l5.5 0', key: 'svg-3' }],\n ['path', { d: 'M14.5 6l5.5 0', key: 'svg-4' }],\n ['path', { d: 'M14.5 10l5.5 0', key: 'svg-5' }],\n ['path', { d: 'M14.5 14l5.5 0', key: 'svg-6' }],\n ['path', { d: 'M14.5 18l5.5 0', key: 'svg-7' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('copy', 'IconCopy', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n 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',\n key: 'svg-1',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('currency-dollar', 'IconCurrencyDollar', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M12 3v3m0 12v3', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('dots', 'IconDots', [\n ['path', { d: 'M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-0' }],\n ['path', { d: 'M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-1' }],\n ['path', { d: 'M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('edit', 'IconEdit', [\n [\n 'path',\n {\n d: 'M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1',\n key: 'svg-0',\n },\n ],\n [\n 'path',\n {\n d: 'M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M16 5l3 3', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('equal-not', 'IconEqualNot', [\n ['path', { d: 'M5 10h14', key: 'svg-0' }],\n ['path', { d: 'M5 14h14', key: 'svg-1' }],\n ['path', { d: 'M5 19l14 -14', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('equal', 'IconEqual', [\n ['path', { d: 'M5 10h14', key: 'svg-0' }],\n ['path', { d: 'M5 14h14', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('file-alert', 'IconFileAlert', [\n ['path', { d: 'M14 3v4a1 1 0 0 0 1 1h4', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M12 17l.01 0', key: 'svg-2' }],\n ['path', { d: 'M12 11l0 3', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('file-plus', 'IconFilePlus', [\n ['path', { d: 'M14 3v4a1 1 0 0 0 1 1h4', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2z',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M12 11l0 6', key: 'svg-2' }],\n ['path', { d: 'M9 14l6 0', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('filter', 'IconFilter', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('gender-female', 'IconGenderFemale', [\n ['path', { d: 'M12 9m-5 0a5 5 0 1 0 10 0a5 5 0 1 0 -10 0', key: 'svg-0' }],\n ['path', { d: 'M12 14v7', key: 'svg-1' }],\n ['path', { d: 'M9 18h6', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('list-details', 'IconListDetails', [\n ['path', { d: 'M13 5h8', key: 'svg-0' }],\n ['path', { d: 'M13 9h5', key: 'svg-1' }],\n ['path', { d: 'M13 15h8', key: 'svg-2' }],\n ['path', { d: 'M13 19h5', key: 'svg-3' }],\n [\n 'path',\n {\n d: 'M3 4m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z',\n key: 'svg-4',\n },\n ],\n [\n 'path',\n {\n d: 'M3 14m0 1a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1z',\n key: 'svg-5',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('logout', 'IconLogout', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 12h12l-3 -3', key: 'svg-1' }],\n ['path', { d: 'M18 15l3 -3', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('math-greater', 'IconMathGreater', [\n ['path', { d: 'M5 18l14 -6l-14 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('math-lower', 'IconMathLower', [\n ['path', { d: 'M19 18l-14 -6l14 -6', key: 'svg-0' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('message', 'IconMessage', [\n ['path', { d: 'M8 9h8', key: 'svg-0' }],\n ['path', { d: 'M8 13h6', key: 'svg-1' }],\n [\n 'path',\n {\n 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',\n key: 'svg-2',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('pin', 'IconPin', [\n [\n 'path',\n {\n d: 'M15 4.5l-4 4l-4 1.5l-1.5 1.5l7 7l1.5 -1.5l1.5 -4l4 -4',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 15l-4.5 4.5', key: 'svg-1' }],\n ['path', { d: 'M14.5 4l5.5 5.5', key: 'svg-2' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('pinned-off', 'IconPinnedOff', [\n ['path', { d: 'M3 3l18 18', key: 'svg-0' }],\n [\n 'path',\n {\n d: 'M15 4.5l-3.249 3.249m-2.57 1.433l-2.181 .818l-1.5 1.5l7 7l1.5 -1.5l.82 -2.186m1.43 -2.563l3.25 -3.251',\n key: 'svg-1',\n },\n ],\n ['path', { d: 'M9 15l-4.5 4.5', key: 'svg-2' }],\n ['path', { d: 'M14.5 4l5.5 5.5', key: 'svg-3' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('plus', 'IconPlus', [\n ['path', { d: 'M12 5l0 14', key: 'svg-0' }],\n ['path', { d: 'M5 12l14 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('refresh', 'IconRefresh', [\n ['path', { d: 'M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4', key: 'svg-0' }],\n ['path', { d: 'M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('search', 'IconSearch', [\n ['path', { d: 'M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0', key: 'svg-0' }],\n ['path', { d: 'M21 21l-6 -6', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('settings', 'IconSettings', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0', key: 'svg-1' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('sort-ascending', 'IconSortAscending', [\n ['path', { d: 'M4 6l7 0', key: 'svg-0' }],\n ['path', { d: 'M4 12l7 0', key: 'svg-1' }],\n ['path', { d: 'M4 18l9 0', key: 'svg-2' }],\n ['path', { d: 'M15 9l3 -3l3 3', key: 'svg-3' }],\n ['path', { d: 'M18 6l0 12', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('sort-descending', 'IconSortDescending', [\n ['path', { d: 'M4 6l9 0', key: 'svg-0' }],\n ['path', { d: 'M4 12l7 0', key: 'svg-1' }],\n ['path', { d: 'M4 18l7 0', key: 'svg-2' }],\n ['path', { d: 'M15 15l3 3l3 -3', key: 'svg-3' }],\n ['path', { d: 'M18 6l0 12', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('square', 'IconSquare', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('stethoscope', 'IconStethoscope', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M8 15a6 6 0 1 0 12 0v-3', key: 'svg-1' }],\n ['path', { d: 'M11 3v2', key: 'svg-2' }],\n ['path', { d: 'M6 3v2', key: 'svg-3' }],\n ['path', { d: 'M20 10m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent(\n 'switch-horizontal',\n 'IconSwitchHorizontal',\n [\n ['path', { d: 'M16 3l4 4l-4 4', key: 'svg-0' }],\n ['path', { d: 'M10 7l10 0', key: 'svg-1' }],\n ['path', { d: 'M8 13l-4 4l4 4', key: 'svg-2' }],\n ['path', { d: 'M4 17l9 0', key: 'svg-3' }],\n ],\n);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('table-export', 'IconTableExport', [\n [\n 'path',\n {\n 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',\n key: 'svg-0',\n },\n ],\n ['path', { d: 'M3 10h18', key: 'svg-1' }],\n ['path', { d: 'M10 3v18', key: 'svg-2' }],\n ['path', { d: 'M16 19h6', key: 'svg-3' }],\n ['path', { d: 'M19 16l3 3l-3 3', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('trash', 'IconTrash', [\n ['path', { d: 'M4 7l16 0', key: 'svg-0' }],\n ['path', { d: 'M10 11l0 6', key: 'svg-1' }],\n ['path', { d: 'M14 11l0 6', key: 'svg-2' }],\n [\n 'path',\n { d: 'M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12', key: 'svg-3' },\n ],\n ['path', { d: 'M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3', key: 'svg-4' }],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('user-square', 'IconUserSquare', [\n ['path', { d: 'M9 10a3 3 0 1 0 6 0a3 3 0 0 0 -6 0', key: 'svg-0' }],\n ['path', { d: 'M6 21v-1a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v1', key: 'svg-1' }],\n [\n 'path',\n {\n d: 'M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14z',\n key: 'svg-2',\n },\n ],\n]);\n", "import createReactComponent from '../createReactComponent';\nexport default createReactComponent('x', 'IconX', [\n ['path', { d: 'M18 6l-12 12', key: 'svg-0' }],\n ['path', { d: 'M6 6l12 12', key: 'svg-1' }],\n]);\n", "import { Center, Loader } from '@mantine/core';\n\nexport function Loading(): JSX.Element {\n return (\n <Center style={{ width: '100%', height: '100vh' }}>\n <Loader />\n </Center>\n );\n}\n", ".main {\n flex: 1;\n background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6));\n padding-bottom: var(--mantine-spacing-lg);\n}\n", "import { Avatar, Group, AppShell as MantineAppShell, Menu, Stack, Text, UnstyledButton } from '@mantine/core';\nimport { ProfileResource, formatHumanName, getReferenceString } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport { useMedplumContext } from '@medplum/react-hooks';\nimport { IconChevronDown, IconLogout, IconSettings, IconSwitchHorizontal } from '@tabler/icons-react';\nimport cx from 'clsx';\nimport { ReactNode, useState } from 'react';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport classes from './Header.module.css';\nimport { HeaderSearchInput } from './HeaderSearchInput';\n\nexport interface HeaderProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n headerSearchDisabled?: boolean;\n logo: ReactNode;\n version?: string;\n navbarToggle: () => void;\n}\n\nexport function Header(props: HeaderProps): JSX.Element {\n const context = useMedplumContext();\n const { medplum, profile, navigate } = context;\n const logins = medplum.getLogins();\n const [userMenuOpened, setUserMenuOpened] = useState(false);\n\n return (\n <MantineAppShell.Header p={8} style={{ zIndex: 101 }}>\n <Group justify=\"space-between\">\n <Group gap=\"xs\">\n <UnstyledButton className={classes.logoButton} onClick={props.navbarToggle}>\n {props.logo}\n </UnstyledButton>\n {!props.headerSearchDisabled && (\n <HeaderSearchInput pathname={props.pathname} searchParams={props.searchParams} />\n )}\n </Group>\n\n <Menu\n width={260}\n shadow=\"xl\"\n position=\"bottom-end\"\n transitionProps={{ transition: 'pop-top-right' }}\n opened={userMenuOpened}\n onClose={() => setUserMenuOpened(false)}\n >\n <Menu.Target>\n <UnstyledButton\n className={cx(classes.user, { [classes.userActive]: userMenuOpened })}\n onClick={() => setUserMenuOpened((o) => !o)}\n >\n <Group gap={7}>\n <ResourceAvatar value={profile} radius=\"xl\" size={24} />\n <Text size=\"sm\" className={classes.userName}>\n {formatHumanName(profile?.name?.[0] as HumanName)}\n </Text>\n <IconChevronDown size={12} stroke={1.5} />\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <Menu.Dropdown>\n <Stack align=\"center\" p=\"xl\">\n <ResourceAvatar size=\"xl\" radius={100} value={context.profile} />\n <HumanNameDisplay value={context.profile?.name?.[0] as HumanName} />\n <Text c=\"dimmed\" size=\"xs\">\n {medplum.getActiveLogin()?.project.display}\n </Text>\n </Stack>\n {logins.length > 1 && <Menu.Divider />}\n {logins.map(\n (login) =>\n login.profile.reference !== getReferenceString(context.profile as ProfileResource) && (\n <Menu.Item\n key={login.profile.reference}\n onClick={() => {\n medplum\n .setActiveLogin(login)\n .then(() => window.location.reload())\n .catch(console.log);\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" fw={500}>\n {login.profile.display}\n </Text>\n <Text c=\"dimmed\" size=\"xs\">\n {login.project.display}\n </Text>\n </div>\n </Group>\n </Menu.Item>\n )\n )}\n <Menu.Divider />\n <Menu.Item\n leftSection={<IconSwitchHorizontal size={14} stroke={1.5} />}\n onClick={() => navigate('/signin')}\n >\n Add another account\n </Menu.Item>\n <Menu.Item\n leftSection={<IconSettings size={14} stroke={1.5} />}\n onClick={() => navigate(`/${getReferenceString(profile as ProfileResource)}`)}\n >\n Account settings\n </Menu.Item>\n <Menu.Item\n leftSection={<IconLogout size={14} stroke={1.5} />}\n onClick={async () => {\n await medplum.signOut();\n navigate('/signin');\n }}\n >\n Sign out\n </Menu.Item>\n <Text size=\"xs\" c=\"dimmed\" ta=\"center\">\n {props.version}\n </Text>\n </Menu.Dropdown>\n </Menu>\n </Group>\n </MantineAppShell.Header>\n );\n}\n", "function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f);else for(t in e)e[t]&&(n&&(n+=\" \"),n+=t);return n}export function clsx(){for(var e,t,f=0,n=\"\";f<arguments.length;)(e=arguments[f++])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;", "import { formatHumanName, HumanNameFormatOptions } from '@medplum/core';\nimport { HumanName } from '@medplum/fhirtypes';\n\nexport interface HumanNameDisplayProps {\n value?: HumanName;\n options?: HumanNameFormatOptions;\n}\n\nexport function HumanNameDisplay(props: HumanNameDisplayProps): JSX.Element | null {\n const name = props.value;\n if (!name) {\n return null;\n }\n\n return <>{formatHumanName(name, props.options)}</>;\n}\n", "import { Avatar, AvatarProps } from '@mantine/core';\nimport { getDisplayString, getImageSrc } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { useResource } from '@medplum/react-hooks';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ResourceAvatarProps extends AvatarProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceAvatar(props: ResourceAvatarProps): JSX.Element {\n const resource = useResource(props.value);\n const text = resource ? getDisplayString(resource) : props.alt ?? '';\n const imageUrl = (resource && getImageSrc(resource)) ?? props.src;\n const radius = props.radius ?? 'xl';\n\n const avatarProps = { ...props };\n delete avatarProps.value;\n delete avatarProps.link;\n\n if (props.link) {\n return (\n <MedplumLink to={resource}>\n <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />\n </MedplumLink>\n );\n }\n\n return <Avatar src={imageUrl} alt={text} radius={radius} {...avatarProps} />;\n}\n", "import { Anchor, TextProps } from '@mantine/core';\nimport { isReference, isResource } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { useMedplumNavigate } from '@medplum/react-hooks';\nimport { MouseEvent, MouseEventHandler, ReactNode } from 'react';\nimport { killEvent } from '../utils/dom';\n\nexport interface MedplumLinkProps extends TextProps {\n to?: Resource | Reference | string;\n suffix?: string;\n label?: string;\n onClick?: MouseEventHandler;\n children: ReactNode;\n}\n\nexport function MedplumLink(props: MedplumLinkProps): JSX.Element {\n const navigate = useMedplumNavigate();\n const { to, suffix, label, onClick, children, ...rest } = props;\n\n let href = getHref(to);\n if (suffix) {\n href += '/' + suffix;\n }\n\n return (\n <Anchor\n href={href}\n aria-label={label}\n onClick={(e: MouseEvent) => {\n killEvent(e);\n if (onClick) {\n onClick(e);\n } else if (to) {\n navigate(href);\n }\n }}\n {...rest}\n >\n {children}\n </Anchor>\n );\n}\n\nfunction getHref(to: Resource | Reference | string | undefined): string {\n if (to) {\n if (typeof to === 'string') {\n return getStringHref(to);\n } else if (isResource(to)) {\n return getResourceHref(to);\n } else if (isReference(to)) {\n return getReferenceHref(to);\n }\n }\n return '#';\n}\n\nfunction getStringHref(to: string): string {\n if (to.startsWith('http://') || to.startsWith('https://') || to.startsWith('/')) {\n return to;\n }\n return '/' + to;\n}\n\nfunction getResourceHref(to: Resource): string {\n return `/${to.resourceType}/${to.id}`;\n}\n\nfunction getReferenceHref(to: Reference): string {\n return `/${to.reference}`;\n}\n", "/**\n * Kills a browser event.\n * Prevents default behavior.\n * Stops event propagation.\n * @param e - The event.\n */\nexport function killEvent(e: Event | React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n}\n\n/**\n * Returns true if the element is a checkbox or a table cell containing a checkbox.\n * Table cells containing checkboxes are commonly accidentally clicked.\n * @param el - The HTML DOM element.\n * @returns True if the element is a checkbox or a table cell containing a checkbox.\n */\nexport function isCheckboxCell(el: Element): boolean {\n if (isCheckboxElement(el)) {\n return true;\n }\n\n if (el instanceof HTMLTableCellElement) {\n const children = el.children;\n if (children.length === 1 && isCheckboxElement(children[0])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isCheckboxElement(el: Element): boolean {\n return el instanceof HTMLInputElement && el.type === 'checkbox';\n}\n", ".logoButton {\n padding: var(--mantine-spacing-xs) var(--mantine-spacing-sm);\n border-radius: var(--mantine-radius-sm);\n transition: background-color 100ms ease;\n\n &:hover {\n background-color: var(--mantine-primary-color-light-hover);\n }\n}\n\n.user {\n padding: var(--mantine-spacing-xs) var(--mantine-spacing-sm);\n border-radius: var(--mantine-radius-sm);\n transition: background-color 100ms ease;\n\n &:hover {\n background-color: var(--mantine-primary-color-light-hover);\n }\n}\n\n.userName {\n font-weight: 500;\n line-height: 1px;\n margin-right: 3px;\n\n @media (max-width: $mantine-breakpoint-xs) {\n display: none;\n }\n}\n\n.userActive {\n background-color: var(--mantine-primary-color-light-hover);\n}\n", "import { formatHumanName, getDisplayString, getReferenceString, isUUID } from '@medplum/core';\nimport { Patient, ServiceRequest } from '@medplum/fhirtypes';\nimport { useMedplum, useMedplumNavigate } from '@medplum/react-hooks';\nimport { IconSearch } from '@tabler/icons-react';\nimport { forwardRef, useCallback } from 'react';\nimport { AsyncAutocomplete, AsyncAutocompleteOption } from '../AsyncAutocomplete/AsyncAutocomplete';\nimport classes from './HeaderSearchInput.module.css';\nimport { Group, Text } from '@mantine/core';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\n\nexport type HeaderSearchTypes = Patient | ServiceRequest;\n\ninterface SearchGraphQLResponse {\n readonly data: {\n readonly Patients1: Patient[] | undefined;\n readonly Patients2: Patient[] | undefined;\n readonly ServiceRequestList: ServiceRequest[] | undefined;\n };\n}\n\nfunction toOption(resource: HeaderSearchTypes): AsyncAutocompleteOption<HeaderSearchTypes> {\n return {\n value: resource.id as string,\n label: getDisplayString(resource),\n resource,\n };\n}\n\nexport interface HeaderSearchInputProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n}\n\nexport function HeaderSearchInput(props: HeaderSearchInputProps): JSX.Element {\n const navigate = useMedplumNavigate();\n const medplum = useMedplum();\n\n const loadData = useCallback(\n async (input: string, signal: AbortSignal): Promise<HeaderSearchTypes[]> => {\n const query = buildGraphQLQuery(input);\n const options = { signal };\n const response = (await medplum.graphql(query, undefined, undefined, options)) as SearchGraphQLResponse;\n return getResourcesFromResponse(response, input);\n },\n [medplum]\n );\n\n const handleSelect = useCallback(\n (item: HeaderSearchTypes[]): void => {\n if (item.length > 0) {\n navigate(`/${getReferenceString(item[0])}`);\n }\n },\n [navigate]\n );\n\n return (\n <AsyncAutocomplete\n key={`${props.pathname}?${props.searchParams}`}\n size=\"sm\"\n radius=\"md\"\n className={classes.searchInput}\n leftSection={<IconSearch size={16} />}\n placeholder=\"Search\"\n itemComponent={ItemComponent}\n toOption={toOption}\n onChange={handleSelect}\n loadOptions={loadData}\n maxValues={0}\n clearable={false}\n />\n );\n}\n\nconst ItemComponent = forwardRef<HTMLDivElement, any>(\n ({ resource, ...others }: AsyncAutocompleteOption<HeaderSearchTypes>, ref) => {\n let helpText: string | undefined = undefined;\n\n if (resource.resourceType === 'Patient') {\n helpText = resource.birthDate;\n } else if (resource.resourceType === 'ServiceRequest') {\n helpText = resource.subject?.display;\n }\n\n return (\n <div ref={ref} {...others}>\n <Group wrap=\"nowrap\">\n <ResourceAvatar value={resource} />\n <div>\n <Text>{getDisplayString(resource)}</Text>\n <Text size=\"xs\" c=\"dimmed\">\n {helpText}\n </Text>\n </div>\n </Group>\n </div>\n );\n }\n);\n\nfunction buildGraphQLQuery(input: string): string {\n const escaped = JSON.stringify(input);\n if (isUUID(input)) {\n return `{\n Patients1: PatientList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n }\n return `{\n Patients1: PatientList(name: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n Patients2: PatientList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n}\n\n/**\n * Returns a de-duped and sorted list of resources from the search response.\n * The search request is actually 3+ separate searches, which can include duplicates.\n * This function combines the results, de-dupes, and sorts by relevance.\n * @param response - The response from a search query.\n * @param query - The user entered search query.\n * @returns The resources to display in the autocomplete.\n */\nfunction getResourcesFromResponse(response: SearchGraphQLResponse, query: string): HeaderSearchTypes[] {\n const resources = [];\n if (response.data.Patients1) {\n resources.push(...response.data.Patients1);\n }\n if (response.data.Patients2) {\n resources.push(...response.data.Patients2);\n }\n if (response.data.ServiceRequestList) {\n resources.push(...response.data.ServiceRequestList);\n }\n return sortByRelevance(dedupeResources(resources), query).slice(0, 5);\n}\n\n/**\n * Removes duplicate resources from an array by ID.\n * @param resources - The array of resources with possible duplicates.\n * @returns The array of resources with no duplicates.\n */\nfunction dedupeResources(resources: HeaderSearchTypes[]): HeaderSearchTypes[] {\n const ids = new Set<string>();\n const result = [];\n\n for (const resource of resources) {\n if (!ids.has(resource.id as string)) {\n ids.add(resource.id as string);\n result.push(resource);\n }\n }\n\n return result;\n}\n\n/**\n * Sorts an array of resources by relevance.\n * @param resources - The candidate resources.\n * @param query - The user entered search string.\n * @returns The sorted array of resources.\n */\nfunction sortByRelevance(resources: HeaderSearchTypes[], query: string): HeaderSearchTypes[] {\n return resources.sort((a: HeaderSearchTypes, b: HeaderSearchTypes) => {\n return getResourceScore(b, query) - getResourceScore(a, query);\n });\n}\n\n/**\n * Calculates a relevance score of a candidate resource.\n * Higher scores are better.\n * @param resource - The candidate resource.\n * @param query - The user entered search string.\n * @returns The relevance score of the candidate resource.\n */\nfunction getResourceScore(resource: HeaderSearchTypes, query: string): number {\n let bestScore = 0;\n\n if (resource.identifier) {\n for (const identifier of resource.identifier) {\n bestScore = Math.max(bestScore, getStringScore(identifier.value, query));\n }\n }\n\n if (resource.resourceType === 'Patient' && resource.name) {\n for (const name of resource.name) {\n bestScore = Math.max(bestScore, getStringScore(formatHumanName(name), query));\n }\n }\n\n return bestScore;\n}\n\n/**\n * Calculates a relevance score of a candidate display string.\n * Higher scores are better.\n * @param str - The candidate display string.\n * @param query - The user entered search string.\n * @returns The relevance score of the candidate string.\n */\nfunction getStringScore(str: string | undefined, query: string): number {\n if (!str) {\n return 0;\n }\n const index = str.toLowerCase().indexOf(query.toLowerCase());\n if (index < 0) {\n return 0;\n }\n return 100 - index;\n}\n", "import { Combobox, ComboboxItem, ComboboxProps, Group, Loader, Pill, PillsInput, useCombobox } from '@mantine/core';\nimport { showNotification } from '@mantine/notifications';\nimport { normalizeErrorString } from '@medplum/core';\nimport { KeyboardEvent, ReactNode, useCallback, useEffect, useRef, useState } from 'react';\nimport { killEvent } from '../utils/dom';\n\nexport interface AsyncAutocompleteOption<T> extends ComboboxItem {\n resource: T;\n}\n\nexport interface AsyncAutocompleteProps<T>\n extends Omit<ComboboxProps, 'data' | 'defaultValue' | 'loadOptions' | 'onChange' | 'onCreate' | 'searchable'> {\n readonly name?: string;\n readonly label?: ReactNode;\n readonly description?: ReactNode;\n readonly error?: ReactNode;\n readonly defaultValue?: T | T[];\n readonly toOption: (item: T) => AsyncAutocompleteOption<T>;\n readonly loadOptions: (input: string, signal: AbortSignal) => Promise<T[]>;\n readonly itemComponent?: (props: AsyncAutocompleteOption<T>) => JSX.Element | ReactNode;\n readonly onChange: (item: T[]) => void;\n readonly onCreate?: (input: string) => T;\n readonly creatable?: boolean;\n readonly clearable?: boolean;\n readonly required?: boolean;\n readonly className?: string;\n readonly placeholder?: string;\n readonly leftSection?: ReactNode;\n readonly maxValues?: number;\n}\n\nexport function AsyncAutocomplete<T>(props: AsyncAutocompleteProps<T>): JSX.Element {\n const combobox = useCombobox({\n onDropdownClose: () => combobox.resetSelectedOption(),\n onDropdownOpen: () => combobox.updateSelectedOptionIndex('active'),\n });\n const {\n name,\n label,\n description,\n error,\n defaultValue,\n toOption,\n loadOptions,\n itemComponent,\n onChange,\n onCreate,\n creatable,\n clearable,\n required,\n placeholder,\n leftSection,\n maxValues,\n ...rest\n } = props;\n const defaultItems = toDefaultItems(defaultValue);\n const [search, setSearch] = useState('');\n const [timer, setTimer] = useState<number>();\n const [abortController, setAbortController] = useState<AbortController>();\n const [autoSubmit, setAutoSubmit] = useState<boolean>();\n const [selected, setSelected] = useState<AsyncAutocompleteOption<T>[]>(defaultItems.map(toOption));\n const [options, setOptions] = useState<AsyncAutocompleteOption<T>[]>([]);\n const ItemComponent = itemComponent ?? DefaultItemComponent;\n\n const searchRef = useRef<string>();\n searchRef.current = search;\n\n const lastLoadOptionsRef = useRef<AsyncAutocompleteProps<T>['loadOptions']>();\n const lastValueRef = useRef<string>();\n\n const timerRef = useRef<number>();\n timerRef.current = timer;\n\n const abortControllerRef = useRef<AbortController>();\n abortControllerRef.current = abortController;\n\n const autoSubmitRef = useRef<boolean>();\n autoSubmitRef.current = autoSubmit;\n\n const optionsRef = useRef<AsyncAutocompleteOption<T>[]>();\n optionsRef.current = options;\n\n const handleTimer = useCallback((): void => {\n setTimer(undefined);\n\n if (searchRef.current === lastValueRef.current && loadOptions === lastLoadOptionsRef.current) {\n // Same search input and loadOptions function, move on\n return;\n }\n\n lastValueRef.current = searchRef.current;\n lastLoadOptionsRef.current = loadOptions;\n\n const newAbortController = new AbortController();\n setAbortController(newAbortController);\n\n loadOptions(searchRef.current ?? '', newAbortController.signal)\n .then((newValues: T[]) => {\n if (!newAbortController.signal.aborted) {\n setOptions(newValues.map(toOption));\n setAbortController(undefined);\n if (autoSubmitRef.current) {\n if (newValues.length > 0) {\n onChange(newValues.slice(0, 1));\n }\n setAutoSubmit(false);\n } else if (newValues.length > 0) {\n combobox.openDropdown();\n }\n }\n })\n .catch((err) => {\n if (!(newAbortController.signal.aborted || err.message.includes('aborted'))) {\n showNotification({ color: 'red', message: normalizeErrorString(err) });\n }\n });\n }, [combobox, loadOptions, onChange, toOption]);\n\n const handleSearchChange = useCallback(\n (e: React.SyntheticEvent): void => {\n if (options && options.length > 0) {\n combobox.openDropdown();\n }\n\n combobox.updateSelectedOptionIndex();\n setSearch((e.currentTarget as HTMLInputElement).value);\n\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setAbortController(undefined);\n }\n\n if (timerRef.current !== undefined) {\n window.clearTimeout(timerRef.current);\n }\n\n const newTimer = window.setTimeout(() => handleTimer(), 100);\n setTimer(newTimer);\n },\n [combobox, options, handleTimer]\n );\n\n const addSelected = useCallback(\n (newValue: string): void => {\n const result: T[] = [];\n const newSelected: AsyncAutocompleteOption<T>[] = [...selected];\n\n let option = options?.find((option) => option.value === newValue);\n let item = option?.resource;\n if (!item && creatable !== false && onCreate) {\n item = onCreate(newValue);\n option = toOption(item);\n }\n\n if (item) {\n result.push(item);\n }\n\n if (option) {\n newSelected.push(option);\n }\n\n if (maxValues !== undefined) {\n while (newSelected.length > maxValues) {\n // Remove from the front\n newSelected.shift();\n }\n }\n\n onChange(result);\n setSelected(newSelected);\n },\n [creatable, options, selected, maxValues, onChange, onCreate, toOption]\n );\n\n const handleValueSelect = (val: string): void => {\n setSearch('');\n setOptions([]);\n lastValueRef.current = undefined;\n if (val === '$create') {\n addSelected(search);\n } else {\n addSelected(val);\n }\n };\n\n const handleValueRemove = useCallback(\n (item: AsyncAutocompleteOption<T>): void => {\n const newSelected = selected.filter((v) => v.value !== item.value);\n onChange(newSelected.map((v) => v.resource));\n setSelected(newSelected);\n },\n [selected, onChange]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent): void => {\n if (e.key === 'Enter') {\n if (!timer && !abortController) {\n killEvent(e);\n if (options && options.length > 0) {\n setOptions(options.slice(0, 1));\n addSelected(options[0].value);\n }\n } else {\n // The user pressed enter, but we don't have results yet.\n // We need to wait for the results to come in.\n setAutoSubmit(true);\n }\n } else if (e.key === 'Backspace' && search.length === 0) {\n killEvent(e);\n handleValueRemove(selected[selected.length - 1]);\n }\n },\n [search, selected, options, timer, abortController, addSelected, handleValueRemove]\n );\n\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n // Based on Mantine MultiSelect:\n // https://github.com/mantinedev/mantine/blob/master/packages/%40mantine/core/src/components/MultiSelect/MultiSelect.tsx\n const clearButton = clearable && selected.length > 0 && (\n <Combobox.ClearButton\n title=\"Clear all\"\n size={16}\n onClear={() => {\n setSearch('');\n setSelected([]);\n onChange([]);\n }}\n />\n );\n\n return (\n <Combobox store={combobox} onOptionSubmit={handleValueSelect} withinPortal={true} shadow=\"xl\" {...rest}>\n <Combobox.DropdownTarget>\n <PillsInput\n label={label}\n description={description}\n error={error}\n className={props.className}\n leftSection={leftSection}\n rightSection={abortController ? <Loader size={16} /> : clearButton}\n required={required}\n >\n <Pill.Group>\n {selected.map((item) => (\n <Pill key={item.value} withRemoveButton onRemove={() => handleValueRemove(item)}>\n {item.label}\n </Pill>\n ))}\n\n <Combobox.EventsTarget>\n <PillsInput.Field\n role=\"searchbox\"\n name={name}\n value={search}\n placeholder={placeholder}\n onFocus={handleSearchChange}\n onBlur={() => combobox.closeDropdown()}\n onKeyDown={handleKeyDown}\n onChange={handleSearchChange}\n />\n </Combobox.EventsTarget>\n </Pill.Group>\n </PillsInput>\n </Combobox.DropdownTarget>\n\n <Combobox.Dropdown>\n <Combobox.Options>\n {options.map((item) => (\n <Combobox.Option value={item.value} key={item.value} active={selected.includes(item)}>\n <ItemComponent {...item} />\n </Combobox.Option>\n ))}\n\n {creatable && search.trim().length > 0 && (\n <Combobox.Option value=\"$create\">+ Create {search}</Combobox.Option>\n )}\n\n {!creatable && search.trim().length > 0 && options.length === 0 && (\n <Combobox.Empty>Nothing found</Combobox.Empty>\n )}\n </Combobox.Options>\n </Combobox.Dropdown>\n </Combobox>\n );\n}\n\nfunction toDefaultItems<T>(defaultValue: T | T[] | undefined): T[] {\n if (!defaultValue) {\n return [];\n }\n if (Array.isArray(defaultValue)) {\n return defaultValue;\n }\n return [defaultValue];\n}\n\nfunction DefaultItemComponent(props: ComboboxItem): JSX.Element {\n return (\n <Group gap=\"sm\">\n <span>{props.label}</span>\n </Group>\n );\n}\n", ".searchInput {\n input {\n width: 220px;\n transition: width 0.1s ease-in-out;\n }\n\n input:focus {\n width: 400px;\n }\n\n @media (max-width: 800px) {\n input {\n width: 150px;\n }\n input:focus {\n width: 150px;\n }\n }\n}\n", "import { Button, AppShell as MantineAppShell, ScrollArea, Space, Text } from '@mantine/core';\nimport { useMedplumNavigate } from '@medplum/react-hooks';\nimport { IconPlus } from '@tabler/icons-react';\nimport cx from 'clsx';\nimport { Fragment, MouseEventHandler, ReactNode, SyntheticEvent, useState } from 'react';\nimport { BookmarkDialog } from '../BookmarkDialog/BookmarkDialog';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { ResourceTypeInput } from '../ResourceTypeInput/ResourceTypeInput';\nimport classes from './Navbar.module.css';\n\nexport interface NavbarLink {\n icon?: JSX.Element;\n label?: string;\n href: string;\n}\n\nexport interface NavbarMenu {\n title?: string;\n links?: NavbarLink[];\n}\n\nexport interface NavbarProps {\n pathname?: string;\n searchParams?: URLSearchParams;\n menus?: NavbarMenu[];\n closeNavbar: () => void;\n displayAddBookmark?: boolean;\n resourceTypeSearchDisabled?: boolean;\n}\n\nexport function Navbar(props: NavbarProps): JSX.Element {\n const navigate = useMedplumNavigate();\n const activeLink = getActiveLink(props.pathname, props.searchParams, props.menus);\n const [bookmarkDialogVisible, setBookmarkDialogVisible] = useState(false);\n\n function onLinkClick(e: SyntheticEvent, to: string): void {\n e.stopPropagation();\n e.preventDefault();\n navigate(to);\n if (window.innerWidth < 768) {\n props.closeNavbar();\n }\n }\n\n function navigateResourceType(resourceType: string | undefined): void {\n if (resourceType) {\n navigate(`/${resourceType}`);\n }\n }\n\n return (\n <>\n <MantineAppShell.Navbar>\n <ScrollArea p=\"xs\">\n {!props.resourceTypeSearchDisabled && (\n <MantineAppShell.Section mb=\"sm\">\n <ResourceTypeInput\n key={window.location.pathname}\n name=\"resourceType\"\n placeholder=\"Resource Type\"\n onChange={(newValue) => navigateResourceType(newValue)}\n />\n </MantineAppShell.Section>\n )}\n <MantineAppShell.Section grow>\n {props.menus?.map((menu) => (\n <Fragment key={`menu-${menu.title}`}>\n <Text className={classes.menuTitle}>{menu.title}</Text>\n {menu.links?.map((link) => (\n <NavbarLink\n key={link.href}\n to={link.href}\n active={link.href === activeLink?.href}\n onClick={(e) => onLinkClick(e, link.href)}\n >\n <NavLinkIcon to={link.href} icon={link.icon} />\n <span>{link.label}</span>\n </NavbarLink>\n ))}\n </Fragment>\n ))}\n {props.displayAddBookmark && (\n <Button\n variant=\"subtle\"\n size=\"xs\"\n mt=\"xl\"\n leftSection={<IconPlus size=\"0.75rem\" />}\n onClick={() => setBookmarkDialogVisible(true)}\n >\n Add Bookmark\n </Button>\n )}\n </MantineAppShell.Section>\n </ScrollArea>\n </MantineAppShell.Navbar>\n {props.pathname && props.searchParams && (\n <BookmarkDialog\n pathname={props.pathname}\n searchParams={props.searchParams}\n visible={bookmarkDialogVisible}\n onOk={() => setBookmarkDialogVisible(false)}\n onCancel={() => setBookmarkDialogVisible(false)}\n />\n )}\n </>\n );\n}\n\ninterface NavbarLinkProps {\n to: string;\n active: boolean;\n onClick: MouseEventHandler;\n children: ReactNode;\n}\n\nfunction NavbarLink(props: NavbarLinkProps): JSX.Element {\n return (\n <MedplumLink\n onClick={props.onClick}\n to={props.to}\n className={cx(classes.link, { [classes.linkActive]: props.active })}\n >\n {props.children}\n </MedplumLink>\n );\n}\n\ninterface NavLinkIconProps {\n to: string;\n icon?: JSX.Element;\n}\n\nfunction NavLinkIcon(props: NavLinkIconProps): JSX.Element {\n if (props.icon) {\n return props.icon;\n }\n return <Space w={30} />;\n}\n\n/**\n * Returns the best \"active\" link for the menu.\n * In most cases, the navbar links are simple, and an exact match can determine which link is active.\n * However, we ignore some search parameters to support pagination.\n * But we cannot ignore all search parameters, to support separate links based on search filters.\n * So in the end, we use a simple scoring system based on the number of matching query search params.\n * @param currentPathname - The web browser current pathname.\n * @param currentSearchParams - The web browser current search parameters.\n * @param menus - Collection of navbar menus and links.\n * @returns The active link if one is found.\n */\nfunction getActiveLink(\n currentPathname: string | undefined,\n currentSearchParams: URLSearchParams | undefined,\n menus: NavbarMenu[] | undefined\n): NavbarLink | undefined {\n if (!currentPathname || !currentSearchParams || !menus) {\n return undefined;\n }\n\n let bestLink = undefined;\n let bestScore = 0;\n\n for (const menu of menus) {\n if (menu.links) {\n for (const link of menu.links) {\n const score = getLinkScore(currentPathname, currentSearchParams, link.href);\n if (score > bestScore) {\n bestScore = score;\n bestLink = link;\n }\n }\n }\n }\n\n return bestLink;\n}\n\n/**\n * Calculates a score for a link.\n * Zero means \"does not match at all\".\n * One means \"matches the pathname only\".\n * Additional increases for each matching search parameter.\n * Ignores pagination parameters \"_count\" and \"_offset\".\n * @param currentPathname - The web browser current pathname.\n * @param currentSearchParams - The web browser current search parameters.\n * @param linkHref - A candidate link href.\n * @returns The link score.\n */\nfunction getLinkScore(currentPathname: string, currentSearchParams: URLSearchParams, linkHref: string): number {\n const linkUrl = new URL(linkHref, 'https://example.com');\n if (currentPathname !== linkUrl.pathname) {\n return 0;\n }\n const ignoredParams = ['_count', '_offset'];\n for (const [key, value] of linkUrl.searchParams.entries()) {\n if (ignoredParams.includes(key)) {\n continue;\n }\n if (currentSearchParams.get(key) !== value) {\n return 0;\n }\n }\n let count = 1;\n for (const [key, value] of currentSearchParams.entries()) {\n if (ignoredParams.includes(key)) {\n continue;\n }\n if (linkUrl.searchParams.get(key) === value) {\n count++;\n }\n }\n return count;\n}\n", "import { Button, Group, Modal, NativeSelect, Stack, TextInput } from '@mantine/core';\nimport { showNotification } from '@mantine/notifications';\nimport { deepClone, normalizeErrorString } from '@medplum/core';\nimport { UserConfiguration } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { Form } from '../Form/Form';\n\ninterface BookmarkDialogProps {\n pathname: string;\n searchParams: URLSearchParams;\n visible: boolean;\n onOk: () => void;\n onCancel: () => void;\n defaultValue?: string;\n}\nexport function BookmarkDialog(props: BookmarkDialogProps): JSX.Element | null {\n const medplum = useMedplum();\n const config = medplum.getUserConfiguration() as UserConfiguration;\n\n function submitHandler(formData: Record<string, string>): void {\n const { menuname, bookmarkname: name } = formData;\n const target = `${props.pathname}?${props.searchParams.toString()}`;\n const newConfig = deepClone(config) as UserConfiguration;\n const menu = newConfig.menu?.find(({ title }) => title === menuname);\n\n menu?.link?.push({ name, target });\n medplum\n .updateResource(newConfig)\n .then((res) => {\n // refresh current config menu\n config.menu = res.menu;\n medplum.dispatchEvent({ type: 'change' });\n showNotification({ color: 'green', message: 'Success' });\n props.onOk();\n })\n .catch((err: any) => {\n showNotification({ color: 'red', message: normalizeErrorString(err) });\n });\n }\n\n return (\n <Modal\n title=\"Add Bookmark\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={props.onCancel}\n >\n <Form onSubmit={submitHandler}>\n <Stack>\n <SelectMenu config={config}></SelectMenu>\n <TextInput label=\"Bookmark Name\" type=\"text\" name=\"bookmarkname\" placeholder=\"Bookmark Name\" withAsterisk />\n <Group justify=\"flex-end\">\n <Button mt=\"sm\" type=\"submit\">\n OK\n </Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n );\n}\n\ninterface SelectMenuProps {\n config: UserConfiguration | undefined;\n}\n\nfunction SelectMenu(props: SelectMenuProps): JSX.Element {\n function userConfigToMenu(config: UserConfiguration | undefined): string[] {\n return config?.menu?.map((menu) => menu.title) as [];\n }\n const menus = userConfigToMenu(props.config);\n\n return <NativeSelect name=\"menuname\" defaultValue={menus[0]} label=\"Select Menu Option\" data={menus} withAsterisk />;\n}\n", "/**\n * Parses an HTML form and returns the result as a JavaScript object.\n * @param form - The HTML form element.\n * @returns Form values in key value pairs.\n */\nexport function parseForm(form: HTMLFormElement): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const element of Array.from(form.elements)) {\n if (element instanceof HTMLInputElement) {\n parseInputElement(result, element);\n } else if (element instanceof HTMLTextAreaElement) {\n result[element.name] = element.value;\n } else if (element instanceof HTMLSelectElement) {\n parseSelectElement(result, element);\n }\n }\n\n return result;\n}\n\n/**\n * Parses an HTML input element.\n * Sets the name/value pair in the result,\n * but only if the element is enabled and checked.\n * @param result - The result builder.\n * @param el - The input element.\n */\nfunction parseInputElement(result: Record<string, string>, el: HTMLInputElement): void {\n if (el.disabled) {\n // Ignore disabled elements\n return;\n }\n\n if ((el.type === 'checkbox' || el.type === 'radio') && !el.checked) {\n // Ignore unchecked radio or checkbox elements\n return;\n }\n\n result[el.name] = el.value;\n}\n\n/**\n * Parses an HTML select element.\n * Sets the name/value pair if one is selected.\n * @param result - The result builder.\n * @param el - The select element.\n */\nfunction parseSelectElement(result: Record<string, string>, el: HTMLSelectElement): void {\n result[el.name] = el.value;\n}\n", "import { CSSProperties, ReactNode, SyntheticEvent } from 'react';\nimport { parseForm } from './FormUtils';\n\nexport interface FormProps {\n onSubmit?: (formData: Record<string, string>) => void;\n style?: CSSProperties;\n children?: ReactNode;\n testid?: string;\n}\n\nexport function Form(props: FormProps): JSX.Element {\n return (\n <form\n style={props.style}\n data-testid={props.testid}\n onSubmit={(e: SyntheticEvent) => {\n e.preventDefault();\n const formData = parseForm(e.target as HTMLFormElement);\n if (props.onSubmit) {\n props.onSubmit(formData);\n }\n }}\n >\n {props.children}\n </form>\n );\n}\n", "import { ResourceType } from '@medplum/fhirtypes';\nimport { useCallback, useState } from 'react';\nimport { CodeInput } from '../CodeInput/CodeInput';\n\nexport interface ResourceTypeInputProps {\n name: string;\n placeholder?: string;\n defaultValue?: ResourceType;\n targetTypes?: string[];\n autoFocus?: boolean;\n testId?: string;\n onChange?: (value: ResourceType | undefined) => void;\n}\n\nexport function ResourceTypeInput(props: ResourceTypeInputProps): JSX.Element {\n const [resourceType, setResourceType] = useState<string | undefined>(props.defaultValue);\n const onChange = props.onChange;\n\n const setResourceTypeWrapper = useCallback(\n (newResourceType: string | undefined) => {\n setResourceType(newResourceType);\n if (onChange) {\n onChange(newResourceType as ResourceType);\n }\n },\n [onChange]\n );\n\n return (\n <CodeInput\n data-autofocus={props.autoFocus}\n data-testid={props.testId}\n defaultValue={resourceType}\n onChange={setResourceTypeWrapper}\n name={props.name}\n placeholder={props.placeholder}\n binding=\"https://medplum.com/fhir/ValueSet/resource-types\"\n creatable={false}\n maxValues={0}\n clearable={false}\n />\n );\n}\n", "import { ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { ValueSetAutocomplete, ValueSetAutocompleteProps } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeInputProps extends Omit<ValueSetAutocompleteProps, 'defaultValue' | 'onChange'> {\n defaultValue?: string;\n onChange?: (value: string | undefined) => void;\n}\n\nexport function CodeInput(props: CodeInputProps): JSX.Element {\n const { defaultValue, onChange, ...rest } = props;\n const [value, setValue] = useState<string | undefined>(defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newValue = newValues[0];\n const newCode = valueSetElementToCode(newValue);\n setValue(newCode);\n if (onChange) {\n onChange(newCode);\n }\n }\n\n return <ValueSetAutocomplete defaultValue={codeToValueSetElement(value)} onChange={handleChange} {...rest} />;\n}\n\nfunction codeToValueSetElement(code: string | undefined): ValueSetExpansionContains | undefined {\n return code ? { code } : undefined;\n}\n\nfunction valueSetElementToCode(element: ValueSetExpansionContains | undefined): string | undefined {\n return element?.code;\n}\n", "import { ValueSetExpandParams } from '@medplum/core';\nimport { ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback } from 'react';\nimport {\n AsyncAutocomplete,\n AsyncAutocompleteOption,\n AsyncAutocompleteProps,\n} from '../AsyncAutocomplete/AsyncAutocomplete';\n\nexport interface ValueSetAutocompleteProps\n extends Omit<AsyncAutocompleteProps<ValueSetExpansionContains>, 'loadOptions' | 'toKey' | 'toOption'> {\n binding: string | undefined;\n creatable?: boolean;\n clearable?: boolean;\n expandParams?: Partial<ValueSetExpandParams>;\n}\n\nfunction toKey(element: ValueSetExpansionContains): string {\n if (typeof element.code === 'string') {\n return element.code;\n }\n return JSON.stringify(element);\n}\n\nfunction getDisplay(item: ValueSetExpansionContains): string {\n if (typeof item.display === 'string') {\n return item.display;\n }\n return toKey(item);\n}\n\nfunction toOption(element: ValueSetExpansionContains): AsyncAutocompleteOption<ValueSetExpansionContains> {\n return {\n value: toKey(element),\n label: getDisplay(element),\n resource: element,\n };\n}\n\nfunction createValue(input: string): ValueSetExpansionContains {\n return {\n code: input,\n display: input,\n };\n}\n\n/**\n * A low-level component to autocomplete based on a FHIR Valueset.\n * This is the base component for CodeableConceptInput, CodingInput, and CodeInput.\n * @param props - The ValueSetAutocomplete React props.\n * @returns The ValueSetAutocomplete React node.\n */\nexport function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element {\n const medplum = useMedplum();\n const { binding, creatable, clearable, expandParams, ...rest } = props;\n\n const loadValues = useCallback(\n async (input: string, signal: AbortSignal): Promise<ValueSetExpansionContains[]> => {\n if (!binding) {\n return [];\n }\n const valueSet = await medplum.valueSetExpand(\n {\n ...expandParams,\n url: binding,\n filter: input,\n },\n { signal }\n );\n const valueSetElements = valueSet.expansion?.contains as ValueSetExpansionContains[];\n const newData: ValueSetExpansionContains[] = [];\n for (const valueSetElement of valueSetElements) {\n if (valueSetElement.code && !newData.some((item) => item.code === valueSetElement.code)) {\n newData.push(valueSetElement);\n }\n }\n\n return newData;\n },\n [medplum, expandParams, binding]\n );\n\n return (\n <AsyncAutocomplete\n {...rest}\n creatable={creatable ?? true}\n clearable={clearable ?? true}\n toOption={toOption}\n loadOptions={loadValues}\n onCreate={createValue}\n />\n );\n}\n", ".menuTitle {\n margin: 20px 0 4px 6px;\n font-size: 9px;\n font-weight: normal;\n text-transform: uppercase;\n letter-spacing: 2px;\n}\n\n.link {\n display: flex;\n align-items: center;\n text-decoration: none;\n font-size: var(--mantine-font-size-sm);\n color: light-dark(var(--mantine-color-gray-7), var(--mantine-color-dark-1));\n padding: 8px 12px;\n border-radius: var(--mantine-radius-sm);\n font-weight: 500;\n\n &:hover {\n background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6));\n color: light-dark(var(--mantine-color-black), var(--mantine-color-white));\n text-decoration: none;\n\n & svg {\n color: light-dark(var(--mantine-color-black), var(--mantine-color-white));\n }\n }\n\n & svg {\n color: light-dark(var(--mantine-color-gray-6), var(--mantine-color-dark-2));\n margin-right: var(--mantine-spacing-sm);\n stroke-width: 1.5;\n width: 18px;\n height: 18px;\n }\n}\n\n.linkActive {\n color: var(--mantine-primary-color-filled);\n background-color: light-dark(var(--mantine-primary-color-light), var(--mantine-primary-color-dark));\n\n &:hover {\n color: var(--mantine-primary-color-filled-hover);\n background-color: light-dark(var(--mantine-primary-color-light-hover), var(--mantine-primary-color-dark-hover));\n\n & svg {\n color: var(--mantine-color-blue-light-color);\n }\n }\n\n & svg {\n color: var(--mantine-color-blue-light-color);\n }\n}\n", "import { Anchor } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\n\nexport interface AttachmentDisplayProps {\n value?: Attachment;\n maxWidth?: number;\n}\n\nexport function AttachmentDisplay(props: AttachmentDisplayProps): JSX.Element | null {\n const { contentType, url, title } = props.value ?? {};\n\n if (!url) {\n return null;\n }\n\n return (\n <div data-testid=\"attachment-display\">\n {contentType?.startsWith('image/') && (\n <img data-testid=\"attachment-image\" style={{ maxWidth: props.maxWidth }} src={url} alt={title} />\n )}\n {contentType?.startsWith('video/') && (\n <video data-testid=\"attachment-video\" style={{ maxWidth: props.maxWidth }} controls={true}>\n <source type={contentType} src={url} />\n </video>\n )}\n {contentType === 'application/pdf' && (\n <div data-testid=\"attachment-pdf\" style={{ maxWidth: props.maxWidth, minHeight: 400 }}>\n <iframe\n width=\"100%\"\n height=\"400\"\n src={url + '#navpanes=0'}\n allowFullScreen={true}\n frameBorder={0}\n seamless={true}\n />\n </div>\n )}\n <div data-testid=\"download-link\" style={{ padding: '2px 16px 16px 16px' }}>\n <Anchor\n href={url}\n data-testid=\"attachment-details\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download={getDownloadName(title)}\n >\n {title || 'Download'}\n </Anchor>\n </div>\n </div>\n );\n}\n\nfunction getDownloadName(title: string | undefined): string | undefined {\n // Title often contains the filename by convention\n return title?.includes('.') ? title : undefined;\n}\n", "import { Attachment } from '@medplum/fhirtypes';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\n\nexport interface AttachmentArrayDisplayProps {\n values?: Attachment[];\n maxWidth?: number;\n}\n\nexport function AttachmentArrayDisplay(props: AttachmentArrayDisplayProps): JSX.Element {\n return (\n <div>\n {props.values?.map((v, index) => (\n <div key={'attatchment-' + index}>\n <AttachmentDisplay value={v} maxWidth={props.maxWidth} />\n </div>\n ))}\n </div>\n );\n}\n", "import { ActionIcon } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCloudUpload } from '@tabler/icons-react';\nimport { MouseEvent, useRef, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentArrayInputProps {\n name: string;\n defaultValue?: Attachment[];\n arrayElement?: boolean;\n onChange?: (value: Attachment[]) => void;\n}\n\nexport function AttachmentArrayInput(props: AttachmentArrayInputProps): JSX.Element {\n const [values, setValues] = useState<Attachment[]>(props.defaultValue ?? []);\n\n const valuesRef = useRef<Attachment[]>();\n valuesRef.current = values;\n\n function setValuesWrapper(newValues: Attachment[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n return (\n <table style={{ width: '100%' }}>\n <colgroup>\n <col width=\"97%\" />\n <col width=\"3%\" />\n </colgroup>\n <tbody>\n {values.map((v: Attachment, index: number) => (\n <tr key={`${index}-${values.length}`}>\n <td>\n <AttachmentDisplay value={v} maxWidth={200} />\n </td>\n <td>\n <ActionIcon\n title=\"Remove\"\n variant=\"subtle\"\n size=\"sm\"\n color=\"gray\"\n onClick={(e: MouseEvent) => {\n killEvent(e);\n const copy = values.slice();\n copy.splice(index, 1);\n setValuesWrapper(copy);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </td>\n </tr>\n ))}\n <tr>\n <td></td>\n <td>\n <AttachmentButton\n onUpload={(attachment: Attachment) => {\n setValuesWrapper([...(valuesRef.current as Attachment[]), attachment]);\n }}\n >\n {(props) => (\n <ActionIcon {...props} title=\"Add\" variant=\"subtle\" size=\"sm\" color=\"green\">\n <IconCloudUpload />\n </ActionIcon>\n )}\n </AttachmentButton>\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n", "import { normalizeOperationOutcome } from '@medplum/core';\nimport { Attachment, Binary, OperationOutcome } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ChangeEvent, MouseEvent, ReactNode, useRef } from 'react';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentButtonProps {\n onUpload: (attachment: Attachment) => void;\n onUploadStart?: () => void;\n onUploadProgress?: (e: ProgressEvent) => void;\n onUploadError?: (outcome: OperationOutcome) => void;\n children(props: { onClick(e: MouseEvent): void }): ReactNode;\n}\n\nexport function AttachmentButton(props: AttachmentButtonProps): JSX.Element {\n const medplum = useMedplum();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n function onClick(e: MouseEvent): void {\n killEvent(e);\n fileInputRef.current?.click();\n }\n\n function onFileChange(e: ChangeEvent): void {\n killEvent(e);\n const files = (e.target as HTMLInputElement).files;\n if (files) {\n Array.from(files).forEach(processFile);\n }\n }\n\n /**\n * Processes a single file.\n * @param file - The file descriptor.\n */\n function processFile(file: File): void {\n if (!file) {\n return;\n }\n\n const fileName = file.name;\n if (!fileName) {\n return;\n }\n\n if (props.onUploadStart) {\n props.onUploadStart();\n }\n\n const filename = file.name;\n const contentType = file.type || 'application/octet-stream';\n medplum\n .createBinary(file, filename, contentType, props.onUploadProgress)\n .then((binary: Binary) => {\n props.onUpload({\n contentType: binary.contentType,\n url: binary.url,\n title: filename,\n });\n })\n .catch((err) => {\n if (props.onUploadError) {\n props.onUploadError(normalizeOperationOutcome(err));\n }\n });\n }\n\n return (\n <>\n <input\n type=\"file\"\n data-testid=\"upload-file-input\"\n style={{ display: 'none' }}\n ref={fileInputRef}\n onChange={(e) => onFileChange(e)}\n />\n {props.children({ onClick })}\n </>\n );\n}\n", "import { Button } from '@mantine/core';\nimport { Attachment } from '@medplum/fhirtypes';\nimport { MouseEvent, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { killEvent } from '../utils/dom';\n\nexport interface AttachmentInputProps {\n name: string;\n defaultValue?: Attachment;\n arrayElement?: boolean;\n onChange?: (value: Attachment | undefined) => void;\n}\n\nexport function AttachmentInput(props: AttachmentInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Attachment | undefined): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n if (value) {\n return (\n <>\n <AttachmentDisplay value={value} maxWidth={200} />\n <Button\n onClick={(e: MouseEvent) => {\n killEvent(e);\n setValueWrapper(undefined);\n }}\n >\n Remove\n </Button>\n </>\n );\n }\n\n return (\n <AttachmentButton onUpload={setValueWrapper}>{(props) => <Button {...props}>Upload...</Button>}</AttachmentButton>\n );\n}\n", "import { getPathDisplayName, tryGetDataType, TypedValue } from '@medplum/core';\nimport { DEFAULT_IGNORED_NON_NESTED_PROPERTIES, DEFAULT_IGNORED_PROPERTIES } from '../constants';\nimport { DescriptionList, DescriptionListEntry } from '../DescriptionList/DescriptionList';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.utils';\n\nexport interface BackboneElementDisplayProps {\n value: TypedValue;\n compact?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function BackboneElementDisplay(props: BackboneElementDisplayProps): JSX.Element | null {\n const typedValue = props.value;\n const value = typedValue.value;\n if (!value) {\n return null;\n }\n\n const typeName = typedValue.type;\n const typeSchema = tryGetDataType(typeName);\n if (!typeSchema) {\n return <div>{typeName}&nbsp;not implemented</div>;\n }\n\n if (\n typeof value === 'object' &&\n 'name' in value &&\n Object.keys(value).length === 1 &&\n typeof value.name === 'string'\n ) {\n // Special case for common BackboneElement pattern\n // Where there is an object with a single property 'name'\n // Just display the name value.\n return <div>{value.name}</div>;\n }\n\n return (\n <DescriptionList compact={props.compact}>\n {Object.entries(typeSchema.elements).map((entry) => {\n const [key, property] = entry;\n if (DEFAULT_IGNORED_PROPERTIES.includes(key)) {\n return null;\n }\n if (DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key) && property.path.split('.').length === 2) {\n return null;\n }\n const [propertyValue, propertyType] = getValueAndType(typedValue, key);\n if (\n props.ignoreMissingValues &&\n (!propertyValue || (Array.isArray(propertyValue) && propertyValue.length === 0))\n ) {\n return null;\n }\n return (\n <DescriptionListEntry key={key} term={getPathDisplayName(key)}>\n <ResourcePropertyDisplay\n property={property}\n propertyType={propertyType}\n value={propertyValue}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </DescriptionListEntry>\n );\n })}\n </DescriptionList>\n );\n}\n", "export const DEFAULT_IGNORED_PROPERTIES = ['meta', 'implicitRules', 'contained', 'extension', 'modifierExtension'];\n\n// Ignored only when they are top-level properties\n// e.g. Patient.language is ignored, but Patient.communication.language is not ignored\nexport const DEFAULT_IGNORED_NON_NESTED_PROPERTIES = ['language', 'text'];\n", ".root {\n display: grid;\n grid-template-columns: 30% 70%;\n margin: 0;\n\n & > dt,\n & > dd {\n padding: var(--mantine-spacing-sm);\n border-top: 0.1px solid var(--mantine-color-gray-3);\n margin: 0;\n }\n}\n\n.compact {\n grid-template-columns: 20% 80%;\n\n & > dt,\n & > dd {\n padding: 0 var(--mantine-spacing-xs) var(--mantine-spacing-xs);\n border: 0;\n }\n}\n", "import cx from 'clsx';\nimport { ReactNode } from 'react';\nimport classes from './DescriptionList.module.css';\n\nexport interface DescriptionListProps {\n children: ReactNode;\n compact?: boolean;\n}\n\nexport function DescriptionList(props: DescriptionListProps): JSX.Element {\n const { children, compact } = props;\n return <dl className={cx(classes.root, { [classes.compact]: compact })}>{children}</dl>;\n}\n\nexport interface DescriptionListEntryProps {\n term: string;\n children: ReactNode;\n}\n\nexport function DescriptionListEntry(props: DescriptionListEntryProps): JSX.Element {\n return (\n <>\n <dt>{props.term}</dt>\n <dd>{props.children}</dd>\n </>\n );\n}\n", "import { ActionIcon, Box, CopyButton, Tooltip } from '@mantine/core';\nimport {\n InternalSchemaElement,\n PropertyType,\n formatDateTime,\n formatPeriod,\n formatTiming,\n isEmpty,\n} from '@medplum/core';\nimport { IconCheck, IconCopy } from '@tabler/icons-react';\nimport { AddressDisplay } from '../AddressDisplay/AddressDisplay';\nimport { AttachmentArrayDisplay } from '../AttachmentArrayDisplay/AttachmentArrayDisplay';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodingDisplay } from '../CodingDisplay/CodingDisplay';\nimport { ContactDetailDisplay } from '../ContactDetailDisplay/ContactDetailDisplay';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\nimport { HumanNameDisplay } from '../HumanNameDisplay/HumanNameDisplay';\nimport { IdentifierDisplay } from '../IdentifierDisplay/IdentifierDisplay';\nimport { MoneyDisplay } from '../MoneyDisplay/MoneyDisplay';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { RatioDisplay } from '../RatioDisplay/RatioDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceArrayDisplay } from '../ResourceArrayDisplay/ResourceArrayDisplay';\n\nexport interface ResourcePropertyDisplayProps {\n property?: InternalSchemaElement;\n propertyType: string;\n value: any;\n arrayElement?: boolean;\n maxWidth?: number;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\n/**\n * Low-level component that renders a property from a given resource, given type information.\n * @param props - The ResourcePropertyDisplay React props.\n * @returns The ResourcePropertyDisplay React node.\n */\nexport function ResourcePropertyDisplay(props: ResourcePropertyDisplayProps): JSX.Element {\n const { property, propertyType, value } = props;\n\n const isIdProperty = property?.path?.endsWith('.id');\n if (isIdProperty) {\n return (\n <Box component=\"div\" style={{ display: 'flex', gap: 3, alignItems: 'center' }}>\n {value}\n {!isEmpty(value) && (\n <CopyButton value={value} timeout={2000}>\n {({ copied, copy }) => (\n <Tooltip label={copied ? 'Copied' : 'Copy'} withArrow position=\"right\">\n <ActionIcon variant=\"subtle\" color={copied ? 'teal' : 'gray'} onClick={copy}>\n {copied ? <IconCheck size=\"1rem\" /> : <IconCopy size=\"1rem\" />}\n </ActionIcon>\n </Tooltip>\n )}\n </CopyButton>\n )}\n </Box>\n );\n }\n\n if (property?.max && property.max > 1 && !props.arrayElement) {\n if (propertyType === PropertyType.Attachment) {\n return <AttachmentArrayDisplay values={value} maxWidth={props.maxWidth} />;\n }\n return (\n <ResourceArrayDisplay\n property={property}\n values={value}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n );\n }\n\n switch (propertyType) {\n case PropertyType.boolean:\n return <>{value === undefined ? '' : Boolean(value).toString()}</>;\n case PropertyType.SystemString:\n case PropertyType.string:\n return <div style={{ whiteSpace: 'pre-wrap' }}>{value}</div>;\n case PropertyType.code:\n case PropertyType.date:\n case PropertyType.decimal:\n case PropertyType.id:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n case PropertyType.uri:\n case PropertyType.url:\n return <>{value}</>;\n case PropertyType.canonical:\n return <ReferenceDisplay value={{ reference: value }} link={props.link} />;\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <>{formatDateTime(value)}</>;\n case PropertyType.markdown:\n return <pre>{value}</pre>;\n case PropertyType.Address:\n return <AddressDisplay value={value} />;\n case PropertyType.Annotation:\n return <>{value?.text}</>;\n case PropertyType.Attachment:\n return <AttachmentDisplay value={value} maxWidth={props.maxWidth} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptDisplay value={value} />;\n case PropertyType.Coding:\n return <CodingDisplay value={value} />;\n case PropertyType.ContactDetail:\n return <ContactDetailDisplay value={value} />;\n case PropertyType.ContactPoint:\n return <ContactPointDisplay value={value} />;\n case PropertyType.HumanName:\n return <HumanNameDisplay value={value} />;\n case PropertyType.Identifier:\n return <IdentifierDisplay value={value} />;\n case PropertyType.Money:\n return <MoneyDisplay value={value} />;\n case PropertyType.Period:\n return <>{formatPeriod(value)}</>;\n case PropertyType.Quantity:\n case PropertyType.Duration:\n return <QuantityDisplay value={value} />;\n case PropertyType.Range:\n return <RangeDisplay value={value} />;\n case PropertyType.Ratio:\n return <RatioDisplay value={value} />;\n case PropertyType.Reference:\n return <ReferenceDisplay value={value} link={props.link} />;\n case PropertyType.Timing:\n return <>{formatTiming(value)}</>;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n return (\n <BackboneElementDisplay\n value={{ type: propertyType, value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n default:\n if (!property) {\n throw Error(`Displaying property of type ${props.propertyType} requires element schema`);\n }\n return (\n <BackboneElementDisplay\n value={{ type: property.type[0].code, value }}\n compact={true}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n }\n}\n", "import { formatCodeableConcept } from '@medplum/core';\nimport { CodeableConcept } from '@medplum/fhirtypes';\n\nexport interface CodeableConceptDisplayProps {\n value?: CodeableConcept;\n}\n\nexport function CodeableConceptDisplay(props: CodeableConceptDisplayProps): JSX.Element {\n return <>{formatCodeableConcept(props.value)}</>;\n}\n", "import { formatCoding } from '@medplum/core';\nimport { Coding } from '@medplum/fhirtypes';\n\nexport interface CodingDisplayProps {\n value?: Coding;\n}\n\nexport function CodingDisplay(props: CodingDisplayProps): JSX.Element {\n return <>{formatCoding(props.value)}</>;\n}\n", "import { ContactPoint } from '@medplum/fhirtypes';\n\nexport interface ContactPointDisplayProps {\n value?: ContactPoint;\n}\n\nexport function ContactPointDisplay(props: ContactPointDisplayProps): JSX.Element | null {\n const contactPoint = props.value;\n if (!contactPoint) {\n return null;\n }\n\n const builder = [];\n\n if (contactPoint.value) {\n builder.push(contactPoint.value);\n }\n\n if (contactPoint.use || contactPoint.system) {\n builder.push(' [');\n\n if (contactPoint.use) {\n builder.push(contactPoint.use);\n }\n\n if (contactPoint.use && contactPoint.system) {\n builder.push(' ');\n }\n\n if (contactPoint.system) {\n builder.push(contactPoint.system);\n }\n\n builder.push(']');\n }\n\n return <>{builder.join('').trim()}</>;\n}\n", "import { ContactDetail } from '@medplum/fhirtypes';\nimport { ContactPointDisplay } from '../ContactPointDisplay/ContactPointDisplay';\n\nexport interface ContactDetailDisplayProps {\n value?: ContactDetail;\n}\n\nexport function ContactDetailDisplay(props: ContactDetailDisplayProps): JSX.Element | null {\n const contactDetail = props.value;\n if (!contactDetail) {\n return null;\n }\n\n return (\n <>\n {contactDetail.name}\n {contactDetail.name && ': '}\n {contactDetail.telecom?.map((telecom) => (\n <ContactPointDisplay key={`telecom-${contactDetail.name}-${telecom.value}`} value={telecom} />\n ))}\n </>\n );\n}\n", "import { Identifier } from '@medplum/fhirtypes';\n\nexport interface IdentifierDisplayProps {\n value?: Identifier;\n}\n\nexport function IdentifierDisplay(props: IdentifierDisplayProps): JSX.Element {\n return (\n <div>\n {props.value?.system}: {props.value?.value}\n </div>\n );\n}\n", "import { formatMoney } from '@medplum/core';\nimport { Money } from '@medplum/fhirtypes';\n\nexport interface MoneyDisplayProps {\n value?: Money;\n}\n\nexport function MoneyDisplay(props: MoneyDisplayProps): JSX.Element | null {\n return <>{formatMoney(props.value)}</>;\n}\n", "import { formatQuantity } from '@medplum/core';\nimport { Quantity } from '@medplum/fhirtypes';\n\nexport interface QuantityDisplayProps {\n value?: Quantity;\n}\n\nexport function QuantityDisplay(props: QuantityDisplayProps): JSX.Element | null {\n return <>{formatQuantity(props.value)}</>;\n}\n", "import { formatRange } from '@medplum/core';\nimport { Range } from '@medplum/fhirtypes';\n\nexport interface RangeDisplayProps {\n value?: Range;\n}\n\nexport function RangeDisplay(props: RangeDisplayProps): JSX.Element | null {\n return <>{formatRange(props.value)}</>;\n}\n", "import { Ratio } from '@medplum/fhirtypes';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\n\nexport interface RatioDisplayProps {\n value?: Ratio;\n}\n\nexport function RatioDisplay(props: RatioDisplayProps): JSX.Element | null {\n const value = props.value;\n if (!value) {\n return null;\n }\n\n return (\n <>\n <QuantityDisplay value={value.numerator} />\n &nbsp;/&nbsp;\n <QuantityDisplay value={value.denominator} />\n </>\n );\n}\n", "import { stringify } from '@medplum/core';\nimport { Reference } from '@medplum/fhirtypes';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ReferenceDisplayProps {\n value?: Reference;\n link?: boolean;\n}\n\nexport function ReferenceDisplay(props: ReferenceDisplayProps): JSX.Element | null {\n if (!props.value) {\n return null;\n }\n\n const displayString = props.value.display || props.value.reference || stringify(props.value);\n\n // The \"link\" prop defaults to \"true\"; undefined is treated as \"true\"\n // To disable the link, it must be explicitly \"false\"\n if (props.link !== false && props.value.reference) {\n return <MedplumLink to={props.value}>{displayString}</MedplumLink>;\n } else {\n return <>{displayString}</>;\n }\n}\n", "import { InternalSchemaElement } from '@medplum/core';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface ResourceArrayDisplayProps {\n property: InternalSchemaElement;\n values: any[];\n arrayElement?: boolean;\n ignoreMissingValues?: boolean;\n link?: boolean;\n}\n\nexport function ResourceArrayDisplay(props: ResourceArrayDisplayProps): JSX.Element {\n const { property, values } = props;\n const propertyType = property.type[0].code;\n return props.values ? (\n <>\n {values.map((v: any, index: number) => (\n <div key={`${index}-${values.length}`}>\n <ResourcePropertyDisplay\n arrayElement={true}\n property={property}\n propertyType={propertyType}\n value={v}\n ignoreMissingValues={props.ignoreMissingValues}\n link={props.link}\n />\n </div>\n ))}\n </>\n ) : (\n <></>\n );\n}\n", "import {\n getTypedPropertyValue,\n getTypedPropertyValueWithSchema,\n InternalSchemaElement,\n TypedValue,\n} from '@medplum/core';\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param context - The base context (usually a FHIR resource).\n * @param path - The property path.\n * @returns The value of the property and the property type.\n */\nexport function getValueAndType(context: TypedValue, path: string): [any, string] {\n const typedResult = getTypedPropertyValue(context, path);\n if (!typedResult) {\n return [undefined, 'undefined'];\n }\n\n if (Array.isArray(typedResult)) {\n return [typedResult.map((e) => e.value), typedResult[0].type];\n }\n\n return [typedResult.value, typedResult.type];\n}\n\n/**\n * Returns the value of the property and the property type.\n * Some property definitions support multiple types.\n * For example, \"Observation.value[x]\" can be \"valueString\", \"valueInteger\", \"valueQuantity\", etc.\n * According to the spec, there can only be one property for a given element definition.\n * This function returns the value and the type.\n * @param value - The base context (usually a FHIR resource).\n * @param path - The property path.\n * @param element - The property element definition.\n * @returns The value of the property and the property type.\n */\nexport function getValueAndTypeFromElement(\n value: TypedValue['value'],\n path: string,\n element: InternalSchemaElement\n): [any, string] {\n const typedResult = getTypedPropertyValueWithSchema(value, path, element);\n if (!typedResult) {\n return [undefined, 'undefined'];\n }\n\n if (Array.isArray(typedResult)) {\n return [typedResult.map((e) => e.value), typedResult[0].type];\n }\n\n return [typedResult.value, typedResult.type];\n}\n", "import { tryGetDataType } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useContext, useMemo, useState } from 'react';\nimport { ElementsInput } from '../ElementsInput/ElementsInput';\nimport { BackboneElementContext, buildBackboneElementContext } from './BackboneElementInput.utils';\n\nexport interface BackboneElementInputProps {\n /** Type name the backbone element represents */\n typeName: string;\n /** (optional) The contents of the resource represented by the backbone element */\n defaultValue?: any;\n /** (optional) OperationOutcome from the last attempted system action*/\n outcome?: OperationOutcome;\n /** (optional) callback function that is called when the value of the backbone element changes */\n onChange?: (value: any) => void;\n /** (optional) Profile URL of the structure definition represented by the backbone element */\n profileUrl?: string;\n}\n\nexport function BackboneElementInput(props: BackboneElementInputProps): JSX.Element {\n const { typeName } = props;\n const [value, setValue] = useState<any>(props.defaultValue ?? {});\n const backboneContext = useContext(BackboneElementContext);\n const profileUrl = props.profileUrl ?? backboneContext.profileUrl;\n const typeSchema = useMemo(() => tryGetDataType(typeName, profileUrl), [typeName, profileUrl]);\n\n const context = useMemo(() => {\n return buildBackboneElementContext(typeSchema, profileUrl);\n }, [typeSchema, profileUrl]);\n\n if (!typeSchema) {\n return <div>{typeName}&nbsp;not implemented</div>;\n }\n\n function setValueWrapper(newValue: any): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <BackboneElementContext.Provider value={context}>\n <ElementsInput\n type={typeSchema.type}\n elements={typeSchema.elements}\n defaultValue={value}\n onChange={setValueWrapper}\n outcome={props.outcome}\n />\n </BackboneElementContext.Provider>\n );\n}\n", "import { Stack } from '@mantine/core';\nimport { InternalSchemaElement, TypedValue, getPathDisplayName, isPopulated } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useMemo, useState } from 'react';\nimport { CheckboxFormSection } from '../CheckboxFormSection/CheckboxFormSection';\nimport { FormSection } from '../FormSection/FormSection';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm.utils';\nimport { getValueAndTypeFromElement } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.utils';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { DEFAULT_IGNORED_NON_NESTED_PROPERTIES, DEFAULT_IGNORED_PROPERTIES } from '../constants';\n\nconst EXTENSION_KEYS = new Set(['extension', 'modifierExtension']);\nconst IGNORED_PROPERTIES = new Set(['id', ...DEFAULT_IGNORED_PROPERTIES].filter((prop) => !EXTENSION_KEYS.has(prop)));\n\nexport interface ElementsInputProps {\n type: string | undefined;\n elements: { [key: string]: InternalSchemaElement };\n defaultValue: any;\n outcome: OperationOutcome | undefined;\n onChange: ((value: any) => void) | undefined;\n testId?: string;\n}\n\nexport function ElementsInput(props: ElementsInputProps): JSX.Element {\n const { elements } = props;\n const [value, setValue] = useState<any>(props.defaultValue ?? {});\n\n const fixedProperties = useMemo(() => {\n const result: { [key: string]: InternalSchemaElement & { fixed: TypedValue } } = Object.create(null);\n for (const [key, property] of Object.entries(elements)) {\n if (property.fixed) {\n result[key] = property as any;\n }\n }\n return result;\n }, [elements]);\n\n function setValueWrapper(newValue: any): void {\n for (const [key, prop] of Object.entries(fixedProperties)) {\n setPropertyValue(newValue, key, key, prop, prop.fixed.value);\n }\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Stack style={{ flexGrow: 1 }} data-testid={props.testId}>\n {Object.entries(elements).map(([key, element]) => {\n if (!element.type) {\n return null;\n }\n\n if (element.max === 0) {\n return null;\n }\n\n // mostly for Extension.url\n if (key === 'url' && element.fixed) {\n return null;\n }\n\n if (EXTENSION_KEYS.has(key) && !isPopulated(element.slicing?.slices)) {\n // an extension property without slices has no nested extensions\n return null;\n } else if (IGNORED_PROPERTIES.has(key)) {\n return null;\n } else if (DEFAULT_IGNORED_NON_NESTED_PROPERTIES.includes(key) && element.path.split('.').length === 2) {\n return null;\n }\n\n // Profiles can include nested elements in addition to their containing element, e.g.:\n // identifier, identifier.use, identifier.system\n // Skip nested elements, e.g. identifier.use, since they are handled by the containing element\n if (key.includes('.')) {\n return null;\n }\n\n const [propertyValue, propertyType] = getValueAndTypeFromElement(value, key, element);\n\n const required = element.min !== undefined && element.min > 0;\n\n const resourcePropertyInput = (\n <ResourcePropertyInput\n key={key}\n property={element}\n name={key}\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n setValueWrapper(setPropertyValue({ ...value }, key, propName ?? key, element, newValue));\n }}\n arrayElement={undefined}\n outcome={props.outcome}\n />\n );\n\n // no FormSection wrapper for extensions\n if (props.type === 'Extension' || EXTENSION_KEYS.has(key)) {\n return resourcePropertyInput;\n }\n\n if (element.type.length === 1 && element.type[0].code === 'boolean') {\n return (\n <CheckboxFormSection\n key={key}\n title={getPathDisplayName(key)}\n description={element.description}\n htmlFor={key}\n fhirPath={element.path}\n withAsterisk={required}\n >\n {resourcePropertyInput}\n </CheckboxFormSection>\n );\n }\n\n return (\n <FormSection\n key={key}\n title={getPathDisplayName(key)}\n description={element.description}\n withAsterisk={required}\n htmlFor={key}\n outcome={props.outcome}\n fhirPath={element.path}\n >\n {resourcePropertyInput}\n </FormSection>\n );\n })}\n </Stack>\n );\n}\n", "import { Group, Input } from '@mantine/core';\nimport { ReactNode, useContext } from 'react';\nimport { BackboneElementContext } from '../BackboneElementInput/BackboneElementInput.utils';\n\nexport interface CheckboxFormSectionProps {\n htmlFor?: string;\n title?: string;\n description?: string;\n withAsterisk?: boolean;\n children?: ReactNode;\n testId?: string;\n fhirPath?: string;\n}\n\nexport function CheckboxFormSection(props: CheckboxFormSectionProps): JSX.Element {\n const { debugMode } = useContext(BackboneElementContext);\n\n let label: React.ReactNode;\n if (debugMode && props.fhirPath) {\n label = `${props.title} - ${props.fhirPath}`;\n } else {\n label = props.title;\n }\n return (\n <Group wrap=\"nowrap\" data-testid={props.testId}>\n <div>{props.children}</div>\n <div>\n <Input.Wrapper\n id={props.htmlFor}\n label={label}\n description={props.description}\n withAsterisk={props.withAsterisk}\n >\n {(() => null)()}\n </Input.Wrapper>\n </div>\n </Group>\n );\n}\n", "import { InternalSchemaElement, InternalTypeSchema } from '@medplum/core';\nimport React from 'react';\n\n/**\n * Splits a string on the last occurrence of the delimiter\n * @param str - The string to split\n * @param delim - The delimiter string\n * @returns An array of two strings; the first consisting of the beginning of the\n * string up to the last occurrence of the delimiter. the second is the remainder of the\n * string after the last occurrence of the delimiter. If the delimiter is not present\n * in the string, the first element is empty and the second is the input string.\n */\nfunction splitOnceRight(str: string, delim: string): [string, string] {\n const delimIndex = str.lastIndexOf(delim);\n if (delimIndex === -1) {\n return ['', str];\n }\n const beginning = str.substring(0, delimIndex);\n const last = str.substring(delimIndex + delim.length);\n return [beginning, last];\n}\n\nexport type FlatWalkedPaths = {\n [path: string]: InternalSchemaElement;\n};\n\nexport type BackboneElementContextType = {\n debugMode: boolean;\n profileUrl: string | undefined;\n /**\n * Get the element definition for the specified path if it has been modified by a profile.\n * @param nestedElementPath - The path of the nested element\n * @returns The modified element definition if it has been modified by the active profile or undefined. If undefined,\n * the element has the default definition for the given type.\n */\n getModifiedNestedElement: (nestedElementPath: string) => InternalSchemaElement | undefined;\n};\n\nexport const BackboneElementContext = React.createContext<BackboneElementContextType>({\n profileUrl: undefined,\n debugMode: false,\n getModifiedNestedElement: () => undefined,\n});\n\nexport function buildBackboneElementContext(\n typeSchema: InternalTypeSchema | undefined,\n profileUrl?: string | undefined,\n debugMode?: boolean | undefined\n): BackboneElementContextType {\n const nestedPaths: FlatWalkedPaths = Object.create(null);\n\n function getModifiedNestedElement(nestedElementPath: string): InternalSchemaElement | undefined {\n return nestedPaths[nestedElementPath];\n }\n\n const elements = typeSchema?.elements;\n if (elements) {\n const seenKeys = new Set<string>();\n for (const [key, property] of Object.entries(elements)) {\n const [beginning, _last] = splitOnceRight(key, '.');\n // assume paths are hierarchically sorted, e.g. identifier comes before identifier.id\n if (seenKeys.has(beginning)) {\n nestedPaths[typeSchema.type + '.' + key] = property;\n }\n seenKeys.add(key);\n }\n }\n\n return { debugMode: debugMode ?? false, profileUrl, getModifiedNestedElement };\n}\n", "import { Input } from '@mantine/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { ReactNode, useContext } from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\nimport { BackboneElementContext } from '../BackboneElementInput/BackboneElementInput.utils';\n\nexport interface FormSectionProps {\n title?: string;\n htmlFor?: string;\n description?: string;\n withAsterisk?: boolean;\n outcome?: OperationOutcome;\n children?: ReactNode;\n testId?: string;\n fhirPath?: string;\n}\n\nexport function FormSection(props: FormSectionProps): JSX.Element {\n const { debugMode } = useContext(BackboneElementContext);\n\n let label: React.ReactNode;\n if (debugMode && props.fhirPath) {\n label = `${props.title} - ${props.fhirPath}`;\n } else {\n label = props.title;\n }\n return (\n <Input.Wrapper\n id={props.htmlFor}\n label={label}\n description={props.description}\n withAsterisk={props.withAsterisk}\n error={getErrorsForInput(props.outcome, props.htmlFor)}\n data-testid={props.testId}\n >\n {props.children}\n </Input.Wrapper>\n );\n}\n", "import { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\n\nexport function getErrorsForInput(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): string | undefined {\n return outcome?.issue\n ?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression))\n ?.map((issue) => issue.details?.text)\n ?.join('\\n');\n}\n\nexport function getIssuesForExpression(\n outcome: OperationOutcome | undefined,\n expression: string | undefined\n): OperationOutcomeIssue[] | undefined {\n return outcome?.issue?.filter((issue) => isExpressionMatch(issue.expression?.[0], expression));\n}\n\nfunction isExpressionMatch(expr1: string | undefined, expr2: string | undefined): boolean {\n // Expression can be either \"fieldName\" or \"resourceType.fieldName\"\n if (expr1 === expr2) {\n return true;\n }\n if (!expr1 || !expr2) {\n return false;\n }\n const dot1 = expr1.indexOf('.');\n if (dot1 >= 0 && expr1.substring(dot1 + 1) === expr2) {\n return true;\n }\n const dot2 = expr2.indexOf('.');\n if (dot2 >= 0 && expr2.substring(dot2 + 1) === expr1) {\n return true;\n }\n return false;\n}\n", "import { capitalize, InternalSchemaElement, isEmpty } from '@medplum/core';\nimport { StructureDefinition } from '@medplum/fhirtypes';\n\nexport function setPropertyValue(\n obj: any,\n key: string,\n propName: string,\n elementDefinition: InternalSchemaElement,\n value: any\n): any {\n const types = elementDefinition.type;\n if (types.length > 1) {\n for (const type of types) {\n const compoundKey = key.replace('[x]', capitalize(type.code as string));\n if (compoundKey in obj) {\n delete obj[compoundKey];\n }\n }\n }\n obj[propName] = value;\n return obj;\n}\n\nexport type SupportedProfileStructureDefinition = StructureDefinition & {\n url: NonNullable<StructureDefinition['url']>;\n name: NonNullable<StructureDefinition['name']>;\n};\n\nexport function isSupportedProfileStructureDefinition(\n profile?: StructureDefinition\n): profile is SupportedProfileStructureDefinition {\n return !!profile && !isEmpty(profile.url) && !isEmpty(profile.name);\n}\n", "import { Checkbox, Group, NativeSelect, Textarea, TextInput } from '@mantine/core';\nimport { capitalize, HTTP_HL7_ORG, InternalSchemaElement, PropertyType } from '@medplum/core';\nimport { ElementDefinitionBinding, ElementDefinitionType, OperationOutcome } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { AddressInput } from '../AddressInput/AddressInput';\nimport { AnnotationInput } from '../AnnotationInput/AnnotationInput';\nimport { AttachmentArrayInput } from '../AttachmentArrayInput/AttachmentArrayInput';\nimport { AttachmentInput } from '../AttachmentInput/AttachmentInput';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { CodeableConceptInput } from '../CodeableConceptInput/CodeableConceptInput';\nimport { CodeInput } from '../CodeInput/CodeInput';\nimport { CodingInput } from '../CodingInput/CodingInput';\nimport { ContactDetailInput } from '../ContactDetailInput/ContactDetailInput';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { ExtensionInput } from '../ExtensionInput/ExtensionInput';\nimport { HumanNameInput } from '../HumanNameInput/HumanNameInput';\nimport { IdentifierInput } from '../IdentifierInput/IdentifierInput';\nimport { MoneyInput } from '../MoneyInput/MoneyInput';\nimport { PeriodInput } from '../PeriodInput/PeriodInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { RatioInput } from '../RatioInput/RatioInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\nimport { ResourceArrayInput } from '../ResourceArrayInput/ResourceArrayInput';\nimport { SensitiveTextarea } from '../SensitiveTextarea/SensitiveTextarea';\nimport { TimingInput } from '../TimingInput/TimingInput';\nimport { getErrorsForInput } from '../utils/outcomes';\nimport { ComplexTypeInputProps } from './ResourcePropertyInput.utils';\n\nexport interface ResourcePropertyInputProps {\n property: InternalSchemaElement;\n name: string;\n defaultPropertyType?: string | undefined;\n defaultValue: any;\n arrayElement?: boolean | undefined;\n onChange: ((value: any, propName?: string) => void) | undefined;\n outcome: OperationOutcome | undefined;\n}\n\nexport function ResourcePropertyInput(props: ResourcePropertyInputProps): JSX.Element {\n const { property, name, defaultValue, onChange } = props;\n const defaultPropertyType =\n props.defaultPropertyType && props.defaultPropertyType !== 'undefined'\n ? props.defaultPropertyType\n : property.type[0].code;\n\n const propertyTypes = property.type as ElementDefinitionType[];\n\n if ((property.isArray || property.max > 1) && !props.arrayElement) {\n if (defaultPropertyType === PropertyType.Attachment) {\n return <AttachmentArrayInput name={name} defaultValue={defaultValue} onChange={onChange} />;\n }\n\n // Extensions are a special type of array that shouldn't be indented\n const indent = propertyTypes[0]?.code !== PropertyType.Extension;\n return (\n <ResourceArrayInput\n property={property}\n name={name}\n defaultValue={defaultValue}\n indent={indent}\n onChange={onChange}\n outcome={props.outcome}\n />\n );\n }\n\n if (propertyTypes.length > 1) {\n return <ElementDefinitionInputSelector elementDefinitionTypes={propertyTypes} {...props} />;\n } else {\n return (\n <ElementDefinitionTypeInput\n name={name}\n defaultValue={defaultValue}\n onChange={(newValue: any) => {\n if (props.onChange) {\n const newPropName = props.name.replace('[x]', capitalize(propertyTypes[0].code as string));\n props.onChange(newValue, newPropName);\n }\n }}\n outcome={props.outcome}\n elementDefinitionType={propertyTypes[0]}\n min={property.min}\n max={property.min}\n binding={property.binding}\n path={property.path}\n />\n );\n }\n}\n\nexport interface ElementDefinitionSelectorProps extends ResourcePropertyInputProps {\n elementDefinitionTypes: ElementDefinitionType[];\n}\n\nexport function ElementDefinitionInputSelector(props: ElementDefinitionSelectorProps): JSX.Element {\n const propertyTypes = props.elementDefinitionTypes;\n let initialPropertyType: ElementDefinitionType | undefined = undefined;\n if (props.defaultPropertyType) {\n initialPropertyType = propertyTypes.find((t) => t.code === props.defaultPropertyType) as ElementDefinitionType;\n }\n if (!initialPropertyType) {\n initialPropertyType = propertyTypes[0];\n }\n const [selectedType, setSelectedType] = useState(initialPropertyType);\n return (\n <Group gap=\"xs\" grow wrap=\"nowrap\" align=\"flex-start\">\n <NativeSelect\n style={{ width: '200px' }}\n defaultValue={selectedType.code}\n onChange={(e) => {\n setSelectedType(\n propertyTypes.find(\n (type: ElementDefinitionType) => type.code === e.currentTarget.value\n ) as ElementDefinitionType\n );\n }}\n data={propertyTypes.map((type: ElementDefinitionType) => ({\n value: type.code as string,\n label: type.code as string,\n }))}\n />\n <ElementDefinitionTypeInput\n name={props.name}\n defaultValue={props.defaultValue}\n outcome={props.outcome}\n elementDefinitionType={selectedType}\n onChange={(newValue: any) => {\n if (props.onChange) {\n props.onChange(newValue, props.name.replace('[x]', capitalize(selectedType.code as string)));\n }\n }}\n min={props.property.min}\n max={props.property.max}\n binding={props.property.binding}\n path={props.property.path}\n />\n </Group>\n );\n}\n\n// Avoiding optional props on lower-level components like to make it more difficult to misuse\nexport type ElementDefinitionTypeInputProps = {\n name: ResourcePropertyInputProps['name'];\n path: string;\n defaultValue: ResourcePropertyInputProps['defaultValue'];\n onChange: ResourcePropertyInputProps['onChange'];\n outcome: ResourcePropertyInputProps['outcome'];\n elementDefinitionType: ElementDefinitionType;\n min: number;\n max: number;\n binding: ElementDefinitionBinding | undefined;\n};\n\nexport function ElementDefinitionTypeInput(props: ElementDefinitionTypeInputProps): JSX.Element {\n const { name, defaultValue, onChange, outcome, binding, path } = props;\n const required = props.min !== undefined && props.min > 0;\n\n const propertyType = props.elementDefinitionType.code;\n\n if (!propertyType) {\n return <div>Property type not specified </div>;\n }\n\n const properties: ComplexTypeInputProps<any> = { name, defaultValue, onChange, outcome, path };\n\n switch (propertyType) {\n // 2.24.0.1 Primitive Types\n // https://www.hl7.org/fhir/datatypes.html#primitive\n\n case PropertyType.SystemString:\n case PropertyType.canonical:\n case PropertyType.string:\n case PropertyType.time:\n case PropertyType.uri:\n case PropertyType.url:\n if (props.path === 'Project.secret.value[x]') {\n return (\n <SensitiveTextarea\n id={name}\n name={name}\n data-testid={name}\n defaultValue={defaultValue}\n required={required}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(props.outcome, name)}\n />\n );\n }\n\n return (\n <TextInput\n id={name}\n name={name}\n data-testid={name}\n defaultValue={defaultValue}\n required={required}\n onChange={(e) => {\n if (onChange) {\n onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(outcome, name)}\n />\n );\n case PropertyType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n data-testid={name}\n defaultValue={defaultValue}\n required={required}\n onChange={(e) => {\n if (onChange) {\n onChange(e.currentTarget.value);\n }\n }}\n error={getErrorsForInput(outcome, name)}\n />\n );\n case PropertyType.dateTime:\n case PropertyType.instant:\n return <DateTimeInput name={name} defaultValue={defaultValue} onChange={onChange} outcome={outcome} />;\n case PropertyType.decimal:\n case PropertyType.integer:\n case PropertyType.positiveInt:\n case PropertyType.unsignedInt:\n return (\n <TextInput\n type=\"number\"\n step={propertyType === PropertyType.decimal ? 'any' : '1'}\n id={name}\n name={name}\n data-testid={name}\n defaultValue={defaultValue}\n required={required}\n onChange={(e) => {\n if (onChange) {\n onChange(e.currentTarget.valueAsNumber);\n }\n }}\n />\n );\n case PropertyType.code:\n return <CodeInput {...properties} binding={binding?.valueSet} />;\n case PropertyType.boolean:\n return (\n <Checkbox\n id={name}\n name={name}\n data-testid={name}\n defaultChecked={!!defaultValue}\n onChange={(e) => {\n if (onChange) {\n onChange(e.currentTarget.checked);\n }\n }}\n />\n );\n case PropertyType.base64Binary:\n case PropertyType.markdown:\n return (\n <Textarea\n id={name}\n spellCheck={propertyType !== PropertyType.base64Binary}\n name={name}\n data-testid={name}\n defaultValue={defaultValue}\n required={required}\n onChange={(e) => {\n if (onChange) {\n onChange(e.currentTarget.value);\n }\n }}\n />\n );\n\n // 2.24.0.2 Complex Types\n // https://www.hl7.org/fhir/datatypes.html#complex\n\n case PropertyType.Address:\n return <AddressInput {...properties} />;\n case PropertyType.Annotation:\n return <AnnotationInput {...properties} />;\n case PropertyType.Attachment:\n return <AttachmentInput {...properties} />;\n case PropertyType.CodeableConcept:\n return <CodeableConceptInput binding={binding?.valueSet} {...properties} />;\n case PropertyType.Coding:\n return <CodingInput binding={binding?.valueSet} {...properties} />;\n case PropertyType.ContactDetail:\n return <ContactDetailInput {...properties} />;\n case PropertyType.ContactPoint:\n return <ContactPointInput {...properties} />;\n case PropertyType.Extension:\n return <ExtensionInput {...properties} propertyType={props.elementDefinitionType} />;\n case PropertyType.HumanName:\n return <HumanNameInput {...properties} />;\n case PropertyType.Identifier:\n return <IdentifierInput {...properties} />;\n case PropertyType.Money:\n return <MoneyInput {...properties} />;\n case PropertyType.Period:\n return <PeriodInput {...properties} />;\n case PropertyType.Duration:\n case PropertyType.Quantity:\n return <QuantityInput {...properties} />;\n case PropertyType.Range:\n return <RangeInput {...properties} />;\n case PropertyType.Ratio:\n return <RatioInput {...properties} />;\n case PropertyType.Reference:\n return <ReferenceInput {...properties} targetTypes={getTargetTypes(props.elementDefinitionType)} />;\n case PropertyType.Timing:\n return <TimingInput {...properties} />;\n case PropertyType.Dosage:\n case PropertyType.UsageContext:\n default:\n return (\n <BackboneElementInput\n typeName={propertyType}\n defaultValue={defaultValue}\n onChange={onChange}\n outcome={outcome}\n />\n );\n }\n}\n\nconst RESOURCE_TYPE_URL_PREFIXES = [\n `${HTTP_HL7_ORG}/fhir/StructureDefinition/`,\n 'https://medplum.com/fhir/StructureDefinition/',\n];\nfunction getTargetTypes(elementDefinitionType?: ElementDefinitionType): string[] | undefined {\n return elementDefinitionType?.targetProfile?.map((p) => {\n const resourceTypePrefix = RESOURCE_TYPE_URL_PREFIXES.find((prefix) => p.startsWith(prefix));\n if (resourceTypePrefix) {\n return p.slice(resourceTypePrefix.length);\n } else {\n return p;\n }\n });\n}\n", "import { CodeableConcept, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { ValueSetAutocomplete, ValueSetAutocompleteProps } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodeableConceptInputProps extends Omit<ValueSetAutocompleteProps, 'defaultValue' | 'onChange'> {\n defaultValue?: CodeableConcept;\n onChange?: (value: CodeableConcept | undefined) => void;\n}\n\nexport function CodeableConceptInput(props: CodeableConceptInputProps): JSX.Element {\n const { defaultValue, onChange, ...rest } = props;\n const [value, setValue] = useState<CodeableConcept | undefined>(defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newConcept = valueSetElementToCodeableConcept(newValues);\n setValue(newConcept);\n if (onChange) {\n onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n defaultValue={value && codeableConceptToValueSetElement(value)}\n onChange={handleChange}\n {...rest}\n />\n );\n}\n\nfunction codeableConceptToValueSetElement(concept: CodeableConcept): ValueSetExpansionContains[] | undefined {\n return concept.coding?.map((c) => ({\n system: c.system,\n code: c.code,\n display: c.display,\n }));\n}\n\nfunction valueSetElementToCodeableConcept(elements: ValueSetExpansionContains[]): CodeableConcept | undefined {\n if (elements.length === 0) {\n return undefined;\n }\n return {\n coding: elements.map((e) => ({\n system: e.system,\n code: e.code,\n display: e.display,\n })),\n };\n}\n", "import { Coding, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { ValueSetAutocomplete, ValueSetAutocompleteProps } from '../ValueSetAutocomplete/ValueSetAutocomplete';\n\nexport interface CodingInputProps extends Omit<ValueSetAutocompleteProps, 'defaultValue' | 'onChange'> {\n defaultValue?: Coding;\n onChange?: (value: Coding | undefined) => void;\n}\n\nexport function CodingInput(props: CodingInputProps): JSX.Element {\n const { defaultValue, onChange, ...rest } = props;\n const [value, setValue] = useState<Coding | undefined>(defaultValue);\n\n function handleChange(newValues: ValueSetExpansionContains[]): void {\n const newValue = newValues[0];\n const newConcept = newValue && valueSetElementToCoding(newValue);\n setValue(newConcept);\n if (onChange) {\n onChange(newConcept);\n }\n }\n\n return (\n <ValueSetAutocomplete\n defaultValue={value && codingToValueSetElement(value)}\n maxValues={1}\n onChange={handleChange}\n {...rest}\n />\n );\n}\n\nfunction codingToValueSetElement(coding: Coding): ValueSetExpansionContains {\n return {\n system: coding.system,\n code: coding.code,\n display: coding.display,\n };\n}\n\nfunction valueSetElementToCoding(element: ValueSetExpansionContains): Coding {\n return {\n system: element.system,\n code: element.code,\n display: element.display,\n };\n}\n", "import { Group, TextInput } from '@mantine/core';\nimport { ContactDetail, ContactPoint } from '@medplum/fhirtypes';\nimport { useRef, useState } from 'react';\nimport { ContactPointInput } from '../ContactPointInput/ContactPointInput';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\n\nexport type ContactDetailInputProps = ComplexTypeInputProps<ContactDetail>;\n\nexport function ContactDetailInput(props: ContactDetailInputProps): JSX.Element {\n const [contactPoint, setContactDetail] = useState(props.defaultValue);\n\n const ref = useRef<ContactDetail>();\n ref.current = contactPoint;\n\n function setContactDetailWrapper(newValue: ContactDetail): void {\n setContactDetail(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setName(name: string): void {\n const newValue: ContactDetail = { ...ref.current, name };\n if (!name) {\n delete newValue.name;\n }\n setContactDetailWrapper(newValue);\n }\n\n function setTelecom(telecom: ContactPoint | undefined): void {\n const newValue: ContactDetail = { ...ref.current, telecom: telecom && [telecom] };\n if (!telecom) {\n delete newValue.telecom;\n }\n setContactDetailWrapper(newValue);\n }\n\n return (\n <Group gap=\"xs\" grow wrap=\"nowrap\">\n <TextInput\n data-testid={props.name + '-name'}\n name={props.name + '-name'}\n placeholder=\"Name\"\n style={{ width: 180 }}\n defaultValue={contactPoint?.name}\n onChange={(e) => setName(e.currentTarget.value)}\n />\n <ContactPointInput\n name={props.name + '-telecom'}\n path={props.path + '.telecom'}\n defaultValue={contactPoint?.telecom?.[0]}\n onChange={setTelecom}\n outcome={props.outcome}\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { ContactPoint } from '@medplum/fhirtypes';\nimport { useContext, useMemo, useRef, useState } from 'react';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\nimport { BackboneElementContext } from '../BackboneElementInput/BackboneElementInput.utils';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport type ContactPointInputProps = ComplexTypeInputProps<ContactPoint> & {\n onChange: ((value: ContactPoint | undefined) => void) | undefined;\n};\n\nexport function ContactPointInput(props: ContactPointInputProps): JSX.Element {\n const { path, outcome } = props;\n const { getModifiedNestedElement } = useContext(BackboneElementContext);\n const [contactPoint, setContactPoint] = useState(props.defaultValue);\n\n const ref = useRef<ContactPoint>();\n ref.current = contactPoint;\n\n const [systemElement, useElement, valueElement] = useMemo(\n () => ['system', 'use', 'value'].map((field) => getModifiedNestedElement(path + '.' + field)),\n [getModifiedNestedElement, path]\n );\n\n function setContactPointWrapper(newValue: ContactPoint | undefined): void {\n if (newValue && Object.keys(newValue).length === 0) {\n newValue = undefined;\n }\n setContactPoint(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setSystem(system: 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other'): void {\n const newValue: ContactPoint = { ...ref.current, system };\n if (!system) {\n delete newValue.system;\n }\n setContactPointWrapper(newValue);\n }\n\n function setUse(use: 'home' | 'work' | 'temp' | 'old' | 'mobile'): void {\n const newValue: ContactPoint = { ...ref.current, use };\n if (!use) {\n delete newValue.use;\n }\n setContactPointWrapper(newValue);\n }\n\n function setValue(value: string): void {\n const newValue: ContactPoint = { ...ref.current, value };\n if (!value) {\n delete newValue.value;\n }\n setContactPointWrapper(newValue);\n }\n\n return (\n <Group gap=\"xs\" grow wrap=\"nowrap\" align=\"flex-start\">\n <NativeSelect\n data-testid=\"system\"\n defaultValue={contactPoint?.system}\n required={(systemElement?.min ?? 0) > 0}\n onChange={(e) =>\n setSystem(e.currentTarget.value as 'url' | 'phone' | 'fax' | 'email' | 'pager' | 'sms' | 'other')\n }\n data={['', 'email', 'phone', 'fax', 'pager', 'sms', 'other']}\n error={getErrorsForInput(outcome, path + '.system')}\n />\n <NativeSelect\n data-testid=\"use\"\n defaultValue={contactPoint?.use}\n required={(useElement?.min ?? 0) > 0}\n onChange={(e) => setUse(e.currentTarget.value as 'home' | 'work' | 'temp' | 'old' | 'mobile')}\n data={['', 'home', 'work', 'temp', 'old', 'mobile']}\n error={getErrorsForInput(outcome, path + '.use')}\n />\n <TextInput\n placeholder=\"Value\"\n defaultValue={contactPoint?.value}\n required={(valueElement?.min ?? 0) > 0}\n onChange={(e) => setValue(e.currentTarget.value)}\n error={getErrorsForInput(outcome, path + '.value')}\n />\n </Group>\n );\n}\n", "import { TextInput } from '@mantine/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { ChangeEvent } from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\nimport { convertIsoToLocal, convertLocalToIso } from './DateTimeInput.utils';\n\nexport interface DateTimeInputProps {\n name?: string;\n placeholder?: string;\n defaultValue?: string;\n autoFocus?: boolean;\n required?: boolean;\n outcome?: OperationOutcome;\n onChange?: (value: string) => void;\n}\n\n/**\n * The DateTimeInput component is a wrapper around the HTML5 input type=\"datetime-local\".\n * The main purpose is to reconcile time zones.\n * Most of our date/time values are in ISO-8601, which includes a time zone offset.\n * The datetime-local input does not support the time zone offset.\n * @param props - The Input props.\n * @returns The JSX element to render.\n */\nexport function DateTimeInput(props: DateTimeInputProps): JSX.Element {\n return (\n <TextInput\n id={props.name}\n name={props.name}\n data-autofocus={props.autoFocus}\n data-testid={props.name}\n placeholder={props.placeholder}\n required={props.required}\n type={getInputType()}\n defaultValue={convertIsoToLocal(props.defaultValue)}\n autoFocus={props.autoFocus}\n error={getErrorsForInput(props.outcome, props.name)}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n if (props.onChange) {\n const newValue = e.currentTarget.value;\n props.onChange(convertLocalToIso(newValue));\n }\n }}\n />\n );\n}\n\n/**\n * Returns the input type for the requested type.\n * JSDOM does not support many of the valid <input> type attributes.\n * For example, it won't fire change events for <input type=\"datetime-local\">.\n * @returns The input type for the current environment.\n */\nfunction getInputType(): string {\n return import.meta.env.NODE_ENV === 'test' ? 'text' : 'datetime-local';\n}\n", "import { isValidDate } from '@medplum/core';\n\n/**\n * Converts an ISO-8601 date/time string to a local date/time string.\n * @param isoString - The ISO-8601 date/time string to convert.\n * @returns The local date/time string.\n */\nexport function convertIsoToLocal(isoString: string | undefined): string {\n if (!isoString) {\n return '';\n }\n\n // Convert the ISO-8601 date to a local datetime-local value.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings\n // See: https://stackoverflow.com/a/60368477\n const date = new Date(isoString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toLocaleDateString('sv') + 'T' + date.toLocaleTimeString('sv');\n}\n\n/**\n * Converts a local date/time string to an ISO-8601 date/time string.\n * @param localString - The local date/time string to convert.\n * @returns The ISO-8601 date/time string.\n */\nexport function convertLocalToIso(localString: string | undefined): string {\n if (!localString) {\n return '';\n }\n\n // Try to parse the local string as a Date\n // JavaScript's Date() constructor defaults to the local time zone.\n // The Date() constructor will throw if the value is malformed.\n const date = new Date(localString);\n if (!isValidDate(date)) {\n // If the input string was malformed, return an empty string.\n return '';\n }\n\n return date.toISOString();\n}\n", "import { JsonInput } from '@mantine/core';\nimport { InternalTypeSchema, stringify, tryGetProfile, isProfileLoaded } from '@medplum/core';\nimport { ElementDefinitionType, Extension } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useEffect, useMemo, useState } from 'react';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\n\nexport type ExtensionInputProps = ComplexTypeInputProps<Extension> & {\n propertyType: ElementDefinitionType;\n};\n\nexport function ExtensionInput(props: ExtensionInputProps): JSX.Element | null {\n const { propertyType } = props;\n\n const medplum = useMedplum();\n const [loadingProfile, setLoadingProfile] = useState(false);\n const [typeSchema, setTypeSchema] = useState<InternalTypeSchema | undefined>();\n const profileUrl: string | undefined = useMemo(() => {\n if (!propertyType.profile || propertyType.profile.length === 0) {\n return undefined;\n }\n\n return propertyType.profile[0] satisfies string;\n }, [propertyType]);\n\n useEffect(() => {\n if (profileUrl) {\n setLoadingProfile(true);\n medplum\n .requestProfileSchema(profileUrl)\n .then(() => {\n const profile = tryGetProfile(profileUrl);\n setLoadingProfile(false);\n setTypeSchema(profile);\n })\n .catch((reason) => {\n setLoadingProfile(false);\n console.warn(reason);\n });\n }\n }, [medplum, profileUrl]);\n\n function onChange(newValue: any): void {\n if (props.onChange) {\n console.log('Extension', newValue);\n props.onChange(newValue);\n }\n }\n\n if (!profileUrl) {\n return <ExtensionJsonInput {...props} />;\n }\n\n if (profileUrl && (loadingProfile || !isProfileLoaded(profileUrl))) {\n return <div>Loading...</div>;\n }\n\n if (!typeSchema) {\n return <div>StructureDefinition for {profileUrl} not found</div>;\n }\n\n /*\n From the spec:\n An extension SHALL have either a value (i.e. a value[x] element) or sub-extensions, but not both.\n If present, the value[x] element SHALL have content (value attribute or other elements)\n */\n\n // const valueElement = typeSchema.elements['value[x]'];\n // const extensionHasValue = valueElement.max !== 0;\n // console.debug(typeSchema.name, { extensionHasValue });\n // It seems like the behavior of ExtensionInput should differ based on extensionHasValue. It likely\n // isn't strictly necessary to do so given the recursive use of BackboneElementInput\n\n return (\n <BackboneElementInput\n profileUrl={profileUrl}\n typeName={typeSchema.name}\n defaultValue={props.defaultValue}\n onChange={onChange}\n />\n );\n}\n\nfunction ExtensionJsonInput(props: ExtensionInputProps): JSX.Element {\n return (\n <JsonInput\n id={props.name}\n name={props.name}\n data-testid=\"extension-json-input\"\n defaultValue={stringify(props.defaultValue)}\n deserialize={JSON.parse}\n onChange={(newValue) => {\n if (props.onChange) {\n props.onChange(JSON.parse(newValue));\n }\n }}\n />\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { HumanName } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\n\nexport type HumanNameInputProps = ComplexTypeInputProps<HumanName>;\n\nexport function HumanNameInput(props: HumanNameInputProps): JSX.Element {\n const { outcome, path } = props;\n const [value, setValue] = useState<HumanName | undefined>(props.defaultValue);\n\n function setValueWrapper(newValue: HumanName): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n function setUse(use: 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden' | undefined): void {\n // || instead of ?? to handle empty strings\n setValueWrapper({ ...value, use: use || undefined });\n }\n\n function setPrefix(prefix: string): void {\n setValueWrapper({\n ...value,\n prefix: prefix ? prefix.split(' ') : undefined,\n });\n }\n\n function setGiven(given: string): void {\n setValueWrapper({\n ...value,\n given: given ? given.split(' ') : undefined,\n });\n }\n\n function setFamily(family: string): void {\n setValueWrapper({\n ...value,\n // || instead of ?? to handle empty strings\n family: family || undefined,\n });\n }\n\n function setSuffix(suffix: string): void {\n setValueWrapper({\n ...value,\n suffix: suffix ? suffix.split(' ') : undefined,\n });\n }\n\n return (\n <Group gap=\"xs\" grow wrap=\"nowrap\">\n <NativeSelect\n defaultValue={value?.use}\n name={props.name + '-use'}\n data-testid=\"use\"\n onChange={(e) =>\n setUse(e.currentTarget.value as 'temp' | 'old' | 'usual' | 'official' | 'nickname' | 'anonymous' | 'maiden')\n }\n data={['', 'temp', 'old', 'usual', 'official', 'nickname', 'anonymous', 'maiden']}\n error={getErrorsForInput(outcome, path + '.use')}\n />\n <TextInput\n placeholder=\"Prefix\"\n name={props.name + '-prefix'}\n defaultValue={value?.prefix?.join(' ')}\n onChange={(e) => setPrefix(e.currentTarget.value)}\n error={getErrorsForInput(outcome, path + '.prefix')}\n />\n <TextInput\n placeholder=\"Given\"\n name={props.name + '-given'}\n defaultValue={value?.given?.join(' ')}\n onChange={(e) => setGiven(e.currentTarget.value)}\n error={getErrorsForInput(outcome, path + '.given')}\n />\n <TextInput\n name={props.name + '-family'}\n placeholder=\"Family\"\n defaultValue={value?.family}\n onChange={(e) => setFamily(e.currentTarget.value)}\n error={getErrorsForInput(outcome, path + '.family')}\n />\n <TextInput\n placeholder=\"Suffix\"\n name={props.name + '-suffix'}\n defaultValue={value?.suffix?.join(' ')}\n onChange={(e) => setSuffix(e.currentTarget.value)}\n error={getErrorsForInput(outcome, path + '.suffix')}\n />\n </Group>\n );\n}\n", "import { Group, TextInput } from '@mantine/core';\nimport { Identifier } from '@medplum/fhirtypes';\nimport { useContext, useMemo, useState } from 'react';\nimport { getErrorsForInput } from '../utils/outcomes';\nimport { BackboneElementContext } from '../BackboneElementInput/BackboneElementInput.utils';\nimport { ComplexTypeInputProps } from '../ResourcePropertyInput/ResourcePropertyInput.utils';\n\nexport type IdentifierInputProps = ComplexTypeInputProps<Identifier>;\n\nexport function IdentifierInput(props: IdentifierInputProps): JSX.Element {\n const { path, outcome } = props;\n const [value, setValue] = useState(props.defaultValue);\n const { getModifiedNestedElement } = useContext(BackboneElementContext);\n\n const [systemElement, valueElement] = useMemo(\n () => ['system', 'value'].map((field) => getModifiedNestedElement(path + '.' + field)),\n [getModifiedNestedElement, path]\n );\n\n function setValueWrapper(newValue: Identifier): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group gap=\"xs\" grow wrap=\"nowrap\" align=\"flex-start\">\n <TextInput\n placeholder=\"System\"\n required={(systemElement?.min ?? 0) > 0}\n defaultValue={value?.system}\n onChange={(e) => setValueWrapper({ ...value, system: e.currentTarget.value })}\n error={getErrorsForInput(outcome, path + '.system')}\n />\n <TextInput\n placeholder=\"Value\"\n required={(valueElement?.min ?? 0) > 0}\n defaultValue={value?.value}\n onChange={(e) => setValueWrapper({ ...value, value: e.currentTarget.value })}\n error={getErrorsForInput(outcome, path + '.value')}\n />\n </Group>\n );\n}\n", "import { NativeSelect, TextInput } from '@mantine/core';\nimport { Money } from '@medplum/fhirtypes';\nimport { IconCurrencyDollar } from '@tabler/icons-react';\nimport { ChangeEvent, useCallback, useState } from 'react';\n\n/*\n * Based on: https://github.com/mantinedev/ui.mantine.dev/blob/master/components/CurrencyInput/CurrencyInput.tsx\n */\n\n/**\n * List of currencies.\n *\n * Full list of currencies:\n * https://www.hl7.org/fhir/valueset-currencies.html\n *\n * Latest browsers can report list of supported currencies, but it's not widely supported:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/supportedValuesOf\n *\n * Using a short list for simplicity for now.\n */\nconst data = ['USD', 'EUR', 'CAD', 'GBP', 'AUD'];\n\nexport interface MoneyInputProps {\n name: string;\n label?: string;\n placeholder?: string;\n defaultValue?: Money;\n onChange?: (value: Money) => void;\n}\n\nexport function MoneyInput(props: MoneyInputProps): JSX.Element {\n const { onChange } = props;\n const [value, setValue] = useState(props.defaultValue);\n\n const setValueWrapper = useCallback(\n (newValue: Money): void => {\n setValue(newValue);\n if (onChange) {\n onChange(newValue);\n }\n },\n [onChange]\n );\n\n const handleCurrencyChange = useCallback(\n (e: ChangeEvent<HTMLSelectElement>) => {\n setValueWrapper({\n ...value,\n currency: e.currentTarget.value,\n });\n },\n [value, setValueWrapper]\n );\n\n const handleValueChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n setValueWrapper({\n ...value,\n value: e.currentTarget.valueAsNumber,\n });\n },\n [value, setValueWrapper]\n );\n\n const select = (\n <NativeSelect\n defaultValue={value?.currency}\n data={data}\n styles={{\n input: {\n fontWeight: 500,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n width: 92,\n },\n }}\n onChange={handleCurrencyChange}\n />\n );\n\n return (\n <TextInput\n type=\"number\"\n label={props.label}\n placeholder={props.placeholder ?? 'Value'}\n defaultValue={value?.value?.toString() ?? 'USD'}\n leftSection={<IconCurrencyDollar size={14} />}\n rightSection={select}\n rightSectionWidth={92}\n onChange={handleValueChange}\n />\n );\n}\n", "import { Group } from '@mantine/core';\nimport { Period } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\n\nexport interface PeriodInputProps {\n name: string;\n defaultValue?: Period;\n onChange?: (value: Period) => void;\n}\n\nexport function PeriodInput(props: PeriodInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Period): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group gap=\"xs\" grow wrap=\"nowrap\">\n <DateTimeInput\n name={props.name + '.start'}\n placeholder=\"Start\"\n defaultValue={value?.start}\n onChange={(newValue) => setValueWrapper({ ...value, start: newValue })}\n />\n <DateTimeInput\n name={props.name + '.end'}\n placeholder=\"End\"\n defaultValue={value?.end}\n onChange={(newValue) => setValueWrapper({ ...value, end: newValue })}\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect, TextInput } from '@mantine/core';\nimport { Quantity } from '@medplum/fhirtypes';\nimport { useState, WheelEvent } from 'react';\n\nexport interface QuantityInputProps {\n name: string;\n defaultValue?: Quantity;\n autoFocus?: boolean;\n required?: boolean;\n onChange?: (value: Quantity) => void;\n disableWheel?: boolean;\n}\n\nexport function QuantityInput(props: QuantityInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Quantity): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group gap=\"xs\" grow wrap=\"nowrap\">\n <NativeSelect\n style={{ width: 80 }}\n data-testid={props.name + '-comparator'}\n defaultValue={value?.comparator}\n data={['', '<', '<=', '>=', '>']}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n comparator: e.currentTarget.value as '<' | '<=' | '>=' | '>',\n })\n }\n />\n <TextInput\n id={props.name}\n name={props.name}\n required={props.required}\n data-autofocus={props.autoFocus}\n data-testid={props.name + '-value'}\n type=\"number\"\n placeholder=\"Value\"\n defaultValue={value?.value}\n autoFocus={props.autoFocus}\n step=\"any\"\n onWheel={(e: WheelEvent<HTMLInputElement>) => {\n if (props.disableWheel) {\n e.currentTarget.blur();\n }\n }}\n onChange={(e) => {\n setValueWrapper({\n ...value,\n value: tryParseNumber(e.currentTarget.value),\n });\n }}\n />\n <TextInput\n placeholder=\"Unit\"\n data-testid={props.name + '-unit'}\n defaultValue={value?.unit}\n onChange={(e) =>\n setValueWrapper({\n ...value,\n unit: e.currentTarget.value,\n })\n }\n />\n </Group>\n );\n}\n\nfunction tryParseNumber(str: string): number | undefined {\n if (!str) {\n return undefined;\n }\n return parseFloat(str);\n}\n", "import { Group } from '@mantine/core';\nimport { Range } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RangeInputProps {\n name: string;\n defaultValue?: Range;\n onChange?: (value: Range) => void;\n}\n\n/**\n * Renders a Range input.\n * See: https://www.hl7.org/fhir/datatypes.html#Range\n * @param props - Range input properties.\n * @returns Range input element.\n */\nexport function RangeInput(props: RangeInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Range): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group gap=\"xs\" grow wrap=\"nowrap\">\n <QuantityInput\n name={props.name + '-low'}\n defaultValue={value?.low}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n low: v,\n })\n }\n />\n\n <QuantityInput\n name={props.name + '-high'}\n defaultValue={value?.high}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n high: v,\n })\n }\n />\n </Group>\n );\n}\n", "import { Group } from '@mantine/core';\nimport { Ratio } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\n\nexport interface RatioInputProps {\n name: string;\n defaultValue?: Ratio;\n onChange?: (value: Ratio) => void;\n}\n\n/**\n * Renders a Ratio input.\n * See: https://www.hl7.org/fhir/datatypes.html#Ratio\n * @param props - Ratio input properties.\n * @returns Ratio input element.\n */\nexport function RatioInput(props: RatioInputProps): JSX.Element {\n const [value, setValue] = useState(props.defaultValue);\n\n function setValueWrapper(newValue: Ratio): void {\n setValue(newValue);\n if (props.onChange) {\n props.onChange(newValue);\n }\n }\n\n return (\n <Group gap=\"xs\" grow wrap=\"nowrap\">\n <QuantityInput\n name={props.name + '-numerator'}\n defaultValue={value?.numerator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n numerator: v,\n })\n }\n />\n <QuantityInput\n name={props.name + '-denominator'}\n defaultValue={value?.denominator}\n onChange={(v) =>\n setValueWrapper({\n ...value,\n denominator: v,\n })\n }\n />\n </Group>\n );\n}\n", "import { Group, NativeSelect } from '@mantine/core';\nimport {\n LRUCache,\n MedplumClient,\n ReadablePromise,\n createReference,\n isEmpty,\n isPopulated,\n tryGetProfile,\n} from '@medplum/core';\nimport { Reference, Resource, ResourceType, StructureDefinition } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\nimport { ResourceTypeInput } from '../ResourceTypeInput/ResourceTypeInput';\n\nexport interface ReferenceInputProps {\n name: string;\n placeholder?: string;\n defaultValue?: Reference;\n targetTypes?: string[];\n searchCriteria?: Record<string, string>;\n autoFocus?: boolean;\n required?: boolean;\n onChange?: (value: Reference | undefined) => void;\n}\n\ninterface BaseTargetType {\n value: string;\n}\n\ntype ProfileTargetType = BaseTargetType & {\n type: 'profile';\n name?: string;\n title?: string;\n resourceType?: string;\n error?: any;\n};\n\ntype ResourceTypeTargetType = BaseTargetType & {\n type: 'resourceType';\n resourceType: string;\n};\ntype TargetType = ResourceTypeTargetType | ProfileTargetType;\n\nexport function ReferenceInput(props: ReferenceInputProps): JSX.Element {\n const { onChange } = props;\n const medplum = useMedplum();\n const [value, setValue] = useState<Reference | undefined>(props.defaultValue);\n const [targetTypes, setTargetTypes] = useState<TargetType[] | undefined>(() => createTargetTypes(props.targetTypes));\n const [targetType, setTargetType] = useState<TargetType | undefined>(() =>\n getInitialTargetType(props.defaultValue, targetTypes)\n );\n\n const promiseCache = useRef(new LRUCache<ReadablePromise<TargetType>>());\n\n const searchCriteria = useMemo<ReferenceInputProps['searchCriteria']>(() => {\n if (targetType?.type === 'profile') {\n return { ...props.searchCriteria, _profile: targetType.value };\n }\n return props.searchCriteria;\n }, [props.searchCriteria, targetType]);\n\n useEffect(() => {\n let anyToFetch = false;\n const newTargetTypePromises: Promise<TargetType>[] | undefined = targetTypes?.map((tt) => {\n if (!shouldFetchResourceType(tt)) {\n return Promise.resolve(tt);\n }\n\n anyToFetch = true;\n const cacheKey = tt.value;\n const cached = promiseCache.current.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const promise = fetchResourceTypeOfProfile(medplum, tt.value)\n .then((profile) => {\n const newTargetType = { ...tt };\n\n if (!profile) {\n console.error(`StructureDefinition not found for ${tt.value}`);\n newTargetType.error = 'StructureDefinition not found';\n } else if (!isPopulated(profile.type)) {\n console.error(`StructureDefinition.type missing for ${tt.value}`);\n newTargetType.error = 'StructureDefinition.type missing';\n } else {\n newTargetType.resourceType = profile.type;\n newTargetType.name = profile.name;\n newTargetType.title = profile.title;\n }\n\n return newTargetType;\n })\n .catch((reason) => {\n console.error(reason);\n return { ...tt, error: reason };\n });\n\n const readablePromise = new ReadablePromise(promise);\n promiseCache.current.set(cacheKey, readablePromise);\n\n return readablePromise;\n });\n\n if (!newTargetTypePromises || !anyToFetch) {\n return;\n }\n\n Promise.all(newTargetTypePromises)\n .then((newTargetTypes) => {\n setTargetTypes(newTargetTypes);\n if (!targetType) {\n return;\n }\n\n const index = newTargetTypes.findIndex(\n (tt) => tt.value === targetType.value || tt.resourceType === targetType.resourceType\n );\n if (index === -1) {\n console.debug(`defaultValue had unexpected resourceType: ${targetType.resourceType}`);\n return;\n }\n // orphaned targetType has been resolved\n setTargetType(newTargetTypes[index]);\n })\n .catch(console.error);\n }, [medplum, targetType, targetTypes]);\n\n const setValueHelper = useCallback(\n (item: Resource | undefined) => {\n const newValue = item ? createReference(item) : undefined;\n setValue(newValue);\n if (onChange) {\n onChange(newValue);\n }\n },\n [onChange]\n );\n\n const typeSelectOptions = useMemo(() => {\n if (targetTypes) {\n return targetTypes.map((tt) => {\n return {\n value: tt.value,\n label: tt.type === 'profile' ? tt.title ?? tt.name ?? tt.resourceType ?? tt.value : tt.value,\n };\n });\n }\n return [];\n }, [targetTypes]);\n\n return (\n <Group gap=\"xs\" grow wrap=\"nowrap\">\n {targetTypes && targetTypes.length > 1 && (\n <NativeSelect\n data-autofocus={props.autoFocus}\n data-testid=\"reference-input-resource-type-select\"\n defaultValue={targetType?.resourceType}\n autoFocus={props.autoFocus}\n onChange={(e) => {\n const newValue = e.currentTarget.value;\n const newTargetType = targetTypes.find((tt) => tt.value === newValue);\n setTargetType(newTargetType);\n }}\n data={typeSelectOptions}\n />\n )}\n {!targetTypes && (\n <ResourceTypeInput\n autoFocus={props.autoFocus}\n testId=\"reference-input-resource-type-input\"\n defaultValue={targetType?.resourceType as ResourceType}\n onChange={(newResourceType) => {\n if (newResourceType) {\n setTargetType({ type: 'resourceType', value: newResourceType, resourceType: newResourceType });\n } else {\n setTargetType(undefined);\n }\n }}\n name={props.name + '-resourceType'}\n placeholder=\"Resource Type\"\n />\n )}\n <ResourceInput\n resourceType={targetType?.resourceType as ResourceType}\n name={props.name + '-id'}\n required={props.required}\n placeholder={props.placeholder}\n defaultValue={value}\n searchCriteria={searchCriteria}\n onChange={setValueHelper}\n />\n </Group>\n );\n}\n\nfunction createTargetTypes(resourceTypesAndProfileUrls: string[] | undefined): TargetType[] | undefined {\n if (\n !resourceTypesAndProfileUrls ||\n resourceTypesAndProfileUrls.length === 0 ||\n (resourceTypesAndProfileUrls.length === 1 && resourceTypesAndProfileUrls[0] === 'Resource')\n ) {\n return undefined;\n }\n\n const results: TargetType[] = [];\n for (const value of resourceTypesAndProfileUrls) {\n // is there a less hacky way to distinguish resourceType from profile URLs?\n if (value.includes('/')) {\n results.push({ type: 'profile', value });\n } else {\n results.push({ type: 'resourceType', value, resourceType: value });\n }\n }\n return results;\n}\n\nfunction getInitialTargetType(\n defaultValue: Reference | undefined,\n targetTypes: TargetType[] | undefined\n): TargetType | undefined {\n const defaultValueResourceType = defaultValue?.reference?.split('/')[0];\n if (defaultValueResourceType) {\n const targetType = targetTypes?.find((tt) => tt.resourceType === defaultValueResourceType);\n if (targetType) {\n return targetType;\n }\n\n // An \"orphaned\" TargetType is created when defaultValue references a resourceType\n // that is not yet represented in targetTypes due to profile URL resolution to resource type\n // that has yet to occur. An orphan can also occur if a defaultValue is provided\n // but targetTypes is not.\n return {\n type: 'resourceType',\n value: defaultValueResourceType,\n resourceType: defaultValueResourceType,\n };\n }\n\n if (targetTypes && targetTypes.length > 0) {\n return targetTypes[0];\n }\n\n return undefined;\n}\n\ninterface ResourceTypeGraphQLResponse {\n readonly data: {\n readonly StructureDefinitionList: Partial<StructureDefinition>[];\n };\n}\n\nasync function fetchResourceTypeOfProfile(\n medplum: MedplumClient,\n profileUrl: string\n): Promise<Partial<StructureDefinition> | undefined> {\n const profile = tryGetProfile(profileUrl);\n if (profile) {\n return { type: profile.type, name: profile.name, title: profile.title };\n }\n\n const query = `{\n StructureDefinitionList(url: \"${profileUrl}\", _sort: \"_lastUpdated\", _count: 1) {\n type,\n name,\n title,\n }\n }`.replace(/\\s+/g, ' ');\n\n const response = (await medplum.graphql(query)) as ResourceTypeGraphQLResponse;\n\n return response.data.StructureDefinitionList[0];\n}\n\nfunction shouldFetchResourceType(targetType: TargetType): targetType is ProfileTargetType {\n return targetType.type === 'profile' && !targetType?.error && isEmpty(targetType.resourceType);\n}\n", "import { getDisplayString, getReferenceString } from '@medplum/core';\nimport { OperationOutcome, Patient, Reference, Resource } from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { forwardRef, useCallback, useState } from 'react';\nimport { AsyncAutocomplete, AsyncAutocompleteOption } from '../AsyncAutocomplete/AsyncAutocomplete';\nimport { Group, Text } from '@mantine/core';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\n\n/**\n * Search parameter overrides for specific resource types.\n * Use this to specify the search parameter to use for a given resource type.\n * Otherwise it will fallback to \"name\" if the resource type is in NAME_RESOURCE_TYPES.\n * Otherwise it will fallback to \"_id\".\n */\nconst SEARCH_CODES: Record<string, string> = {\n Observation: 'code',\n User: 'email:contains',\n};\n\n/**\n * Resource types that should use the \"name\" search parameter.\n * This is the full list of resource types that have a \"name\" search parameter.\n * Otherwise it will fallback to \"_id\".\n */\nconst NAME_RESOURCE_TYPES = [\n 'AccessPolicy',\n 'Account',\n 'ActivityDefinition',\n 'Bot',\n 'CapabilityStatement',\n 'ClientApplication',\n 'CodeSystem',\n 'CompartmentDefinition',\n 'ConceptMap',\n 'EffectEvidenceSynthesis',\n 'Endpoint',\n 'EventDefinition',\n 'Evidence',\n 'EvidenceVariable',\n 'ExampleScenario',\n 'GraphDefinition',\n 'HealthcareService',\n 'ImplementationGuide',\n 'InsurancePlan',\n 'Library',\n 'Location',\n 'Measure',\n 'MedicinalProduct',\n 'MessageDefinition',\n 'NamingSystem',\n 'OperationDefinition',\n 'Organization',\n 'Patient',\n 'Person',\n 'PlanDefinition',\n 'Practitioner',\n 'Project',\n 'Questionnaire',\n 'RelatedPerson',\n 'ResearchDefinition',\n 'ResearchElementDefinition',\n 'RiskEvidenceSynthesis',\n 'SearchParameter',\n 'StructureDefinition',\n 'StructureMap',\n 'TerminologyCapabilities',\n 'TestScript',\n 'UserConfiguration',\n 'ValueSet',\n];\n\nexport interface ResourceInputProps<T extends Resource = Resource> {\n readonly resourceType: T['resourceType'];\n readonly name: string;\n readonly defaultValue?: T | Reference<T>;\n readonly searchCriteria?: Record<string, string>;\n readonly placeholder?: string;\n readonly loadOnFocus?: boolean;\n readonly required?: boolean;\n readonly onChange?: (value: T | undefined) => void;\n}\n\nfunction toOption<T extends Resource>(resource: T): AsyncAutocompleteOption<T> {\n return {\n value: getReferenceString(resource),\n label: getDisplayString(resource),\n resource,\n };\n}\n\nexport function ResourceInput<T extends Resource = Resource>(props: ResourceInputProps<T>): JSX.Element | null {\n const medplum = useMedplum();\n const { resourceType, searchCriteria } = props;\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const defaultValue = useResource(props.defaultValue, setOutcome);\n const onChange = props.onChange;\n\n const loadValues = useCallback(\n async (input: string, signal: AbortSignal): Promise<T[]> => {\n const searchCode = getSearchParamForResourceType(resourceType);\n const searchParams = new URLSearchParams({\n [searchCode]: input ?? '',\n _count: '10',\n ...searchCriteria,\n });\n\n const resources = await medplum.searchResources(resourceType, searchParams, { signal });\n return resources as unknown as T[];\n },\n [medplum, resourceType, searchCriteria]\n );\n\n const handleChange = useCallback(\n (newResources: T[]) => {\n if (onChange) {\n onChange(newResources[0]);\n }\n },\n [onChange]\n );\n\n if (props.defaultValue && !outcome && !defaultValue) {\n // If a default value was specified, but the default resource is not loaded yet,\n // then return null to avoid rendering the input until the default resource is loaded.\n // The Mantine <MultiSelect> component does not reliably handle changes to defaultValue.\n return null;\n }\n\n return (\n <AsyncAutocomplete<T>\n name={props.name}\n required={props.required}\n itemComponent={ItemComponent}\n defaultValue={defaultValue}\n placeholder={props.placeholder}\n maxValues={1}\n toOption={toOption}\n loadOptions={loadValues}\n onChange={handleChange}\n clearable\n />\n );\n}\n\nconst ItemComponent = forwardRef<HTMLDivElement, any>(({ label, resource, ...others }: any, ref) => {\n return (\n <div ref={ref} {...others}>\n <Group wrap=\"nowrap\">\n <ResourceAvatar value={resource} />\n <div>\n <Text>{label}</Text>\n <Text size=\"xs\" c=\"dimmed\">\n {(resource as Patient).birthDate}\n </Text>\n </div>\n </Group>\n </div>\n );\n});\n\n/**\n * Returns the search parameter to use for the given resource type.\n * If the resource type is in SEARCH_CODES, then that value is used.\n * Otherwise, if the resource type is in NAME_RESOURCE_TYPES, then \"name\" is used.\n * Otherwise, \"_id\" is used.\n * @param resourceType - The FHIR resource type.\n * @returns The search parameter to use for the autocomplete input.\n */\nfunction getSearchParamForResourceType(resourceType: string): string {\n return SEARCH_CODES[resourceType] ?? (NAME_RESOURCE_TYPES.includes(resourceType) ? 'name' : '_id');\n}\n", "import { ActionIcon, Button, Group, Stack } from '@mantine/core';\nimport {\n InternalSchemaElement,\n getPathDisplayName,\n getPropertyDisplayName,\n isEmpty,\n tryGetProfile,\n} from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons-react';\nimport { MouseEvent, useEffect, useState } from 'react';\nimport { ElementsInput } from '../ElementsInput/ElementsInput';\nimport { FormSection } from '../FormSection/FormSection';\nimport { ElementDefinitionTypeInput, ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { killEvent } from '../utils/dom';\nimport classes from './ResourceArrayInput.module.css';\nimport {\n SupportedSliceDefinition,\n assignValuesIntoSlices,\n isSupportedSliceDefinition,\n} from './ResourceArrayInput.utils';\n\nexport interface ResourceArrayInputProps {\n property: InternalSchemaElement;\n name: string;\n defaultValue?: any[];\n indent?: boolean;\n arrayElement?: boolean;\n outcome: OperationOutcome | undefined;\n onChange?: (value: any[]) => void;\n hideNonSliceValues?: boolean;\n}\n\nexport function ResourceArrayInput(props: Readonly<ResourceArrayInputProps>): JSX.Element {\n const { property } = props;\n const medplum = useMedplum();\n const [loading, setLoading] = useState(true);\n const [slices, setSlices] = useState<SupportedSliceDefinition[]>([]);\n // props.defaultValue should NOT be used after this; prefer the defaultValue state\n const [defaultValue] = useState<any[]>(() => (Array.isArray(props.defaultValue) ? props.defaultValue : []));\n const [slicedValues, setSlicedValues] = useState<any[][]>([[]]);\n\n const propertyTypeCode = property.type[0]?.code;\n useEffect(() => {\n if (!property.slicing) {\n const emptySlices: SupportedSliceDefinition[] = [];\n setSlices(emptySlices);\n const results = assignValuesIntoSlices(defaultValue, emptySlices, property.slicing);\n setSlicedValues(results);\n setLoading(false);\n return;\n }\n\n const supportedSlices: SupportedSliceDefinition[] = [];\n const profileUrls: (string | undefined)[] = [];\n const promises: Promise<void>[] = [];\n for (const slice of property.slicing.slices) {\n if (!isSupportedSliceDefinition(slice)) {\n continue;\n }\n\n const sliceType = slice.type[0];\n let profileUrl: string | undefined;\n if (isEmpty(slice.elements)) {\n if (sliceType.profile) {\n profileUrl = sliceType.profile[0];\n }\n }\n\n // important to keep these three arrays the same length;\n supportedSlices.push(slice);\n profileUrls.push(profileUrl);\n if (profileUrl) {\n promises.push(medplum.requestProfileSchema(profileUrl));\n } else {\n promises.push(Promise.resolve());\n }\n }\n\n Promise.all(promises)\n .then(() => {\n for (let i = 0; i < supportedSlices.length; i++) {\n const slice = supportedSlices[i];\n const profileUrl = profileUrls[i];\n if (profileUrl) {\n const typeSchema = tryGetProfile(profileUrl);\n slice.typeSchema = typeSchema;\n }\n }\n setSlices(supportedSlices);\n const results = assignValuesIntoSlices(defaultValue, supportedSlices, property.slicing);\n setSlicedValues(results);\n setLoading(false);\n })\n .catch((reason) => {\n console.error(reason);\n setLoading(false);\n });\n }, [medplum, property.slicing, propertyTypeCode, defaultValue]);\n\n function setValuesWrapper(newValues: any[], sliceIndex: number): void {\n const newSlicedValues = [...slicedValues];\n newSlicedValues[sliceIndex] = newValues;\n setSlicedValues(newSlicedValues);\n if (props.onChange) {\n // Remove any placeholder (i.e. undefined) values before propagating\n const cleaned = newSlicedValues.flat().filter((val) => val !== undefined);\n props.onChange(cleaned);\n }\n }\n\n if (loading) {\n return <div>Loading...</div>;\n }\n\n const nonSliceIndex = slices.length;\n const nonSliceValues = slicedValues[nonSliceIndex];\n\n // Hide non-sliced values when handling sliced extensions\n const showNonSliceValues = !(props.hideNonSliceValues ?? (propertyTypeCode === 'Extension' && slices.length > 0));\n const propertyDisplayName = getPathDisplayName(property.path);\n\n return (\n <Stack className={props.indent ? classes.indented : undefined}>\n {slices.map((slice, sliceIndex) => {\n return (\n <SliceInput\n slice={slice}\n key={slice.name}\n property={property}\n defaultValue={slicedValues[sliceIndex]}\n onChange={(newValue: any[]) => {\n setValuesWrapper(newValue, sliceIndex);\n }}\n testId={`slice-${slice.name}`}\n />\n );\n })}\n\n {showNonSliceValues &&\n nonSliceValues.map((value, valueIndex) => (\n <Group key={`${valueIndex}-${nonSliceValues.length}`} wrap=\"nowrap\" style={{ flexGrow: 1 }}>\n <div style={{ flexGrow: 1 }}>\n <ResourcePropertyInput\n arrayElement={true}\n property={props.property}\n name={props.name + '.' + valueIndex}\n defaultValue={value}\n onChange={(newValue: any) => {\n const newNonSliceValues = [...nonSliceValues];\n newNonSliceValues[valueIndex] = newValue;\n setValuesWrapper(newNonSliceValues, nonSliceIndex);\n }}\n defaultPropertyType={undefined}\n outcome={props.outcome}\n />\n </div>\n <RemoveButton\n propertyDisplayName={propertyDisplayName}\n testId={`nonsliced-remove-${valueIndex}`}\n onClick={(e: MouseEvent) => {\n killEvent(e);\n const newNonSliceValues = [...nonSliceValues];\n newNonSliceValues.splice(valueIndex, 1);\n setValuesWrapper(newNonSliceValues, nonSliceIndex);\n }}\n />\n </Group>\n ))}\n {showNonSliceValues && slicedValues.flat().length < property.max && (\n <Group wrap=\"nowrap\" style={{ justifyContent: 'flex-start' }}>\n <AddButton\n propertyDisplayName={propertyDisplayName}\n onClick={(e: MouseEvent) => {\n killEvent(e);\n const newNonSliceValues = [...nonSliceValues];\n newNonSliceValues.push(undefined);\n setValuesWrapper(newNonSliceValues, nonSliceIndex);\n }}\n testId=\"nonsliced-add\"\n />\n </Group>\n )}\n </Stack>\n );\n}\n\ntype SliceInputProps = Readonly<{\n slice: SupportedSliceDefinition;\n property: InternalSchemaElement;\n defaultValue: any[];\n onChange: (newValue: any[]) => void;\n outcome?: OperationOutcome;\n testId?: string;\n}>;\n\nfunction SliceInput(props: SliceInputProps): JSX.Element | null {\n const { slice, property } = props;\n const [values, setValues] = useState<any[]>(() => {\n return props.defaultValue.map((v) => v ?? {});\n });\n\n function setValuesWrapper(newValues: any[]): void {\n setValues(newValues);\n if (props.onChange) {\n props.onChange(newValues);\n }\n }\n\n const required = slice.min > 0;\n\n // this is a bit of a hack targeted at nested extensions; indentation would ideally be controlled elsewhere\n // e.g. USCorePatientProfile -> USCoreEthnicityExtension -> {ombCategory, detailed, text}\n const indentedStack = isEmpty(slice.elements);\n const propertyDisplayName = getPropertyDisplayName(slice.name);\n return (\n <FormSection\n title={propertyDisplayName}\n description={slice.definition}\n withAsterisk={required}\n fhirPath={`${property.path}:${slice.name}`}\n testId={props.testId}\n >\n <Stack className={indentedStack ? classes.indented : undefined}>\n {values.map((value, valueIndex) => {\n return (\n <Group key={`${valueIndex}-${values.length}`} wrap=\"nowrap\">\n <div style={{ flexGrow: 1 }}>\n <Stack>\n {!isEmpty(slice.elements) ? (\n <ElementsInput\n type={slice.type[0].code}\n elements={slice.elements}\n defaultValue={value}\n outcome={props.outcome}\n onChange={(newValue) => {\n const newValues = [...values];\n newValues[valueIndex] = newValue;\n setValuesWrapper(newValues);\n }}\n testId={props.testId && `${props.testId}-elements-${valueIndex}`}\n />\n ) : (\n <ElementDefinitionTypeInput\n elementDefinitionType={slice.type[0]}\n name={slice.name}\n defaultValue={value}\n onChange={(newValue) => {\n const newValues = [...values];\n newValues[valueIndex] = newValue;\n setValuesWrapper(newValues);\n }}\n outcome={undefined}\n min={slice.min}\n max={slice.max}\n binding={undefined}\n path={slice.path}\n />\n )}\n </Stack>\n </div>\n {values.length > slice.min && (\n <RemoveButton\n propertyDisplayName={propertyDisplayName}\n testId={props.testId && `${props.testId}-remove-${valueIndex}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const newValues = [...values];\n newValues.splice(valueIndex, 1);\n setValuesWrapper(newValues);\n }}\n />\n )}\n </Group>\n );\n })}\n {values.length < slice.max && (\n <Group wrap=\"nowrap\" style={{ justifyContent: 'flex-start' }}>\n <AddButton\n propertyDisplayName={propertyDisplayName}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n const newValues = [...values, undefined];\n setValuesWrapper(newValues);\n }}\n testId={props.testId && `${props.testId}-add`}\n />\n </Group>\n )}\n </Stack>\n </FormSection>\n );\n}\n\ntype ButtonProps = Readonly<{\n propertyDisplayName?: string;\n onClick: React.MouseEventHandler;\n testId?: string;\n}>;\n\nfunction AddButton({ propertyDisplayName, onClick, testId }: ButtonProps): JSX.Element {\n const text = propertyDisplayName ? `Add ${propertyDisplayName}` : 'Add';\n\n return propertyDisplayName ? (\n <Button\n title={text}\n size=\"sm\"\n color=\"green.6\"\n variant=\"subtle\"\n data-testid={testId}\n leftSection={<IconCirclePlus size=\"1.25rem\" />}\n onClick={onClick}\n >\n {text}\n </Button>\n ) : (\n <ActionIcon title={text} color=\"green.6\" data-testid={testId} onClick={onClick}>\n <IconCirclePlus size=\"1.25rem\" />\n </ActionIcon>\n );\n}\n\nfunction RemoveButton({ propertyDisplayName, onClick, testId }: ButtonProps): JSX.Element {\n return (\n <ActionIcon\n title={propertyDisplayName ? `Remove ${propertyDisplayName}` : 'Remove'}\n color=\"red.5\"\n data-testid={testId}\n onClick={onClick}\n >\n <IconCircleMinus size=\"1.25rem\" />\n </ActionIcon>\n );\n}\n", ".indented {\n margin-top: 0.5rem;\n border-left: 3px solid var(--mantine-color-gray-4);\n padding: 0.5rem 0 0.5rem 0.5rem;\n}\n", "import {\n InternalTypeSchema,\n SliceDefinition,\n SliceDiscriminator,\n SlicingRules,\n TypedValue,\n arrayify,\n getElementDefinitionFromElements,\n getTypedPropertyValueWithSchema,\n isPopulated,\n matchDiscriminant,\n} from '@medplum/core';\n\nfunction isDiscriminatorComponentMatch(\n typedValue: TypedValue,\n discriminator: SliceDiscriminator,\n slice: SupportedSliceDefinition\n): boolean {\n for (const elementList of [slice.elements, slice.typeSchema?.elements]) {\n let nestedProp: TypedValue | TypedValue[] | undefined;\n if (isPopulated(elementList)) {\n const ed = getElementDefinitionFromElements(elementList, discriminator.path);\n if (ed) {\n nestedProp = getTypedPropertyValueWithSchema(typedValue.value, discriminator.path, ed);\n }\n }\n\n if (nestedProp) {\n return arrayify(nestedProp)?.some((v: any) => matchDiscriminant(v, discriminator, slice, elementList)) ?? false;\n }\n }\n\n return false;\n}\nfunction getValueSliceName(\n value: any,\n slices: SupportedSliceDefinition[],\n discriminators: SliceDiscriminator[]\n): string | undefined {\n if (!value) {\n return undefined;\n }\n\n for (const slice of slices) {\n const typedValue: TypedValue = {\n value,\n type: slice.typeSchema?.name ?? slice.type[0].code,\n };\n if (discriminators.every((d) => isDiscriminatorComponentMatch(typedValue, d, slice))) {\n return slice.name;\n }\n }\n return undefined;\n}\n\nexport function assignValuesIntoSlices(\n values: any[],\n slices: SupportedSliceDefinition[],\n slicing: SlicingRules | undefined\n): any[][] {\n if (!slicing || slicing.slices.length === 0) {\n return [values];\n }\n\n // store values in an array of arrays: one for each slice plus another for non-sliced values\n const slicedValues: any[][] = new Array(slices.length + 1);\n for (let i = 0; i < slicedValues.length; i++) {\n slicedValues[i] = [];\n }\n\n for (const value of values) {\n const sliceName = getValueSliceName(value, slices, slicing.discriminator);\n let sliceIndex = sliceName ? slices.findIndex((slice) => slice.name === sliceName) : -1;\n if (sliceIndex === -1) {\n sliceIndex = slices.length; // values not matched to a slice go in the last entry for non-slice\n }\n slicedValues[sliceIndex].push(value);\n }\n\n // for slices without existing values, add a placeholder empty value\n for (let i = 0; i < slices.length; i++) {\n if (slicedValues[i].length === 0) {\n slicedValues[i].push(undefined);\n }\n }\n\n return slicedValues;\n}\n\nexport type SupportedSliceDefinition = SliceDefinition & {\n type: NonNullable<SliceDefinition['type']>;\n typeSchema?: InternalTypeSchema;\n};\n\nexport function isSupportedSliceDefinition(slice: SliceDefinition): slice is SupportedSliceDefinition {\n return slice.type !== undefined && slice.type.length > 0;\n}\n", "import { ActionIcon, Flex, Textarea, TextareaProps } from '@mantine/core';\nimport { useClipboard } from '@mantine/hooks';\nimport { showNotification } from '@mantine/notifications';\nimport { IconCopy } from '@tabler/icons-react';\nimport { RefAttributes, useRef, useState } from 'react';\n\nexport interface SensitiveTextareaProps extends TextareaProps, RefAttributes<HTMLTextAreaElement> {}\n\nexport function SensitiveTextarea(props: Omit<SensitiveTextareaProps, 'ref'>): JSX.Element {\n const [revealed, setRevealed] = useState(false);\n const clipboard = useClipboard();\n const ref = useRef<HTMLTextAreaElement | null>(null);\n\n const styles: SensitiveTextareaProps['styles'] = {\n ...props.styles,\n };\n if (!revealed) {\n if (!styles.input) {\n styles.input = {};\n }\n\n (styles.input as Record<string, string>)['WebkitTextSecurity'] = 'disc';\n }\n\n return (\n <Flex gap=\"xs\">\n <Textarea\n {...props}\n styles={{\n ...styles,\n root: {\n ...(styles.root ?? {}),\n flexGrow: 1,\n },\n }}\n ref={ref}\n autosize\n minRows={1}\n onFocus={() => setRevealed(true)}\n onBlur={() => setRevealed(false)}\n />\n <ActionIcon\n title=\"Copy secret\"\n onClick={() => {\n clipboard.copy(ref.current?.value);\n showNotification({ color: 'green', message: 'Copied' });\n }}\n >\n <IconCopy />\n </ActionIcon>\n </Flex>\n );\n}\n", "import { Button, Chip, Group, Modal, NativeSelect, Stack, Switch, TextInput } from '@mantine/core';\nimport { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport { useRef, useState } from 'react';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\ntype PeriodUnit = 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing | undefined>(props.defaultValue);\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <Group gap=\"xs\" grow wrap=\"nowrap\">\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </Group>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nconst defaultValue: Timing = {\n repeat: {\n period: 1,\n periodUnit: 'd',\n },\n};\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || defaultValue);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat | undefined): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: PeriodUnit | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDaysOfWeek(newDaysOfWeek: DayOfWeek[] | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: newDaysOfWeek });\n }\n\n return (\n <Modal\n title=\"Timing\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={() => props.onCancel()}\n >\n <Stack>\n <FormSection title=\"Starts on\" htmlFor=\"timing-dialog-start\">\n <DateTimeInput name=\"timing-dialog-start\" onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <Switch\n label=\"Repeat\"\n checked={!!value.repeat}\n onChange={(e) => setRepeat(e.currentTarget.checked ? defaultValue.repeat : undefined)}\n />\n {value.repeat && (\n <>\n <FormSection title=\"Repeat every\" htmlFor=\"timing-dialog-period\">\n <Group gap=\"xs\" grow wrap=\"nowrap\">\n <TextInput\n type=\"number\"\n step={1}\n id=\"timing-dialog-period\"\n name=\"timing-dialog-period\"\n defaultValue={value.repeat.period || 1}\n onChange={(e) => setPeriod(parseInt(e.currentTarget.value, 10) || 1)}\n />\n <NativeSelect\n id=\"timing-dialog-periodUnit\"\n name=\"timing-dialog-periodUnit\"\n defaultValue={value.repeat.periodUnit}\n onChange={(e) => setPeriodUnit(e.currentTarget.value as PeriodUnit | undefined)}\n data={[\n { label: 'second', value: 's' },\n { label: 'minute', value: 'min' },\n { label: 'hour', value: 'h' },\n { label: 'day', value: 'd' },\n { label: 'week', value: 'wk' },\n { label: 'month', value: 'mo' },\n { label: 'year', value: 'a' },\n ]}\n />\n </Group>\n </FormSection>\n {value.repeat.periodUnit === 'wk' && (\n <FormSection title=\"Repeat on\">\n <Chip.Group multiple onChange={setDaysOfWeek as (v: string[] | undefined) => void}>\n <Group justify=\"space-between\" mt=\"md\" gap=\"xs\">\n {daysOfWeek.map((day) => (\n <Chip key={day} value={day} size=\"xs\" radius=\"xl\">\n {day.charAt(0).toUpperCase()}\n </Chip>\n ))}\n </Group>\n </Chip.Group>\n </FormSection>\n )}\n </>\n )}\n <Group justify=\"flex-end\">\n <Button onClick={() => props.onOk(value)}>OK</Button>\n </Group>\n </Stack>\n </Modal>\n );\n}\n", "import { Button, Group } from '@mantine/core';\nimport { Slot } from '@medplum/fhirtypes';\nimport { useMemo, useState } from 'react';\nimport classes from './CalendarInput.module.css';\nimport { getMonthString, getStartMonth } from './CalendarInput.utils';\n\nexport interface CalendarInputProps {\n slots: Slot[];\n onChangeMonth: (date: Date) => void;\n onClick: (date: Date) => void;\n}\n\ninterface CalendarCell {\n date: Date;\n available: boolean;\n}\n\ntype OptionalCalendarCell = CalendarCell | undefined;\n\nexport function CalendarInput(props: CalendarInputProps): JSX.Element {\n const { onChangeMonth, onClick } = props;\n const [month, setMonth] = useState<Date>(getStartMonth);\n\n function moveMonth(delta: number): void {\n setMonth((currMonth) => {\n const newMonth = new Date(currMonth.getTime());\n newMonth.setMonth(currMonth.getMonth() + delta);\n onChangeMonth(newMonth);\n return newMonth;\n });\n }\n\n const grid = useMemo(() => buildGrid(month, props.slots), [month, props.slots]);\n\n return (\n <div>\n <Group justify=\"space-between\" gap=\"xs\" grow wrap=\"nowrap\">\n <p style={{ flex: 1 }}>{getMonthString(month)}</p>\n <Group justify=\"flex-end\" gap=\"xs\">\n <Button variant=\"outline\" aria-label=\"Previous month\" onClick={() => moveMonth(-1)}>\n &lt;\n </Button>\n <Button variant=\"outline\" aria-label=\"Next month\" onClick={() => moveMonth(1)}>\n &gt;\n </Button>\n </Group>\n </Group>\n <table className={classes.table}>\n <thead>\n <tr>\n <th>SUN</th>\n <th>MON</th>\n <th>TUE</th>\n <th>WED</th>\n <th>THU</th>\n <th>FRI</th>\n <th>SAT</th>\n </tr>\n </thead>\n <tbody>\n {grid.map((week, weekIndex) => (\n <tr key={'week-' + weekIndex}>\n {week.map((day, dayIndex) => (\n <td key={'day-' + dayIndex}>\n {day && (\n <Button disabled={!day.available} onClick={() => onClick(day.date)}>\n {day.date.getDate()}\n </Button>\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction buildGrid(startDate: Date, slots: Slot[]): OptionalCalendarCell[][] {\n const d = new Date(startDate.getFullYear(), startDate.getMonth());\n const grid: OptionalCalendarCell[][] = [];\n let row: OptionalCalendarCell[] = [];\n\n // Fill leading empty days\n for (let i = 0; i < d.getDay(); i++) {\n row.push(undefined);\n }\n\n while (d.getMonth() === startDate.getMonth()) {\n row.push({\n date: new Date(d.getTime()),\n available: isDayAvailable(d, slots),\n });\n\n if (d.getDay() === 6) {\n grid.push(row);\n row = [];\n }\n\n d.setDate(d.getDate() + 1);\n }\n\n // Fill trailing empty days\n if (d.getDay() !== 0) {\n for (let i = d.getDay(); i < 7; i++) {\n row.push(undefined);\n }\n grid.push(row);\n }\n\n return grid;\n}\n\n/**\n * Returns true if the given date is available for booking.\n * @param day - The day to check.\n * @param slots - The list of available slots.\n * @returns True if there are any available slots for the day.\n */\nfunction isDayAvailable(day: Date, slots: Slot[]): boolean {\n // Note that slot start and end time may or may not be in UTC.\n for (const slot of slots) {\n const slotStart = new Date(slot.start as string);\n if (\n slotStart.getFullYear() === day.getFullYear() &&\n slotStart.getMonth() === day.getMonth() &&\n slotStart.getDate() === day.getDate()\n ) {\n return true;\n }\n }\n\n return false;\n}\n", "\n.table {\n width: 350px;\n\n & th {\n font-weight: normal;\n font-size: 11px;\n padding: 8px;\n text-align: center;\n }\n\n & td {\n padding: 2px 4px;\n }\n\n & td button {\n width: 44px;\n height: 44px;\n color: theme.colors[theme.primaryColor][5];\n font-size: 16px;\n font-weight: 500;\n text-align: center;\n padding: 0;\n background-color: theme.colors[theme.primaryColor][0];\n border: 0;\n border-radius: 50px;\n cursor: pointer;\n }\n\n & td button:hover {\n background-color: theme.colors[theme.primaryColor][1];\n }\n\n & td button:disabled {\n background-color: transparen;\n cursor: defaul;\n color: var(--mantine-color-gray-4);\n font-weight: normal;\n }\n}", "/**\n * Returns a month display string (e.g. \"January 2020\").\n * @param date - Any date within the month.\n * @returns The month display string (e.g. \"January 2020\")\n */\nexport function getMonthString(date: Date): string {\n return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();\n}\n\nexport function getStartMonth(): Date {\n const result = new Date();\n result.setDate(1);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n", "import { ContainerProps, Container as MantineContainer } from '@mantine/core';\nimport classes from './Container.module.css';\n\nexport function Container(props: ContainerProps): JSX.Element {\n const { children, ...others } = props;\n\n return (\n <MantineContainer className={classes.root} {...others}>\n {children}\n </MantineContainer>\n );\n}\n", ".root {\n @media (max-width: 800px) {\n padding-left: 4px;\n padding-right: 4px;\n }\n}\n", "import { ActionIcon, Center, Group, Loader, Menu, ScrollArea, TextInput } from '@mantine/core';\nimport { showNotification, updateNotification } from '@mantine/notifications';\nimport { getReferenceString, MedplumClient, normalizeErrorString, ProfileResource } from '@medplum/core';\nimport {\n Attachment,\n AuditEvent,\n Bundle,\n BundleEntry,\n Communication,\n DiagnosticReport,\n Media,\n OperationOutcome,\n Reference,\n Resource,\n ResourceType,\n} from '@medplum/fhirtypes';\nimport { useMedplum, useMedplumNavigate, useResource } from '@medplum/react-hooks';\nimport {\n IconCheck,\n IconCloudUpload,\n IconEdit,\n IconFileAlert,\n IconListDetails,\n IconMessage,\n IconPin,\n IconPinnedOff,\n IconTrash,\n} from '@tabler/icons-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { AttachmentButton } from '../AttachmentButton/AttachmentButton';\nimport { AttachmentDisplay } from '../AttachmentDisplay/AttachmentDisplay';\nimport { DiagnosticReportDisplay } from '../DiagnosticReportDisplay/DiagnosticReportDisplay';\nimport { Form } from '../Form/Form';\nimport { Panel } from '../Panel/Panel';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceDiffTable } from '../ResourceDiffTable/ResourceDiffTable';\nimport { ResourceTable } from '../ResourceTable/ResourceTable';\nimport { Timeline, TimelineItem } from '../Timeline/Timeline';\nimport { sortByDateAndPriority } from '../utils/date';\nimport classes from './ResourceTimeline.module.css';\n\nexport interface ResourceTimelineProps<T extends Resource> {\n value: T | Reference<T>;\n loadTimelineResources: (\n medplum: MedplumClient,\n resourceType: ResourceType,\n id: string\n ) => Promise<PromiseSettledResult<Bundle>[]>;\n createCommunication?: (resource: T, sender: ProfileResource, text: string) => Communication;\n createMedia?: (resource: T, operator: ProfileResource, attachment: Attachment) => Media;\n}\n\nexport function ResourceTimeline<T extends Resource>(props: ResourceTimelineProps<T>): JSX.Element {\n const medplum = useMedplum();\n const navigate = useMedplumNavigate();\n const sender = medplum.getProfile() as ProfileResource;\n const inputRef = useRef<HTMLInputElement>(null);\n const resource = useResource(props.value);\n const [history, setHistory] = useState<Bundle>();\n const [items, setItems] = useState<Resource[]>([]);\n const loadTimelineResources = props.loadTimelineResources;\n\n const itemsRef = useRef<Resource[]>(items);\n itemsRef.current = items;\n\n /**\n * Sorts and sets the items.\n *\n * Sorting is primarily a function of meta.lastUpdated, but there are special cases.\n * When displaying connected resources, for example a Communication in the context of an Encounter,\n * the Communication.sent time is used rather than Communication.meta.lastUpdated.\n *\n * Other examples of special cases:\n * - DiagnosticReport.issued\n * - Media.issued\n * - Observation.issued\n * - DocumentReference.date\n *\n * See \"sortByDateAndPriority()\" for more details.\n */\n const sortAndSetItems = useCallback(\n (newItmes: Resource[]): void => {\n sortByDateAndPriority(newItmes, resource);\n newItmes.reverse();\n setItems(newItmes);\n },\n [resource]\n );\n\n /**\n * Handles a batch request response.\n * @param batchResponse - The batch response.\n */\n const handleBatchResponse = useCallback(\n (batchResponse: PromiseSettledResult<Bundle>[]): void => {\n const newItems = [];\n\n for (const settledResult of batchResponse) {\n if (settledResult.status !== 'fulfilled') {\n // User may not have access to all resource types\n continue;\n }\n\n const bundle = settledResult.value;\n if (bundle.type === 'history') {\n setHistory(bundle);\n }\n\n if (bundle.entry) {\n for (const entry of bundle.entry) {\n newItems.push(entry.resource as Resource);\n }\n }\n }\n\n sortAndSetItems(newItems);\n },\n [sortAndSetItems]\n );\n\n /**\n * Adds an array of resources to the timeline.\n * @param resource - Resource to add.\n */\n const addResource = useCallback(\n (resource: Resource): void => sortAndSetItems([...itemsRef.current, resource]),\n [sortAndSetItems]\n );\n\n /**\n * Loads the timeline.\n */\n const loadTimeline = useCallback(() => {\n let resourceType: ResourceType;\n let id: string;\n if ('resourceType' in props.value) {\n resourceType = props.value.resourceType;\n id = props.value.id as string;\n } else {\n [resourceType, id] = props.value.reference?.split('/') as [ResourceType, string];\n }\n loadTimelineResources(medplum, resourceType, id).then(handleBatchResponse).catch(console.log);\n }, [medplum, props.value, loadTimelineResources, handleBatchResponse]);\n\n useEffect(() => loadTimeline(), [loadTimeline]);\n\n /**\n * Adds a Communication resource to the timeline.\n * @param contentString - The comment content.\n */\n function createComment(contentString: string): void {\n if (!resource || !props.createCommunication) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createCommunication(resource, sender, contentString))\n .then((result) => addResource(result))\n .catch(console.log);\n }\n\n /**\n * Adds a Media resource to the timeline.\n * @param attachment - The media attachment.\n */\n function createMedia(attachment: Attachment): void {\n if (!resource || !props.createMedia) {\n // Encounter not loaded yet\n return;\n }\n medplum\n .createResource(props.createMedia(resource, sender, attachment))\n .then((result) => addResource(result))\n .then(() =>\n updateNotification({\n id: 'upload-notification',\n color: 'teal',\n title: 'Upload complete',\n message: '',\n icon: <IconCheck size={16} />,\n autoClose: 2000,\n })\n )\n .catch((reason) =>\n updateNotification({\n id: 'upload-notification',\n color: 'red',\n title: 'Upload error',\n message: normalizeErrorString(reason),\n icon: <IconFileAlert size={16} />,\n autoClose: 2000,\n })\n );\n }\n\n function setPriority(\n communication: Communication,\n priority: 'routine' | 'urgent' | 'asap' | 'stat'\n ): Promise<Communication> {\n return medplum.updateResource({ ...communication, priority });\n }\n\n function onPin(communication: Communication): void {\n setPriority(communication, 'stat').then(loadTimeline).catch(console.log);\n }\n\n function onUnpin(communication: Communication): void {\n setPriority(communication, 'routine').then(loadTimeline).catch(console.log);\n }\n\n function onDetails(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}`);\n }\n\n function onEdit(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/edit`);\n }\n\n function onDelete(timelineItem: Resource): void {\n navigate(`/${timelineItem.resourceType}/${timelineItem.id}/delete`);\n }\n\n function onVersionDetails(version: Resource): void {\n navigate(`/${version.resourceType}/${version.id}/_history/${version.meta?.versionId}`);\n }\n\n function onUploadStart(): void {\n showNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Initializing upload...',\n message: 'Please wait...',\n autoClose: false,\n withCloseButton: false,\n });\n }\n\n function onUploadProgress(e: ProgressEvent): void {\n updateNotification({\n id: 'upload-notification',\n loading: true,\n title: 'Uploading...',\n message: getProgressMessage(e),\n autoClose: false,\n withCloseButton: false,\n });\n }\n\n function onUploadError(outcome: OperationOutcome): void {\n updateNotification({\n id: 'upload-notification',\n color: 'red',\n title: 'Upload error',\n message: normalizeErrorString(outcome),\n icon: <IconFileAlert size={16} />,\n autoClose: 2000,\n });\n }\n\n if (!resource) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n return (\n <Timeline>\n {props.createCommunication && (\n <Panel>\n <Form\n testid=\"timeline-form\"\n onSubmit={(formData: Record<string, string>) => {\n createComment(formData.text);\n\n const input = inputRef.current;\n if (input) {\n input.value = '';\n input.focus();\n }\n }}\n >\n <Group gap=\"xs\" wrap=\"nowrap\" style={{ width: '100%' }}>\n <ResourceAvatar value={sender} />\n <TextInput\n name=\"text\"\n ref={inputRef}\n placeholder=\"Add comment\"\n style={{ width: '100%', maxWidth: 300 }}\n />\n <ActionIcon type=\"submit\" radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconMessage size={16} />\n </ActionIcon>\n <AttachmentButton\n onUpload={createMedia}\n onUploadStart={onUploadStart}\n onUploadProgress={onUploadProgress}\n onUploadError={onUploadError}\n >\n {(props) => (\n <ActionIcon {...props} radius=\"xl\" color=\"blue\" variant=\"filled\">\n <IconCloudUpload size={16} />\n </ActionIcon>\n )}\n </AttachmentButton>\n </Group>\n </Form>\n </Panel>\n )}\n {items.map((item) => {\n if (!item) {\n // TODO: Handle null history items for deleted versions.\n return null;\n }\n const key = `${item.resourceType}/${item.id}/${item.meta?.versionId}`;\n if (item.resourceType === resource.resourceType && item.id === resource.id) {\n return (\n <HistoryTimelineItem key={key} history={history as Bundle} resource={item} onDetails={onVersionDetails} />\n );\n }\n switch (item.resourceType) {\n case 'AuditEvent':\n return <AuditEventTimelineItem key={key} resource={item} onDetails={onDetails} />;\n case 'Communication':\n return (\n <CommunicationTimelineItem\n key={key}\n resource={item}\n onPin={item.priority !== 'stat' ? onPin : undefined}\n onUnpin={item.priority === 'stat' ? onUnpin : undefined}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'DiagnosticReport':\n return (\n <DiagnosticReportTimelineItem\n key={key}\n resource={item}\n onDetails={onDetails}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n case 'Media':\n return (\n <MediaTimelineItem key={key} resource={item} onDetails={onDetails} onEdit={onEdit} onDelete={onDelete} />\n );\n default:\n return (\n <TimelineItem key={key} resource={item} padding={true}>\n <ResourceTable value={item} ignoreMissingValues={true} />\n </TimelineItem>\n );\n }\n })}\n </Timeline>\n );\n}\n\ninterface BaseTimelineItemProps<T extends Resource> {\n resource: T;\n onPin?: (resource: T) => void;\n onUnpin?: (resource: T) => void;\n onDetails?: (resource: T) => void;\n onEdit?: (resource: T) => void;\n onDelete?: (resource: T) => void;\n}\n\nfunction TimelineItemPopupMenu<T extends Resource>(props: BaseTimelineItemProps<T>): JSX.Element {\n return (\n <Menu.Dropdown>\n <Menu.Label>Resource</Menu.Label>\n {props.onPin && (\n <Menu.Item\n leftSection={<IconPin size={14} />}\n onClick={() => (props.onPin as (resource: T) => void)(props.resource)}\n aria-label={`Pin ${getReferenceString(props.resource)}`}\n >\n Pin\n </Menu.Item>\n )}\n {props.onUnpin && (\n <Menu.Item\n leftSection={<IconPinnedOff size={14} />}\n onClick={() => (props.onUnpin as (resource: T) => void)(props.resource)}\n aria-label={`Unpin ${getReferenceString(props.resource)}`}\n >\n Unpin\n </Menu.Item>\n )}\n {props.onDetails && (\n <Menu.Item\n leftSection={<IconListDetails size={14} />}\n onClick={() => (props.onDetails as (resource: T) => void)(props.resource)}\n aria-label={`Details ${getReferenceString(props.resource)}`}\n >\n Details\n </Menu.Item>\n )}\n {props.onEdit && (\n <Menu.Item\n leftSection={<IconEdit size={14} />}\n onClick={() => (props.onEdit as (resource: T) => void)(props.resource)}\n aria-label={`Edit ${getReferenceString(props.resource)}`}\n >\n Edit\n </Menu.Item>\n )}\n {props.onDelete && (\n <>\n <Menu.Divider />\n <Menu.Label>Danger zone</Menu.Label>\n <Menu.Item\n color=\"red\"\n leftSection={<IconTrash size={14} />}\n onClick={() => (props.onDelete as (resource: T) => void)(props.resource)}\n aria-label={`Delete ${getReferenceString(props.resource)}`}\n >\n Delete\n </Menu.Item>\n </>\n )}\n </Menu.Dropdown>\n );\n}\n\ninterface HistoryTimelineItemProps extends BaseTimelineItemProps<Resource> {\n history: Bundle;\n}\n\nfunction HistoryTimelineItem(props: HistoryTimelineItemProps): JSX.Element {\n const previous = getPrevious(props.history, props.resource);\n if (previous) {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ResourceDiffTable original={previous} revised={props.resource} />\n </TimelineItem>\n );\n } else {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <h3>Created</h3>\n <ResourceTable value={props.resource} ignoreMissingValues forceUseInput />\n </TimelineItem>\n );\n }\n}\n\nfunction getPrevious(history: Bundle, version: Resource): Resource | undefined {\n const entries = history.entry as BundleEntry[];\n const index = entries.findIndex((entry) => entry.resource?.meta?.versionId === version.meta?.versionId);\n if (index >= entries.length - 1) {\n return undefined;\n }\n return entries[index + 1].resource;\n}\n\nfunction CommunicationTimelineItem(props: BaseTimelineItemProps<Communication>): JSX.Element {\n const routine = !props.resource.priority || props.resource.priority === 'routine';\n const className = routine ? undefined : classes.pinnedComment;\n return (\n <TimelineItem\n resource={props.resource}\n profile={props.resource.sender}\n dateTime={props.resource.sent}\n padding={true}\n className={className}\n popupMenuItems={<TimelineItemPopupMenu {...props} />}\n >\n <p>{props.resource.payload?.[0]?.contentString}</p>\n </TimelineItem>\n );\n}\n\nfunction MediaTimelineItem(props: BaseTimelineItemProps<Media>): JSX.Element {\n const contentType = props.resource.content?.contentType;\n const padding =\n contentType &&\n !contentType.startsWith('image/') &&\n !contentType.startsWith('video/') &&\n contentType !== 'application/pdf';\n return (\n <TimelineItem resource={props.resource} padding={!!padding} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <AttachmentDisplay value={props.resource.content} />\n </TimelineItem>\n );\n}\n\nfunction AuditEventTimelineItem(props: BaseTimelineItemProps<AuditEvent>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <ScrollArea>\n <pre>{props.resource.outcomeDesc}</pre>\n </ScrollArea>\n </TimelineItem>\n );\n}\n\nfunction DiagnosticReportTimelineItem(props: BaseTimelineItemProps<DiagnosticReport>): JSX.Element {\n return (\n <TimelineItem resource={props.resource} padding={true} popupMenuItems={<TimelineItemPopupMenu {...props} />}>\n <DiagnosticReportDisplay value={props.resource} />\n </TimelineItem>\n );\n}\n\nfunction getProgressMessage(e: ProgressEvent): string {\n if (e.lengthComputable) {\n const percent = (100 * e.loaded) / e.total;\n return `Uploaded: ${formatFileSize(e.loaded)} / ${formatFileSize(e.total)} ${percent.toFixed(2)}%`;\n }\n return `Uploaded: ${formatFileSize(e.loaded)}`;\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes === 0) {\n return '0.00 B';\n }\n const e = Math.floor(Math.log(bytes) / Math.log(1024));\n return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';\n}\n", "import { Group, List, Stack, Text, Title } from '@mantine/core';\nimport { capitalize, formatCodeableConcept, formatDateTime, formatObservationValue, isReference } from '@medplum/core';\nimport {\n Annotation,\n DiagnosticReport,\n Observation,\n ObservationComponent,\n ObservationReferenceRange,\n Reference,\n Specimen,\n} from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport cx from 'clsx';\nimport { useEffect, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { NoteDisplay } from '../NoteDisplay/NoteDisplay';\nimport { RangeDisplay } from '../RangeDisplay/RangeDisplay';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\nimport classes from './DiagnosticReportDisplay.module.css';\n\nexport interface DiagnosticReportDisplayProps {\n value?: DiagnosticReport | Reference<DiagnosticReport>;\n hideObservationNotes?: boolean;\n hideSpecimenInfo?: boolean;\n}\n\nDiagnosticReportDisplay.defaultProps = {\n hideObservationNotes: false,\n hideSpecimenInfo: false,\n} as DiagnosticReportDisplayProps;\n\nexport function DiagnosticReportDisplay(props: DiagnosticReportDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const diagnosticReport = useResource(props.value);\n const [specimens, setSpecimens] = useState<Specimen[]>();\n\n useEffect(() => {\n if (diagnosticReport?.specimen) {\n Promise.allSettled(diagnosticReport.specimen.map((ref) => medplum.readReference(ref)))\n .then((outcomes) =>\n outcomes\n .filter((outcome) => outcome.status === 'fulfilled')\n .map((outcome) => (outcome as PromiseFulfilledResult<Specimen>).value)\n )\n .then(setSpecimens)\n .catch(console.error);\n }\n }, [medplum, diagnosticReport]);\n\n if (!diagnosticReport) {\n return null;\n }\n\n const specimenNotes: Annotation[] = specimens?.flatMap((spec) => spec.note || []) || [];\n\n if (diagnosticReport.presentedForm && diagnosticReport.presentedForm.length > 0) {\n const pf = diagnosticReport.presentedForm[0];\n if (pf.contentType?.startsWith('text/plain') && pf.data) {\n specimenNotes.push({ text: window.atob(pf.data) });\n }\n }\n\n return (\n <Stack>\n <Title>Diagnostic Report</Title>\n <DiagnosticReportHeader value={diagnosticReport} />\n {specimens && !props.hideSpecimenInfo && SpecimenInfo(specimens)}\n {diagnosticReport.result && (\n <ObservationTable hideObservationNotes={props.hideObservationNotes} value={diagnosticReport.result} />\n )}\n {specimenNotes.length > 0 && <NoteDisplay value={specimenNotes} />}\n </Stack>\n );\n}\n\ninterface DiagnosticReportHeaderProps {\n value: DiagnosticReport;\n}\n\nfunction DiagnosticReportHeader({ value }: DiagnosticReportHeaderProps): JSX.Element {\n return (\n <Group mt=\"md\" gap={30}>\n {value.subject && (\n <div>\n <Text size=\"xs\" tt=\"uppercase\" c=\"dimmed\">\n Subject\n </Text>\n <ResourceBadge value={value.subject} link={true} />\n </div>\n )}\n {value.resultsInterpreter?.map((interpreter) => (\n <div key={interpreter.reference}>\n <Text size=\"xs\" tt=\"uppercase\" c=\"dimmed\">\n Interpreter\n </Text>\n <ResourceBadge value={interpreter} link={true} />\n </div>\n ))}\n {value.performer?.map((performer) => (\n <div key={performer.reference}>\n <Text size=\"xs\" tt=\"uppercase\" c=\"dimmed\">\n Performer\n </Text>\n <ResourceBadge value={performer} link={true} />\n </div>\n ))}\n {value.issued && (\n <div>\n <Text size=\"xs\" tt=\"uppercase\" c=\"dimmed\">\n Issued\n </Text>\n <Text>{formatDateTime(value.issued)}</Text>\n </div>\n )}\n {value.status && (\n <div>\n <Text size=\"xs\" tt=\"uppercase\" c=\"dimmed\">\n Status\n </Text>\n <Text>{capitalize(value.status)}</Text>\n </div>\n )}\n </Group>\n );\n}\n\nfunction SpecimenInfo(specimens: Specimen[] | undefined): JSX.Element {\n return (\n <Stack gap=\"xs\">\n <Title order={2} size=\"h6\">\n Specimens\n </Title>\n\n <List type=\"ordered\">\n {specimens?.map((specimen) => (\n <List.Item ml=\"sm\" key={`specimen-${specimen.id}`}>\n <Group gap={20}>\n <Group gap={5}>\n <Text fw={500}>Collected:</Text> {formatDateTime(specimen.collection?.collectedDateTime)}\n </Group>\n <Group gap={5}>\n <Text fw={500}>Received:</Text> {formatDateTime(specimen.receivedTime)}\n </Group>\n </Group>\n </List.Item>\n ))}\n </List>\n </Stack>\n );\n}\n\nexport interface ObservationTableProps {\n value?: Observation[] | Reference<Observation>[];\n ancestorIds?: string[];\n hideObservationNotes?: boolean;\n}\n\nexport function ObservationTable(props: ObservationTableProps): JSX.Element {\n return (\n <table className={classes.table}>\n <thead>\n <tr>\n <th>Test</th>\n <th>Value</th>\n <th>Reference Range</th>\n <th>Interpretation</th>\n <th>Category</th>\n <th>Performer</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n <ObservationRowGroup\n value={props.value}\n ancestorIds={props.ancestorIds}\n hideObservationNotes={props.hideObservationNotes}\n />\n </tbody>\n </table>\n );\n}\n\ninterface ObservationRowGroupProps {\n value?: Observation[] | Reference<Observation>[];\n ancestorIds?: string[];\n hideObservationNotes?: boolean;\n}\n\nfunction ObservationRowGroup(props: ObservationRowGroupProps): JSX.Element {\n return (\n <>\n {props.value?.map((observation) => (\n <ObservationRow\n key={`obs-${isReference(observation) ? observation.reference : observation.id}`}\n value={observation}\n ancestorIds={props.ancestorIds}\n hideObservationNotes={props.hideObservationNotes}\n />\n ))}\n </>\n );\n}\n\ninterface ObservationRowProps {\n value: Observation | Reference<Observation>;\n ancestorIds?: string[];\n hideObservationNotes?: boolean;\n}\n\nfunction ObservationRow(props: ObservationRowProps): JSX.Element | null {\n const observation = useResource(props.value);\n\n if (!observation || props.ancestorIds?.includes(observation.id as string)) {\n return null;\n }\n\n const displayNotes = !props.hideObservationNotes && observation.note;\n\n const critical = isCritical(observation);\n\n return (\n <>\n <tr className={cx({ [classes.criticalRow]: critical })}>\n <td rowSpan={displayNotes ? 2 : 1}>\n <MedplumLink to={observation}>\n <CodeableConceptDisplay value={observation.code} />\n </MedplumLink>\n </td>\n <td>\n <ObservationValueDisplay value={observation} />\n </td>\n <td>\n <ReferenceRangeDisplay value={observation.referenceRange} />\n </td>\n <td>\n {observation.interpretation && observation.interpretation.length > 0 && (\n <CodeableConceptDisplay value={observation.interpretation[0]} />\n )}\n </td>\n <td>\n {observation.category && observation.category.length > 0 && (\n <>\n {observation.category.map((concept) => (\n <div key={`category-${formatCodeableConcept(concept)}`}>\n <CodeableConceptDisplay value={concept} />\n </div>\n ))}\n </>\n )}\n </td>\n <td>\n {observation.performer?.map((performer) => <ReferenceDisplay key={performer.reference} value={performer} />)}\n </td>\n <td>{observation.status && <StatusBadge status={observation.status} />}</td>\n </tr>\n {observation.hasMember && (\n <ObservationRowGroup\n value={observation.hasMember as Reference<Observation>[]}\n ancestorIds={\n props.ancestorIds ? [...props.ancestorIds, observation.id as string] : [observation.id as string]\n }\n hideObservationNotes={props.hideObservationNotes}\n />\n )}\n {displayNotes && (\n <tr>\n <td colSpan={6}>\n <NoteDisplay value={observation.note} />\n </td>\n </tr>\n )}\n </>\n );\n}\n\ninterface ObservationValueDisplayProps {\n value?: Observation | ObservationComponent;\n}\n\nfunction ObservationValueDisplay(props: ObservationValueDisplayProps): JSX.Element | null {\n const obs = props.value;\n return <>{formatObservationValue(obs)}</>;\n}\n\ninterface ReferenceRangeProps {\n value?: ObservationReferenceRange[];\n}\n\nfunction ReferenceRangeDisplay(props: ReferenceRangeProps): JSX.Element | null {\n const range = props.value && props.value.length > 0 && props.value[0];\n if (!range) {\n return null;\n }\n if (range.text) {\n return <>{range.text}</>;\n }\n return <RangeDisplay value={range} />;\n}\n\n/**\n * Returns true if the observation is critical.\n * See: https://www.hl7.org/fhir/valueset-observation-interpretation.html\n * @param observation - The FHIR observation.\n * @returns True if the FHIR observation is a critical value.\n */\nfunction isCritical(observation: Observation): boolean {\n const code = observation.interpretation?.[0]?.coding?.[0]?.code;\n return code === 'AA' || code === 'LL' || code === 'HH' || code === 'A';\n}\n", "import { Blockquote, Stack } from '@mantine/core';\nimport { Annotation } from '@medplum/fhirtypes';\nimport classes from './NoteDisplay.module.css';\n\nexport interface NoteDisplayProps {\n value?: Annotation[];\n}\n\nexport function NoteDisplay({ value }: NoteDisplayProps): JSX.Element | null {\n if (!value) {\n return null;\n }\n\n return (\n <Stack justify=\"flex-start\" gap=\"xs\">\n {value.map(\n (note) =>\n note.text && (\n <Blockquote\n key={`note-${note.text}`}\n classNames={{ cite: classes.noteCite, root: classes.noteRoot }}\n cite={note.authorReference?.display || note.authorString}\n icon={null}\n >\n {note.text}\n </Blockquote>\n )\n )}\n </Stack>\n );\n}\n", ".noteBody {\n font-size: var(--mantine-font-size-sm);\n}\n\n.noteCite {\n font-size: var(--mantine-font-size-xs);\n margin-block-start: 3;\n}\n\n.noteRoot {\n padding: 5px;\n}\n", "import { Group } from '@mantine/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface ResourceBadgeProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceBadge(props: ResourceBadgeProps): JSX.Element {\n return (\n <Group gap=\"xs\">\n <ResourceAvatar size={24} radius={12} value={props.value} link={props.link} />\n <ResourceName value={props.value} link={props.link} />\n </Group>\n );\n}\n", "import { Text, TextProps } from '@mantine/core';\nimport { getDisplayString, isOk, normalizeErrorString } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport { useResource } from '@medplum/react-hooks';\nimport { useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\n\nexport interface ResourceNameProps extends TextProps {\n value?: Reference | Resource;\n link?: boolean;\n}\n\nexport function ResourceName(props: ResourceNameProps): JSX.Element | null {\n const { value, link, ...rest } = props;\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const resource = useResource(value, setOutcome);\n let text: string;\n\n if (outcome && !isOk(outcome)) {\n text = `[${normalizeErrorString(outcome)}]`;\n } else if (resource) {\n text = getDisplayString(resource);\n } else {\n return null;\n }\n\n return link ? (\n <MedplumLink to={value} {...rest}>\n {text}\n </MedplumLink>\n ) : (\n <Text component=\"span\" {...rest}>\n {text}\n </Text>\n );\n}\n", "import { Badge, DefaultMantineColor } from '@mantine/core';\n\n/*\n * Request status: https://hl7.org/fhir/valueset-request-status.html\n * draft, active, on-hold, revoked, completed, entered-in-error, unknown\n *\n * Publication status: https://hl7.org/fhir/valueset-publication-status.html\n * draft, active, retired, unknown\n *\n * Observation status: https://www.hl7.org/fhir/valueset-observation-status.html\n * registered, preliminary, final, amended, corrected, cancelled, entered-in-error, unknown\n *\n * DiagnosticReport status: https://hl7.org/fhir/valueset-diagnostic-report-status.html\n * registered, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown\n *\n * Task status: https://hl7.org/fhir/valueset-task-status.html\n * draft, requested, received, accepted, rejected, ready, cancelled, in-progress, on-hold, failed, completed, entered-in-error\n *\n * Appointment status: https://www.hl7.org/fhir/valueset-appointmentstatus.html\n * proposed, pending, booked, arrived, fulfilled, cancelled, noshow, entered-in-error, chcked-in, waitlist\n *\n * Immunization status: https://hl7.org/fhir/r4/valueset-immunization-status.html\n * completed, entered-in-error, not-done\n */\n\nconst statusToColor: Record<string, DefaultMantineColor> = {\n draft: 'blue',\n active: 'blue',\n 'on-hold': 'yellow',\n revoked: 'red',\n completed: 'green',\n 'entered-in-error': 'red',\n unknown: 'gray',\n retired: 'gray',\n registered: 'blue',\n preliminary: 'blue',\n final: 'green',\n amended: 'yellow',\n corrected: 'yellow',\n cancelled: 'red',\n requested: 'blue',\n received: 'blue',\n accepted: 'blue',\n rejected: 'red',\n ready: 'blue',\n 'in-progress': 'blue',\n failed: 'red',\n proposed: 'blue',\n pending: 'blue',\n booked: 'blue',\n arrived: 'blue',\n fulfilled: 'green',\n noshow: 'red',\n 'checked-in': 'blue',\n waitlist: 'gray',\n routine: 'gray',\n urgent: 'red',\n asap: 'red',\n stat: 'red',\n 'not-done': 'red',\n};\n\nexport interface StatusBadgeProps {\n readonly status: string;\n}\n\nexport function StatusBadge(props: StatusBadgeProps): JSX.Element {\n return <Badge color={statusToColor[props.status]}>{props.status}</Badge>;\n}\n", ".table {\n border: 0.1px solid var(--mantine-color-gray-5);\n border-collapse: collapse;\n\n & td,\n & th {\n border: 0.1px solid var(--mantine-color-gray-5);\n padding: 4px;\n }\n}\n\n.criticalRow {\n background: light-dark(var(--mantine-color-red-1), var(--mantine-color-red-7));\n border: 0.1px solid var(--mantine-color-red-5);\n color: var(--mantine-color-red-5);\n font-weight: 500;\n\n & td {\n border: 0.1px solid var(--mantine-color-red-5);\n }\n}\n\n.noteBody {\n font-size: var(--mantine-font-size-sm);\n}\n\n.noteCite {\n font-size: var(--mantine-font-size-xs);\n margin-block-start: 3;\n}\n\n.noteRoot {\n padding: 5px;\n}\n", "import { Paper, PaperProps } from '@mantine/core';\nimport cx from 'clsx';\nimport classes from './Panel.module.css';\n\nexport interface PanelStylesParams {\n width?: number;\n fill?: boolean;\n}\n\nexport interface PanelProps extends PaperProps {\n width?: number;\n fill?: boolean;\n children?: React.ReactNode;\n}\n\nexport function Panel(props: PanelProps): JSX.Element {\n const { width, fill, className, children, ...rest } = props;\n const style = width ? { width } : undefined;\n return (\n <Paper\n className={cx(classes.paper, fill && classes.fill, className)}\n style={style}\n shadow=\"sm\"\n radius=\"sm\"\n withBorder\n {...rest}\n >\n {children}\n </Paper>\n );\n}\n", ".paper {\n margin: var(--mantine-spacing-xl) auto;\n padding: var(--mantine-spacing-md);\n\n @media (max-width: 800px) {\n padding: 8px;\n }\n\n & img {\n width: 100%;\n max-width: 100%;\n }\n\n & video {\n width: 100%;\n max-width: 100%;\n }\n}\n\n.fill {\n padding: 0;\n}\n", "import { Table } from '@mantine/core';\nimport { capitalize, evalFhirPathTyped, getSearchParameterDetails, toTypedValue } from '@medplum/core';\nimport { Resource, SearchParameter } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useEffect, useState } from 'react';\nimport { createPatch } from 'rfc6902';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport classes from './ResourceDiffTable.module.css';\n\nexport interface ResourceDiffTableProps {\n original: Resource;\n revised: Resource;\n}\n\nexport function ResourceDiffTable(props: ResourceDiffTableProps): JSX.Element | null {\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n\n useEffect(() => {\n medplum\n .requestSchema(props.original.resourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.original.resourceType]);\n\n if (!schemaLoaded) {\n return null;\n }\n\n const patch = createPatch(props.original, props.revised);\n const typedOriginal = [toTypedValue(props.original)];\n const typedRevised = [toTypedValue(props.revised)];\n\n return (\n <Table className={classes.root}>\n <Table.Thead>\n <Table.Tr>\n <Table.Th />\n <Table.Th>Before</Table.Th>\n <Table.Th>After</Table.Th>\n </Table.Tr>\n </Table.Thead>\n <Table.Tbody>\n {patch.map((op) => {\n if (op.path.startsWith('/meta')) {\n return null;\n }\n\n const path = op.path;\n const fhirPath = jsonPathToFhirPath(path);\n const details = getSearchParameterDetails(props.original.resourceType, {\n resourceType: 'SearchParameter',\n base: [props.original.resourceType],\n code: props.original.resourceType + '.' + fhirPath,\n expression: props.original.resourceType + '.' + fhirPath,\n } as SearchParameter);\n const property = details?.elementDefinitions?.[0];\n const isArray = !!property?.isArray;\n const originalValue = op.op === 'add' ? undefined : evalFhirPathTyped(fhirPath, typedOriginal)?.[0];\n const revisedValue = op.op === 'remove' ? undefined : evalFhirPathTyped(fhirPath, typedRevised)?.[0];\n\n return (\n <Table.Tr key={`op-${op.op}-${op.path}`}>\n <Table.Td>\n {capitalize(op.op)} {fhirPath}\n </Table.Td>\n <Table.Td className={classes.removed}>\n {originalValue && (\n <ResourcePropertyDisplay\n property={property}\n propertyType={originalValue.type}\n value={fixArray(originalValue.value, isArray)}\n ignoreMissingValues={true}\n />\n )}\n </Table.Td>\n <Table.Td className={classes.added}>\n {revisedValue && (\n <ResourcePropertyDisplay\n property={property}\n propertyType={revisedValue.type}\n value={fixArray(revisedValue.value, isArray)}\n ignoreMissingValues={true}\n />\n )}\n </Table.Td>\n </Table.Tr>\n );\n })}\n </Table.Tbody>\n </Table>\n );\n}\n\nfunction jsonPathToFhirPath(path: string): string {\n const parts = path.split('/').filter(Boolean);\n let result = '';\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === '-') {\n result += '.last()';\n } else if (/^\\d+$/.test(part)) {\n result += `[${part}]`;\n } else {\n if (i > 0) {\n result += '.';\n }\n result += part;\n }\n }\n return result;\n}\n\nfunction fixArray(inputValue: any, isArray: boolean): any {\n if (Array.isArray(inputValue) && !isArray) {\n return inputValue[0];\n }\n if (!Array.isArray(inputValue) && isArray) {\n return [inputValue];\n }\n return inputValue;\n}\n", ".root {\n border-collapse: collapse;\n width: 100%;\n\n & tr {\n border-top: 0.1px solid var(--mantine-color-gray-3);\n }\n\n & th,\n & td {\n padding: var(--mantine-spacing-sm) var(--mantine-spacing-sm);\n vertical-align: top;\n }\n}\n\n.removed {\n color: var(--mantine-color-red-7);\n text-decoration: line-through;\n}\n\n.added {\n color: var(--mantine-color-green-7);\n}\n", "import { Reference, Resource } from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { useEffect, useState } from 'react';\nimport { BackboneElementDisplay } from '../BackboneElementDisplay/BackboneElementDisplay';\n\nexport interface ResourceTableProps {\n /**\n * The input value either as a resource or a reference.\n */\n value: Resource | Reference;\n\n /**\n * Optional flag to ignore missing values.\n * By default, missing values are displayed as empty strings.\n */\n ignoreMissingValues?: boolean;\n\n /**\n * Optional flag to force use the input value.\n * This is useful when you want to display a specific version of the resource,\n * and not use the latest version.\n */\n forceUseInput?: boolean;\n}\n\nexport function ResourceTable(props: ResourceTableProps): JSX.Element | null {\n const medplum = useMedplum();\n const value = useResource(props.value);\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n\n useEffect(() => {\n if (value) {\n medplum\n .requestSchema(value.resourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }\n }, [medplum, value]);\n\n if (!schemaLoaded || !value) {\n return null;\n }\n\n return (\n <BackboneElementDisplay\n value={{\n type: value.resourceType,\n value: props.forceUseInput ? props.value : value,\n }}\n ignoreMissingValues={props.ignoreMissingValues}\n />\n );\n}\n", "import { ActionIcon, Group, Menu, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { IconDots } from '@tabler/icons-react';\nimport { ReactNode } from 'react';\nimport { Container } from '../Container/Container';\nimport { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { Panel, PanelProps } from '../Panel/Panel';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface TimelineProps {\n children?: ReactNode;\n}\n\nexport function Timeline(props: TimelineProps): JSX.Element {\n return <Container>{props.children}</Container>;\n}\n\nexport interface TimelineItemProps extends PanelProps {\n resource: Resource;\n profile?: Reference;\n dateTime?: string;\n padding?: boolean;\n popupMenuItems?: ReactNode;\n}\n\nexport function TimelineItem(props: TimelineItemProps): JSX.Element {\n const { resource, profile, padding, popupMenuItems, ...others } = props;\n const author = profile ?? resource.meta?.author;\n const dateTime = props.dateTime ?? resource.meta?.lastUpdated;\n\n return (\n <Panel data-testid=\"timeline-item\" fill={true} {...others}>\n <Group justify=\"space-between\" gap={8} mx=\"xs\" my=\"sm\">\n <ResourceAvatar value={author} link={true} size=\"md\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\">\n <ResourceName c=\"dark\" fw={500} value={author} link={true} />\n </Text>\n <Text size=\"xs\">\n <MedplumLink c=\"dimmed\" to={props.resource}>\n {formatDateTime(dateTime)}\n </MedplumLink>\n <Text component=\"span\" c=\"dimmed\" mx={8}>\n &middot;\n </Text>\n <MedplumLink c=\"dimmed\" to={props.resource}>\n {props.resource.resourceType}\n </MedplumLink>\n </Text>\n </div>\n {popupMenuItems && (\n <Menu position=\"bottom-end\" shadow=\"md\" width={200}>\n <Menu.Target>\n <ActionIcon\n color=\"gray\"\n variant=\"subtle\"\n radius=\"xl\"\n aria-label={`Actions for ${getReferenceString(props.resource)}`}\n >\n <IconDots />\n </ActionIcon>\n </Menu.Target>\n {popupMenuItems}\n </Menu>\n )}\n </Group>\n <ErrorBoundary>\n {padding && <div style={{ padding: '0 16px 16px 16px' }}>{props.children}</div>}\n {!padding && <>{props.children}</>}\n </ErrorBoundary>\n </Panel>\n );\n}\n", "import { Resource } from '@medplum/fhirtypes';\n\n/**\n * Sorts an array of resources in place by meta.lastUpdated ascending.\n * @param resources - Array of resources.\n * @param timelineResource - Optional primary resource of a timeline view. If specified, the primary resource will be sorted by meta.lastUpdated descending.\n */\nexport function sortByDateAndPriority(resources: Resource[], timelineResource?: Resource): void {\n resources.sort((a: Resource, b: Resource): number => {\n const priority1 = getPriorityScore(a, timelineResource);\n const priority2 = getPriorityScore(b, timelineResource);\n if (priority1 > priority2) {\n return 1;\n }\n if (priority1 < priority2) {\n return -1;\n }\n return getTime(a, timelineResource) - getTime(b, timelineResource);\n });\n}\n\nfunction getPriorityScore(resource: Resource, timelineResource: Resource | undefined): number {\n if (!isSameResourceType(resource, timelineResource)) {\n // Only use priority if not the primary resource of a timeline view.\n\n const priority = (resource as any).priority;\n if (typeof priority === 'string') {\n return { stat: 4, asap: 3, urgent: 2 }[priority] ?? 0;\n }\n }\n return 0;\n}\n\nfunction getTime(resource: Resource, timelineResource: Resource | undefined): number {\n if (!isSameResourceType(resource, timelineResource)) {\n // Only use special case timestamps if not the primary resource of a timeline view.\n\n if (resource.resourceType === 'Communication' && resource.sent) {\n return new Date(resource.sent).getTime();\n }\n\n if (\n (resource.resourceType === 'DiagnosticReport' ||\n resource.resourceType === 'Media' ||\n resource.resourceType === 'Observation') &&\n resource.issued\n ) {\n return new Date(resource.issued).getTime();\n }\n\n if (resource.resourceType === 'DocumentReference' && resource.date) {\n return new Date(resource.date).getTime();\n }\n }\n\n const dateTime = resource.meta?.lastUpdated;\n if (!dateTime) {\n return 0;\n }\n return new Date(dateTime).getTime();\n}\n\nfunction isSameResourceType(a: Resource, b: Resource | undefined): boolean {\n return !!b && a.resourceType === b.resourceType && a.id === b.id;\n}\n", "\n.pinnedComment {\n background-color: var(--mantine-color-blue-0);\n}", "import { MedplumClient } from '@medplum/core';\nimport { Reference, Resource, ResourceType } from '@medplum/fhirtypes';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface DefaultResourceTimelineProps {\n resource: Resource | Reference;\n}\n\nexport function DefaultResourceTimeline(props: DefaultResourceTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.resource}\n loadTimelineResources={async (medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory(resourceType, id),\n medplum.search('Task', { _filter: `based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`, _count }),\n ]);\n }}\n />\n );\n}\n", "import { Container } from '../Container/Container';\nimport { Panel, PanelProps } from '../Panel/Panel';\n\nexport function Document(props: PanelProps): JSX.Element {\n const { children, ...others } = props;\n return (\n <Container>\n <Panel {...others}>{children}</Panel>\n </Container>\n );\n}\n", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Encounter, Reference, ResourceType } from '@medplum/fhirtypes';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface EncounterTimelineProps {\n encounter: Encounter | Reference<Encounter>;\n}\n\nexport function EncounterTimeline(props: EncounterTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.encounter}\n loadTimelineResources={async (medplum: MedplumClient, _resourceType: ResourceType, id: string) => {\n return Promise.allSettled([\n medplum.readHistory('Encounter', id),\n medplum.search('Communication', 'encounter=Encounter/' + id),\n medplum.search('Media', 'encounter=Encounter/' + id),\n ]);\n }}\n createCommunication={(resource: Encounter, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Encounter, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n encounter: createReference(resource),\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { Button, Loader, Table } from '@mantine/core';\nimport { normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome, Resource } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ChangeEvent, MouseEvent, memo, useEffect, useRef, useState } from 'react';\nimport { FhirPathDisplay } from '../FhirPathDisplay/FhirPathDisplay';\nimport { SearchClickEvent } from '../SearchControl/SearchControl';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\n\nexport interface FhirPathTableField {\n readonly propertyType: string;\n readonly name: string;\n readonly fhirPath: string;\n}\n\nexport interface FhirPathTableProps {\n resourceType: string;\n query: string;\n fields: FhirPathTableField[];\n checkboxesEnabled?: boolean;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onBulk?: (ids: string[]) => void;\n}\n\nexport interface SmartSearchResponse {\n data: {\n ResourceList: Resource[];\n };\n}\n\n/**\n * The FhirPathTable component represents the embeddable search table control.\n * @param props - FhirPathTable React props.\n * @returns FhirPathTable React node.\n */\nexport function FhirPathTable(props: FhirPathTableProps): JSX.Element {\n const medplum = useMedplum();\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { query, fields } = props;\n const [response, setResponse] = useState<SmartSearchResponse | undefined>();\n const [selected, setSelected] = useState<{ [id: string]: boolean }>({});\n\n const responseRef = useRef<SmartSearchResponse>();\n responseRef.current = response;\n\n const selectedRef = useRef<{ [id: string]: boolean }>({});\n selectedRef.current = selected;\n\n useEffect(() => {\n setOutcome(undefined);\n medplum\n .graphql(query)\n .then(setResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }, [medplum, query]);\n\n function handleSingleCheckboxClick(e: ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...selectedRef.current };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setSelected(newSelected);\n }\n\n function handleAllCheckboxClick(e: ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const resources = responseRef.current?.data.ResourceList;\n if (checked && resources) {\n resources.forEach((resource) => {\n if (resource.id) {\n newSelected[resource.id] = true;\n }\n });\n }\n setSelected(newSelected);\n }\n\n function isAllSelected(): boolean {\n const resources = responseRef.current?.data.ResourceList;\n if (!resources || resources.length === 0) {\n return false;\n }\n for (const resource of resources) {\n if (resource.id && !selectedRef.current[resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n function handleRowClick(e: MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n killEvent(e);\n\n if (e.button !== 1 && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (e.button === 1 && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n useEffect(() => {\n medplum\n .requestSchema(props.resourceType)\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum, props.resourceType]);\n\n if (!schemaLoaded) {\n return <Loader />;\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n\n return (\n <div onContextMenu={(e) => killEvent(e)} data-testid=\"search-control\">\n <Table>\n <Table.Thead>\n <Table.Tr>\n {checkboxColumn && (\n <Table.Th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </Table.Th>\n )}\n {fields.map((field) => (\n <Table.Th key={field.name}>{field.name}</Table.Th>\n ))}\n </Table.Tr>\n </Table.Thead>\n <Table.Tbody>\n {response?.data.ResourceList.map(\n (resource) =>\n resource && (\n <Table.Tr\n key={resource.id}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <Table.Td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </Table.Td>\n )}\n {fields.map((field) => {\n return (\n <Table.Td key={field.name}>\n <FhirPathDisplay propertyType={field.propertyType} path={field.fhirPath} resource={resource} />\n </Table.Td>\n );\n })}\n </Table.Tr>\n )\n )}\n </Table.Tbody>\n </Table>\n {response?.data.ResourceList.length === 0 && <div data-testid=\"empty-search\">No results</div>}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n {props.onBulk && (\n <Button onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(selectedRef.current))}>\n Bulk...\n </Button>\n )}\n </div>\n );\n}\n\nexport const MemoizedFhirPathTable = memo(FhirPathTable);\n", "import { evalFhirPath } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\n\nexport interface FhirPathDisplayProps {\n resource: Resource;\n path: string;\n propertyType: string;\n}\n\nexport function FhirPathDisplay(props: FhirPathDisplayProps): JSX.Element | null {\n let value;\n\n try {\n value = evalFhirPath(props.path, props.resource);\n } catch (err) {\n console.warn('FhirPathDisplay:', err);\n return null;\n }\n\n if (value.length > 1) {\n throw new Error(\n `Component \"path\" for \"FhirPathDisplay\" must resolve to a single element. \\\n Received ${value.length} elements \\\n [${JSON.stringify(value, null, 2)}]`\n );\n }\n return <ResourcePropertyDisplay value={value[0] || ''} propertyType={props.propertyType} />;\n}\n", "import {\n ActionIcon,\n Button,\n Center,\n Group,\n Loader,\n Menu,\n Pagination,\n Table,\n Text,\n UnstyledButton,\n} from '@mantine/core';\nimport { DEFAULT_SEARCH_COUNT, Filter, SearchRequest, formatSearchQuery, isDataTypeLoaded } from '@medplum/core';\nimport {\n Bundle,\n OperationOutcome,\n Resource,\n ResourceType,\n SearchParameter,\n UserConfiguration,\n} from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport {\n IconAdjustmentsHorizontal,\n IconBoxMultiple,\n IconColumns,\n IconFilePlus,\n IconFilter,\n IconRefresh,\n IconTableExport,\n IconTrash,\n} from '@tabler/icons-react';\nimport { ChangeEvent, MouseEvent, memo, useCallback, useEffect, useRef, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { SearchExportDialog } from '../SearchExportDialog/SearchExportDialog';\nimport { SearchFieldEditor } from '../SearchFieldEditor/SearchFieldEditor';\nimport { SearchFilterEditor } from '../SearchFilterEditor/SearchFilterEditor';\nimport { SearchFilterValueDialog } from '../SearchFilterValueDialog/SearchFilterValueDialog';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchPopupMenu } from '../SearchPopupMenu/SearchPopupMenu';\nimport { isCheckboxCell, killEvent } from '../utils/dom';\nimport classes from './SearchControl.module.css';\nimport { getFieldDefinitions } from './SearchControlField';\nimport { addFilter, buildFieldNameString, getOpString, renderValue, setPage } from './SearchUtils';\n\nexport class SearchChangeEvent extends Event {\n readonly definition: SearchRequest;\n\n constructor(definition: SearchRequest) {\n super('change');\n this.definition = definition;\n }\n}\n\nexport class SearchLoadEvent extends Event {\n readonly response: Bundle;\n\n constructor(response: Bundle) {\n super('load');\n this.response = response;\n }\n}\n\nexport class SearchClickEvent extends Event {\n readonly resource: Resource;\n readonly browserEvent: MouseEvent;\n\n constructor(resource: Resource, browserEvent: MouseEvent) {\n super('click');\n this.resource = resource;\n this.browserEvent = browserEvent;\n }\n}\n\nexport interface SearchControlProps {\n search: SearchRequest;\n userConfig?: UserConfiguration;\n checkboxesEnabled?: boolean;\n hideToolbar?: boolean;\n hideFilters?: boolean;\n onLoad?: (e: SearchLoadEvent) => void;\n onChange?: (e: SearchChangeEvent) => void;\n onClick?: (e: SearchClickEvent) => void;\n onAuxClick?: (e: SearchClickEvent) => void;\n onNew?: () => void;\n onExport?: () => void;\n onExportCsv?: () => void;\n onExportTransactionBundle?: () => void;\n onDelete?: (ids: string[]) => void;\n onPatch?: (ids: string[]) => void;\n onBulk?: (ids: string[]) => void;\n}\n\ninterface SearchControlState {\n searchResponse?: Bundle;\n selected: { [id: string]: boolean };\n fieldEditorVisible: boolean;\n filterEditorVisible: boolean;\n filterDialogVisible: boolean;\n exportDialogVisible: boolean;\n filterDialogFilter?: Filter;\n filterDialogSearchParam?: SearchParameter;\n}\n\n/**\n * The SearchControl component represents the embeddable search table control.\n * It includes the table, rows, headers, sorting, etc.\n * It does not include the field editor, filter editor, pagination buttons.\n * @param props - The SearchControl React props.\n * @returns The SearchControl React node.\n */\nexport function SearchControl(props: SearchControlProps): JSX.Element {\n const medplum = useMedplum();\n const [loadingSchema, setLoadingSchema] = useState<string>();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n const { search, onLoad } = props;\n\n const [state, setState] = useState<SearchControlState>({\n selected: {},\n fieldEditorVisible: false,\n filterEditorVisible: false,\n exportDialogVisible: false,\n filterDialogVisible: false,\n });\n\n const stateRef = useRef<SearchControlState>(state);\n stateRef.current = state;\n\n const totalType = search.total ?? 'accurate';\n\n const loadResults = useCallback(\n (options?: RequestInit) => {\n setOutcome(undefined);\n\n medplum\n .search(\n search.resourceType as ResourceType,\n formatSearchQuery({ ...search, total: totalType, fields: undefined }),\n options\n )\n .then((response) => {\n setState({ ...stateRef.current, searchResponse: response });\n if (onLoad) {\n onLoad(new SearchLoadEvent(response));\n }\n })\n .catch((reason) => {\n setState({ ...stateRef.current, searchResponse: undefined });\n setOutcome(reason);\n });\n },\n [medplum, search, totalType, onLoad]\n );\n\n const refreshResults = useCallback(() => {\n setState({ ...stateRef.current, searchResponse: undefined });\n loadResults({ cache: 'reload' });\n }, [loadResults]);\n\n useEffect(() => {\n loadResults();\n }, [loadResults]);\n\n function handleSingleCheckboxClick(e: ChangeEvent, id: string): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = { ...stateRef.current.selected };\n if (checked) {\n newSelected[id] = true;\n } else {\n delete newSelected[id];\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function handleAllCheckboxClick(e: ChangeEvent): void {\n e.stopPropagation();\n\n const el = e.target as HTMLInputElement;\n const checked = el.checked;\n const newSelected = {} as { [id: string]: boolean };\n const searchResponse = stateRef.current.searchResponse;\n if (checked && searchResponse?.entry) {\n searchResponse.entry.forEach((entry) => {\n if (entry.resource?.id) {\n newSelected[entry.resource.id] = true;\n }\n });\n }\n setState({ ...stateRef.current, selected: newSelected });\n }\n\n function isAllSelected(): boolean {\n const state = stateRef.current;\n if (!state.searchResponse?.entry || state.searchResponse.entry.length === 0) {\n return false;\n }\n for (const e of state.searchResponse.entry) {\n if (e.resource?.id && !state.selected[e.resource.id]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Emits a change event to the optional change listener.\n * @param newSearch - The new search definition.\n */\n function emitSearchChange(newSearch: SearchRequest): void {\n if (props.onChange) {\n props.onChange(new SearchChangeEvent(newSearch));\n }\n }\n\n /**\n * Handles a click on a order row.\n * @param e - The click event.\n * @param resource - The FHIR resource.\n */\n function handleRowClick(e: MouseEvent, resource: Resource): void {\n if (isCheckboxCell(e.target as Element)) {\n // Ignore clicks on checkboxes\n return;\n }\n\n if (e.button === 2) {\n // Ignore right clicks\n return;\n }\n\n killEvent(e);\n\n const isAux = e.button === 1 || e.ctrlKey || e.metaKey;\n\n if (!isAux && props.onClick) {\n props.onClick(new SearchClickEvent(resource, e));\n }\n\n if (isAux && props.onAuxClick) {\n props.onAuxClick(new SearchClickEvent(resource, e));\n }\n }\n\n function isExportPassed(): boolean {\n return !!(props.onExport ?? props.onExportCsv ?? props.onExportTransactionBundle);\n }\n\n useEffect(() => {\n setLoadingSchema(props.search.resourceType);\n medplum\n .requestSchema(props.search.resourceType as ResourceType)\n .catch(console.error)\n .finally(() => setLoadingSchema(undefined));\n }, [medplum, props.search.resourceType]);\n\n if (!isDataTypeLoaded(props.search.resourceType) || loadingSchema === props.search.resourceType) {\n return (\n <Center style={{ width: '100%', height: '100%' }}>\n <Loader />\n </Center>\n );\n }\n\n const checkboxColumn = props.checkboxesEnabled;\n const fields = getFieldDefinitions(search);\n const resourceType = search.resourceType;\n const lastResult = state.searchResponse;\n const entries = lastResult?.entry;\n const resources = entries?.map((e) => e.resource);\n\n const buttonVariant = 'subtle';\n const buttonColor = 'gray';\n const iconSize = 16;\n const isMobile = window.innerWidth < 768;\n\n return (\n <div className={classes.root} data-testid=\"search-control\">\n {!props.hideToolbar && (\n <Group justify=\"space-between\" mb=\"xl\">\n <Group gap={2}>\n <Button\n size=\"compact-md\"\n variant={buttonVariant}\n color={buttonColor}\n leftSection={<IconColumns size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, fieldEditorVisible: true })}\n >\n Fields\n </Button>\n <Button\n size=\"compact-md\"\n variant={buttonVariant}\n color={buttonColor}\n leftSection={<IconFilter size={iconSize} />}\n onClick={() => setState({ ...stateRef.current, filterEditorVisible: true })}\n >\n Filters\n </Button>\n {props.onNew && (\n <Button\n size=\"compact-md\"\n variant={buttonVariant}\n color={buttonColor}\n leftSection={<IconFilePlus size={iconSize} />}\n onClick={props.onNew}\n >\n New...\n </Button>\n )}\n {!isMobile && isExportPassed() && (\n <Button\n size=\"compact-md\"\n variant={buttonVariant}\n color={buttonColor}\n leftSection={<IconTableExport size={iconSize} />}\n onClick={\n props.onExport ? props.onExport : () => setState({ ...stateRef.current, exportDialogVisible: true })\n }\n >\n Export...\n </Button>\n )}\n {!isMobile && props.onDelete && (\n <Button\n size=\"compact-md\"\n variant={buttonVariant}\n color={buttonColor}\n leftSection={<IconTrash size={iconSize} />}\n onClick={() => (props.onDelete as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Delete...\n </Button>\n )}\n {!isMobile && props.onBulk && (\n <Button\n size=\"compact-md\"\n variant={buttonVariant}\n color={buttonColor}\n leftSection={<IconBoxMultiple size={iconSize} />}\n onClick={() => (props.onBulk as (ids: string[]) => any)(Object.keys(state.selected))}\n >\n Bulk...\n </Button>\n )}\n </Group>\n <Group gap={2}>\n {lastResult && (\n <Text size=\"xs\" c=\"dimmed\">\n {getStart(search, lastResult.total as number)}-{getEnd(search, lastResult.total as number)} of{' '}\n {`${totalType === 'estimate' ? '~' : ''}${lastResult.total?.toLocaleString()}`}\n </Text>\n )}\n <ActionIcon variant={buttonVariant} color={buttonColor} title=\"Refresh\" onClick={refreshResults}>\n <IconRefresh size={iconSize} />\n </ActionIcon>\n </Group>\n </Group>\n )}\n <Table className={classes.table}>\n <Table.Thead>\n <Table.Tr>\n {checkboxColumn && (\n <Table.Th>\n <input\n type=\"checkbox\"\n value=\"checked\"\n aria-label=\"all-checkbox\"\n data-testid=\"all-checkbox\"\n checked={isAllSelected()}\n onChange={(e) => handleAllCheckboxClick(e)}\n />\n </Table.Th>\n )}\n {fields.map((field) => (\n <Table.Th key={field.name}>\n <Menu shadow=\"md\" width={240} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton className={classes.control} p={2}>\n <Group justify=\"space-between\" wrap=\"nowrap\">\n <Text fw={500}>{buildFieldNameString(field.name)}</Text>\n <Center className={classes.icon}>\n <IconAdjustmentsHorizontal size={14} stroke={1.5} />\n </Center>\n </Group>\n </UnstyledButton>\n </Menu.Target>\n <SearchPopupMenu\n search={props.search}\n searchParams={field.searchParams}\n onPrompt={(searchParam, filter) => {\n setState({\n ...stateRef.current,\n filterDialogVisible: true,\n filterDialogSearchParam: searchParam,\n filterDialogFilter: filter,\n });\n }}\n onChange={(result) => {\n emitSearchChange(result);\n }}\n />\n </Menu>\n </Table.Th>\n ))}\n </Table.Tr>\n {!props.hideFilters && (\n <Table.Tr>\n {checkboxColumn && <Table.Th />}\n {fields.map((field) => (\n <Table.Th key={field.name}>\n {field.searchParams && (\n <FilterDescription\n resourceType={resourceType}\n searchParams={field.searchParams}\n filters={props.search.filters}\n />\n )}\n </Table.Th>\n ))}\n </Table.Tr>\n )}\n </Table.Thead>\n <Table.Tbody>\n {resources?.map(\n (resource) =>\n resource && (\n <Table.Tr\n key={resource.id}\n className={classes.tr}\n data-testid=\"search-control-row\"\n onClick={(e) => handleRowClick(e, resource)}\n onAuxClick={(e) => handleRowClick(e, resource)}\n >\n {checkboxColumn && (\n <Table.Td>\n <input\n type=\"checkbox\"\n value=\"checked\"\n data-testid=\"row-checkbox\"\n aria-label={`Checkbox for ${resource.id}`}\n checked={!!state.selected[resource.id as string]}\n onChange={(e) => handleSingleCheckboxClick(e, resource.id as string)}\n />\n </Table.Td>\n )}\n {fields.map((field) => (\n <Table.Td key={field.name}>{renderValue(resource, field)}</Table.Td>\n ))}\n </Table.Tr>\n )\n )}\n </Table.Tbody>\n </Table>\n {resources?.length === 0 && (\n <Container>\n <Center style={{ height: 150 }}>\n <Text size=\"xl\" c=\"dimmed\">\n No results\n </Text>\n </Center>\n </Container>\n )}\n {lastResult?.total !== undefined && lastResult.total > 0 && (\n <Center m=\"md\" p=\"md\">\n <Pagination\n value={getPage(search)}\n total={getTotalPages(search, lastResult.total)}\n onChange={(newPage) => emitSearchChange(setPage(search, newPage))}\n getControlProps={(control) => {\n switch (control) {\n case 'previous':\n return { 'aria-label': 'Previous page' };\n case 'next':\n return { 'aria-label': 'Next page' };\n default:\n return {};\n }\n }}\n />\n </Center>\n )}\n {outcome && (\n <div data-testid=\"search-error\">\n <pre style={{ textAlign: 'left' }}>{JSON.stringify(outcome, undefined, 2)}</pre>\n </div>\n )}\n <SearchFieldEditor\n search={props.search}\n visible={stateRef.current.fieldEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n fieldEditorVisible: false,\n });\n }}\n />\n <SearchFilterEditor\n search={props.search}\n visible={stateRef.current.filterEditorVisible}\n onOk={(result) => {\n emitSearchChange(result);\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterEditorVisible: false,\n });\n }}\n />\n <SearchExportDialog\n visible={stateRef.current.exportDialogVisible}\n exportCsv={props.onExportCsv}\n exportTransactionBundle={props.onExportTransactionBundle}\n onCancel={() => {\n setState({\n ...stateRef.current,\n exportDialogVisible: false,\n });\n }}\n />\n <SearchFilterValueDialog\n key={state.filterDialogSearchParam?.code}\n visible={stateRef.current.filterDialogVisible}\n title={state.filterDialogSearchParam?.code ? buildFieldNameString(state.filterDialogSearchParam.code) : ''}\n resourceType={resourceType}\n searchParam={state.filterDialogSearchParam}\n filter={state.filterDialogFilter}\n defaultValue=\"\"\n onOk={(filter) => {\n emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n onCancel={() => {\n setState({\n ...stateRef.current,\n filterDialogVisible: false,\n });\n }}\n />\n </div>\n );\n}\n\nexport const MemoizedSearchControl = memo(SearchControl);\n\ninterface FilterDescriptionProps {\n readonly resourceType: string;\n readonly searchParams: SearchParameter[];\n readonly filters?: Filter[];\n}\n\nfunction FilterDescription(props: FilterDescriptionProps): JSX.Element {\n const filters = (props.filters ?? []).filter((f) => props.searchParams.find((p) => p.code === f.code));\n if (filters.length === 0) {\n return <span>no filters</span>;\n }\n\n return (\n <>\n {filters.map((filter: Filter) => (\n <div key={`filter-${filter.code}-${filter.operator}-${filter.value}`}>\n {getOpString(filter.operator)}\n &nbsp;\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </div>\n ))}\n </>\n );\n}\n\nfunction getPage(search: SearchRequest): number {\n return Math.floor((search.offset ?? 0) / (search.count ?? DEFAULT_SEARCH_COUNT)) + 1;\n}\n\nfunction getTotalPages(search: SearchRequest, total: number): number {\n const pageSize = search.count ?? DEFAULT_SEARCH_COUNT;\n return Math.ceil(total / pageSize);\n}\n\nfunction getStart(search: SearchRequest, total: number): number {\n return Math.min(total, (search.offset ?? 0) + 1);\n}\n\nfunction getEnd(search: SearchRequest, total: number): number {\n return Math.min(total, ((search.offset ?? 0) + 1) * (search.count ?? DEFAULT_SEARCH_COUNT));\n}\n", "import { Box, Button, Modal, Text } from '@mantine/core';\n\ninterface SearchExportDialogProps {\n visible: boolean;\n exportCsv?: () => void;\n exportTransactionBundle?: () => void;\n onCancel: () => void;\n}\n\nexport function SearchExportDialog(props: SearchExportDialogProps): JSX.Element | null {\n return (\n <Modal title=\"Export\" closeButtonProps={{ 'aria-label': 'Close' }} opened={props.visible} onClose={props.onCancel}>\n <Box display=\"flex\" style={{ justifyContent: 'space-between' }}>\n {props.exportCsv && <ExportButton text=\"CSV\" exportLogic={props.exportCsv} onCancel={props.onCancel} />}\n {props.exportTransactionBundle && (\n <ExportButton\n text=\"Transaction Bundle\"\n exportLogic={props.exportTransactionBundle}\n onCancel={props.onCancel}\n />\n )}\n </Box>\n <Text style={{ marginTop: '10px', marginLeft: '2px' }}>Limited to 1000 records</Text>\n </Modal>\n );\n}\n\ninterface ExportButtonProps {\n text: string;\n exportLogic: () => void;\n onCancel: () => void;\n}\n\nexport function ExportButton(props: ExportButtonProps): JSX.Element {\n return (\n <Button\n onClick={() => {\n props.exportLogic();\n props.onCancel();\n }}\n >\n {`Export as ${props.text}`}\n </Button>\n );\n}\n", "import { Button, Group, Modal, MultiSelect, Stack } from '@mantine/core';\nimport { InternalTypeSchema, SearchRequest, getDataType, getSearchParameters, stringify } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { buildFieldNameString } from '../SearchControl/SearchUtils';\n\nexport interface SearchFieldEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFieldEditor(props: SearchFieldEditorProps): JSX.Element | null {\n const wasDropdownOpen = useRef(false);\n const [state, setState] = useState({\n search: JSON.parse(stringify(props.search)) as SearchRequest,\n });\n\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n\n useEffect(() => {\n setState({ search: props.search });\n }, [props.search]);\n\n const allFields = useMemo(() => {\n if (!props.visible) {\n return [];\n }\n\n const resourceType = props.search.resourceType;\n const typeSchema = getDataType(resourceType);\n const searchParams = getSearchParameters(resourceType);\n return getFieldsList(typeSchema, searchParams)\n .sort((a, b) => a.localeCompare(b))\n .map((field) => {\n return { value: field, label: buildFieldNameString(field) };\n });\n }, [props.visible, props.search.resourceType]);\n\n if (!props.visible) {\n return null;\n }\n\n function handleChange(newFields: string[]): void {\n setState({ search: { ...state.search, fields: newFields } });\n }\n\n return (\n <Modal\n title=\"Fields\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n opened={props.visible}\n onClose={() => {\n props.onCancel();\n }}\n size=\"auto\"\n /*\n By default, the MultiSelect dropdown does not interact well with Modal's closeOnClickOutside:\n When the MultiSelect's dropdown is opened and the user clicks outside of the dropdown to close it\n (and outside the modal, i.e. clicks on the Modal's overlay), the Modal is undesirably also closed\n from the same click.\n\n Due to the sequencing of the events fired during a click on the overlay and when React\n rerenders of various components occur, it is not possible to simply do something such as setting\n closeOnClickOutside={!isDropdownOpened}:\n\n * user begins a click on the overlay which triggers\n * mousedown event on the overlay which triggers\n * blur event on the MultiSelect's input element which invokes\n * the MultiSelect.onDropdownClose callback which calls setIsDropdownOpen(false) which causes\n * rerender of SearchFieldEditor with isDropdownOpen set to false\n * the user ends the click which triggers\n * click event on the Modal which activates the closeOnClickOutside logic\n * since isDropdownOpen is false, closeOnClickOutside is true, so the Modal closes\n\n Instead, emulate closeOnClickOutside's behavior only when the MultiSelect dropdown\n was not open at the beginning of the click\n */\n withOverlay\n closeOnClickOutside={false}\n overlayProps={{\n onMouseDownCapture: () => {\n // capture whether the MultiSelect dropdown is open when a click on the overlay begins (i.e. mousedown)\n wasDropdownOpen.current = isDropdownOpen;\n },\n onClick: () => {\n if (!wasDropdownOpen.current) {\n // invoke onCancel callback since the dropdown wasn't open at the start of the click on the overlay\n props.onCancel();\n }\n\n // not strictly needed since onMouseDownCapture should always precede onClick, but reset the ref\n wasDropdownOpen.current = false;\n },\n children: <div data-testid=\"overlay-child\" />, // can't specify testid on the overlay itself\n }}\n >\n <Stack>\n <MultiSelect\n // withinPortal={true}\n style={{ width: 550 }}\n placeholder=\"Select fields to display\"\n data={allFields}\n value={state.search.fields ?? []}\n onChange={handleChange}\n onDropdownOpen={() => setIsDropdownOpen(true)}\n onDropdownClose={() => setIsDropdownOpen(false)}\n /* shows at most ~6.5 items; the extra half to provide a hint that there are more entries to scroll through */\n maxDropdownHeight=\"250px\"\n // dropdownPosition=\"bottom\"\n clearButtonProps={{ 'aria-label': 'Clear selection' }}\n clearable\n searchable\n />\n <Group justify=\"flex-end\">\n <Button onClick={() => props.onOk(state.search)}>OK</Button>\n </Group>\n </Stack>\n </Modal>\n );\n}\n\n/**\n * Returns a list of fields/columns available for a type.\n * The result is the union of properties and search parameters.\n * @param typeSchema - The type definition.\n * @param searchParams - The search parameters.\n * @returns A list of fields/columns available for a resource type.\n */\nfunction getFieldsList(\n typeSchema: InternalTypeSchema,\n searchParams: Record<string, SearchParameter> | undefined\n): string[] {\n const result = [] as string[];\n const keys = new Set<string>();\n const names = new Set<string>();\n\n // Add properties first\n for (const key of Object.keys(typeSchema.elements)) {\n result.push(key);\n keys.add(key.toLowerCase());\n names.add(buildFieldNameString(key));\n }\n\n // Add search parameters if unique\n if (searchParams) {\n for (const code of Object.keys(searchParams)) {\n const name = buildFieldNameString(code);\n if (!keys.has(code) && !names.has(name)) {\n result.push(code);\n keys.add(code);\n names.add(name);\n }\n }\n }\n\n return result;\n}\n", "import {\n capitalize,\n DEFAULT_SEARCH_COUNT,\n evalFhirPathTyped,\n Filter,\n formatDateTime,\n InternalSchemaElement,\n Operator,\n SearchRequest,\n} from '@medplum/core';\nimport { Resource, SearchParameter } from '@medplum/fhirtypes';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.utils';\nimport { SearchControlField } from './SearchControlField';\n\nconst searchParamToOperators: Record<string, Operator[]> = {\n string: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n fulltext: [Operator.EQUALS, Operator.NOT, Operator.CONTAINS, Operator.EXACT],\n token: [Operator.EQUALS, Operator.NOT],\n reference: [Operator.EQUALS, Operator.NOT],\n numeric: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n quantity: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n ],\n date: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n datetime: [\n Operator.EQUALS,\n Operator.NOT_EQUALS,\n Operator.GREATER_THAN,\n Operator.LESS_THAN,\n Operator.GREATER_THAN_OR_EQUALS,\n Operator.LESS_THAN_OR_EQUALS,\n Operator.STARTS_AFTER,\n Operator.ENDS_BEFORE,\n Operator.APPROXIMATELY,\n ],\n};\n\nconst operatorNames: Record<Operator, string> = {\n eq: 'equals',\n ne: 'not equals',\n gt: 'greater than',\n lt: 'less than',\n ge: 'greater than or equals',\n le: 'less than or equals',\n sa: 'starts after',\n eb: 'ends before',\n ap: 'approximately',\n contains: 'contains',\n exact: 'exact',\n text: 'text',\n not: 'not',\n above: 'above',\n below: 'below',\n in: 'in',\n 'not-in': 'not in',\n 'of-type': 'of type',\n missing: 'missing',\n identifier: 'identifier',\n iterate: 'iterate',\n};\n\n/**\n * Sets the array of filters.\n * @param definition - The original search request.\n * @param filters - The new filters.\n * @returns The updated search request.\n */\nexport function setFilters(definition: SearchRequest, filters: Filter[]): SearchRequest {\n return {\n ...definition,\n filters: filters,\n offset: 0,\n name: undefined,\n };\n}\n\n/**\n * Clears all of the filters.\n * @param definition - The original search request.\n * @returns The updated search request.\n */\nexport function clearFilters(definition: SearchRequest): SearchRequest {\n return setFilters(definition, []);\n}\n\n/**\n * Clears all of the filters on a certain field.\n * @param definition - The original search request.\n * @param code - The field key name to clear filters.\n * @returns The updated search request.\n */\nexport function clearFiltersOnField(definition: SearchRequest, code: string): SearchRequest {\n return setFilters(\n definition,\n (definition.filters ?? []).filter((f) => f.code !== code)\n );\n}\n\n/**\n * Adds a filter.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param op - The operation key name.\n * @param value - The filter value.\n * @param opt_clear - Optional flag to clear filters on the field.\n * @returns The updated search request.\n */\nexport function addFilter(\n definition: SearchRequest,\n field: string,\n op: Operator,\n value?: string,\n opt_clear?: boolean\n): SearchRequest {\n if (opt_clear) {\n definition = clearFiltersOnField(definition, field);\n }\n\n const nextFilters: Filter[] = [];\n if (definition.filters) {\n nextFilters.push(...definition.filters);\n }\n nextFilters.push({ code: field, operator: op, value: value ?? '' });\n\n return setFilters(definition, nextFilters);\n}\n\n/**\n * Adds a field.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addField(definition: SearchRequest, field: string): SearchRequest {\n if (definition.fields?.includes(field)) {\n return definition;\n }\n const newFields = [];\n if (definition.fields) {\n newFields.push(...definition.fields);\n }\n newFields.push(field);\n return {\n ...definition,\n fields: newFields,\n name: undefined,\n };\n}\n\n/**\n * Deletes a filter at the specified index.\n * @param definition - The original search request.\n * @param index - The filter index.\n * @returns The updated search request.\n */\nexport function deleteFilter(definition: SearchRequest, index: number): SearchRequest {\n if (!definition.filters) {\n return definition;\n }\n const newFilters = [...definition.filters];\n newFilters.splice(index, 1);\n return {\n ...definition,\n filters: newFilters,\n name: undefined,\n };\n}\n\n/**\n * Adds a filter that constrains the specified field to \"yesterday\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addYesterdayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"today\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addTodayFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"tomorrow\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addTomorrowFilter(definition: SearchRequest, field: string): SearchRequest {\n return addDayFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a day.\n * The day is specified as a delta from the current day.\n * \"Today\" would be 0.\n * \"Yesterday\" would be -1.\n * \"Tomorrow\" would be 1.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param delta - The number of days from this day.\n * @returns The updated search request.\n */\nfunction addDayFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setDate(startTime.getDate() + delta);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setDate(endTime.getDate() + 1);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"last month\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addLastMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, -1);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"this month\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addThisMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 0);\n}\n\n/**\n * Adds a filter that constrains the specified field to \"next month\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addNextMonthFilter(definition: SearchRequest, field: string): SearchRequest {\n return addMonthFilter(definition, field, 1);\n}\n\n/**\n * Adds a filter that constrains the specified field to a month.\n * The month is specified as a delta from the current month.\n * \"This month\" would be 0.\n * \"Last month\" would be -1.\n * \"Next month\" would be 1.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param delta - The number of months from this month.\n * @returns The updated search request.\n */\nfunction addMonthFilter(definition: SearchRequest, field: string, delta: number): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(startTime.getMonth() + delta);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date(startTime.getTime());\n endTime.setMonth(endTime.getMonth() + 1);\n endTime.setDate(1);\n endTime.setHours(0, 0, 0, 0);\n endTime.setTime(endTime.getTime() - 1);\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter that constrains the specified field to the year to date.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @returns The updated search request.\n */\nexport function addYearToDateFilter(definition: SearchRequest, field: string): SearchRequest {\n const startTime = new Date();\n startTime.setMonth(0);\n startTime.setDate(1);\n startTime.setHours(0, 0, 0, 0);\n\n const endTime = new Date();\n\n return addDateFilterBetween(definition, field, startTime, endTime);\n}\n\n/**\n * Adds a filter for a date between two dates (inclusive of both dates).\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param d1 - The start date.\n * @param d2 - The end date.\n * @returns The updated search request.\n */\nexport function addDateFilterBetween(definition: SearchRequest, field: string, d1: Date, d2: Date): SearchRequest {\n definition = clearFiltersOnField(definition, field);\n definition = addDateFilterImpl(definition, field, Operator.GREATER_THAN_OR_EQUALS, d1);\n definition = addDateFilterImpl(definition, field, Operator.LESS_THAN_OR_EQUALS, d2);\n return definition;\n}\n\n/**\n * Adds a filter for a date before a certain date/time.\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param op - The date/time operation.\n * @param value - The date.\n * @returns The updated search request.\n */\nfunction addDateFilterImpl(definition: SearchRequest, field: string, op: Operator, value: Date): SearchRequest {\n return addFilter(definition, field, op, value.toISOString());\n}\n\n/**\n * Adds a filter that constrains the specified field to \"missing\".\n * @param definition - The original search request.\n * @param field - The field key name.\n * @param value - Optional boolean value. Default is true.\n * @returns The updated search request.\n */\nexport function addMissingFilter(definition: SearchRequest, field: string, value = true): SearchRequest {\n return addFilter(definition, field, Operator.MISSING, value.toString());\n}\n\n/**\n * Sets the offset (starting at zero).\n * @param definition - The original search request.\n * @param offset - The offset number.\n * @returns The updated search request.\n */\nexport function setOffset(definition: SearchRequest, offset: number): SearchRequest {\n if (definition.offset === offset) {\n return definition;\n }\n return {\n ...definition,\n offset,\n name: undefined,\n };\n}\n\n/**\n * Creates a new search request with the search offset at the specified page.\n * @param definition - The search definition.\n * @param page - The new page number\n * @returns The new search definition.\n */\nexport function setPage(definition: SearchRequest, page: number): SearchRequest {\n const count = definition.count ?? DEFAULT_SEARCH_COUNT;\n const newOffset = (page - 1) * count;\n return setOffset(definition, newOffset);\n}\n\n/**\n * Sorts the search by the specified key, and optional direction.\n * Direction defaults to ascending ('asc') if not specified.\n * @param definition - The original search request.\n * @param sort - The sort key.\n * @param desc - Optional descending flag. Default is false.\n * @returns The updated search request.\n */\nexport function setSort(definition: SearchRequest, sort: string, desc?: boolean): SearchRequest {\n if (sort === getSortField(definition) && desc !== undefined && desc === isSortDescending(definition)) {\n return definition;\n }\n return {\n ...definition,\n sortRules: [\n {\n code: sort,\n descending: !!desc,\n },\n ],\n name: undefined,\n };\n}\n\n/**\n * Toggles the sort of the search by key.\n * If the search is already sorted by the key, reverses the direction.\n * If the search is not sorted by the key, sort in ascending order.\n * @param definition - The original search request.\n * @param key - The field key name.\n * @returns The updated search request.\n */\nexport function toggleSort(definition: SearchRequest, key: string): SearchRequest {\n let desc = false;\n if (getSortField(definition) === key) {\n desc = !isSortDescending(definition);\n }\n return setSort(definition, key, desc);\n}\n\nexport function getSortField(definition: SearchRequest): string | undefined {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return undefined;\n }\n const field = sortRules[0].code;\n return field.startsWith('-') ? field.substr(1) : field;\n}\n\nexport function isSortDescending(definition: SearchRequest): boolean {\n const sortRules = definition.sortRules;\n if (!sortRules || sortRules.length === 0) {\n return false;\n }\n return !!sortRules[0].descending;\n}\n\n/**\n * Returns a list of operators for a search parameter.\n * @param searchParam - The search parameter.\n * @returns The list of operators that can be used for the search parameter.\n */\nexport function getSearchOperators(searchParam: SearchParameter): Operator[] | undefined {\n return searchParamToOperators[searchParam.type as string];\n}\n\n/**\n * Returns a string representing the operation.\n * @param op - The operation code.\n * @returns A display string for the operation.\n */\nexport function getOpString(op: Operator): string {\n return operatorNames[op] ?? '';\n}\n\n/**\n * Returns a field display name.\n * @param key - The field key.\n * @returns The field display name.\n */\nexport function buildFieldNameString(key: string): string {\n let tmp = key;\n\n // If dot separated, only the last part\n if (tmp.includes('.')) {\n tmp = tmp.split('.').pop() as string;\n }\n\n // Special case for Version ID\n if (tmp === 'versionId') {\n return 'Version ID';\n }\n\n // Remove choice of type\n tmp = tmp.replace('[x]', '');\n\n // Convert camel case to space separated\n tmp = tmp.replace(/([A-Z])/g, ' $1');\n\n // Convert dashes and underscores to spaces\n tmp = tmp.replace(/[-_]/g, ' ');\n\n // Normalize whitespace to single space character\n tmp = tmp.replace(/\\s+/g, ' ');\n\n // Trim\n tmp = tmp.trim();\n\n // Special case for ID\n if (tmp.toLowerCase() === 'id') {\n return 'ID';\n }\n\n // Capitalize the first letter of each word\n return tmp.split(/\\s/).map(capitalize).join(' ');\n}\n\n/**\n * Returns a fragment to be displayed in the search table for the value.\n * @param resource - The parent resource.\n * @param field - The search code or FHIRPath expression.\n * @returns The fragment to display.\n */\nexport function renderValue(resource: Resource, field: SearchControlField): string | JSX.Element | null | undefined {\n const key = field.name;\n if (key === 'id') {\n return resource.id;\n }\n\n if (key === 'meta.versionId') {\n return resource.meta?.versionId;\n }\n\n if (key === '_lastUpdated') {\n return formatDateTime(resource.meta?.lastUpdated);\n }\n\n // Priority 1: InternalSchemaElement by exact match\n if (field.elementDefinition && `${resource.resourceType}.${field.name}` === field.elementDefinition.path) {\n return renderPropertyValue(resource, field.elementDefinition);\n }\n\n // Priority 2: SearchParameter by exact match\n if (field.searchParams && field.searchParams.length === 1 && field.name === field.searchParams[0].code) {\n return renderSearchParameterValue(resource, field.searchParams[0]);\n }\n\n // We don't know how to render this field definition\n return null;\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a resource property.\n * @param resource - The parent resource.\n * @param elementDefinition - The property element definition.\n * @returns A React element or null.\n */\nfunction renderPropertyValue(resource: Resource, elementDefinition: InternalSchemaElement): JSX.Element | null {\n const path = elementDefinition.path?.split('.')?.pop()?.replaceAll('[x]', '') ?? '';\n const [value, propertyType] = getValueAndType({ type: resource.resourceType, value: resource }, path);\n if (!value) {\n return null;\n }\n\n return (\n <ResourcePropertyDisplay\n property={elementDefinition}\n propertyType={propertyType}\n value={value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n );\n}\n\n/**\n * Returns a fragment to be displayed in the search table for a search parameter.\n * @param resource - The parent resource.\n * @param searchParam - The search parameter.\n * @returns A React element or null.\n */\nfunction renderSearchParameterValue(resource: Resource, searchParam: SearchParameter): JSX.Element | null {\n const value = evalFhirPathTyped(searchParam.expression as string, [{ type: resource.resourceType, value: resource }]);\n if (!value || value.length === 0) {\n return null;\n }\n\n return (\n <>\n {value.map((v, index) => (\n <ResourcePropertyDisplay\n key={`${index}-${value.length}`}\n propertyType={v.type}\n value={v.value}\n maxWidth={200}\n ignoreMissingValues={true}\n link={false}\n />\n ))}\n </>\n );\n}\n", "import { Button, Group, Modal, NativeSelect } from '@mantine/core';\nimport { Filter, getSearchParameters, Operator, SearchRequest, stringify } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport { useEffect, useRef, useState } from 'react';\nimport {\n addFilter,\n buildFieldNameString,\n deleteFilter,\n getOpString,\n getSearchOperators,\n setFilters,\n} from '../SearchControl/SearchUtils';\nimport { SearchFilterValueDisplay } from '../SearchFilterValueDisplay/SearchFilterValueDisplay';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterEditorProps {\n visible: boolean;\n search: SearchRequest;\n onOk: (search: SearchRequest) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterEditor(props: SearchFilterEditorProps): JSX.Element | null {\n const [search, setSearch] = useState<SearchRequest>(JSON.parse(stringify(props.search)) as SearchRequest);\n const [editingIndex, setEditingIndex] = useState<number>(-1);\n\n const searchRef = useRef<SearchRequest>(search);\n searchRef.current = search;\n\n useEffect(() => {\n setSearch(JSON.parse(stringify(props.search)) as SearchRequest);\n }, [props.search]);\n\n function onAddFilter(filter: Filter): void {\n setSearch(addFilter(searchRef.current, filter.code, filter.operator, filter.value));\n }\n\n if (!props.visible) {\n return null;\n }\n\n const resourceType = props.search.resourceType;\n const searchParams = getSearchParameters(resourceType) ?? {};\n const filters = search.filters || [];\n\n return (\n <Modal\n title=\"Filters\"\n closeButtonProps={{ 'aria-label': 'Close' }}\n size={900}\n opened={props.visible}\n onClose={props.onCancel}\n >\n <div>\n <table>\n <colgroup>\n <col style={{ width: 200 }} />\n <col style={{ width: 200 }} />\n <col style={{ width: 380 }} />\n <col style={{ width: 120 }} />\n </colgroup>\n <thead>\n <tr>\n <th>Field</th>\n <th>Operation</th>\n <th>Value</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n {filters.map((filter: Filter, index: number) => {\n if (index === editingIndex) {\n return (\n <FilterRowInput\n key={`filter-${filter.code}-${filter.operator}-${filter.value}-input`}\n resourceType={resourceType}\n searchParams={searchParams}\n defaultValue={filter}\n okText=\"Save\"\n onOk={(newFilter: Filter) => {\n const newFilters = [...filters];\n newFilters[index] = newFilter;\n setSearch(setFilters(searchRef.current, newFilters));\n setEditingIndex(-1);\n }}\n onCancel={() => setEditingIndex(-1)}\n />\n );\n } else {\n return (\n <FilterRowDisplay\n key={`filter-${filter.code}-${filter.operator}-${filter.value}-display`}\n resourceType={resourceType}\n searchParams={searchParams}\n filter={filter}\n onEdit={() => setEditingIndex(index)}\n onDelete={() => setSearch(deleteFilter(searchRef.current, index))}\n />\n );\n }\n })}\n <FilterRowInput resourceType={resourceType} searchParams={searchParams} okText=\"Add\" onOk={onAddFilter} />\n </tbody>\n </table>\n </div>\n <Group justify=\"flex-end\" mt=\"xl\">\n <Button onClick={() => props.onOk(searchRef.current)}>OK</Button>\n </Group>\n </Modal>\n );\n}\n\ninterface FilterRowDisplayProps {\n readonly searchParams: Record<string, SearchParameter>;\n readonly resourceType: string;\n readonly filter: Filter;\n readonly onEdit: () => void;\n readonly onDelete: () => void;\n}\n\nfunction FilterRowDisplay(props: FilterRowDisplayProps): JSX.Element | null {\n const { filter } = props;\n return (\n <tr>\n <td>{buildFieldNameString(filter.code)}</td>\n <td>{getOpString(filter.operator)}</td>\n <td>\n <SearchFilterValueDisplay resourceType={props.resourceType} filter={filter} />\n </td>\n <td>\n <Button size=\"compact-md\" variant=\"outline\" onClick={props.onEdit}>\n Edit\n </Button>\n <Button size=\"size-md\" variant=\"outline\" onClick={props.onDelete}>\n Delete\n </Button>\n </td>\n </tr>\n );\n}\n\ninterface FilterRowInputProps {\n resourceType: string;\n searchParams: Record<string, SearchParameter>;\n defaultValue?: Filter;\n okText: string;\n onOk: (value: Filter) => void;\n onCancel?: () => void;\n}\n\nfunction FilterRowInput(props: FilterRowInputProps): JSX.Element {\n const [value, setValue] = useState<Filter>(props.defaultValue ?? ({} as Filter));\n const valueRef = useRef<Filter>(value);\n valueRef.current = value;\n\n function setFilterCode(newCode: string): void {\n setValue({ ...valueRef.current, code: newCode });\n }\n\n function setFilterOperator(newOperator: Operator): void {\n setValue({ ...valueRef.current, operator: newOperator });\n }\n\n function setFilterValue(newFilterValue: string): void {\n setValue({ ...valueRef.current, value: newFilterValue });\n }\n\n const searchParam = props.searchParams[value.code];\n const operators = searchParam && getSearchOperators(searchParam);\n\n return (\n <tr>\n <td>\n <NativeSelect\n data-testid=\"filter-field\"\n defaultValue={valueRef.current.code}\n onChange={(e) => setFilterCode(e.currentTarget.value)}\n data={[\n '',\n ...Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) })),\n ]}\n />\n </td>\n <td>\n {operators && (\n <NativeSelect\n data-testid=\"filter-operation\"\n defaultValue={value.operator}\n onChange={(e) => setFilterOperator(e.currentTarget.value as Operator)}\n data={['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))]}\n />\n )}\n </td>\n <td>\n {searchParam && value.operator && (\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={searchParam}\n defaultValue={value.value}\n onChange={setFilterValue}\n />\n )}\n </td>\n <td>\n {value.code && value.operator && (\n <Button\n size=\"compact-md\"\n variant=\"outline\"\n onClick={() => {\n props.onOk(valueRef.current);\n setValue({} as Filter);\n }}\n >\n {props.okText}\n </Button>\n )}\n {props.onCancel && (\n <Button size=\"compact-md\" variant=\"outline\" onClick={props.onCancel}>\n Cancel\n </Button>\n )}\n </td>\n </tr>\n );\n}\n", "import {\n Filter,\n formatDateTime,\n getSearchParameterDetails,\n globalSchema,\n Operator,\n SearchParameterType,\n} from '@medplum/core';\nimport { ResourceName } from '../ResourceName/ResourceName';\n\nexport interface SearchFilterValueDisplayProps {\n readonly resourceType: string;\n readonly filter: Filter;\n}\n\nexport function SearchFilterValueDisplay(props: SearchFilterValueDisplayProps): JSX.Element {\n const { resourceType, filter } = props;\n\n const searchParam = globalSchema.types[resourceType].searchParams?.[filter.code];\n if (searchParam) {\n if (\n searchParam.type === 'reference' &&\n (filter.operator === Operator.EQUALS || filter.operator === Operator.NOT_EQUALS)\n ) {\n return <ResourceName value={{ reference: filter.value }} />;\n }\n\n const searchParamDetails = getSearchParameterDetails(resourceType, searchParam);\n if (filter.code === '_lastUpdated' || searchParamDetails.type === SearchParameterType.DATETIME) {\n return <>{formatDateTime(filter.value)}</>;\n }\n }\n\n return <>{filter.value}</>;\n}\n", "import { Checkbox, TextInput } from '@mantine/core';\nimport { getSearchParameterDetails, SearchParameterType } from '@medplum/core';\nimport { Quantity, Reference, SearchParameter } from '@medplum/fhirtypes';\nimport { DateTimeInput } from '../DateTimeInput/DateTimeInput';\nimport { QuantityInput } from '../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../ReferenceInput/ReferenceInput';\n\nexport interface SearchFilterValueInputProps {\n resourceType: string;\n searchParam: SearchParameter;\n defaultValue?: string;\n autoFocus?: boolean;\n onChange: (value: string) => void;\n}\n\nexport function SearchFilterValueInput(props: SearchFilterValueInputProps): JSX.Element | null {\n const details = getSearchParameterDetails(props.resourceType, props.searchParam);\n const name = 'filter-value';\n\n switch (details.type) {\n case SearchParameterType.REFERENCE:\n return (\n <ReferenceInput\n name={name}\n defaultValue={props.defaultValue ? { reference: props.defaultValue } : undefined}\n targetTypes={props.searchParam.target}\n autoFocus={props.autoFocus}\n onChange={(newReference: Reference | undefined) => {\n if (newReference) {\n props.onChange(newReference.reference as string);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n case SearchParameterType.BOOLEAN:\n return (\n <Checkbox\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultChecked={props.defaultValue === 'true'}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.checked.toString())}\n />\n );\n\n case SearchParameterType.DATE:\n return (\n <TextInput\n type=\"date\"\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.DATETIME:\n return (\n <DateTimeInput\n name={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={props.onChange}\n />\n );\n\n case SearchParameterType.NUMBER:\n return (\n <TextInput\n type=\"number\"\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n />\n );\n\n case SearchParameterType.QUANTITY:\n return (\n <QuantityInput\n name={name}\n defaultValue={tryParseQuantity(props.defaultValue)}\n autoFocus={props.autoFocus}\n onChange={(newQuantity: Quantity | undefined) => {\n if (newQuantity) {\n props.onChange(`${newQuantity.value}`);\n } else {\n props.onChange('');\n }\n }}\n />\n );\n\n default:\n return (\n <TextInput\n name={name}\n data-autofocus={props.autoFocus}\n data-testid={name}\n defaultValue={props.defaultValue}\n autoFocus={props.autoFocus}\n onChange={(e) => props.onChange(e.currentTarget.value)}\n placeholder=\"Search value\"\n />\n );\n }\n}\n\nfunction tryParseQuantity(value: string | undefined): Quantity | undefined {\n if (value) {\n const [valueString, systemString, unitString] = value.split('|');\n if (valueString) {\n return {\n value: parseFloat(valueString),\n system: systemString,\n unit: unitString,\n };\n }\n }\n return undefined;\n}\n", "import { Button, Grid, Modal } from '@mantine/core';\nimport { Filter } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { SearchFilterValueInput } from '../SearchFilterValueInput/SearchFilterValueInput';\n\nexport interface SearchFilterValueDialogProps {\n title: string;\n visible: boolean;\n resourceType: string;\n searchParam?: SearchParameter;\n filter?: Filter;\n defaultValue?: string;\n onOk: (filter: Filter) => void;\n onCancel: () => void;\n}\n\nexport function SearchFilterValueDialog(props: SearchFilterValueDialogProps): JSX.Element | null {\n const [value, setValue] = useState<string>(props.defaultValue ?? '');\n\n if (!props.visible || !props.searchParam || !props.filter) {\n return null;\n }\n\n function onOk(): void {\n props.onOk({ ...(props.filter as Filter), value });\n }\n\n return (\n <Modal title={props.title} size=\"xl\" opened={props.visible} onClose={props.onCancel}>\n <Form onSubmit={onOk}>\n <Grid>\n <Grid.Col span={10}>\n <SearchFilterValueInput\n resourceType={props.resourceType}\n searchParam={props.searchParam}\n defaultValue={value}\n autoFocus={true}\n onChange={setValue}\n />\n </Grid.Col>\n <Grid.Col span={2}>\n <Button onClick={onOk} fullWidth>\n OK\n </Button>\n </Grid.Col>\n </Grid>\n </Form>\n </Modal>\n );\n}\n", "import { Menu } from '@mantine/core';\nimport { Filter, Operator, SearchRequest } from '@medplum/core';\nimport { SearchParameter } from '@medplum/fhirtypes';\nimport {\n IconBleach,\n IconBleachOff,\n IconBracketsContain,\n IconBucket,\n IconBucketOff,\n IconCalendar,\n IconEqual,\n IconEqualNot,\n IconMathGreater,\n IconMathLower,\n IconSettings,\n IconSortAscending,\n IconSortDescending,\n IconX,\n} from '@tabler/icons-react';\nimport {\n addLastMonthFilter,\n addMissingFilter,\n addNextMonthFilter,\n addThisMonthFilter,\n addTodayFilter,\n addTomorrowFilter,\n addYearToDateFilter,\n addYesterdayFilter,\n buildFieldNameString,\n clearFiltersOnField,\n setSort,\n} from '../SearchControl/SearchUtils';\n\nexport interface SearchPopupMenuProps {\n search: SearchRequest;\n searchParams?: SearchParameter[];\n onPrompt: (searchParam: SearchParameter, filter: Filter) => void;\n onChange: (definition: SearchRequest) => void;\n}\n\nexport function SearchPopupMenu(props: SearchPopupMenuProps): JSX.Element | null {\n if (!props.searchParams) {\n return null;\n }\n\n function onSort(searchParam: SearchParameter, desc: boolean): void {\n onChange(setSort(props.search, searchParam.code as string, desc));\n }\n\n function onClear(searchParam: SearchParameter): void {\n onChange(clearFiltersOnField(props.search, searchParam.code as string));\n }\n\n function onPrompt(searchParam: SearchParameter, operator: Operator): void {\n props.onPrompt(searchParam, { code: searchParam.code as string, operator, value: '' });\n }\n\n function onChange(definition: SearchRequest): void {\n props.onChange(definition);\n }\n\n // If there is only one search parameter, then show it directly\n if (props.searchParams.length === 1) {\n return (\n <SearchParameterSubMenu\n search={props.search}\n searchParam={props.searchParams[0]}\n onSort={onSort}\n onPrompt={onPrompt}\n onChange={onChange}\n onClear={onClear}\n />\n );\n }\n\n // Otherwise, show a menu, with each search parameter as a sub menu\n return (\n <Menu.Dropdown>\n {props.searchParams.map((searchParam) => (\n <Menu.Item key={searchParam.code}>{buildFieldNameString(searchParam.code as string)}</Menu.Item>\n ))}\n </Menu.Dropdown>\n );\n}\n\ninterface SearchPopupSubMenuProps {\n search: SearchRequest;\n searchParam: SearchParameter;\n onSort: (searchParam: SearchParameter, descending: boolean) => void;\n onPrompt: (searchParam: SearchParameter, operator: Operator) => void;\n onChange: (search: SearchRequest) => void;\n onClear: (searchParam: SearchParameter) => void;\n}\n\nfunction SearchParameterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n switch (props.searchParam.type) {\n case 'date':\n return <DateFilterSubMenu {...props} />;\n case 'number':\n case 'quantity':\n return <NumericFilterSubMenu {...props} />;\n case 'reference':\n return <ReferenceFilterSubMenu {...props} />;\n case 'string':\n case 'token':\n case 'uri':\n return <TextFilterSubMenu {...props} />;\n default:\n return <>Unknown search param type: {props.searchParam.type}</>;\n }\n}\n\nfunction DateFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <Menu.Dropdown>\n <Menu.Item leftSection={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Oldest to Newest\n </Menu.Item>\n <Menu.Item leftSection={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Newest to Oldest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item leftSection={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item\n leftSection={<IconEqualNot size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}\n >\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n leftSection={<IconMathLower size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.ENDS_BEFORE)}\n >\n Before...\n </Menu.Item>\n <Menu.Item\n leftSection={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.STARTS_AFTER)}\n >\n After...\n </Menu.Item>\n <Menu.Item\n leftSection={<IconBracketsContain size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}\n >\n Between...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n leftSection={<IconCalendar size={14} />}\n onClick={() => props.onChange(addTomorrowFilter(props.search, code))}\n >\n Tomorrow\n </Menu.Item>\n <Menu.Item\n leftSection={<IconCalendar size={14} />}\n onClick={() => props.onChange(addTodayFilter(props.search, code))}\n >\n Today\n </Menu.Item>\n <Menu.Item\n leftSection={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYesterdayFilter(props.search, code))}\n >\n Yesterday\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n leftSection={<IconCalendar size={14} />}\n onClick={() => props.onChange(addNextMonthFilter(props.search, code))}\n >\n Next Month\n </Menu.Item>\n <Menu.Item\n leftSection={<IconCalendar size={14} />}\n onClick={() => props.onChange(addThisMonthFilter(props.search, code))}\n >\n This Month\n </Menu.Item>\n <Menu.Item\n leftSection={<IconCalendar size={14} />}\n onClick={() => props.onChange(addLastMonthFilter(props.search, code))}\n >\n Last Month\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n leftSection={<IconCalendar size={14} />}\n onClick={() => props.onChange(addYearToDateFilter(props.search, code))}\n >\n Year to date\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction NumericFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item leftSection={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort Smallest to Largest\n </Menu.Item>\n <Menu.Item leftSection={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Largest to Smallest\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item leftSection={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item\n leftSection={<IconEqualNot size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.NOT_EQUALS)}\n >\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item\n leftSection={<IconMathGreater size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN)}\n >\n Greater than...\n </Menu.Item>\n <Menu.Item\n leftSection={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.GREATER_THAN_OR_EQUALS)}\n >\n Greater than or equal to...\n </Menu.Item>\n <Menu.Item\n leftSection={<IconMathLower size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN)}\n >\n Less than...\n </Menu.Item>\n <Menu.Item\n leftSection={<IconSettings size={14} />}\n onClick={() => props.onPrompt(searchParam, Operator.LESS_THAN_OR_EQUALS)}\n >\n Less than or equal to...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction ReferenceFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item leftSection={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item leftSection={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction TextFilterSubMenu(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n return (\n <Menu.Dropdown>\n <Menu.Item leftSection={<IconSortAscending size={14} />} onClick={() => props.onSort(searchParam, false)}>\n Sort A to Z\n </Menu.Item>\n <Menu.Item leftSection={<IconSortDescending size={14} />} onClick={() => props.onSort(searchParam, true)}>\n Sort Z to A\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item leftSection={<IconEqual size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Equals...\n </Menu.Item>\n <Menu.Item leftSection={<IconEqualNot size={14} />} onClick={() => props.onPrompt(searchParam, Operator.NOT)}>\n Does not equal...\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item leftSection={<IconBucket size={14} />} onClick={() => props.onPrompt(searchParam, Operator.CONTAINS)}>\n Contains...\n </Menu.Item>\n <Menu.Item leftSection={<IconBucketOff size={14} />} onClick={() => props.onPrompt(searchParam, Operator.EQUALS)}>\n Does not contain...\n </Menu.Item>\n <CommonMenuItems {...props} />\n </Menu.Dropdown>\n );\n}\n\nfunction CommonMenuItems(props: SearchPopupSubMenuProps): JSX.Element {\n const { searchParam } = props;\n const code = searchParam.code as string;\n return (\n <>\n <Menu.Divider />\n <Menu.Item\n leftSection={<IconBleach size={14} />}\n onClick={() => props.onChange(addMissingFilter(props.search, code))}\n >\n Missing\n </Menu.Item>\n <Menu.Item\n leftSection={<IconBleachOff size={14} />}\n onClick={() => props.onChange(addMissingFilter(props.search, code, false))}\n >\n Not missing\n </Menu.Item>\n <Menu.Divider />\n <Menu.Item leftSection={<IconX size={14} />} onClick={() => props.onClear(searchParam)}>\n Clear filters\n </Menu.Item>\n </>\n );\n}\n", ".root {\n max-width: 100%;\n overflow: auto;\n text-align: left;\n margin-bottom: 20px;\n}\n\n.table {\n cursor: pointer;\n}\n\n.tr {\n &:hover {\n background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-7));\n }\n}\n\n.th {\n padding: 0 !important;\n}\n\n.control {\n width: 100%;\n padding: var(--mantine-spacing-xs) var(--mantine-spacing-md);\n\n &:hover {\n background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6));\n }\n}\n\n.icon {\n width: 21px;\n height: 21px;\n border-radius: 21px;\n}\n", "import {\n getElementDefinition,\n getSearchParameter,\n getSearchParameterDetails,\n getSearchParameters,\n InternalSchemaElement,\n SearchRequest,\n} from '@medplum/core';\nimport { ResourceType, SearchParameter } from '@medplum/fhirtypes';\n\n/**\n * The SearchControlField type describes a field in the search control.\n *\n * In a SearchRequest, a field is a simple string. Strings can be one of the following:\n * 1) Simple property names, which refer to InternalSchemaElement objects\n * 2) Search parameter names, which refer to SearchParameter resources\n *\n * Consider a few examples of how this becomes complicated.\n *\n * \"name\" (easy)\n * - element definition path=\"Patient.name\"\n * - search parameter code=\"name\"\n *\n * \"birthDate\" (medium)\n * - refers to the element definition path=\"Patient.birthDate\"\n * - refers to the search parameter code=\"birthdate\" (note the capitalization)\n *\n * \"email\" (hard)\n * - refers to the search parameter code=\"email\"\n * - refers to the element definition path=\"Patient.telecom\"\n *\n * In the last case, we start with the search parameter, and walk backwards to the\n * element definition in order to get type details for rendering.\n *\n * Overall, we want columns, fields, properties, and search parameters to feel seamless,\n * so we try our darndest to make this work.\n */\nexport interface SearchControlField {\n readonly name: string;\n readonly elementDefinition?: InternalSchemaElement;\n readonly searchParams?: SearchParameter[];\n}\n\n/**\n * Returns the collection of field definitions for the search request.\n * @param search - The search request definition.\n * @returns An array of field definitions.\n */\nexport function getFieldDefinitions(search: SearchRequest): SearchControlField[] {\n const resourceType = search.resourceType;\n const fields = [] as SearchControlField[];\n\n for (const name of search.fields || ['id', '_lastUpdated']) {\n fields.push(getFieldDefinition(resourceType, name));\n }\n return fields;\n}\n\n/**\n * Return the field definition for a given field name.\n * Field names can be either property names or search parameter codes.\n * @param resourceType - The resource type.\n * @param name - The search field name (either property name or search parameter code).\n * @returns The field definition.\n */\nfunction getFieldDefinition(resourceType: string, name: string): SearchControlField {\n if (name === '_lastUpdated') {\n return {\n name: '_lastUpdated',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_lastUpdated',\n name: '_lastUpdated',\n type: 'date',\n expression: 'Resource.meta.lastUpdated',\n } as SearchParameter,\n ],\n };\n }\n\n if (name === 'meta.versionId') {\n return {\n name: 'meta.versionId',\n searchParams: [\n {\n resourceType: 'SearchParameter',\n base: ['Resource' as ResourceType],\n code: '_versionId',\n name: '_versionId',\n type: 'token',\n expression: 'Resource.meta.versionId',\n } as SearchParameter,\n ],\n };\n }\n\n const exactElementDefinition = getElementDefinition(resourceType, name);\n const exactSearchParam = getSearchParameter(resourceType, name.toLowerCase());\n\n // Best case: Exact match of element definition or search parameter.\n // Examples: ServiceRequest.subject, Patient.name, Patient.birthDate\n // In this case, we only show the one search parameter.\n if (exactElementDefinition && exactSearchParam) {\n return { name, elementDefinition: exactElementDefinition, searchParams: [exactSearchParam] };\n }\n\n // Next best case: Exact match of element definition\n // Examples: Observation.value\n // In this case, there could be zero or more search parameters that are a function of the element definition.\n // So search for those search parameters.\n if (exactElementDefinition) {\n const allSearchParams = getSearchParameters(resourceType);\n let searchParams: SearchParameter[] | undefined = undefined;\n if (allSearchParams) {\n // To avoid matching names that happen to be prefixes of other names, e.g. id and identifier,\n // match ${resourceType}.${name} followed by a non-name character OR the end of the string\n // Name characters include letters, numbers, underscores, and hyphens\n const pathRegex = new RegExp(`${resourceType}\\\\.${name.replaceAll('[x]', '')}([^\\\\w-]|$)`);\n\n searchParams = Object.values(allSearchParams).filter((p) => !!p.expression && pathRegex.test(p?.expression));\n if (searchParams.length === 0) {\n searchParams = undefined;\n }\n }\n return { name, elementDefinition: exactElementDefinition, searchParams };\n }\n\n // Search parameter case: Exact match of search parameter\n // Examples: Observation.value-quantity, Patient.email\n // Here we have a search parameter, but no element definition.\n // Observation.value-quantity is a search parameter for the Observation.value element.\n // Patient.email is a search parameter for the Patient.telecom element.\n // So we need to walk backwards to find the element definition.\n if (exactSearchParam) {\n const details = getSearchParameterDetails(resourceType, exactSearchParam);\n return { name, elementDefinition: details.elementDefinitions?.[0], searchParams: [exactSearchParam] };\n }\n\n // Worst case: no element definition and no search parameter.\n // This is probably a malformed URL that includes an unknown field.\n // We will render the column header, but all cells will be empty.\n return { name };\n}\n", "export interface LogoProps {\n size: number;\n fill?: string;\n}\n\nexport function Logo(props: LogoProps): JSX.Element {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 491 491\" style={{ width: props.size, height: props.size }}>\n <title>Medplum Logo</title>\n <path fill={props.fill ?? '#ad7136'} d=\"M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z\" />\n <path\n fill={props.fill ?? '#946af9'}\n d=\"M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z\"\n />\n <path\n fill={props.fill ?? '#7857c5'}\n d=\"M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z\"\n />\n <path\n fill={props.fill ?? '#40bc26'}\n d=\"M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z\"\n />\n <path fill={props.fill ?? '#33961e'} d=\"M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z\" />\n </svg>\n );\n}\n", "import { Box, SimpleGrid } from '@mantine/core';\nimport { MeasureReport, MeasureReportGroup, Reference } from '@medplum/fhirtypes';\nimport { useResource, useSearchOne } from '@medplum/react-hooks';\nimport { MeasureReportGroupDisplay, MeasureTitle } from './MeasureReportGroupDisplay/MeasureReportGroupDisplay';\n\nexport interface MeasureReportDisplayProps {\n readonly measureReport: MeasureReport | Reference<MeasureReport>;\n}\n\nexport function MeasureReportDisplay(props: MeasureReportDisplayProps): JSX.Element | null {\n const report = useResource(props.measureReport);\n const [measure] = useSearchOne('Measure', { url: report?.measure });\n\n if (!report) {\n return null;\n }\n\n return (\n <Box>\n {measure && <MeasureTitle measure={measure} />}\n <SimpleGrid cols={{ base: 3, sm: 1 }} spacing={{ base: 'md', sm: 'sm' }}>\n {report.group?.map((group: MeasureReportGroup, idx: number) => (\n <MeasureReportGroupDisplay key={group.id ?? idx} group={group} />\n ))}\n </SimpleGrid>\n </Box>\n );\n}\n", "import { Box, Flex, Group, Paper, RingProgress, Text, Title } from '@mantine/core';\nimport { formatCodeableConcept } from '@medplum/core';\nimport { Measure, MeasureReportGroup } from '@medplum/fhirtypes';\nimport { QuantityDisplay } from '../../QuantityDisplay/QuantityDisplay';\n\ninterface MeasureReportGroupDisplayProps {\n readonly group: MeasureReportGroup;\n}\n\ninterface MeasureProps {\n readonly measure: Measure;\n}\n\nexport function MeasureReportGroupDisplay(props: MeasureReportGroupDisplayProps): JSX.Element | null {\n const { group } = props;\n return (\n <Paper withBorder radius=\"md\" p=\"xs\" display=\"flex\" style={{ alignItems: 'center', justifyContent: 'center' }}>\n <Group>\n {group.measureScore && <MeasureScore group={group} />}\n {!group.measureScore && <MeasureReportPopulation group={group} />}\n </Group>\n </Paper>\n );\n}\n\nexport function MeasureTitle(props: MeasureProps): JSX.Element {\n const { measure } = props;\n return (\n <>\n <Text fz=\"md\" fw={500} mb={8}>\n {measure.title}\n </Text>\n <Text fz=\"xs\" c=\"dimmed\" mb={8}>\n {measure.subtitle}\n </Text>\n </>\n );\n}\n\nfunction MeasureReportPopulation(props: MeasureReportGroupDisplayProps): JSX.Element {\n const { group } = props;\n const populations = group.population;\n const numerator = populations?.find((p: any) => formatCodeableConcept(p.code) === 'numerator');\n const denominator = populations?.find((p: any) => formatCodeableConcept(p.code) === 'denominator');\n\n const numeratorCount = numerator?.count;\n const denominatorCount = denominator?.count;\n\n if (denominatorCount === 0) {\n return (\n <Box>\n <Title order={3}>Not Applicable</Title>\n <Text>{`Denominator: ${denominatorCount}`}</Text>\n </Box>\n );\n }\n\n if (numeratorCount === undefined || denominatorCount === undefined) {\n return (\n <Box>\n <Title order={3}>Insufficient Data</Title>\n <Text>{`Numerator: ${numeratorCount}`}</Text>\n <Text>{`Denominator: ${denominatorCount}`}</Text>\n </Box>\n );\n }\n\n const value = (numeratorCount / denominatorCount) * 100;\n return (\n <RingProgress\n size={120}\n thickness={12}\n roundCaps\n sections={[{ value: value, color: groupColor(value) }]}\n label={\n <Flex justify=\"center\">\n <Text fw={700} fz={18}>\n {numeratorCount} / {denominatorCount}\n </Text>\n </Flex>\n }\n />\n );\n}\n\nfunction MeasureScore(props: MeasureReportGroupDisplayProps): JSX.Element {\n const { group } = props;\n const unit = group.measureScore?.unit ?? group.measureScore?.code;\n\n return (\n <>\n {unit === '%' ? (\n <RingProgress\n size={120}\n thickness={12}\n roundCaps\n sections={[{ value: groupValue(group), color: groupColor(group?.measureScore?.value ?? 0) }]}\n label={\n <Flex justify=\"center\">\n <Text fw={700} fz={18}>\n <QuantityDisplay value={group.measureScore} />\n </Text>\n </Flex>\n }\n />\n ) : (\n <Flex h={120} align=\"center\">\n <Title order={3}>\n <QuantityDisplay value={group.measureScore} />\n </Title>\n </Flex>\n )}\n </>\n );\n}\n\nfunction groupValue(group: MeasureReportGroup): number {\n const score = group.measureScore?.value;\n const unit = group.measureScore?.unit;\n if (!score) {\n return 0;\n }\n if (score <= 1 && unit === '%') {\n return score * 100;\n }\n return score;\n}\n\nfunction groupColor(score: number): string {\n if (score <= 33) {\n return 'red';\n }\n if (score <= 67) {\n return 'yellow';\n }\n return 'green';\n}\n", "import { Alert } from '@mantine/core';\nimport { operationOutcomeIssueToString } from '@medplum/core';\nimport { OperationOutcome, OperationOutcomeIssue } from '@medplum/fhirtypes';\nimport { IconAlertCircle } from '@tabler/icons-react';\n\nexport interface OperationOutcomeAlertProps {\n outcome?: OperationOutcome;\n issues?: OperationOutcomeIssue[];\n}\n\nexport function OperationOutcomeAlert(props: OperationOutcomeAlertProps): JSX.Element | null {\n const issues = props.outcome?.issue || props.issues;\n if (!issues || issues.length === 0) {\n return null;\n }\n return (\n <Alert icon={<IconAlertCircle size={16} />} color=\"red\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {operationOutcomeIssueToString(issue)}\n </div>\n ))}\n </Alert>\n );\n}\n", "import { Anchor, Card, CardProps, Divider, Flex, Group, Paper, Stack, Text } from '@mantine/core';\nimport { calculateAgeString, formatHumanName, resolveId } from '@medplum/core';\nimport {\n AllergyIntolerance,\n Condition,\n HumanName,\n MedicationRequest,\n Observation,\n Patient,\n Reference,\n} from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { IconGenderFemale, IconStethoscope, IconUserSquare } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { Allergies } from './Allergies';\nimport { Medications } from './Medications';\nimport { ProblemList } from './ProblemList';\nimport { SmokingStatus } from './SmokingStatus';\nimport { Vitals } from './Vitals';\n\nexport interface PatientSummaryProps extends Omit<CardProps, 'children'> {\n readonly patient: Patient | Reference<Patient>;\n readonly background?: string;\n}\n\nexport function PatientSummary(props: PatientSummaryProps): JSX.Element | null {\n const medplum = useMedplum();\n const { patient: propsPatient, background, ...rest } = props;\n const [patient, setPatient] = useState<Patient>();\n const [allergies, setAllergies] = useState<AllergyIntolerance[]>();\n const [problems, setProblems] = useState<Condition[]>();\n const [smokingStatus, setSmokingStatus] = useState<Observation>();\n const [vitals, setVitals] = useState<Observation[]>();\n const [medicationRequest, setMedicationRequest] = useState<MedicationRequest[]>();\n\n useEffect(() => {\n const id = resolveId(propsPatient) as string;\n const ref = `Patient/${id}`;\n const searchMeta = { _count: 100, _sort: '-_lastUpdated' };\n\n Promise.all([\n medplum.readResource('Patient', id),\n medplum.searchResources('AllergyIntolerance', { patient: ref, ...searchMeta }),\n medplum.searchResources('Condition', { patient: ref, ...searchMeta }),\n medplum.searchResources('MedicationRequest', { subject: ref, ...searchMeta }),\n medplum.searchResources('Observation', { subject: ref, ...searchMeta }),\n ])\n .then((results) => {\n setPatient(results[0] as Patient);\n setAllergies(results[1] as AllergyIntolerance[]);\n setProblems(results[2] as Condition[]);\n setMedicationRequest(results[3] as MedicationRequest[]);\n\n const observations = results[4] as Observation[];\n setSmokingStatus(observations.find((obs) => obs.code?.coding?.[0].code === '72166-2'));\n setVitals(observations.filter((obs) => obs.category?.[0]?.coding?.[0].code === 'vital-signs'));\n })\n .catch(console.error);\n }, [medplum, propsPatient]);\n\n if (!patient) {\n return null;\n }\n\n return (\n <Card {...rest}>\n <Card.Section h={100} style={{ background }} />\n <ResourceAvatar value={patient} size={80} radius={80} mx=\"auto\" mt={-50} style={{ border: '2px solid white' }} />\n <Text ta=\"center\" fz=\"lg\" fw={500}>\n {formatHumanName(patient.name?.[0] as HumanName)}\n </Text>\n <Text ta=\"center\" fz=\"xs\" color=\"dimmed\">\n {patient.birthDate} ({calculateAgeString(patient.birthDate as string)})\n </Text>\n <Paper withBorder p=\"md\" my=\"md\">\n <Group grow>\n <Flex justify=\"center\" align=\"center\" direction=\"column\" gap={0} maw=\"33%\">\n <IconUserSquare size={24} color=\"gray\" />\n <Text fz=\"xs\" ta=\"center\" style={{ whiteSpace: 'nowrap' }}>\n Self\n </Text>\n </Flex>\n <Flex justify=\"center\" align=\"center\" direction=\"column\" gap={0}>\n <IconStethoscope size={24} color=\"gray\" />\n <Text fz=\"xs\" style={{ whiteSpace: 'nowrap' }}>\n {patient?.generalPractitioner?.[0]?.display ?? 'No provider'}\n </Text>\n </Flex>\n <Flex justify=\"center\" align=\"center\" direction=\"column\" gap={0}>\n <IconGenderFemale size={24} color=\"gray\" />\n <Text fz=\"xs\" style={{ whiteSpace: 'nowrap' }}>\n {patient.gender}\n </Text>\n </Flex>\n </Group>\n </Paper>\n <Stack gap=\"xs\">\n <Anchor href=\"#\">No upcoming appointments</Anchor>\n <Anchor href=\"#\">No documented visits</Anchor>\n <Divider />\n <Allergies patient={patient} allergies={allergies as AllergyIntolerance[]} />\n <Divider />\n <ProblemList patient={patient} problems={problems as Condition[]} />\n <Divider />\n <Medications patient={patient} medicationRequests={medicationRequest as MedicationRequest[]} />\n <Divider />\n <SmokingStatus patient={patient} smokingStatus={smokingStatus} />\n <Divider />\n <Vitals patient={patient} vitals={vitals as Observation[]} />\n </Stack>\n </Card>\n );\n}\n", "import { Anchor, Badge, Box, Button, Group, Modal, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { createReference } from '@medplum/core';\nimport { AllergyIntolerance, CodeableConcept, Encounter, Patient } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodeableConceptInput } from '../CodeableConceptInput/CodeableConceptInput';\nimport { Form } from '../Form/Form';\nimport { killEvent } from '../utils/dom';\n\nexport interface AllergiesProps {\n readonly patient: Patient;\n readonly encounter?: Encounter;\n readonly allergies: AllergyIntolerance[];\n}\n\nexport function Allergies(props: AllergiesProps): JSX.Element {\n const medplum = useMedplum();\n const { patient, encounter } = props;\n const [allergies, setAllergies] = useState<AllergyIntolerance[]>(props.allergies);\n const [opened, { open, close }] = useDisclosure(false);\n const [code, setCode] = useState<CodeableConcept>();\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .createResource<AllergyIntolerance>({\n resourceType: 'AllergyIntolerance',\n patient: createReference(patient),\n encounter: encounter ? createReference(encounter) : undefined,\n code,\n onsetDateTime: formData.onset ? formData.onset : undefined,\n reaction: formData.reaction ? [{ manifestation: [{ text: formData.reaction }] }] : undefined,\n })\n .then((newAllergy) => {\n setAllergies([...allergies, newAllergy]);\n close();\n })\n .catch(console.error);\n },\n [medplum, patient, encounter, allergies, close, code]\n );\n\n return (\n <>\n <Group justify=\"space-between\">\n <Text fz=\"md\" fw={700}>\n Allergies\n </Text>\n <Anchor\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n open();\n }}\n >\n + Add\n </Anchor>\n </Group>\n {allergies.length > 0 ? (\n <Box>\n {allergies.map((allergy) => (\n <Badge key={allergy.id} variant=\"light\" maw=\"100%\">\n <CodeableConceptDisplay value={allergy.code} />\n </Badge>\n ))}\n </Box>\n ) : (\n <Text>(none)</Text>\n )}\n <Modal opened={opened} onClose={close} title=\"Add Allergy\">\n <Form onSubmit={handleSubmit}>\n <Stack>\n <CodeableConceptInput\n name=\"allergy\"\n data-autofocus={true}\n binding=\"http://hl7.org/fhir/us/core/ValueSet/us-core-allergy-substance\"\n onChange={(allergy) => setCode(allergy)}\n />\n <TextInput name=\"reaction\" label=\"Reaction\" />\n <NativeSelect name=\"status\" label=\"Status\" data={['active']} />\n <TextInput name=\"onset\" label=\"Onset\" type=\"date\" />\n <Group justify=\"flex-end\" gap={4} mt=\"md\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n </>\n );\n}\n", "import { Anchor, Badge, Box, Button, Group, Modal, Radio, Stack, Text } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { createReference } from '@medplum/core';\nimport { CodeableConcept, Encounter, MedicationRequest, Patient } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { CodeableConceptInput } from '../CodeableConceptInput/CodeableConceptInput';\nimport { Form } from '../Form/Form';\nimport { killEvent } from '../utils/dom';\n\nexport interface MedicationsProps {\n readonly patient: Patient;\n readonly encounter?: Encounter;\n readonly medicationRequests: MedicationRequest[];\n}\n\nexport function Medications(props: MedicationsProps): JSX.Element {\n const medplum = useMedplum();\n const [medicationRequests, setMedicationRequests] = useState<MedicationRequest[]>(props.medicationRequests);\n const [opened, { open, close }] = useDisclosure(false);\n const [code, setCode] = useState<CodeableConcept>();\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n const status = formData.status as 'active' | 'stopped';\n medplum\n .createResource<MedicationRequest>({\n resourceType: 'MedicationRequest',\n status,\n intent: 'order',\n encounter: props.encounter ? createReference(props.encounter) : undefined,\n medicationCodeableConcept: code,\n subject: createReference(props.patient),\n })\n .then((newRequest) => {\n setMedicationRequests([newRequest, ...medicationRequests]);\n close();\n })\n .catch(console.error);\n },\n [medplum, props.patient, props.encounter, medicationRequests, close, code]\n );\n\n return (\n <>\n <Group justify=\"space-between\">\n <Text fz=\"md\" fw={700}>\n Medications\n </Text>\n <Anchor\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n open();\n }}\n >\n + Add\n </Anchor>\n </Group>\n {medicationRequests.length > 0 ? (\n <Box>\n {medicationRequests.map((request) => (\n <Badge\n mt={4}\n key={request.id}\n variant=\"light\"\n maw=\"50%\"\n color={request.status === 'active' ? 'blue' : 'gray'}\n >\n <CodeableConceptDisplay value={request.medicationCodeableConcept} />\n </Badge>\n ))}\n </Box>\n ) : (\n <Text>(none)</Text>\n )}\n <Modal opened={opened} onClose={close} title=\"Add Medication Request\">\n <Form onSubmit={handleSubmit}>\n <Stack h={275}>\n <CodeableConceptInput\n name=\"request\"\n data-autofocus={true}\n binding=\"https://app.medplum.com/ValueSet/16d6f7b7-7eeb-4d0e-a83b-83be082aa10b\"\n onChange={(request) => setCode(request)}\n />\n <Radio.Group mt={32} name=\"status\" label=\"Request Status\" required>\n <Radio key=\"active\" value=\"active\" label=\"active\" my=\"xs\" />\n <Radio key=\"stopped\" value=\"stopped\" label=\"stopped\" my=\"xs\" />\n </Radio.Group>\n <Group justify=\"flex-end\" gap={4} mt=\"md\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n </>\n );\n}\n", "import {\n Anchor,\n Badge,\n Button,\n Grid,\n Group,\n Modal,\n NativeSelect,\n Stack,\n Text,\n Textarea,\n TextInput,\n} from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { createReference } from '@medplum/core';\nimport { Condition, Encounter, Patient } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { Fragment, useCallback, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { Form } from '../Form/Form';\nimport { killEvent } from '../utils/dom';\n\nexport interface ProblemListProps {\n readonly patient: Patient;\n readonly encounter?: Encounter;\n readonly problems: Condition[];\n}\n\nexport function ProblemList(props: ProblemListProps): JSX.Element {\n const medplum = useMedplum();\n const { patient, encounter } = props;\n const [problems, setProblems] = useState<Condition[]>(props.problems);\n const [opened, { open, close }] = useDisclosure(false);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .createResource<Condition>({\n resourceType: 'Condition',\n subject: createReference(patient),\n encounter: encounter ? createReference(encounter) : undefined,\n code: { coding: [{ code: formData.problem, display: formData.problem }] },\n onsetDateTime: formData.onset ? formData.onset : undefined,\n })\n .then((newProblem) => {\n setProblems([...problems, newProblem]);\n close();\n })\n .catch(console.error);\n },\n [medplum, patient, encounter, problems, close]\n );\n\n return (\n <>\n <Group justify=\"space-between\">\n <Text fz=\"md\" fw={700}>\n Problem List\n </Text>\n <Anchor\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n open();\n }}\n >\n + Add\n </Anchor>\n </Group>\n {problems.length > 0 ? (\n <Grid gutter=\"xs\">\n {problems.map((problem) => (\n <Fragment key={problem.id}>\n <Grid.Col span={2}>{problem.onsetDateTime?.substring(0, 4)}</Grid.Col>\n <Grid.Col span={10}>\n <Badge key={problem.id} variant=\"light\" maw=\"100%\">\n <CodeableConceptDisplay value={problem.code} />\n </Badge>\n </Grid.Col>\n </Fragment>\n ))}\n </Grid>\n ) : (\n <Text>(none)</Text>\n )}\n <Modal opened={opened} onClose={close} title=\"Add Problem\">\n <Form onSubmit={handleSubmit}>\n <Stack>\n <TextInput name=\"problem\" label=\"Problem\" data-autofocus={true} autoFocus required />\n <TextInput name=\"onset\" label=\"Dx Date\" type=\"date\" required />\n <NativeSelect name=\"status\" label=\"Status\" data={['active']} />\n <Textarea name=\"notes\" label=\"Notes\" />\n <Group justify=\"flex-end\" gap={4} mt=\"md\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n </>\n );\n}\n", "import { Anchor, Badge, Box, Button, Group, Modal, Radio, Stack, Text } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { HTTP_HL7_ORG, LOINC, SNOMED, createReference } from '@medplum/core';\nimport { Encounter, Observation, Patient } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback, useState } from 'react';\nimport { CodeableConceptDisplay } from '../CodeableConceptDisplay/CodeableConceptDisplay';\nimport { Form } from '../Form/Form';\nimport { killEvent } from '../utils/dom';\n\n// Smoking Status widget\n// See: https://build.fhir.org/ig/HL7/US-Core/StructureDefinition-us-core-smokingstatus.html\n\nconst smokingStatusOptions: Record<string, string> = {\n '266919005': 'Never smoked tobacco',\n '266927001': 'Tobacco smoking consumption unknown',\n '428041000124106': 'Occasional tobacco smoker',\n '428061000124105': 'Light tobacco smoker',\n '428071000124103': 'Heavy tobacco smoker',\n '449868002': 'Smokes tobacco daily',\n '77176002': 'Smoker',\n '8517006': 'Ex-smoker',\n};\n\nexport interface SmokingStatusProps {\n readonly patient: Patient;\n readonly encounter?: Encounter;\n readonly smokingStatus?: Observation;\n}\n\nexport function SmokingStatus(props: SmokingStatusProps): JSX.Element {\n const medplum = useMedplum();\n const { patient, encounter } = props;\n const [smokingStatus, setSmokingStatus] = useState<Observation | undefined>(props.smokingStatus);\n const [opened, { open, close }] = useDisclosure(false);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .createResource<Observation>({\n resourceType: 'Observation',\n meta: {\n profile: [HTTP_HL7_ORG + '/fhir/us/core/StructureDefinition/us-core-smokingstatus'],\n },\n status: 'final',\n category: [\n {\n coding: [\n {\n system: 'http://terminology.hl7.org/CodeSystem/observation-category',\n code: 'social-history',\n display: 'Social History',\n },\n ],\n text: 'Social History',\n },\n ],\n code: {\n coding: [\n {\n system: LOINC,\n code: '72166-2',\n display: 'Tobacco smoking status',\n },\n ],\n text: 'Tobacco smoking status',\n },\n subject: createReference(patient),\n encounter: encounter ? createReference(encounter) : undefined,\n effectiveDateTime: new Date().toISOString(),\n valueCodeableConcept: {\n coding: [\n {\n system: SNOMED,\n version: SNOMED + '/731000124108',\n code: formData.smokingStatus,\n },\n ],\n text: smokingStatusOptions[formData.smokingStatus],\n },\n })\n .then((newSmokingStatus) => {\n setSmokingStatus(newSmokingStatus);\n close();\n })\n .catch(console.error);\n },\n [medplum, patient, encounter, close]\n );\n\n return (\n <>\n <Group justify=\"space-between\">\n <Text fz=\"md\" fw={700}>\n Smoking Status\n </Text>\n <Anchor\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n open();\n }}\n >\n + Edit\n </Anchor>\n </Group>\n {smokingStatus?.valueCodeableConcept ? (\n <Box>\n <Badge variant=\"light\">\n <CodeableConceptDisplay value={smokingStatus.valueCodeableConcept} />\n </Badge>\n </Box>\n ) : (\n <Text>(none)</Text>\n )}\n <Modal opened={opened} onClose={close} title=\"Set Smoking Status\">\n <Form onSubmit={handleSubmit}>\n <Stack>\n <Radio.Group name=\"smokingStatus\" label=\"Smoking Status\" required>\n {Object.entries(smokingStatusOptions).map(([code, text]) => (\n <Radio key={code} value={code} label={text} my=\"xs\" />\n ))}\n </Radio.Group>\n <Group justify=\"flex-end\" gap={4} mt=\"md\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Stack>\n </Form>\n </Modal>\n </>\n );\n}\n", "import { Anchor, Button, Grid, Group, Modal, Stack, Text, Textarea, TextInput } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { Encounter, Observation, Patient } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useCallback, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { QuantityDisplay } from '../QuantityDisplay/QuantityDisplay';\nimport { killEvent } from '../utils/dom';\nimport {\n createCompoundObservation,\n createLoincCode,\n createObservation,\n createQuantity,\n getCompoundObservationValue,\n getObservationValue,\n} from './Vitals.utils';\n\ninterface ObservationMeta {\n readonly code: string;\n readonly title: string;\n readonly unit: string;\n}\n\nconst LOINC_CODES: Record<string, ObservationMeta> = {\n bloodPressure: {\n code: '85354-9',\n title: 'Blood Pressure',\n unit: 'mm[Hg]',\n },\n heartRate: {\n code: '8867-4',\n title: 'Heart Rate',\n unit: '/min',\n },\n bodyTemperature: {\n code: '8310-5',\n title: 'Body Temperature',\n unit: 'Cel',\n },\n respiratoryRate: {\n code: '9279-1',\n title: 'Respiratory Rate',\n unit: '/min',\n },\n height: {\n code: '8302-2',\n title: 'height',\n unit: 'cm',\n },\n weight: {\n code: '29463-7',\n title: 'weight',\n unit: 'kg',\n },\n bmi: {\n code: '39156-5',\n title: 'BMI',\n unit: 'kg/m2',\n },\n oxygen: {\n code: '2708-6',\n title: 'Oxygen',\n unit: '%',\n },\n headCircumference: {\n code: '9843-4',\n title: 'Head Circumference',\n unit: 'cm',\n },\n};\n\nconst SYSTOLIC = '8480-6';\nconst DIASTOLIC = '8462-4';\n\nexport interface VitalsProps {\n readonly patient: Patient;\n readonly encounter?: Encounter;\n readonly vitals: Observation[];\n}\n\nexport function Vitals(props: VitalsProps): JSX.Element {\n const medplum = useMedplum();\n const { patient, encounter } = props;\n const [vitals, setVitals] = useState<Observation[]>(props.vitals);\n const [opened, { open, close }] = useDisclosure(false);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n const newObservations = Object.entries(LOINC_CODES)\n .map(([name, meta]) => {\n if (name === 'bloodPressure') {\n return createCompoundObservation(patient, encounter, meta.code, meta.title, [\n {\n code: createLoincCode(SYSTOLIC, 'Systolic blood pressure'),\n valueQuantity: createQuantity(parseFloat(formData['systolic']), 'mm[Hg]'),\n },\n {\n code: createLoincCode(DIASTOLIC, 'Diastolic blood pressure'),\n valueQuantity: createQuantity(parseFloat(formData['diastolic']), 'mm[Hg]'),\n },\n ]);\n }\n return createObservation(\n patient,\n encounter,\n meta.code,\n meta.title,\n createQuantity(parseFloat(formData[name]), meta.unit)\n );\n })\n .filter(Boolean) as Observation[];\n\n // Execute all create requests in parallel to take advantage of autobatching\n Promise.all(newObservations.map((obs) => medplum.createResource<Observation>(obs)))\n .then((newVitals) => setVitals([...newVitals, ...vitals]))\n .catch(console.error);\n\n close();\n },\n [medplum, patient, encounter, vitals, close]\n );\n\n return (\n <>\n <Group justify=\"space-between\">\n <Text fz=\"md\" fw={700}>\n Vitals\n </Text>\n <Anchor\n href=\"#\"\n onClick={(e) => {\n killEvent(e);\n open();\n }}\n >\n + Add\n </Anchor>\n </Group>\n <Grid>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n BP Sys\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getCompoundObservationValue(vitals, LOINC_CODES.bloodPressure.code, SYSTOLIC)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n BP Dias\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getCompoundObservationValue(vitals, LOINC_CODES.bloodPressure.code, DIASTOLIC)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n HR\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.heartRate.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n Temp\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.bodyTemperature.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n RR\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.respiratoryRate.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n Height\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.height.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n Weight\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.weight.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n BMI\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.bmi.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n O2\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.oxygen.code)} />\n </Grid.Col>\n <Grid.Col span={3} ta=\"right\" c=\"dimmed\">\n HC\n </Grid.Col>\n <Grid.Col span={3}>\n <QuantityDisplay value={getObservationValue(vitals, LOINC_CODES.headCircumference.code)} />\n </Grid.Col>\n </Grid>\n <Modal opened={opened} onClose={close} title=\"Add Vitals\">\n <Form onSubmit={handleSubmit}>\n <Stack>\n <Group grow>\n <TextInput name=\"systolic\" label=\"BP Sys\" data-autofocus={true} autoFocus />\n <TextInput name=\"diastolic\" label=\"BP Dias\" />\n </Group>\n <Group grow>\n <TextInput name=\"heartRate\" label=\"HR\" />\n <TextInput name=\"bodyTemperature\" label=\"Temp\" />\n </Group>\n <Group grow>\n <TextInput name=\"respiratoryRate\" label=\"RR\" />\n <TextInput name=\"height\" label=\"height\" />\n </Group>\n <Group grow>\n <TextInput name=\"weight\" label=\"Wt\" />\n <TextInput name=\"bmi\" label=\"BMI\" />\n </Group>\n <Group grow>\n <TextInput name=\"oxygen\" label=\"O2\" />\n <TextInput name=\"headCircumference\" label=\"HC\" />\n </Group>\n <Textarea name=\"notes\" label=\"Notes\" />\n </Stack>\n <Group justify=\"flex-end\" gap={4} mt=\"md\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n </Modal>\n </>\n );\n}\n", "import { LOINC, UCUM, createReference } from '@medplum/core';\nimport { CodeableConcept, Encounter, Observation, ObservationComponent, Patient, Quantity } from '@medplum/fhirtypes';\n\nexport function getObservationValue(observations: Observation[], code: string): Quantity | undefined {\n const observation = observations.find((o) => o.code?.coding?.[0].code === code);\n return observation?.valueQuantity;\n}\n\nexport function getCompoundObservationValue(\n observations: Observation[],\n code: string,\n innerCode: string\n): Quantity | undefined {\n const observation = observations.find((o) => o.code?.coding?.[0].code === code);\n const component = observation?.component?.find((c) => c.code?.coding?.[0].code === innerCode);\n return component?.valueQuantity;\n}\n\nexport function createObservation(\n patient: Patient,\n encounter: Encounter | undefined,\n code: string,\n title: string,\n valueQuantity: Quantity\n): Observation | undefined {\n if (!isValidNumber(valueQuantity.value)) {\n return undefined;\n }\n return {\n ...createBaseObservation(patient, encounter, code, title),\n valueQuantity,\n };\n}\n\nexport function createCompoundObservation(\n patient: Patient,\n encounter: Encounter | undefined,\n code: string,\n title: string,\n components: ObservationComponent[]\n): Observation | undefined {\n const component = components.filter((c) => isValidNumber(c.valueQuantity?.value));\n if (component.length === 0) {\n return undefined;\n }\n return {\n ...createBaseObservation(patient, encounter, code, title),\n component,\n };\n}\n\nexport function createBaseObservation(\n patient: Patient,\n encounter: Encounter | undefined,\n code: string,\n title: string\n): Observation {\n return {\n resourceType: 'Observation',\n status: 'preliminary',\n subject: createReference(patient),\n encounter: encounter ? createReference(encounter) : undefined,\n effectiveDateTime: new Date().toISOString(),\n category: [\n {\n coding: [\n {\n system: 'http://terminology.hl7.org/CodeSystem/observation-category',\n code: 'vital-signs',\n display: 'Vital Signs',\n },\n ],\n },\n ],\n code: createLoincCode(code, title),\n };\n}\n\nexport function createLoincCode(code: string, display: string): CodeableConcept {\n return {\n coding: [\n {\n code,\n display,\n system: LOINC,\n },\n ],\n text: display,\n };\n}\n\nexport function createQuantity(value: number, unit: string): Quantity {\n return {\n value,\n system: UCUM,\n unit,\n code: unit,\n };\n}\n\nfunction isValidNumber(value: number | undefined): boolean {\n return value !== undefined && !isNaN(value) && isFinite(value);\n}\n", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Patient, Reference, ResourceType } from '@medplum/fhirtypes';\nimport { useCallback } from 'react';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface PatientTimelineProps {\n patient: Patient | Reference<Patient>;\n}\n\nexport function PatientTimeline(props: PatientTimelineProps): JSX.Element {\n const loadTimelineResources = useCallback((medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory('Patient', id),\n medplum.search('Communication', { subject: ref, _count }),\n medplum.search('Device', { patient: ref, _count }),\n medplum.search('DeviceRequest', { patient: ref, _count }),\n medplum.search('DiagnosticReport', { subject: ref, _count }),\n medplum.search('Media', { subject: ref, _count }),\n medplum.search('ServiceRequest', { subject: ref, _count }),\n medplum.search('Task', { subject: ref, _count }),\n ]);\n }, []);\n\n return (\n <ResourceTimeline\n value={props.patient}\n loadTimelineResources={loadTimelineResources}\n createCommunication={(resource: Patient, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n subject: createReference(resource),\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: Patient, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n subject: createReference(resource),\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { Anchor, Button, NativeSelect, Stack, TextInput } from '@mantine/core';\nimport { InternalSchemaElement, getReferenceString } from '@medplum/core';\nimport { PlanDefinition, PlanDefinitionAction, Reference, ResourceType } from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport cx from 'clsx';\nimport { MouseEvent, SyntheticEvent, useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { FormSection } from '../FormSection/FormSection';\nimport { ReferenceDisplay } from '../ReferenceDisplay/ReferenceDisplay';\nimport { setPropertyValue } from '../ResourceForm/ResourceForm.utils';\nimport { ResourceInput } from '../ResourceInput/ResourceInput';\nimport { ResourcePropertyDisplay } from '../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.utils';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { killEvent } from '../utils/dom';\nimport classes from './PlanDefinitionBuilder.module.css';\n\nexport interface PlanDefinitionBuilderProps {\n value: Partial<PlanDefinition> | Reference<PlanDefinition>;\n onSubmit: (result: PlanDefinition) => void;\n}\n\nexport function PlanDefinitionBuilder(props: PlanDefinitionBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.value);\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n const [value, setValue] = useState<PlanDefinition>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n const valueRef = useRef<PlanDefinition>();\n valueRef.current = value;\n\n useEffect(() => {\n medplum\n .requestSchema('PlanDefinition')\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensurePlanDefinitionKeys(defaultValue ?? { resourceType: 'PlanDefinition', status: 'active' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n if (!schemaLoaded || !value) {\n return null;\n }\n\n function changeProperty(property: string, newValue: any): void {\n setValue({\n ...valueRef.current,\n [property]: newValue,\n } as PlanDefinition);\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <TextInput\n label=\"Plan Title\"\n defaultValue={value.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <ActionArrayBuilder\n actions={value.action || []}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ActionArrayBuilderProps {\n actions: PlanDefinitionAction[];\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (actions: PlanDefinitionAction[]) => void;\n}\n\nfunction ActionArrayBuilder(props: ActionArrayBuilderProps): JSX.Element {\n const actionsRef = useRef<PlanDefinitionAction[]>();\n actionsRef.current = props.actions;\n\n function changeAction(changedAction: PlanDefinitionAction): void {\n props.onChange(\n (actionsRef.current as PlanDefinition[]).map((i) => (i.id === changedAction.id ? changedAction : i))\n );\n }\n\n function addAction(addedAction: PlanDefinitionAction): void {\n props.onChange([...(actionsRef.current as PlanDefinition[]), addedAction]);\n props.setSelectedKey(addedAction.id);\n }\n\n function removeAction(removedAction: PlanDefinitionAction): void {\n props.onChange((actionsRef.current as PlanDefinition[]).filter((i) => i !== removedAction));\n }\n\n return (\n <div className={classes.section}>\n {props.actions.map((action) => (\n <div key={action.id}>\n <ActionBuilder\n action={action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={changeAction}\n onRemove={() => removeAction(action)}\n />\n </div>\n ))}\n <div className={classes.bottomActions}>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n killEvent(e);\n addAction({ id: generateId() });\n }}\n >\n Add action\n </Anchor>\n </div>\n </div>\n );\n}\n\ninterface ActionBuilderProps {\n action: PlanDefinitionAction;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionBuilder(props: ActionBuilderProps): JSX.Element {\n const { action } = props;\n const actionType = getInitialActionType(action);\n const editing = props.selectedKey === props.action.id;\n const hovering = props.hoverKey === props.action.id;\n\n function onClick(e: SyntheticEvent): void {\n e.stopPropagation();\n props.setSelectedKey(props.action.id);\n }\n\n function onHover(e: SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.action.id);\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={action.id} className={className} onClick={onClick} onMouseOver={onHover} onFocus={onHover}>\n {editing ? (\n <ActionEditor\n action={action}\n actionType={actionType}\n onChange={props.onChange}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onRemove={props.onRemove}\n />\n ) : (\n <ActionDisplay action={action} actionType={actionType} />\n )}\n <div className={classes.bottomActions}>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n props.onRemove();\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n}\n\nconst timingProperty: InternalSchemaElement = {\n path: 'PlanDefinition.action.timing[x]',\n min: 0,\n max: 1,\n description: '',\n isArray: false,\n constraints: [],\n type: ['dateTime', 'Period', 'Range', 'Timing'].map((t) => ({ code: t })),\n};\n\ninterface ActionDisplayProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n}\n\nfunction ActionDisplay(props: ActionDisplayProps): JSX.Element {\n const { action, actionType } = props;\n const [propertyValue, propertyType] = getActionTiming(action);\n return (\n <div>\n <div>\n {action.title || 'Untitled'} {actionType && `(${actionType})`}\n </div>\n {action.definitionCanonical && (\n <div>\n <ReferenceDisplay value={{ reference: action.definitionCanonical }} />\n </div>\n )}\n {propertyValue && (\n <div>\n <ResourcePropertyDisplay property={timingProperty} propertyType={propertyType} value={propertyValue} />\n </div>\n )}\n </div>\n );\n}\n\ninterface ActionEditorProps {\n action: PlanDefinitionAction;\n actionType: string | undefined;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n setHoverKey: (key: string | undefined) => void;\n onChange: (action: PlanDefinitionAction) => void;\n onRemove: () => void;\n}\n\nfunction ActionEditor(props: ActionEditorProps): JSX.Element {\n const { action } = props;\n const [actionType, setActionType] = useState<string | undefined>(props.actionType);\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...action,\n [property]: value,\n } as PlanDefinitionAction);\n }\n\n return (\n <Stack gap=\"xl\">\n <TextInput\n name={`actionTitle-${action.id}`}\n label=\"Title\"\n defaultValue={action.title}\n onChange={(e) => changeProperty('title', e.currentTarget.value)}\n />\n <TextInput\n name={`actionDescription-${action.id}`}\n label=\"Description\"\n defaultValue={action.description}\n onChange={(e) => changeProperty('description', e.currentTarget.value)}\n />\n <NativeSelect\n label=\"Type of Action\"\n description=\"The type of the action to be performed.\"\n name={`actionType-${action.id}`}\n defaultValue={actionType}\n onChange={(e) => setActionType(e.currentTarget.value)}\n data={['', 'appointment', 'lab', 'questionnaire', 'task']}\n />\n {action.action && action.action.length > 0 && (\n <ActionArrayBuilder\n actions={action.action}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n setHoverKey={props.setHoverKey}\n onChange={(x) => changeProperty('action', x)}\n />\n )}\n {(() => {\n switch (actionType) {\n case 'appointment':\n return (\n <ActionResourceTypeBuilder\n title=\"Appointment\"\n description=\"The subject must schedule an appointment from the schedule.\"\n resourceType=\"Schedule\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'lab':\n return (\n <ActionResourceTypeBuilder\n title=\"Lab\"\n description=\"The subject must complete the following lab panel.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'questionnaire':\n return (\n <ActionResourceTypeBuilder\n title=\"Questionnaire\"\n description=\"The subject must complete the selected questionnaire.\"\n resourceType=\"Questionnaire\"\n action={action}\n onChange={props.onChange}\n />\n );\n case 'task':\n return (\n <ActionResourceTypeBuilder\n title=\"Task\"\n description=\"The subject must complete the following task.\"\n resourceType=\"ActivityDefinition\"\n action={action}\n onChange={props.onChange}\n />\n );\n default:\n return null;\n }\n })()}\n <FormSection title=\"Timing\" description=\"When the action should take place.\">\n <ActionTimingInput name={'timing-' + action.id} action={action} onChange={props.onChange} />\n </FormSection>\n </Stack>\n );\n}\n\ninterface ActionResourceTypeBuilderProps {\n action: PlanDefinitionAction;\n title: string;\n description: string;\n resourceType: ResourceType;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionResourceTypeBuilder(props: ActionResourceTypeBuilderProps): JSX.Element {\n const { id, definitionCanonical } = props.action;\n const reference = definitionCanonical?.startsWith(props.resourceType + '/')\n ? { reference: definitionCanonical }\n : undefined;\n return (\n <ResourceInput\n name={id as string}\n resourceType={props.resourceType}\n defaultValue={reference}\n loadOnFocus={true}\n onChange={(newValue) => {\n if (newValue) {\n props.onChange({ ...props.action, definitionCanonical: getReferenceString(newValue) });\n } else {\n props.onChange({ ...props.action, definitionCanonical: undefined });\n }\n }}\n />\n );\n}\n\ninterface ActionTimingInputProps {\n name: string;\n action: PlanDefinitionAction;\n onChange: (action: PlanDefinitionAction) => void;\n}\n\nfunction ActionTimingInput(props: ActionTimingInputProps): JSX.Element {\n const value = props.action;\n const key = 'timing';\n const [propertyValue, propertyType] = getActionTiming(value);\n return (\n <ResourcePropertyInput\n property={timingProperty}\n name=\"timing[x]\"\n defaultValue={propertyValue}\n defaultPropertyType={propertyType}\n onChange={(newValue: any, propName?: string) => {\n props.onChange(setPropertyValue(value, key, propName ?? key, timingProperty, newValue));\n }}\n outcome={undefined}\n />\n );\n}\n\nfunction getInitialActionType(action: PlanDefinitionAction): string | undefined {\n if (action.definitionCanonical?.startsWith('Schedule')) {\n return 'appointment';\n }\n\n if (action.definitionCanonical?.startsWith('Questionnaire/')) {\n return 'questionnaire';\n }\n\n if (action.definitionCanonical?.startsWith('ActivityDefinition/')) {\n return 'task';\n }\n\n return undefined;\n}\n\nfunction getActionTiming(action: PlanDefinitionAction): [any, string] {\n return getValueAndType({ type: 'PlanDefinitionAction', value: action }, 'timing');\n}\n\nlet nextId = 1;\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @param existing - Optional existing id which will update nextId.\n * @returns A unique key.\n */\nfunction generateId(existing?: string): string {\n if (existing) {\n if (existing.startsWith('id-')) {\n const existingNum = parseInt(existing.substring(3), 10);\n if (!isNaN(existingNum)) {\n nextId = Math.max(nextId, existingNum + 1);\n }\n }\n return existing;\n }\n return 'id-' + nextId++;\n}\n\nfunction ensurePlanDefinitionKeys(planDefinition: PlanDefinition): PlanDefinition {\n return {\n ...planDefinition,\n action: ensurePlanDefinitionActionKeys(planDefinition.action),\n } as PlanDefinition;\n}\n\nfunction ensurePlanDefinitionActionKeys(\n actions: PlanDefinitionAction[] | undefined\n): PlanDefinitionAction[] | undefined {\n if (!actions) {\n return undefined;\n }\n return actions.map((action) => ({\n ...action,\n id: generateId(action.id),\n action: ensurePlanDefinitionActionKeys(action.action),\n }));\n}\n", "\n.section {\n position: relative;\n margin: 4px 4px 8px;\n padding: 6px 12px 16px 6px;\n border: 1.5px solid var(--mantine-color-gray-1);\n border-radius: var(--mantine-radius-sm);\n transition: all 0.1;\n}\n\n.hovering {\n border: 1.5px solid var(--mantine-color-blue-5);\n}\n\n.editing {\n border: 1.5px solid var(--mantine-color-gray-1);\n border-left: 4px solid var(--mantine-color-blue-5);\n}\n\n.bottomActions {\n position: absolute;\n right: 4px;\n bottom: 0;\n font-size: var(--mantine-font-size-xs);\n\n & a {\n margin-left: 8px;\n }\n}", "import { Anchor, Box, Button, Group, NativeSelect, Space, Textarea, TextInput, Title } from '@mantine/core';\nimport { getElementDefinition, isResource as isResourceType } from '@medplum/core';\nimport {\n Extension,\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n Reference,\n ResourceType,\n} from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { IconArrowDown, IconArrowUp } from '@tabler/icons-react';\nimport cx from 'clsx';\nimport { MouseEvent, SyntheticEvent, useEffect, useRef, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { QuestionnaireFormItem } from '../QuestionnaireForm/QuestionnaireFormItem/QuestionnaireFormItem';\nimport { getValueAndType } from '../ResourcePropertyDisplay/ResourcePropertyDisplay.utils';\nimport { ResourcePropertyInput } from '../ResourcePropertyInput/ResourcePropertyInput';\nimport { ResourceTypeInput } from '../ResourceTypeInput/ResourceTypeInput';\nimport { killEvent } from '../utils/dom';\nimport {\n getQuestionnaireItemReferenceTargetTypes,\n isChoiceQuestion,\n QuestionnaireItemType,\n setQuestionnaireItemReferenceTargetTypes,\n} from '../utils/questionnaire';\nimport classes from './QuestionnaireBuilder.module.css';\n\nexport interface QuestionnaireBuilderProps {\n questionnaire: Partial<Questionnaire> | Reference<Questionnaire>;\n onSubmit: (result: Questionnaire) => void;\n autoSave?: boolean;\n}\n\nexport function QuestionnaireBuilder(props: QuestionnaireBuilderProps): JSX.Element | null {\n const medplum = useMedplum();\n const defaultValue = useResource(props.questionnaire);\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n const [value, setValue] = useState<Questionnaire>();\n const [selectedKey, setSelectedKey] = useState<string>();\n const [hoverKey, setHoverKey] = useState<string>();\n\n function handleDocumentMouseOver(): void {\n setHoverKey(undefined);\n }\n\n function handleDocumentClick(): void {\n setSelectedKey(undefined);\n }\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setValue(ensureQuestionnaireKeys(defaultValue ?? { resourceType: 'Questionnaire', status: 'active' }));\n document.addEventListener('mouseover', handleDocumentMouseOver);\n document.addEventListener('click', handleDocumentClick);\n return () => {\n document.removeEventListener('mouseover', handleDocumentMouseOver);\n document.removeEventListener('click', handleDocumentClick);\n };\n }, [defaultValue]);\n\n const handleChange = (questionnaire: Questionnaire, disableSubmit?: boolean): void => {\n setValue(questionnaire);\n if (props.autoSave && !disableSubmit && props.onSubmit) {\n props.onSubmit(questionnaire);\n }\n };\n\n if (!schemaLoaded || !value) {\n return null;\n }\n\n return (\n <div>\n <Form testid=\"questionnaire-form\" onSubmit={() => props.onSubmit(value)}>\n <ItemBuilder\n item={value}\n selectedKey={selectedKey}\n setSelectedKey={setSelectedKey}\n hoverKey={hoverKey}\n setHoverKey={setHoverKey}\n onChange={handleChange}\n />\n <Button type=\"submit\">Save</Button>\n </Form>\n </div>\n );\n}\n\ninterface ItemBuilderProps<T extends Questionnaire | QuestionnaireItem> {\n item: T;\n selectedKey: string | undefined;\n setSelectedKey: (key: string | undefined) => void;\n hoverKey: string | undefined;\n isFirst?: boolean;\n isLast?: boolean;\n setHoverKey: (key: string | undefined) => void;\n onChange: (item: T, disableSubmit?: boolean) => void;\n onRemove?: () => void;\n onRepeatable?: (item: QuestionnaireItem) => void;\n onMoveUp?(): void;\n onMoveDown?(): void;\n}\n\nfunction ItemBuilder<T extends Questionnaire | QuestionnaireItem>(props: ItemBuilderProps<T>): JSX.Element {\n const resource = props.item as Questionnaire;\n const item = props.item as QuestionnaireItem;\n const isResource = isResourceType(props.item);\n const isContainer = isResource || item.type === QuestionnaireItemType.group;\n const linkId = item.linkId ?? '[untitled]';\n const editing = props.selectedKey === props.item.id;\n const hovering = props.hoverKey === props.item.id;\n\n const itemRef = useRef<T>();\n itemRef.current = props.item;\n\n function onClick(e: SyntheticEvent): void {\n killEvent(e);\n props.setSelectedKey(props.item.id);\n }\n\n function onHover(e: SyntheticEvent): void {\n killEvent(e);\n props.setHoverKey(props.item.id);\n }\n\n function changeItem(changedItem: QuestionnaireItem): void {\n const curr = itemRef.current as T;\n props.onChange({\n ...curr,\n item: curr.item?.map((i) => (i.id === changedItem.id ? changedItem : i)),\n } as T);\n }\n\n function addItem(addedItem: QuestionnaireItem, disableSubmit?: boolean): void {\n props.onChange(\n {\n ...props.item,\n item: [...(props.item.item ?? []), addedItem],\n },\n disableSubmit\n );\n }\n\n function removeItem(removedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item.item?.filter((i) => i !== removedItem),\n });\n }\n\n function changeProperty(property: string, value: any): void {\n props.onChange({\n ...itemRef.current,\n [property]: value,\n } as T);\n }\n\n function updateItem(updatedItem: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n ...updatedItem,\n });\n }\n\n function toggleRepeatable(item: QuestionnaireItem): void {\n props.onChange({\n ...props.item,\n item: props.item.item?.map((i) => (i === item ? { ...i, repeats: !i.repeats } : i)),\n });\n }\n\n function moveItem(itemIndex: number, delta: number): void {\n const updatedItems = reorderItems(props.item.item, itemIndex, delta);\n\n props.onChange({\n ...props.item,\n item: updatedItems,\n });\n }\n\n const className = cx(classes.section, {\n [classes.editing]: editing,\n [classes.hovering]: hovering && !editing,\n });\n\n return (\n <div data-testid={item.linkId} className={className} onClick={onClick} onMouseOver={onHover} onFocus={onHover}>\n <div className={classes.questionBody}>\n {editing ? (\n <>\n {isResource && (\n <TextInput\n size=\"xl\"\n defaultValue={resource.title}\n onBlur={(e) => changeProperty('title', e.currentTarget.value)}\n />\n )}\n {!isResource && (\n <Textarea\n autosize\n minRows={2}\n defaultValue={item.text}\n onBlur={(e) => changeProperty('text', e.currentTarget.value)}\n />\n )}\n {item.type === 'reference' && <ReferenceProfiles item={item} onChange={updateItem} />}\n {isChoiceQuestion(item) && <AnswerBuilder item={item} onChange={(item) => updateItem(item)} />}\n </>\n ) : (\n <>\n {resource.title && <Title>{resource.title}</Title>}\n {item.text && <div>{item.text}</div>}\n {!isContainer && (\n <QuestionnaireFormItem\n item={item}\n index={0}\n onChange={() => undefined}\n response={{ linkId: item.linkId }}\n />\n )}\n </>\n )}\n </div>\n {item.item?.map((item, i) => (\n <div key={item.id}>\n <ItemBuilder\n item={item}\n selectedKey={props.selectedKey}\n setSelectedKey={props.setSelectedKey}\n hoverKey={props.hoverKey}\n isFirst={i === 0}\n isLast={i === (props.item.item ?? []).length - 1}\n setHoverKey={props.setHoverKey}\n onChange={changeItem}\n onRemove={() => removeItem(item)}\n onRepeatable={toggleRepeatable}\n onMoveUp={() => moveItem(i, -1)}\n onMoveDown={() => moveItem(i, 1)}\n />\n </div>\n ))}\n {!isContainer && (\n <div className={classes.topActions}>\n {editing ? (\n <>\n <TextInput\n size=\"xs\"\n className={classes.linkIdInput}\n defaultValue={item.linkId}\n onBlur={(e) => changeProperty('linkId', e.currentTarget.value)}\n />\n {!isContainer && (\n <NativeSelect\n size=\"xs\"\n className={classes.typeSelect}\n defaultValue={item.type}\n onChange={(e) => changeProperty('type', e.currentTarget.value)}\n data={[\n { value: 'display', label: 'Display' },\n { value: 'boolean', label: 'Boolean' },\n { value: 'decimal', label: 'Decimal' },\n { value: 'integer', label: 'Integer' },\n { value: 'date', label: 'Date' },\n { value: 'dateTime', label: 'Date/Time' },\n { value: 'time', label: 'Time' },\n { value: 'string', label: 'String' },\n { value: 'text', label: 'Text' },\n { value: 'url', label: 'URL' },\n { value: 'choice', label: 'Choice' },\n { value: 'open-choice', label: 'Open Choice' },\n { value: 'attachment', label: 'Attachment' },\n { value: 'reference', label: 'Reference' },\n { value: 'quantity', label: 'Quantity' },\n ]}\n />\n )}\n </>\n ) : (\n <div>{linkId}</div>\n )}\n </div>\n )}\n {!isResource && (\n <Box className={classes.movementActions}>\n <Box className={classes.columnAlignment}>\n {!props.isFirst && (\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (props.onMoveUp) {\n props.onMoveUp();\n }\n }}\n >\n <IconArrowUp data-testid=\"up-button\" size={15} className={classes.movementIcons} />\n </Anchor>\n )}\n {!props.isLast && (\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (props.onMoveDown) {\n props.onMoveDown();\n }\n }}\n >\n <IconArrowDown data-testid=\"down-button\" size={15} className={classes.movementIcons} />\n </Anchor>\n )}\n </Box>\n </Box>\n )}\n <div className={classes.bottomActions}>\n {isContainer && (\n <>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n addItem({\n id: generateId(),\n linkId: generateLinkId('q'),\n type: 'string',\n text: 'Question',\n } as QuestionnaireItem);\n }}\n >\n Add item\n </Anchor>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n addItem(\n {\n id: generateId(),\n linkId: generateLinkId('g'),\n type: 'group',\n text: 'Group',\n } as QuestionnaireItem,\n true\n );\n }}\n >\n Add group\n </Anchor>\n </>\n )}\n {isResource && (\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n addItem(createPage(), true);\n }}\n >\n Add Page\n </Anchor>\n )}\n {editing && !isResource && (\n <>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (props.onRepeatable) {\n props.onRepeatable(item);\n }\n }}\n >\n {item.repeats ? 'Remove Repeatable' : 'Make Repeatable'}\n </Anchor>\n <Anchor\n href=\"#\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (props.onRemove) {\n props.onRemove();\n }\n }}\n >\n Remove\n </Anchor>\n </>\n )}\n </div>\n </div>\n );\n}\n\ninterface AnswerBuilderProps {\n item: QuestionnaireItem;\n onChange: (item: QuestionnaireItem) => void;\n}\n\nfunction AnswerBuilder(props: AnswerBuilderProps): JSX.Element {\n const property = getElementDefinition('QuestionnaireItemAnswerOption', 'value[x]');\n const options = props.item.answerOption ?? [];\n return (\n <div>\n {props.item.answerValueSet !== undefined ? (\n <TextInput\n placeholder=\"Enter Value Set\"\n defaultValue={props.item.answerValueSet}\n onChange={(e) => props.onChange({ ...props.item, answerValueSet: e.target.value })}\n />\n ) : (\n <AnswerOptionsInput options={options} property={property} item={props.item} onChange={props.onChange} />\n )}\n <Box display=\"flex\">\n <Anchor\n href=\"#\"\n onClick={(e: SyntheticEvent) => {\n killEvent(e);\n props.onChange({\n ...props.item,\n answerValueSet: undefined,\n answerOption: [\n ...options,\n {\n id: generateId(),\n },\n ],\n });\n }}\n >\n Add choice\n </Anchor>\n <Space w=\"lg\" />\n <Anchor\n href=\"#\"\n onClick={(e: SyntheticEvent) => {\n killEvent(e);\n props.onChange({\n ...props.item,\n answerOption: [],\n answerValueSet: '',\n });\n }}\n >\n Add value set\n </Anchor>\n </Box>\n </div>\n );\n}\n\ninterface AnswerOptionsInputProps {\n options: QuestionnaireItemAnswerOption[];\n property: any;\n item: QuestionnaireItem;\n onChange: (item: QuestionnaireItem) => void;\n}\n\nfunction AnswerOptionsInput(props: AnswerOptionsInputProps): JSX.Element {\n return (\n <div>\n {props.options.map((option: QuestionnaireItemAnswerOption) => {\n const [propertyValue, propertyType] = getValueAndType(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n );\n return (\n <div\n key={option.id}\n style={{\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '80%',\n }}\n >\n <div>\n <ResourcePropertyInput\n key={option.id}\n name=\"value[x]\"\n property={props.property}\n defaultPropertyType={propertyType}\n defaultValue={propertyValue}\n onChange={(newValue: any, propName?: string) => {\n const newOptions = [...props.options];\n const index = newOptions.findIndex((o) => o.id === option.id);\n newOptions[index] = { id: option.id, [propName as string]: newValue };\n props.onChange({\n ...props.item,\n answerOption: newOptions,\n });\n }}\n outcome={undefined}\n />\n </div>\n\n <div>\n <Anchor\n href=\"#\"\n onClick={(e: SyntheticEvent) => {\n killEvent(e);\n props.onChange({\n ...props.item,\n answerOption: props.options.filter((o) => o.id !== option.id),\n });\n }}\n >\n Remove\n </Anchor>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\ninterface ReferenceTypeProps {\n item: QuestionnaireItem;\n onChange: (updatedItem: QuestionnaireItem) => void;\n}\n\nfunction ReferenceProfiles(props: ReferenceTypeProps): JSX.Element {\n const targetTypes = getQuestionnaireItemReferenceTargetTypes(props.item) ?? [];\n return (\n <>\n {targetTypes.map((targetType: ResourceType, index: number) => {\n return (\n <Group key={`${targetType}-${index}`}>\n <ResourceTypeInput\n name=\"resourceType\"\n placeholder=\"Resource Type\"\n defaultValue={targetType}\n onChange={(newValue) => {\n props.onChange(\n setQuestionnaireItemReferenceTargetTypes(\n props.item,\n targetTypes.map((t) => (t === targetType ? (newValue as ResourceType) : t))\n )\n );\n }}\n />\n <Anchor\n href=\"#\"\n onClick={(e: SyntheticEvent) => {\n killEvent(e);\n props.onChange(\n setQuestionnaireItemReferenceTargetTypes(\n props.item,\n targetTypes.filter((t) => t !== targetType)\n )\n );\n }}\n >\n Remove\n </Anchor>\n </Group>\n );\n })}\n <Anchor\n href=\"#\"\n onClick={(e: SyntheticEvent) => {\n killEvent(e);\n props.onChange(setQuestionnaireItemReferenceTargetTypes(props.item, [...targetTypes, '' as ResourceType]));\n }}\n >\n Add Resource Type\n </Anchor>\n </>\n );\n}\n\nlet nextLinkId = 1;\nlet nextId = 1;\n\n/**\n * Generates a link ID for an item.\n * Link IDs are required properties on QuestionnaireItem objects.\n * @param prefix - The link ID prefix string.\n * @returns A unique link ID.\n */\nfunction generateLinkId(prefix: string): string {\n return prefix + nextLinkId++;\n}\n\n/**\n * Generates a unique ID.\n * React needs unique IDs for components for rendering performance.\n * All of the important components in the questionnaire builder have id properties for this:\n * Questionnaire, QuestionnaireItem, and QuestionnaireItemAnswerOption.\n * @returns A unique key.\n */\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction ensureQuestionnaireKeys(questionnaire: Questionnaire): Questionnaire {\n return {\n ...questionnaire,\n id: questionnaire.id || generateId(),\n item: ensureQuestionnaireItemKeys(questionnaire.item),\n } as Questionnaire;\n}\n\nfunction ensureQuestionnaireItemKeys(items: QuestionnaireItem[] | undefined): QuestionnaireItem[] | undefined {\n if (!items) {\n return undefined;\n }\n items.forEach((item) => {\n if (item.id?.match(/^id-\\d+$/)) {\n nextId = Math.max(nextId, parseInt(item.id.substring(3), 10) + 1);\n }\n if (item.linkId?.match(/^q\\d+$/)) {\n nextLinkId = Math.max(nextLinkId, parseInt(item.linkId.substring(1), 10) + 1);\n }\n });\n return items.map((item) => ({\n ...item,\n id: item.id || generateId(),\n item: ensureQuestionnaireItemKeys(item.item),\n answerOption: ensureQuestionnaireOptionKeys(item.answerOption),\n }));\n}\n\nfunction ensureQuestionnaireOptionKeys(\n options: QuestionnaireItemAnswerOption[] | undefined\n): QuestionnaireItemAnswerOption[] | undefined {\n if (!options) {\n return undefined;\n }\n return options.map((option) => ({\n ...option,\n id: option.id || generateId(),\n }));\n}\n\nfunction createPage(): QuestionnaireItem {\n return {\n id: generateId(),\n linkId: generateLinkId('s'),\n type: 'group',\n text: `New Page`,\n extension: [\n {\n url: 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl',\n valueCodeableConcept: {\n coding: [\n {\n system: 'http://hl7.org/fhir/questionnaire-item-control',\n code: 'page',\n },\n ],\n },\n } as Extension,\n ],\n } as QuestionnaireItem;\n}\n\nfunction reorderItems(items: QuestionnaireItem[] | undefined, itemIndex: number, delta: number): QuestionnaireItem[] {\n const currentItems = items ?? [];\n const newIndex = itemIndex + delta;\n if (newIndex < 0 || newIndex >= currentItems.length) {\n return currentItems;\n }\n\n const updatedItems = [...currentItems];\n [updatedItems[itemIndex], updatedItems[newIndex]] = [updatedItems[newIndex], updatedItems[itemIndex]];\n\n return updatedItems;\n}\n", "import { Checkbox, Group, MultiSelect, NativeSelect, Radio, Textarea, TextInput } from '@mantine/core';\nimport {\n capitalize,\n deepEquals,\n formatCodeableConcept,\n formatCoding,\n getElementDefinition,\n getTypedPropertyValue,\n stringify,\n TypedValue,\n} from '@medplum/core';\nimport {\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemInitial,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n} from '@medplum/fhirtypes';\nimport { ChangeEvent, useContext } from 'react';\nimport { AttachmentInput } from '../../AttachmentInput/AttachmentInput';\nimport { CheckboxFormSection } from '../../CheckboxFormSection/CheckboxFormSection';\nimport { CodingInput } from '../../CodingInput/CodingInput';\nimport { DateTimeInput } from '../../DateTimeInput/DateTimeInput';\nimport { QuantityInput } from '../../QuantityInput/QuantityInput';\nimport { ReferenceInput } from '../../ReferenceInput/ReferenceInput';\nimport { ResourcePropertyDisplay } from '../../ResourcePropertyDisplay/ResourcePropertyDisplay';\nimport {\n formatReferenceString,\n getNewMultiSelectValues,\n getQuestionnaireItemReferenceFilter,\n getQuestionnaireItemReferenceTargetTypes,\n QuestionnaireItemType,\n} from '../../utils/questionnaire';\nimport { QuestionnaireFormContext } from '../QuestionnaireForm.context';\n\nexport interface QuestionnaireFormItemProps {\n item: QuestionnaireItem;\n index: number;\n response: QuestionnaireResponseItem;\n onChange: (newResponseItem: QuestionnaireResponseItem) => void;\n}\n\nexport function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null {\n const context = useContext(QuestionnaireFormContext);\n const item = props.item;\n const response = props.response;\n\n function onChangeAnswer(\n newResponseAnswer: QuestionnaireResponseItemAnswer | QuestionnaireResponseItemAnswer[]\n ): void {\n let updatedAnswers: QuestionnaireResponseItemAnswer[];\n if (Array.isArray(newResponseAnswer)) {\n // It's a multi-select case, so use the array directly.\n updatedAnswers = newResponseAnswer;\n } else if (props.index >= (props.response?.answer?.length ?? 0)) {\n // if adding a new answer\n updatedAnswers = (props.response?.answer ?? []).concat([newResponseAnswer]);\n } else {\n // if updating an existing answer\n const newAnswers = (props.response?.answer ?? []).map((a, idx) =>\n idx === props.index ? newResponseAnswer : a\n ) as QuestionnaireResponseItemAnswer[];\n updatedAnswers = newAnswers ?? [];\n }\n props.onChange({\n id: response?.id,\n linkId: response?.linkId,\n text: item.text,\n answer: updatedAnswers,\n });\n }\n\n const type = item.type;\n if (!type) {\n return null;\n }\n\n const name = item.linkId;\n if (!name) {\n return null;\n }\n\n const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;\n const defaultValue =\n getCurrentAnswer(response, props.index) ??\n getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value');\n\n switch (type) {\n case QuestionnaireItemType.display:\n return <p key={props.item.linkId}>{props.item.text}</p>;\n case QuestionnaireItemType.boolean:\n return (\n <CheckboxFormSection key={props.item.linkId} title={props.item.text} htmlFor={props.item.linkId}>\n <Checkbox\n id={props.item.linkId}\n name={props.item.linkId}\n defaultChecked={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked })}\n />\n </CheckboxFormSection>\n );\n case QuestionnaireItemType.decimal:\n return (\n <TextInput\n type=\"number\"\n step=\"any\"\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.integer:\n return (\n <TextInput\n type=\"number\"\n step={1}\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber })}\n />\n );\n case QuestionnaireItemType.date:\n return (\n <TextInput\n type=\"date\"\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueDate: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.dateTime:\n return (\n <DateTimeInput\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(newValue: string) => onChangeAnswer({ valueDateTime: newValue })}\n />\n );\n case QuestionnaireItemType.time:\n return (\n <TextInput\n type=\"time\"\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueTime: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.string:\n case QuestionnaireItemType.url:\n return (\n <TextInput\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.text:\n return (\n <Textarea\n id={name}\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(e) => onChangeAnswer({ valueString: e.currentTarget.value })}\n />\n );\n case QuestionnaireItemType.attachment:\n return (\n <Group py={4}>\n <AttachmentInput\n name={name}\n defaultValue={defaultValue?.value}\n onChange={(newValue) => onChangeAnswer({ valueAttachment: newValue })}\n />\n </Group>\n );\n case QuestionnaireItemType.reference:\n return (\n <ReferenceInput\n name={name}\n required={item.required}\n targetTypes={getQuestionnaireItemReferenceTargetTypes(item)}\n searchCriteria={getQuestionnaireItemReferenceFilter(item, context.subject, context.encounter)}\n defaultValue={defaultValue?.value}\n onChange={(newValue) => onChangeAnswer({ valueReference: newValue })}\n />\n );\n case QuestionnaireItemType.quantity:\n return (\n <QuantityInput\n name={name}\n required={item.required}\n defaultValue={defaultValue?.value}\n onChange={(newValue) => onChangeAnswer({ valueQuantity: newValue })}\n disableWheel\n />\n );\n case QuestionnaireItemType.choice:\n case QuestionnaireItemType.openChoice:\n if (isDropDownChoice(item) && !item.answerValueSet) {\n return (\n <QuestionnaireChoiceDropDownInput\n name={name}\n item={item}\n initial={initial}\n response={response}\n onChangeAnswer={(e) => onChangeAnswer(e)}\n />\n );\n } else {\n return (\n <QuestionnaireChoiceSetInput\n name={name}\n item={item}\n initial={initial}\n response={response}\n onChangeAnswer={(e) => onChangeAnswer(e)}\n />\n );\n }\n default:\n return null;\n }\n}\n\ninterface QuestionnaireChoiceInputProps {\n name: string;\n item: QuestionnaireItem;\n initial: QuestionnaireItemInitial | undefined;\n response: QuestionnaireResponseItem;\n onChangeAnswer: (newResponseAnswer: QuestionnaireResponseItemAnswer | QuestionnaireResponseItemAnswer[]) => void;\n}\n\nfunction QuestionnaireChoiceDropDownInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, response } = props;\n\n if (!item.answerOption?.length) {\n return <NoAnswerDisplay />;\n }\n\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const data = [''];\n\n for (const option of item.answerOption) {\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n data.push(typedValueToString(optionValue) as string);\n }\n\n const defaultValue = getCurrentAnswer(response) ?? initialValue;\n\n if (item.repeats) {\n const { propertyName, data } = formatSelectData(props.item);\n const currentAnswer = getCurrentMultiSelectAnswer(response);\n\n return (\n <MultiSelect\n data={data}\n placeholder=\"Select items\"\n searchable\n defaultValue={currentAnswer || [typedValueToString(initialValue)]}\n onChange={(selected) => {\n const values = getNewMultiSelectValues(selected, propertyName, item);\n props.onChangeAnswer(values);\n }}\n />\n );\n }\n\n return (\n <NativeSelect\n id={name}\n name={name}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n const index = e.currentTarget.selectedIndex;\n if (index === 0) {\n props.onChangeAnswer({});\n return;\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[index - 1];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n props.onChangeAnswer({ [propertyName]: optionValue.value });\n }}\n defaultValue={formatCoding(defaultValue?.value) || defaultValue?.value}\n data={data}\n />\n );\n}\n\nfunction QuestionnaireChoiceSetInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer, response } = props;\n\n if (!item.answerOption?.length && !item.answerValueSet) {\n return <NoAnswerDisplay />;\n }\n\n if (item.answerValueSet) {\n return (\n <CodingInput\n name={name}\n binding={item.answerValueSet}\n onChange={(code) => onChangeAnswer({ valueCoding: code })}\n />\n );\n }\n return (\n <QuestionnaireChoiceRadioInput\n name={response?.id ?? name}\n item={item}\n initial={initial}\n response={response}\n onChangeAnswer={onChangeAnswer}\n />\n );\n}\n\nfunction QuestionnaireChoiceRadioInput(props: QuestionnaireChoiceInputProps): JSX.Element {\n const { name, item, initial, onChangeAnswer, response } = props;\n const valueElementDefinition = getElementDefinition('QuestionnaireItemAnswerOption', 'value[x]');\n const initialValue = getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value') as\n | TypedValue\n | undefined;\n\n const options: [string, TypedValue][] = [];\n let defaultValue = undefined;\n if (item.answerOption) {\n for (let i = 0; i < item.answerOption.length; i++) {\n const option = item.answerOption[i];\n const optionName = `${name}-option-${i}`;\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n\n if (!optionValue?.value) {\n continue;\n }\n\n if (initialValue && stringify(optionValue) === stringify(initialValue)) {\n defaultValue = optionName;\n }\n options.push([optionName, optionValue]);\n }\n }\n\n const defaultAnswer = getCurrentAnswer(response);\n const answerLinkId = getCurrentRadioAnswer(options, defaultAnswer);\n\n return (\n <Radio.Group\n name={name}\n value={answerLinkId ?? defaultValue}\n onChange={(newValue) => {\n const option = options.find((option) => option[0] === newValue);\n if (option) {\n const optionValue = option[1];\n const propertyName = 'value' + capitalize(optionValue.type);\n onChangeAnswer({ [propertyName]: optionValue.value });\n }\n }}\n >\n {options.map(([optionName, optionValue]) => (\n <Radio\n key={optionName}\n id={optionName}\n value={optionName}\n py={4}\n label={\n <ResourcePropertyDisplay\n property={valueElementDefinition}\n propertyType={optionValue.type}\n value={optionValue.value}\n />\n }\n />\n ))}\n </Radio.Group>\n );\n}\n\nfunction NoAnswerDisplay(): JSX.Element {\n return <TextInput disabled placeholder=\"No Answers Defined\" />;\n}\n\nfunction getItemValue(answer: QuestionnaireResponseItemAnswer): TypedValue {\n const itemValue = getTypedPropertyValue({ type: 'QuestionnaireItemAnswer', value: answer }, 'value') as TypedValue;\n return itemValue;\n}\n\nfunction getCurrentAnswer(response: QuestionnaireResponseItem, index: number = 0): TypedValue {\n const results = response.answer;\n return getItemValue(results?.[index] ?? {});\n}\n\nfunction getCurrentMultiSelectAnswer(response: QuestionnaireResponseItem): string[] {\n const results = response.answer;\n if (!results) {\n return [];\n }\n const typedValues = results.map((a) => getItemValue(a));\n return typedValues.map((type) => formatCoding(type?.value) || type?.value);\n}\n\nfunction getCurrentRadioAnswer(options: [string, TypedValue][], defaultAnswer: TypedValue): string | undefined {\n return options.find((option) => deepEquals(option[1].value, defaultAnswer?.value))?.[0];\n}\n\nfunction typedValueToString(typedValue: TypedValue | undefined): string | undefined {\n if (!typedValue) {\n return undefined;\n }\n if (typedValue.type === 'CodeableConcept') {\n return formatCodeableConcept(typedValue.value);\n }\n if (typedValue.type === 'Coding') {\n return formatCoding(typedValue.value);\n }\n if (typedValue.type === 'Reference') {\n return formatReferenceString(typedValue);\n }\n return typedValue.value.toString();\n}\n\nfunction isDropDownChoice(item: QuestionnaireItem): boolean {\n return !!item.extension?.some(\n (e) =>\n e.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl' &&\n e.valueCodeableConcept?.coding?.[0]?.code === 'drop-down'\n );\n}\n\ninterface MultiSelect {\n value: any;\n label: any;\n}\n\ninterface FormattedData {\n propertyName: string;\n data: MultiSelect[];\n}\n\nfunction formatSelectData(item: QuestionnaireItem): FormattedData {\n if (item.answerOption?.length === 0) {\n return { propertyName: '', data: [] };\n }\n const option = (item.answerOption as QuestionnaireItemAnswerOption[])[0];\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n const propertyName = 'value' + capitalize(optionValue.type);\n\n const data = (item.answerOption ?? []).map((a) => ({\n value: getValueAndLabel(a, propertyName),\n label: getValueAndLabel(a, propertyName),\n }));\n return { propertyName, data };\n}\n\nfunction getValueAndLabel(option: QuestionnaireItemAnswerOption, propertyName: string): string | undefined {\n return formatCoding(option.valueCoding) || option[propertyName as keyof QuestionnaireItemAnswerOption]?.toString();\n}\n", "import {\n TypedValue,\n deepClone,\n evalFhirPathTyped,\n formatCoding,\n getExtension,\n getReferenceString,\n getTypedPropertyValue,\n splitN,\n stringify,\n} from '@medplum/core';\nimport {\n Encounter,\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireItemAnswerOption,\n QuestionnaireItemEnableWhen,\n QuestionnaireItemInitial,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n QuestionnaireResponseItemAnswer,\n Reference,\n ResourceType,\n} from '@medplum/fhirtypes';\n\nexport enum QuestionnaireItemType {\n group = 'group',\n display = 'display',\n question = 'question',\n boolean = 'boolean',\n decimal = 'decimal',\n integer = 'integer',\n date = 'date',\n dateTime = 'dateTime',\n time = 'time',\n string = 'string',\n text = 'text',\n url = 'url',\n choice = 'choice',\n openChoice = 'open-choice',\n attachment = 'attachment',\n reference = 'reference',\n quantity = 'quantity',\n}\n\nexport function isChoiceQuestion(item: QuestionnaireItem): boolean {\n return item.type === 'choice' || item.type === 'open-choice';\n}\n\nexport function isQuestionEnabled(item: QuestionnaireItem, responseItems: QuestionnaireResponseItem[]): boolean {\n if (!item.enableWhen) {\n return true;\n }\n\n const enableBehavior = item.enableBehavior ?? 'any';\n\n for (const enableWhen of item.enableWhen) {\n const actualAnswers = getByLinkId(responseItems, enableWhen.question as string);\n\n if (enableWhen.operator === 'exists' && !enableWhen.answerBoolean && !actualAnswers?.length) {\n if (enableBehavior === 'any') {\n return true;\n } else {\n continue;\n }\n }\n const { anyMatch, allMatch } = checkAnswers(enableWhen, actualAnswers, enableBehavior);\n\n if (enableBehavior === 'any' && anyMatch) {\n return true;\n }\n if (enableBehavior === 'all' && !allMatch) {\n return false;\n }\n }\n\n return enableBehavior !== 'any';\n}\n\nexport function getNewMultiSelectValues(\n selected: string[],\n propertyName: string,\n item: QuestionnaireItem\n): QuestionnaireResponseItemAnswer[] {\n return selected.map((o) => {\n const option = item.answerOption?.find(\n (option) =>\n formatCoding(option.valueCoding) === o || option[propertyName as keyof QuestionnaireItemAnswerOption] === o\n );\n const optionValue = getTypedPropertyValue(\n { type: 'QuestionnaireItemAnswerOption', value: option },\n 'value'\n ) as TypedValue;\n return { [propertyName]: optionValue?.value };\n });\n}\n\nfunction getByLinkId(\n responseItems: QuestionnaireResponseItem[] | undefined,\n linkId: string\n): QuestionnaireResponseItemAnswer[] | undefined {\n if (!responseItems) {\n return undefined;\n }\n\n for (const response of responseItems) {\n if (response.linkId === linkId) {\n return response.answer;\n }\n if (response.item) {\n const nestedAnswer = getByLinkId(response.item, linkId);\n if (nestedAnswer) {\n return nestedAnswer;\n }\n }\n }\n\n return undefined;\n}\n\nfunction evaluateMatch(actualAnswer: TypedValue | undefined, expectedAnswer: TypedValue, operator?: string): boolean {\n // We handle exists separately since its so different in terms of comparisons than the other mathematical operators\n if (operator === 'exists') {\n // if actualAnswer is not undefined, then exists: true passes\n // if actualAnswer is undefined, then exists: false passes\n return !!actualAnswer === expectedAnswer.value;\n } else if (!actualAnswer) {\n return false;\n } else {\n // `=` and `!=` should be treated as the FHIRPath `~` and `!~`\n // All other operators should be unmodified\n const fhirPathOperator = operator === '=' || operator === '!=' ? operator?.replace('=', '~') : operator;\n const [{ value }] = evalFhirPathTyped(`%actualAnswer ${fhirPathOperator} %expectedAnswer`, [actualAnswer], {\n '%actualAnswer': actualAnswer,\n '%expectedAnswer': expectedAnswer,\n });\n return value;\n }\n}\n\nfunction checkAnswers(\n enableWhen: QuestionnaireItemEnableWhen,\n answers: QuestionnaireResponseItemAnswer[] | undefined,\n enableBehavior: 'any' | 'all'\n): { anyMatch: boolean; allMatch: boolean } {\n const actualAnswers = answers || [];\n const expectedAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireItemEnableWhen',\n value: enableWhen,\n },\n 'answer[x]'\n ) as TypedValue;\n\n let anyMatch = false;\n let allMatch = true;\n\n for (const actualAnswerValue of actualAnswers) {\n const actualAnswer = getTypedPropertyValue(\n {\n type: 'QuestionnaireResponseItemAnswer',\n value: actualAnswerValue,\n },\n 'value[x]'\n ) as TypedValue | undefined; // possibly undefined when question unanswered\n const { operator } = enableWhen;\n const match = evaluateMatch(actualAnswer, expectedAnswer, operator);\n if (match) {\n anyMatch = true;\n } else {\n allMatch = false;\n }\n\n if (enableBehavior === 'any' && anyMatch) {\n break;\n }\n }\n\n return { anyMatch, allMatch };\n}\n\nexport function getQuestionnaireItemReferenceTargetTypes(item: QuestionnaireItem): ResourceType[] | undefined {\n const extension = getExtension(item, 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource');\n if (!extension) {\n return undefined;\n }\n if (extension.valueCode !== undefined) {\n return [extension.valueCode] as ResourceType[];\n }\n if (extension.valueCodeableConcept) {\n return extension.valueCodeableConcept?.coding?.map((c) => c.code) as ResourceType[];\n }\n return undefined;\n}\n\nexport function setQuestionnaireItemReferenceTargetTypes(\n item: QuestionnaireItem,\n targetTypes: ResourceType[] | undefined\n): QuestionnaireItem {\n const result = deepClone(item);\n let extension = getExtension(result, 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource');\n\n if (!targetTypes || targetTypes.length === 0) {\n if (extension) {\n result.extension = result.extension?.filter((e) => e !== extension);\n }\n return result;\n }\n\n if (!extension) {\n if (!result.extension) {\n result.extension = [];\n }\n extension = { url: 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceResource' };\n result.extension.push(extension);\n }\n\n if (targetTypes.length === 1) {\n extension.valueCode = targetTypes[0];\n delete extension.valueCodeableConcept;\n } else {\n extension.valueCodeableConcept = { coding: targetTypes.map((t) => ({ code: t })) };\n delete extension.valueCode;\n }\n\n return result;\n}\n\n/**\n * Returns the reference filter for the given questionnaire item.\n * @see https://build.fhir.org/ig/HL7/fhir-extensions//StructureDefinition-questionnaire-referenceFilter-definitions.html\n * @param item - The questionnaire item to get the reference filter for.\n * @param subject - Optional subject reference.\n * @param encounter - Optional encounter reference.\n * @returns The reference filter as a map of key/value pairs.\n */\nexport function getQuestionnaireItemReferenceFilter(\n item: QuestionnaireItem,\n subject: Reference | undefined,\n encounter: Reference<Encounter> | undefined\n): Record<string, string> | undefined {\n const extension = getExtension(item, 'http://hl7.org/fhir/StructureDefinition/questionnaire-referenceFilter');\n if (!extension?.valueString) {\n return undefined;\n }\n\n // Replace variables\n let filter = extension.valueString;\n if (subject?.reference) {\n filter = filter.replaceAll('$subj', subject.reference);\n }\n if (encounter?.reference) {\n filter = filter.replaceAll('$encounter', encounter.reference);\n }\n\n // Parse the valueString into a map\n const result: Record<string, string> = {};\n const parts = filter.split('&');\n for (const part of parts) {\n const [key, value] = splitN(part, '=', 2);\n result[key] = value;\n }\n return result;\n}\n\nexport function buildInitialResponse(questionnaire: Questionnaire): QuestionnaireResponse {\n const response: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n questionnaire: getReferenceString(questionnaire),\n item: buildInitialResponseItems(questionnaire.item),\n status: 'in-progress',\n };\n\n return response;\n}\n\nfunction buildInitialResponseItems(items: QuestionnaireItem[] | undefined): QuestionnaireResponseItem[] {\n return items?.map(buildInitialResponseItem) ?? [];\n}\n\nexport function buildInitialResponseItem(item: QuestionnaireItem): QuestionnaireResponseItem {\n return {\n id: generateId(),\n linkId: item.linkId,\n text: item.text,\n item: buildInitialResponseItems(item.item),\n answer: item.initial?.map(buildInitialResponseAnswer) ?? [],\n };\n}\n\nlet nextId = 1;\nfunction generateId(): string {\n return 'id-' + nextId++;\n}\n\nfunction buildInitialResponseAnswer(answer: QuestionnaireItemInitial): QuestionnaireResponseItemAnswer {\n // This works because QuestionnaireItemInitial and QuestionnaireResponseItemAnswer\n // have the same properties.\n return { ...answer };\n}\n\nexport function formatReferenceString(typedValue: TypedValue): string {\n return typedValue.value.display || typedValue.value.reference || stringify(typedValue.value);\n}\n\n/**\n * Returns the number of pages in the questionnaire.\n *\n * By default, a questionnaire is represented as a simple single page questionnaire,\n * so the default return value is 1.\n *\n * If the questionnaire has a page extension on the first item, then the number of pages\n * is the number of top level items in the questionnaire.\n *\n * @param questionnaire - The questionnaire to get the number of pages for.\n * @returns The number of pages in the questionnaire. Default is 1.\n */\nexport function getNumberOfPages(questionnaire: Questionnaire): number {\n const firstItem = questionnaire?.item?.[0];\n if (firstItem) {\n const extension = getExtension(firstItem, 'http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl');\n if (extension?.valueCodeableConcept?.coding?.[0]?.code === 'page') {\n return (questionnaire.item as QuestionnaireItem[]).length;\n }\n }\n return 1;\n}\n", "import { Encounter, Reference } from '@medplum/fhirtypes';\nimport { createContext } from 'react';\n\nexport const QuestionnaireFormContext = createContext<{ subject?: Reference; encounter?: Reference<Encounter> }>({});\n", ".section {\n position: relative;\n margin: 4px 4px 8px;\n padding: 6px 12px 16px 6px;\n border: 1.5px solid var(--mantine-color-gray-1);\n border-radius: var(--mantine-radius-sm);\n transition: all 0.1;\n}\n\n.hovering {\n border: 1.5px solid var(--mantine-color-blue-5);\n}\n\n.editing {\n border: 1.5px solid var(--mantine-color-gray-1);\n border-left: 4px solid var(--mantine-color-blue-5);\n}\n\n.questionBody {\n max-width: 600px;\n}\n\n.topActions {\n position: absolute;\n right: 32px;\n top: 1px;\n padding: 4px;\n color: var(--mantine-color-gray-5);\n font-size: var(--mantine-font-size-xs);\n}\n\n.bottomActions {\n position: absolute;\n right: 4px;\n bottom: 0;\n font-size: var(--mantine-font-size-xs);\n\n & a {\n margin-left: 8px;\n }\n}\n\n.movementActions {\n position: absolute;\n right: 8px;\n top: 0;\n padding-top: 8px;\n font-size: var(--mantine-font-size-xs);\n\n & a {\n margin-left: 8px;\n }\n}\n\n.movementIcons {\n color: var(--mantine-color-gray-5);\n}\n\n.columnAlignment {\n display: flex;\n flex-direction: column;\n}\n\n.linkIdInput {\n width: 100px;\n margin-bottom: 4px;\n}\n\n.typeSelect {\n width: 100px;\n}\n", "import { Title } from '@mantine/core';\nimport { ProfileResource, createReference, getReferenceString } from '@medplum/core';\nimport {\n Encounter,\n Questionnaire,\n QuestionnaireItem,\n QuestionnaireResponse,\n QuestionnaireResponseItem,\n Reference,\n} from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { useEffect, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { buildInitialResponse, getNumberOfPages, isQuestionEnabled } from '../utils/questionnaire';\nimport { QuestionnaireFormContext } from './QuestionnaireForm.context';\nimport { QuestionnairePageSequence } from './QuestionnaireFormComponents/QuestionnaireFormPageSequence';\n\nexport interface QuestionnaireFormProps {\n questionnaire: Questionnaire | Reference<Questionnaire>;\n subject?: Reference;\n encounter?: Reference<Encounter>;\n submitButtonText?: string;\n onSubmit: (response: QuestionnaireResponse) => void;\n}\n\nexport function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null {\n const medplum = useMedplum();\n const source = medplum.getProfile();\n const [schemaLoaded, setSchemaLoaded] = useState(false);\n const questionnaire = useResource(props.questionnaire);\n const [response, setResponse] = useState<QuestionnaireResponse | undefined>();\n const [activePage, setActivePage] = useState(0);\n\n useEffect(() => {\n medplum\n .requestSchema('Questionnaire')\n .then(() => medplum.requestSchema('QuestionnaireResponse'))\n .then(() => setSchemaLoaded(true))\n .catch(console.log);\n }, [medplum]);\n\n useEffect(() => {\n setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);\n }, [questionnaire]);\n\n function setItems(newResponseItems: QuestionnaireResponseItem | QuestionnaireResponseItem[]): void {\n const currentItems = response?.item ?? [];\n const mergedItems = mergeItems(\n currentItems,\n Array.isArray(newResponseItems) ? newResponseItems : [newResponseItems]\n );\n\n const newResponse: QuestionnaireResponse = {\n resourceType: 'QuestionnaireResponse',\n status: 'in-progress',\n item: mergedItems,\n };\n\n setResponse(newResponse);\n }\n\n function checkForQuestionEnabled(item: QuestionnaireItem): boolean {\n return isQuestionEnabled(item, response?.item ?? []);\n }\n\n if (!schemaLoaded || !questionnaire) {\n return null;\n }\n\n const numberOfPages = getNumberOfPages(questionnaire);\n const nextStep = (): void => setActivePage((current) => current + 1);\n const prevStep = (): void => setActivePage((current) => current - 1);\n\n return (\n <QuestionnaireFormContext.Provider value={{ subject: props.subject, encounter: props.encounter }}>\n <Form\n testid=\"questionnaire-form\"\n onSubmit={() => {\n if (props.onSubmit && response) {\n props.onSubmit({\n ...response,\n questionnaire: getReferenceString(questionnaire),\n subject: props.subject,\n source: createReference(source as ProfileResource),\n authored: new Date().toISOString(),\n status: 'completed',\n });\n }\n }}\n >\n {questionnaire.title && <Title>{questionnaire.title}</Title>}\n <QuestionnairePageSequence\n items={questionnaire.item ?? []}\n response={response}\n onChange={setItems}\n renderPages={numberOfPages > 1}\n activePage={activePage}\n numberOfPages={numberOfPages}\n submitButtonText={props.submitButtonText}\n checkForQuestionEnabled={checkForQuestionEnabled}\n nextStep={nextStep}\n prevStep={prevStep}\n />\n </Form>\n </QuestionnaireFormContext.Provider>\n );\n}\n\nfunction mergeIndividualItems(\n prevItem: QuestionnaireResponseItem,\n newItem: QuestionnaireResponseItem\n): QuestionnaireResponseItem {\n // Recursively merge the nested items based on their ids.\n const mergedNestedItems = mergeItems(prevItem.item ?? [], newItem.item ?? []);\n\n return {\n ...newItem,\n item: mergedNestedItems.length > 0 ? mergedNestedItems : undefined,\n answer: newItem.answer && newItem.answer.length > 0 ? newItem.answer : prevItem.answer,\n };\n}\n\nfunction mergeItems(\n prevItems: QuestionnaireResponseItem[],\n newItems: QuestionnaireResponseItem[]\n): QuestionnaireResponseItem[] {\n const result: QuestionnaireResponseItem[] = [];\n const usedIds = new Set<string>();\n\n for (const prevItem of prevItems) {\n const itemId = prevItem.id;\n const newItem = newItems.find((item) => item.id === itemId);\n\n if (newItem) {\n result.push(mergeIndividualItems(prevItem, newItem));\n usedIds.add(newItem.id as string);\n } else {\n result.push(prevItem);\n }\n }\n\n // Add items from newItems that were not in prevItems.\n for (const newItem of newItems) {\n if (!usedIds.has(newItem.id as string)) {\n result.push(newItem);\n }\n }\n\n return result;\n}\n", "import { Button, Group, Stack, Stepper } from '@mantine/core';\nimport { QuestionnaireItem, QuestionnaireResponse, QuestionnaireResponseItem } from '@medplum/fhirtypes';\nimport { QuestionnaireItemType } from '../../utils/questionnaire';\nimport { QuestionnaireRepeatableItem } from '../QuestionnaireFormItem/QuestionnaireRepeatableItem';\nimport { QuestionnaireRepeatedGroup } from './QuestionnaireFormGroup';\n\ninterface QuestionnairePageSequenceProps {\n readonly items: QuestionnaireItem[];\n readonly response?: QuestionnaireResponse;\n readonly renderPages: boolean;\n readonly activePage?: number;\n readonly numberOfPages: number;\n readonly submitButtonText?: string;\n readonly checkForQuestionEnabled: (item: QuestionnaireItem) => boolean;\n readonly onChange: (items: QuestionnaireResponseItem | QuestionnaireResponseItem[]) => void;\n readonly nextStep: () => void;\n readonly prevStep: () => void;\n}\n\nexport function QuestionnairePageSequence(props: QuestionnairePageSequenceProps): JSX.Element {\n const {\n items,\n response,\n activePage,\n onChange,\n nextStep,\n prevStep,\n numberOfPages,\n renderPages,\n submitButtonText,\n checkForQuestionEnabled,\n } = props;\n\n const form = items.map((item) => {\n const itemResponse = response?.item?.filter((i) => i.linkId === item.linkId) ?? [];\n\n const repeatedItem =\n item.type === QuestionnaireItemType.group ? (\n <QuestionnaireRepeatedGroup\n key={item.linkId}\n item={item}\n response={itemResponse}\n onChange={onChange}\n checkForQuestionEnabled={checkForQuestionEnabled}\n />\n ) : (\n <QuestionnaireRepeatableItem\n key={item.linkId}\n item={item}\n response={itemResponse?.[0]}\n onChange={onChange}\n checkForQuestionEnabled={checkForQuestionEnabled}\n />\n );\n\n if (renderPages) {\n return (\n <Stepper.Step key={item.linkId} label={item.text}>\n {repeatedItem}\n </Stepper.Step>\n );\n }\n return repeatedItem;\n });\n\n return (\n <>\n {renderPages && (\n <Stepper active={activePage ?? 0} allowNextStepsSelect={false} p={6}>\n {form}\n </Stepper>\n )}\n {!renderPages && <Stack>{form}</Stack>}\n <ButtonGroup\n activePage={activePage ?? 0}\n numberOfPages={numberOfPages}\n nextStep={nextStep}\n prevStep={prevStep}\n submitButtonText={submitButtonText}\n />\n </>\n );\n}\n\ninterface ButtonGroupProps {\n readonly activePage: number;\n readonly numberOfPages: number;\n readonly submitButtonText?: string;\n readonly nextStep: () => void;\n readonly prevStep: () => void;\n}\n\nfunction ButtonGroup(props: ButtonGroupProps): JSX.Element {\n const showBackButton = props.activePage > 0;\n const showNextButton = props.activePage < props.numberOfPages - 1;\n const showSubmitButton = props.activePage === props.numberOfPages - 1;\n\n return (\n <Group justify=\"flex-end\" mt=\"xl\" gap=\"xs\">\n {showBackButton && <Button onClick={props.prevStep}>Back</Button>}\n {showNextButton && (\n <Button\n onClick={(e) => {\n const form = e.currentTarget.closest('form') as HTMLFormElement;\n if (form.reportValidity()) {\n props.nextStep();\n }\n }}\n >\n Next\n </Button>\n )}\n {showSubmitButton && <Button type=\"submit\">{props.submitButtonText ?? 'Submit'}</Button>}\n </Group>\n );\n}\n", "import { Anchor } from '@mantine/core';\nimport { QuestionnaireItem, QuestionnaireResponseItem } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { FormSection } from '../../FormSection/FormSection';\nimport { QuestionnaireItemType } from '../../utils/questionnaire';\nimport { QuestionnaireFormItem } from './QuestionnaireFormItem';\n\ninterface QuestionnaireRepeatableItemProps {\n readonly item: QuestionnaireItem;\n readonly response?: QuestionnaireResponseItem;\n readonly checkForQuestionEnabled: (item: QuestionnaireItem) => boolean;\n readonly onChange: (items: QuestionnaireResponseItem[]) => void;\n}\n\nexport function QuestionnaireRepeatableItem(props: QuestionnaireRepeatableItemProps): JSX.Element | null {\n const { item, response, onChange } = props;\n const [number, setNumber] = useState(getNumberOfRepeats(item, response ?? { linkId: item.linkId }));\n if (!props.checkForQuestionEnabled(item)) {\n return null;\n }\n\n if (!response) {\n return null;\n }\n\n if (item.type === QuestionnaireItemType.display) {\n return <p key={item.linkId}>{item.text}</p>;\n }\n\n const showAddButton =\n item?.repeats && item.type !== QuestionnaireItemType.choice && item.type !== QuestionnaireItemType.openChoice;\n\n // Styling reason to avoid duplicate text\n if (item.type === QuestionnaireItemType.boolean) {\n return (\n <QuestionnaireFormItem\n key={item.linkId}\n item={item}\n response={response}\n onChange={(r) => onChange([r])}\n index={0}\n />\n );\n }\n\n return (\n <FormSection\n key={props.item.linkId}\n htmlFor={props.item.linkId}\n title={props.item.text}\n withAsterisk={props.item.required}\n >\n {[...Array(number)].map((_, index) => (\n <QuestionnaireFormItem\n key={`${item.linkId}-${index}`}\n item={item}\n response={response}\n onChange={(r) => onChange([r])}\n index={index}\n />\n ))}\n {showAddButton && <Anchor onClick={() => setNumber((n) => n + 1)}>Add Item</Anchor>}\n </FormSection>\n );\n}\n\nfunction getNumberOfRepeats(item: QuestionnaireItem, response: QuestionnaireResponseItem): number {\n if (item.type === QuestionnaireItemType.choice || item.type === QuestionnaireItemType.openChoice) {\n return 1;\n }\n const answers = response.answer;\n return answers?.length ? answers.length : 1;\n}\n", "import { Anchor, Stack, Title } from '@mantine/core';\nimport { QuestionnaireItem, QuestionnaireResponseItem } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { QuestionnaireItemType, buildInitialResponseItem } from '../../utils/questionnaire';\nimport { QuestionnaireRepeatableItem } from '../QuestionnaireFormItem/QuestionnaireRepeatableItem';\n\ninterface QuestionnaireRepeatableGroupProps {\n readonly item: QuestionnaireItem;\n readonly response: QuestionnaireResponseItem[];\n readonly checkForQuestionEnabled: (item: QuestionnaireItem) => boolean;\n readonly onChange: (responses: QuestionnaireResponseItem[]) => void;\n}\n\nexport function QuestionnaireRepeatedGroup(props: QuestionnaireRepeatableGroupProps): JSX.Element | null {\n const [responses, setResponses] = useState(props.response);\n\n if (responses.length === 0) {\n return null;\n }\n\n function handleRepeatableGroup(newResponseItems: QuestionnaireResponseItem[], index: number): void {\n const newResponses = responses.map((responses, idx) => (idx === index ? newResponseItems[0] : responses));\n setResponses(newResponses);\n props.onChange(newResponses);\n }\n\n function insertNewGroup(): void {\n const newResponse = buildInitialResponseItem(props.item);\n setResponses([...responses, newResponse]);\n }\n\n return (\n <>\n {responses.map((response, idx) => (\n <QuestionnaireGroup\n key={response.id}\n item={props.item}\n response={response}\n checkForQuestionEnabled={props.checkForQuestionEnabled}\n onChange={(r) => handleRepeatableGroup(r, idx)}\n />\n ))}\n {props.item.repeats && <Anchor onClick={insertNewGroup}>{`Add Group: ${props.item.text}`}</Anchor>}\n </>\n );\n}\n\ninterface QuestionnaireGroupProps {\n readonly item: QuestionnaireItem;\n readonly response: QuestionnaireResponseItem;\n readonly checkForQuestionEnabled: (item: QuestionnaireItem) => boolean;\n readonly onChange: (response: QuestionnaireResponseItem[]) => void;\n}\n\nexport function QuestionnaireGroup(props: QuestionnaireGroupProps): JSX.Element | null {\n const { response, checkForQuestionEnabled, onChange } = props;\n function onSetGroup(newResponseItem: QuestionnaireResponseItem[]): void {\n const newResponse = response.item?.map((current) => {\n const matchingItem = newResponseItem.find((newResponse) => newResponse.id === current.id);\n return matchingItem ?? current;\n });\n // This checks to see if there were any nested repeated groups that we need to add\n const mergedResponse = newResponse?.concat(newResponseItem.slice(1));\n const groupResponse = { ...response, item: mergedResponse };\n onChange([groupResponse]);\n }\n\n if (!props.checkForQuestionEnabled(props.item)) {\n return null;\n }\n\n return (\n <div key={props.item.linkId}>\n {props.item.text && (\n <Title order={3} mb=\"md\">\n {props.item.text}\n </Title>\n )}\n <Stack>\n {props.item.item?.map((item) => {\n if (item.type === QuestionnaireItemType.group) {\n return item.repeats ? (\n <QuestionnaireRepeatedGroup\n key={item.linkId}\n item={item}\n response={response.item?.filter((i) => i.linkId === item.linkId) ?? []}\n checkForQuestionEnabled={checkForQuestionEnabled}\n onChange={onSetGroup}\n />\n ) : (\n <QuestionnaireGroup\n key={item.linkId}\n item={item}\n checkForQuestionEnabled={checkForQuestionEnabled}\n response={response.item?.find((i) => i.linkId === item.linkId) ?? { linkId: item.linkId }}\n onChange={onSetGroup}\n />\n );\n }\n return (\n <QuestionnaireRepeatableItem\n key={item.linkId}\n item={item}\n response={response.item?.find((i) => i.linkId === item.linkId)}\n onChange={onSetGroup}\n checkForQuestionEnabled={checkForQuestionEnabled}\n />\n );\n })}\n </Stack>\n </div>\n );\n}\n", "import { ActionIcon, Button, Divider, Group, NativeSelect, Stack, Text, TextInput } from '@mantine/core';\nimport { formatRange, getCodeBySystem } from '@medplum/core';\nimport { CodeableConcept, ObservationDefinition, ObservationDefinitionQualifiedInterval } from '@medplum/fhirtypes';\nimport { IconCircleMinus, IconCirclePlus } from '@tabler/icons-react';\nimport { MouseEvent, useEffect, useState } from 'react';\nimport { Container } from '../Container/Container';\nimport { Form } from '../Form/Form';\nimport { RangeInput } from '../RangeInput/RangeInput';\nimport { killEvent } from '../utils/dom';\nimport classes from './ReferenceRangeEditor.module.css';\n\n// Properties of qualified intervals used for grouping\nconst intervalFilters = ['gender', 'age', 'gestationalAge', 'context', 'appliesTo', 'category'] as const;\n\nexport interface ReferenceRangeEditorProps {\n definition: ObservationDefinition;\n onSubmit: (result: ObservationDefinition) => void;\n}\n\n// Helper type that groups of qualified intervals by equal filter criteria\nexport type IntervalGroup = {\n id: string;\n filters: Record<string, any>;\n intervals: ObservationDefinitionQualifiedInterval[];\n};\n\nconst defaultProps: ReferenceRangeEditorProps = {\n definition: {\n resourceType: 'ObservationDefinition',\n code: { text: '' },\n },\n onSubmit: () => {\n return undefined;\n },\n};\n\nexport function ReferenceRangeEditor(props: ReferenceRangeEditorProps): JSX.Element {\n props = Object.assign(defaultProps, props);\n const defaultDefinition = props.definition;\n\n const [intervalGroups, setIntervalGroups] = useState<IntervalGroup[]>([]);\n const [groupId, setGroupId] = useState(1);\n const [intervalId, setIntervalId] = useState(1);\n\n useEffect(() => {\n const definition = ensureQualifiedIntervalKeys(defaultDefinition, setIntervalId);\n setIntervalGroups(groupQualifiedIntervals(definition.qualifiedInterval || [], setGroupId));\n }, [defaultDefinition]);\n\n return (\n <Form testid=\"reference-range-editor\" onSubmit={submitDefinition}>\n <Stack>\n {intervalGroups.map((intervalGroup) => (\n <ReferenceRangeGroupEditor\n unit={getUnitString(defaultDefinition.quantitativeDetails?.unit)}\n onChange={changeInterval}\n onAdd={addInterval}\n onRemove={removeInterval}\n onRemoveGroup={removeGroup}\n key={`group-${intervalGroup.id}`}\n intervalGroup={intervalGroup}\n />\n ))}\n </Stack>\n <ActionIcon\n title=\"Add Group\"\n variant=\"subtle\"\n size=\"sm\"\n onClick={(e: MouseEvent) => {\n killEvent(e);\n addGroup({ id: `group-id-${groupId}`, filters: {} as IntervalGroup['filters'], intervals: [] });\n setGroupId((id) => id + 1);\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n\n <Group justify=\"flex-end\">\n <Button type=\"submit\">Save</Button>\n </Group>\n </Form>\n );\n\n /**\n * Submit qualified intervals\n */\n\n function submitDefinition(): void {\n const qualifiedInterval = intervalGroups\n .flatMap((group) => group.intervals)\n .filter((interval) => !isEmptyInterval(interval));\n props.onSubmit({ ...defaultDefinition, qualifiedInterval });\n }\n\n /**\n * Add Remove Interval Groups\n */\n\n function addGroup(addedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => [...currentGroups, addedGroup]);\n }\n\n function removeGroup(removedGroup: IntervalGroup): void {\n setIntervalGroups((currentGroups) => currentGroups.filter((group) => group.id !== removedGroup.id));\n }\n\n /**\n * Add/Remove/Update specific Qualified Intervals\n * @param groupId - The reference range group ID.\n * @param changedInterval - The updated reference range interval.\n */\n function changeInterval(groupId: string, changedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n\n const index = currentGroup?.intervals.findIndex((interval) => interval.id === changedInterval.id);\n if (index !== undefined && currentGroup?.intervals[index]) {\n currentGroup.intervals[index] = changedInterval;\n }\n return groups;\n });\n }\n\n function addInterval(groupId: string, addedInterval: ObservationDefinitionQualifiedInterval): void {\n if (addedInterval.id === undefined) {\n addedInterval.id = `id-${intervalId}`;\n setIntervalId((id) => id + 1);\n }\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroupIndex = groups.findIndex((g) => g.id === groupId);\n\n if (currentGroupIndex !== -1) {\n const currentGroup = { ...groups[currentGroupIndex] };\n addedInterval = { ...addedInterval, ...currentGroup.filters };\n currentGroup.intervals = [...currentGroup.intervals, addedInterval];\n groups[currentGroupIndex] = currentGroup;\n }\n\n return groups;\n });\n }\n\n function removeInterval(groupId: string, removedInterval: ObservationDefinitionQualifiedInterval): void {\n setIntervalGroups((groups) => {\n groups = [...groups];\n const currentGroup = groups.find((g) => g.id === groupId);\n if (currentGroup) {\n currentGroup.intervals = currentGroup.intervals.filter((interval) => interval.id !== removedInterval.id);\n }\n return groups;\n });\n }\n}\n\n/**\n * Helper component that renders an \"interval group\", which is a set of ObservationDefinitionQualifiedIntervals\n * that have the same filter values\n */\nexport interface ReferenceRangeGroupEditorProps {\n intervalGroup: IntervalGroup;\n unit: string | undefined;\n onChange: (groupId: string, changed: ObservationDefinitionQualifiedInterval) => void;\n onAdd: (groupId: string, added: ObservationDefinitionQualifiedInterval) => void;\n onRemove: (groupId: string, removed: ObservationDefinitionQualifiedInterval) => void;\n onRemoveGroup: (removedGroup: IntervalGroup) => void;\n}\n\nexport function ReferenceRangeGroupEditor(props: ReferenceRangeGroupEditorProps): JSX.Element {\n const { intervalGroup, unit } = props;\n return (\n <Container data-testid={intervalGroup.id} className={classes.section}>\n <Stack gap=\"lg\">\n <Group justify=\"flex-end\">\n <ActionIcon\n title=\"Remove Group\"\n variant=\"subtle\"\n data-testid={`remove-group-button-${intervalGroup.id}`}\n key={`remove-group-button-${intervalGroup.id}`}\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemoveGroup(intervalGroup);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n <ReferenceRangeGroupFilters intervalGroup={intervalGroup} onChange={props.onChange} />\n <Divider />\n {intervalGroup.intervals.map((interval) => (\n <Stack key={`interval-${interval.id}`} gap=\"xs\">\n <Group>\n <TextInput\n key={`condition-${interval.id}`}\n data-testid={`condition-${interval.id}`}\n defaultValue={interval.condition}\n label=\"Condition: \"\n size=\"sm\"\n onChange={(e) => {\n killEvent(e);\n props.onChange(intervalGroup.id, { ...interval, condition: e.currentTarget.value.trim() });\n }}\n />\n <ActionIcon\n title=\"Remove Interval\"\n variant=\"subtle\"\n size=\"sm\"\n key={`remove-interval-${interval.id}`}\n data-testid={`remove-interval-${interval.id}`}\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onRemove(intervalGroup.id, interval);\n }}\n >\n <IconCircleMinus />\n </ActionIcon>\n </Group>\n\n <RangeInput\n onChange={(range) => {\n props.onChange(intervalGroup.id, { ...interval, range });\n }}\n key={`range-${interval.id}`}\n name={`range-${interval.id}`}\n defaultValue={interval.range}\n />\n </Stack>\n ))}\n <ActionIcon\n title=\"Add Interval\"\n variant=\"subtle\"\n size=\"sm\"\n onClick={(e: React.MouseEvent) => {\n killEvent(e);\n props.onAdd(intervalGroup.id, {\n range: {\n low: { unit },\n high: { unit },\n },\n });\n }}\n >\n <IconCirclePlus />\n </ActionIcon>\n </Stack>\n </Container>\n );\n}\n\ninterface ReferenceRangeGroupFiltersProps {\n intervalGroup: IntervalGroup;\n onChange: ReferenceRangeGroupEditorProps['onChange'];\n}\n\n/**\n * Render the \"filters\" section of the IntervalGroup.\n * @param props - The ReferenceRangeGroupFilter React props.\n * @returns The ReferenceRangeGroupFilter React node.\n */\nfunction ReferenceRangeGroupFilters(props: ReferenceRangeGroupFiltersProps): JSX.Element {\n const { intervalGroup, onChange } = props;\n\n // Pre-populate the units of the age filter\n if (!intervalGroup.filters.age) {\n intervalGroup.filters.age = {};\n }\n for (const key of ['low', 'high']) {\n if (!intervalGroup.filters.age[key]?.unit) {\n intervalGroup.filters.age[key] = {\n ...intervalGroup.filters.age[key],\n unit: 'years',\n system: 'http://unitsofmeasure.org',\n };\n }\n }\n\n return (\n <Stack style={{ maxWidth: '50%' }}>\n <Group>\n <NativeSelect\n data={['', 'male', 'female']}\n label=\"Gender:\"\n defaultValue={intervalGroup.filters.gender || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newGender: string | undefined = e.currentTarget.value;\n if (newGender === '') {\n newGender = undefined;\n }\n onChange(intervalGroup.id, {\n ...interval,\n gender: newGender as ObservationDefinitionQualifiedInterval['gender'],\n });\n }\n }}\n />\n </Group>\n <Group gap=\"xs\">\n <Text component=\"label\" htmlFor={`div-age-${intervalGroup.id}`}>\n Age:\n </Text>\n <div id={`div-age-${intervalGroup.id}`}>\n <RangeInput\n key={`age-${intervalGroup.id}`}\n name={`age-${intervalGroup.id}`}\n defaultValue={intervalGroup.filters['age']}\n onChange={(ageRange) => {\n for (const interval of intervalGroup.intervals) {\n onChange(intervalGroup.id, { ...interval, age: ageRange });\n }\n }}\n />\n </div>\n </Group>\n <NativeSelect\n data={['', 'pre-puberty', 'follicular', 'midcycle', 'luteal', 'postmenopausal']}\n label=\"Endocrine:\"\n defaultValue={intervalGroup.filters.context?.text || ''}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n let newEndocrine: string | undefined = e.currentTarget.value;\n if (newEndocrine === '') {\n newEndocrine = undefined;\n onChange(intervalGroup.id, { ...interval, context: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n context: {\n text: newEndocrine,\n coding: [\n { code: newEndocrine, system: 'http://terminology.hl7.org/CodeSystem/referencerange-meaning' },\n ],\n },\n });\n }\n }\n }}\n />\n <NativeSelect\n data={['', 'reference', 'critical', 'absolute']}\n label=\"Category: \"\n defaultValue={intervalGroup.filters.category}\n onChange={(e) => {\n for (const interval of intervalGroup.intervals) {\n const newCategory: string | undefined = e.currentTarget.value;\n if (newCategory === '') {\n onChange(intervalGroup.id, { ...interval, category: undefined });\n } else {\n onChange(intervalGroup.id, {\n ...interval,\n category: newCategory as 'reference' | 'critical' | 'absolute',\n });\n }\n }\n }}\n />\n </Stack>\n );\n}\n\n/**\n * Helper function that assigns ids to each qualifiedInterval of an ObservationDefinition\n * @param definition - An ObservationDefinition\n * @param setIntervalId - React setState function for the intervalId\n * @returns The updated observation definition.\n */\nfunction ensureQualifiedIntervalKeys(\n definition: ObservationDefinition,\n setIntervalId: (id: number) => void\n): ObservationDefinition {\n const intervals = definition.qualifiedInterval || [];\n // Set the nextId to the max of any existing numeric id\n let nextId =\n Math.max(\n ...intervals.map((interval) => {\n const existingNum = parseInt(interval.id?.substring(3) || '', 10);\n return !isNaN(existingNum) ? existingNum : Number.NEGATIVE_INFINITY;\n })\n ) + 1;\n\n if (!Number.isFinite(nextId)) {\n nextId = 1;\n }\n\n // If an interval doesn't have an id, set it to the nextId\n definition = {\n ...definition,\n qualifiedInterval: intervals.map((interval) => ({\n ...interval,\n id: interval.id || `id-${nextId++}`,\n })),\n };\n setIntervalId(nextId);\n return definition;\n}\n\n/**\n * Group all ObservationDefinitionQualifiedIntervals based on the values of their \"filter\" properties,\n * so that similar ranges can be grouped together.\n * @param intervals - Array of reference range intervals.\n * @param setGroupId - Callback to set the group ID.\n * @returns The grouped intervals.\n */\nfunction groupQualifiedIntervals(\n intervals: ObservationDefinitionQualifiedInterval[],\n setGroupId: (id: number) => void\n): IntervalGroup[] {\n let groupId = 1;\n const groups: Record<string, IntervalGroup> = {};\n for (const interval of intervals) {\n const groupKey = generateGroupKey(interval);\n if (!(groupKey in groups)) {\n groups[groupKey] = {\n id: `group-id-${groupId++}`,\n filters: Object.fromEntries(intervalFilters.map((f) => [f, interval[f]])) as Record<string, any>,\n intervals: [],\n };\n }\n groups[groupKey].intervals.push(interval);\n }\n setGroupId(groupId);\n return Object.values(groups);\n}\n\n/**\n * Generates a unique string for each set of filter values, so that similarly filtered intervals can be grouped together.\n * @param interval - The reference range interval.\n * @returns A \"group key\" that corresponds to the value of the interval filter properties.\n */\nfunction generateGroupKey(interval: ObservationDefinitionQualifiedInterval): string {\n const results = [\n `gender=${interval.gender}`,\n `age=${formatRange(interval.age)}`,\n `gestationalAge=${formatRange(interval.gestationalAge)}`,\n `context=${interval.context?.text}`,\n `appliesTo=${interval.appliesTo?.map((c) => c.text).join('+')}`,\n `category=${interval.category}`,\n ];\n\n return results.join(':');\n}\n\nfunction getUnitString(unit: CodeableConcept | undefined): string | undefined {\n return unit && (getCodeBySystem(unit, 'http://unitsofmeasure.org') || unit.text);\n}\n\nfunction isEmptyInterval(interval: ObservationDefinitionQualifiedInterval): boolean {\n return interval.range?.low?.value === undefined && interval.range?.high?.value === undefined;\n}\n", ".section {\n position: relative;\n margin: 4px 4px 8px;\n padding: 6px 12px 16px 6px;\n border: 1.5px solid var(--mantine-color-gray-3);\n border-radius: var(--mantine-radius-sm);\n transition: all 0.1;\n}\n", "import { Button, Grid, Text } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Bundle, BundleEntry, Reference, RequestGroup, Resource, Task } from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { IconCheckbox, IconSquare } from '@tabler/icons-react';\nimport { Fragment, useEffect, useState } from 'react';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\n\nexport interface RequestGroupDisplayProps {\n value?: RequestGroup | Reference<RequestGroup>;\n onStart: (task: Task, input: Reference) => void;\n onEdit: (task: Task, input: Reference, output: Reference) => void;\n}\n\nexport function RequestGroupDisplay(props: RequestGroupDisplayProps): JSX.Element | null {\n const medplum = useMedplum();\n const requestGroup = useResource(props.value);\n const [startedLoading, setStartedLoading] = useState(false);\n const [responseBundle, setResponseBundle] = useState<Bundle>();\n\n useEffect(() => {\n if (requestGroup && !startedLoading) {\n medplum.executeBatch(buildBatchRequest(requestGroup)).then(setResponseBundle).catch(console.log);\n setStartedLoading(true);\n }\n }, [medplum, requestGroup, startedLoading]);\n\n if (!requestGroup || !responseBundle) {\n return null;\n }\n\n return (\n <Grid>\n {requestGroup.action?.map((action, index) => {\n const task = action.resource && findBundleEntry(action.resource as Reference<Task>);\n const taskInput = task?.input?.[0]?.valueReference;\n const taskOutput = task?.output?.[0]?.valueReference;\n return (\n <Fragment key={`action-${index}`}>\n <Grid.Col span={1} p=\"md\">\n {task?.status === 'completed' ? <IconCheckbox /> : <IconSquare color=\"gray\" />}\n </Grid.Col>\n <Grid.Col span={9} p=\"xs\">\n <Text fw={500}>{action.title}</Text>\n {action.description && <div>{action.description}</div>}\n <div>\n Last edited by&nbsp;\n <ResourceName value={task?.meta?.author as Reference} />\n &nbsp;on&nbsp;\n {formatDateTime(task?.meta?.lastUpdated)}\n </div>\n <div>\n Status: <StatusBadge status={task?.status || 'unknown'} />\n </div>\n </Grid.Col>\n <Grid.Col span={2} p=\"md\">\n {taskInput && !taskOutput && <Button onClick={() => props.onStart(task, taskInput)}>Start</Button>}\n {taskInput && taskOutput && (\n <Button onClick={() => props.onEdit(task, taskInput, taskOutput)}>Edit</Button>\n )}\n </Grid.Col>\n </Fragment>\n );\n })}\n </Grid>\n );\n\n function buildBatchRequest(request: RequestGroup): Bundle {\n const batchEntries = [] as BundleEntry[];\n if (request.action) {\n for (const action of request.action) {\n if (action.resource?.reference) {\n batchEntries.push({ request: { method: 'GET', url: action.resource.reference } });\n }\n }\n }\n\n return {\n resourceType: 'Bundle',\n type: 'batch',\n entry: batchEntries,\n };\n }\n\n function findBundleEntry<T extends Resource>(reference: Reference<T>): T | undefined {\n for (const entry of responseBundle?.entry as BundleEntry[]) {\n if (entry.resource && reference.reference === getReferenceString(entry.resource)) {\n return entry.resource as T;\n }\n }\n return undefined;\n }\n}\n", "import { Bundle, Resource, ResourceType } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\nimport { blame } from '../utils/blame';\nimport classes from './ResourceBlame.module.css';\nimport { getTimeString, getVersionUrl } from './ResourceBlame.utils';\n\nexport interface ResourceBlameProps {\n history?: Bundle;\n resourceType?: ResourceType;\n id?: string;\n}\n\nexport function ResourceBlame(props: ResourceBlameProps): JSX.Element | null {\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum.readHistory(props.resourceType, props.id).then(setValue).catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n const resource = value.entry?.[0]?.resource as Resource;\n\n if (!resource) {\n return null;\n }\n\n const table = blame(value);\n\n return (\n <div className={classes.container}>\n <table className={classes.root}>\n <tbody>\n {table.map((row, index) => (\n <tr key={'row-' + index} className={row.span > 0 ? classes.startRow : classes.normalRow}>\n {row.span > 0 && (\n <>\n <td className={classes.author} rowSpan={row.span}>\n <ResourceBadge value={row.meta.author} link={true} />\n </td>\n <td className={classes.dateTime} rowSpan={row.span}>\n <MedplumLink to={getVersionUrl(resource, row.meta.versionId as string)}>\n {getTimeString(row.meta.lastUpdated as string)}\n </MedplumLink>\n </td>\n </>\n )}\n <td className={classes.lineNumber}>{index + 1}</td>\n <td className={classes.line}>\n <pre className={classes.pre}>{row.value}</pre>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n", "import { stringify } from '@medplum/core';\nimport { Bundle, BundleEntry, Meta } from '@medplum/fhirtypes';\nimport { diff } from './diff';\n\nexport interface BlameRow {\n id: string;\n meta: Meta;\n value: string;\n span: number;\n}\n\nexport function blame(history: Bundle): BlameRow[] {\n // Convert to array of array of lines\n const versions = (history.entry as BundleEntry[])\n .filter((entry) => !!entry.resource)\n .map((entry) => ({\n meta: entry.resource?.meta as Meta,\n lines: stringify(entry.resource, true).match(/[^\\r\\n]+/g) as string[],\n }))\n .sort((a, b) => (a.meta.lastUpdated as string).localeCompare(b.meta.lastUpdated as string));\n\n // Start with array of lines from the first version\n const table: BlameRow[] = versions[0].lines.map((line) => ({\n id: versions[0].meta.versionId as string,\n meta: versions[0].meta,\n value: line,\n span: 1,\n }));\n\n compareVersions(table, versions);\n combineSpans(table);\n return table;\n}\n\n/**\n * For each version, update the blame table with revisions.\n * @param table - The output blame table.\n * @param versions - The array of versions.\n */\nfunction compareVersions(table: BlameRow[], versions: { meta: Meta; lines: string[] }[]): void {\n for (let i = 1; i < versions.length; i++) {\n const revisions = diff(versions[i - 1].lines, versions[i].lines);\n\n for (const revision of revisions) {\n const position = revision.original.position;\n const oldLines = revision.original.lines;\n const newLines = revision.revised.lines;\n\n if (revision.type === 'delete' || revision.type === 'change') {\n // Remove the old rows\n table.splice(position, oldLines.length);\n }\n\n if (revision.type === 'insert' || revision.type === 'change') {\n // Add the new lines\n for (let k = 0; k < revision.revised.lines.length; k++) {\n table.splice(position + k, 0, {\n id: versions[i].meta.versionId as string,\n meta: versions[i].meta,\n value: newLines[k],\n span: 1,\n });\n }\n }\n }\n }\n}\n\n/**\n * Combine adjacent rows into spans.\n * @param table - The output blame table.\n */\nfunction combineSpans(table: BlameRow[]): void {\n let start = 0;\n while (start < table.length) {\n let curr = start;\n while (curr < table.length && table[curr].id === table[start].id) {\n table[curr].span = -1;\n curr++;\n }\n table[start].span = curr - start;\n start = curr;\n }\n}\n", "/*\n * Myers Diff algorithm\n * Based on: https://github.com/KengoTODA/java-diff-utils/blob/master/src/main/java/difflib/myers/MyersDiff.java\n * Apache Software License, Version 1.1\n */\n\nexport function diff(original: string[], revised: string[]): Delta[] {\n const path = buildPath(original, revised) as PathNode;\n return buildRevisions(path, original, revised);\n}\n\nexport interface PathNode {\n readonly i: number;\n readonly j: number;\n readonly prev: PathNode | undefined;\n readonly snake: boolean;\n}\n\nexport interface Delta {\n readonly original: Chunk;\n readonly revised: Chunk;\n readonly type: 'change' | 'delete' | 'insert';\n}\n\nexport interface Chunk {\n readonly position: number;\n readonly lines: string[];\n}\n\nfunction buildPath(orig: string[], rev: string[]): PathNode | undefined {\n const N = orig.length;\n const M = rev.length;\n const MAX = N + M + 1;\n const size = 1 + 2 * MAX;\n const middle = (size / 2) | 0;\n const diagonal: (PathNode | undefined)[] = new Array(size);\n\n diagonal[middle + 1] = {\n i: 0,\n j: -1,\n prev: undefined,\n snake: true,\n };\n\n for (let d = 0; d < MAX; d++) {\n for (let k = -d; k <= d; k += 2) {\n const kmiddle = middle + k;\n const kplus = kmiddle + 1;\n const kminus = kmiddle - 1;\n const kplusNode = diagonal[kplus] as PathNode;\n const kminusNode = diagonal[kminus] as PathNode;\n let prev: PathNode | undefined = undefined;\n let i = 0;\n\n if (k === -d || (k !== d && kminusNode.i < kplusNode.i)) {\n i = kplusNode.i;\n prev = kplusNode;\n } else {\n i = kminusNode.i + 1;\n prev = kminusNode;\n }\n\n diagonal[kminus] = undefined; // no longer used\n\n let j = i - k;\n let node = {\n i,\n j,\n prev: previousSnake(prev),\n snake: false,\n };\n\n // orig and rev are zero-based\n // but the algorithm is one-based\n // that's why there's no +1 when indexing the sequences\n while (i < N && j < M && orig[i] === rev[j]) {\n i++;\n j++;\n }\n\n if (i > node.i) {\n node = {\n i,\n j,\n prev: node,\n snake: true,\n };\n }\n\n diagonal[kmiddle] = node;\n\n if (i >= N && j >= M) {\n return diagonal[kmiddle] as PathNode;\n }\n }\n diagonal[middle + d - 1] = undefined;\n }\n\n // According to Myers, this cannot happen\n return undefined;\n}\n\nfunction buildRevisions(startNode: PathNode, orig: string[], rev: string[]): Delta[] {\n const deltas: Delta[] = [];\n let path: PathNode | undefined = startNode;\n\n if (path.snake) {\n path = path.prev;\n }\n\n while (path?.prev && path.prev.j >= 0) {\n const i = path.i;\n const j = path.j;\n\n path = path.prev;\n const ianchor = path.i;\n const janchor = path.j;\n\n const original = {\n position: ianchor,\n lines: orig.slice(ianchor, i),\n };\n\n const revised = {\n position: janchor,\n lines: rev.slice(janchor, j),\n };\n\n let type: 'insert' | 'delete' | 'change';\n\n if (original.lines.length === 0 && revised.lines.length > 0) {\n type = 'insert';\n } else if (original.lines.length > 0 && revised.lines.length === 0) {\n type = 'delete';\n } else {\n type = 'change';\n }\n\n deltas.push({ original, revised, type });\n\n if (path.snake) {\n path = path.prev;\n }\n }\n\n return deltas;\n}\n\nfunction previousSnake(node: PathNode): PathNode {\n if (node && !node.snake && node.prev) {\n return node.prev;\n }\n return node;\n}\n", ".container {\n overflow-x: auto;\n}\n\n.root {\n border: 0.1px solid var(--mantine-color-gray-3);\n border-collapse: collapse;\n border-radius: var(--mantine-radius-sm);\n border-spacing: 0;\n font-size: var(--mantine-font-size-xs);\n width: 100px;\n\n & td {\n padding: 2px 4px 0 4px;\n vertical-align: top;\n white-space: nowra;\n }\n}\n\n.startRow {\n border-top: 0.1px solid var(--mantine-color-gray-3);\n}\n\n.normalRow {\n border-top: 0;\n}\n\n.author {\n line-height: 10px;\n}\n\n.dateTime {\n border-right: 0.1px solid var(--mantine-color-gray-3);\n line-height: 20px;\n}\n\n.lineNumber {\n background-color: var(--mantine-color-gray-1);\n border: 0;\n color: var(--mantine-color-gray-5);\n font-family: var(--mantine-font-family-monospace);\n padding: var(--mantine-spacing-xs) var(--mantine-spacing-sm);\n text-align: right;\n}\n\n.line {\n font-family: var(--mantine-font-family-monospace);\n font-size: var(--mantine-font-size-sm);\n padding: var(--mantine-spacing-xs) var(--mantine-spacing-sm);\n}\n\n.pre {\n margin: 0;\n}\n", "import { Resource } from '@medplum/fhirtypes';\n\nexport function getVersionUrl(resource: Resource, versionId: string): string {\n return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;\n}\n\nexport function getTimeString(lastUpdated: string): string {\n const seconds = Math.floor((Date.now() - Date.parse(lastUpdated)) / 1000);\n\n const years = Math.floor(seconds / 31536000);\n if (years > 0) {\n return pluralizeTime(years, 'year');\n }\n\n const months = Math.floor(seconds / 2592000);\n if (months > 0) {\n return pluralizeTime(months, 'month');\n }\n\n const days = Math.floor(seconds / 86400);\n if (days > 0) {\n return pluralizeTime(days, 'day');\n }\n\n const hours = Math.floor(seconds / 3600);\n if (hours > 0) {\n return pluralizeTime(hours, 'hour');\n }\n\n const minutes = Math.floor(seconds / 60);\n if (minutes > 0) {\n return pluralizeTime(minutes, 'minute');\n }\n\n return pluralizeTime(seconds, 'second');\n}\n\nfunction pluralizeTime(count: number, noun: string): string {\n return `${count} ${count === 1 ? noun : noun + 's'} ago`;\n}\n", "import { stringify } from '@medplum/core';\nimport { Resource } from '@medplum/fhirtypes';\nimport { Delta, diff } from '../utils/diff';\nimport classes from './ResourceDiff.module.css';\n\nexport interface ResourceDiffProps {\n original: Resource;\n revised: Resource;\n ignoreMeta?: boolean;\n}\n\nexport function ResourceDiff(props: ResourceDiffProps): JSX.Element {\n let originalResource = props.original;\n let revisedResource = props.revised;\n\n if (props.ignoreMeta) {\n originalResource = { ...originalResource, meta: undefined };\n revisedResource = { ...revisedResource, meta: undefined };\n }\n\n const original = stringify(originalResource, true).match(/[^\\r\\n]+/g) as string[];\n const revised = stringify(revisedResource, true).match(/[^\\r\\n]+/g) as string[];\n const deltas = diff(original, revised);\n return (\n <pre style={{ color: 'gray' }}>\n {deltas.map((delta, index) => (\n <ChangeDiff key={'delta' + index} delta={delta} />\n ))}\n </pre>\n );\n}\n\nfunction ChangeDiff(props: { delta: Delta }): JSX.Element {\n return (\n <>\n ...\n <br />\n {props.delta.original.lines.length > 0 && (\n <div className={classes.removed}>{props.delta.original.lines.join('\\n')}</div>\n )}\n {props.delta.revised.lines.length > 0 && (\n <div className={classes.added}>{props.delta.revised.lines.join('\\n')}</div>\n )}\n ...\n <br />\n </>\n );\n}\n", "\n.removed {\n color: var(--mantine-color-red-7);\n text-decoration: line-through;\n}\n\n.added {\n color: var(--mantine-color-green-7);\n}", "import { Button, Group, Stack, TextInput } from '@mantine/core';\nimport { deepClone, tryGetProfile } from '@medplum/core';\nimport { OperationOutcome, Reference, Resource } from '@medplum/fhirtypes';\nimport { useMedplum, useResource } from '@medplum/react-hooks';\nimport { FormEvent, useEffect, useState } from 'react';\nimport { BackboneElementInput } from '../BackboneElementInput/BackboneElementInput';\nimport { FormSection } from '../FormSection/FormSection';\n\nexport interface ResourceFormProps {\n defaultValue: Partial<Resource> | Reference;\n outcome?: OperationOutcome;\n onSubmit: (resource: Resource) => void;\n onDelete?: (resource: Resource) => void;\n schemaName?: string;\n /** (optional) URL of the resource profile used to display the form. Takes priority over schemaName. */\n profileUrl?: string;\n}\n\nexport function ResourceForm(props: ResourceFormProps): JSX.Element {\n const { outcome } = props;\n const medplum = useMedplum();\n const defaultValue = useResource(props.defaultValue);\n const [schemaLoaded, setSchemaLoaded] = useState<string>();\n const [value, setValue] = useState<Resource>();\n\n useEffect(() => {\n if (defaultValue) {\n setValue(deepClone(defaultValue));\n if (props.profileUrl) {\n const profileUrl: string = props.profileUrl;\n medplum\n .requestProfileSchema(props.profileUrl)\n .then(() => {\n const profile = tryGetProfile(profileUrl);\n if (profile) {\n setSchemaLoaded(profile.name);\n } else {\n console.log(`Schema not found for ${profileUrl}`);\n }\n })\n .catch(console.log);\n } else {\n const schemaName = props.schemaName ?? defaultValue?.resourceType;\n medplum\n .requestSchema(schemaName)\n .then(() => setSchemaLoaded(schemaName))\n .catch(console.log);\n }\n }\n }, [medplum, defaultValue, props.schemaName, props.profileUrl]);\n\n if (!schemaLoaded || !value) {\n return <div>Loading...</div>;\n }\n\n return (\n <form\n noValidate\n autoComplete=\"off\"\n onSubmit={(e: FormEvent) => {\n e.preventDefault();\n if (props.onSubmit) {\n props.onSubmit(value);\n }\n }}\n >\n <Stack mb=\"xl\">\n <FormSection title=\"Resource Type\" htmlFor=\"resourceType\" outcome={outcome}>\n <TextInput name=\"resourceType\" defaultValue={value.resourceType} disabled={true} />\n </FormSection>\n <FormSection title=\"ID\" htmlFor=\"id\" outcome={outcome}>\n <TextInput name=\"id\" defaultValue={value.id} disabled={true} />\n </FormSection>\n </Stack>\n <BackboneElementInput\n typeName={schemaLoaded}\n defaultValue={value}\n outcome={outcome}\n onChange={setValue}\n profileUrl={props.profileUrl}\n />\n <Group justify=\"flex-end\" mt=\"xl\">\n <Button type=\"submit\">OK</Button>\n {props.onDelete && (\n <Button\n variant=\"outline\"\n color=\"red\"\n type=\"button\"\n onClick={() => {\n (props.onDelete as (resource: Resource) => void)(value);\n }}\n >\n Delete\n </Button>\n )}\n </Group>\n </form>\n );\n}\n", "import { Table } from '@mantine/core';\nimport { formatDateTime, normalizeErrorString } from '@medplum/core';\nimport { Bundle, BundleEntry, Resource, ResourceType } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useEffect, useState } from 'react';\nimport { MedplumLink } from '../MedplumLink/MedplumLink';\nimport { ResourceBadge } from '../ResourceBadge/ResourceBadge';\n\nexport interface ResourceHistoryTableProps {\n history?: Bundle;\n resourceType?: string;\n id?: string;\n}\n\nexport function ResourceHistoryTable(props: ResourceHistoryTableProps): JSX.Element {\n const medplum = useMedplum();\n const [value, setValue] = useState<Bundle | undefined>(props.history);\n\n useEffect(() => {\n if (!props.history && props.resourceType && props.id) {\n medplum\n .readHistory(props.resourceType as ResourceType, props.id)\n .then(setValue)\n .catch(console.log);\n }\n }, [medplum, props.history, props.resourceType, props.id]);\n\n if (!value) {\n return <div>Loading...</div>;\n }\n\n return (\n <Table withTableBorder withRowBorders withColumnBorders>\n <Table.Thead>\n <Table.Tr>\n <Table.Th>Author</Table.Th>\n <Table.Th>Date</Table.Th>\n <Table.Th>Version</Table.Th>\n </Table.Tr>\n </Table.Thead>\n <Table.Tbody>\n {value.entry?.map((entry, index) => <HistoryRow key={'entry-' + index} entry={entry} />)}\n </Table.Tbody>\n </Table>\n );\n}\n\ninterface HistoryRowProps {\n entry: BundleEntry;\n}\n\nfunction HistoryRow(props: HistoryRowProps): JSX.Element {\n const { response, resource } = props.entry;\n if (resource) {\n return (\n <Table.Tr>\n <Table.Td>\n <ResourceBadge value={resource.meta?.author} link={true} />\n </Table.Td>\n <Table.Td>{formatDateTime(resource.meta?.lastUpdated)}</Table.Td>\n <Table.Td>\n <MedplumLink to={getVersionUrl(resource)}>{resource.meta?.versionId}</MedplumLink>\n </Table.Td>\n </Table.Tr>\n );\n } else {\n return (\n <Table.Tr>\n <Table.Td colSpan={3}>{normalizeErrorString(response?.outcome)}</Table.Td>\n </Table.Tr>\n );\n }\n}\n\nfunction getVersionUrl(resource: Resource): string {\n return `/${resource.resourceType}/${resource.id}/_history/${resource.meta?.versionId}`;\n}\n", "import { Button, Stack, Text } from '@mantine/core';\nimport { getReferenceString, isReference } from '@medplum/core';\nimport { Questionnaire, QuestionnaireResponse, Reference, Schedule, Slot } from '@medplum/fhirtypes';\nimport { useResource, useSearchResources } from '@medplum/react-hooks';\nimport { useState } from 'react';\nimport { CalendarInput } from '../CalendarInput/CalendarInput';\nimport { getStartMonth } from '../CalendarInput/CalendarInput.utils';\nimport { QuestionnaireForm } from '../QuestionnaireForm/QuestionnaireForm';\nimport { ResourceAvatar } from '../ResourceAvatar/ResourceAvatar';\nimport { ResourceName } from '../ResourceName/ResourceName';\nimport classes from './Scheduler.module.css';\n\nexport interface SchedulerProps {\n schedule: Schedule | Reference<Schedule>;\n questionnaire: Questionnaire | Reference<Questionnaire>;\n}\n\nexport function Scheduler(props: SchedulerProps): JSX.Element | null {\n const schedule = useResource(props.schedule);\n const questionnaire = useResource(props.questionnaire);\n\n const [month, setMonth] = useState<Date>(getStartMonth());\n const [date, setDate] = useState<Date>();\n const [slot, setSlot] = useState<Slot>();\n const [response, setResponse] = useState<QuestionnaireResponse>();\n\n const [slots] = useSearchResources(\n 'Slot',\n new URLSearchParams([\n ['_count', (30 * 24).toString()],\n [\n 'schedule',\n isReference(props.schedule)\n ? (props.schedule.reference as string)\n : getReferenceString(props.schedule as Schedule),\n ],\n ['start', 'gt' + getStart(month)],\n ['start', 'lt' + getEnd(month)],\n ])\n );\n\n if (!schedule || !slots || !questionnaire) {\n return null;\n }\n\n const actor = schedule.actor?.[0];\n\n return (\n <div className={classes.container} data-testid=\"scheduler\">\n <div className={classes.info}>\n {actor && <ResourceAvatar value={actor} size=\"xl\" />}\n {actor && (\n <Text size=\"xl\" fw={500}>\n <ResourceName value={actor} />\n </Text>\n )}\n <p>1 hour</p>\n {date && <p>{date.toLocaleDateString()}</p>}\n {slot && <p>{formatTime(new Date(slot.start as string))}</p>}\n </div>\n <div className={classes.selection}>\n {!date && (\n <div>\n <h3>Select date</h3>\n <CalendarInput slots={slots} onChangeMonth={setMonth} onClick={setDate} />\n </div>\n )}\n {date && !slot && (\n <div>\n <h3>Select time</h3>\n <Stack>\n {slots.map((s) => {\n const slotStart = new Date(s.start as string);\n return (\n slotStart.getTime() > date.getTime() &&\n slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (\n <div key={s.id}>\n <Button variant=\"outline\" style={{ width: 150 }} onClick={() => setSlot(s)}>\n {formatTime(slotStart)}\n </Button>\n </div>\n )\n );\n })}\n </Stack>\n </div>\n )}\n {date && slot && !response && (\n <QuestionnaireForm questionnaire={questionnaire} submitButtonText=\"Next\" onSubmit={setResponse} />\n )}\n {date && slot && response && (\n <div>\n <h3>You're all set!</h3>\n <p>Check your email for a calendar invite.</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction getStart(month: Date): string {\n return formatSlotInstant(month.getTime());\n}\n\nfunction getEnd(month: Date): string {\n return formatSlotInstant(month.getTime() + 31 * 24 * 60 * 60 * 1000);\n}\n\nfunction formatSlotInstant(time: number): string {\n const date = new Date(Math.max(Date.now(), time));\n date.setHours(0, 0, 0, 0);\n return date.toISOString();\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });\n}\n", "\n.container {\n display: flex;\n min-height: 400px;\n}\n\n.info {\n min-width: 300px;\n padding: 20px;\n border-right: 1px solid var(--mantine-color-gray-3);\n}\n\n.selection {\n min-width: 300px;\n padding: 20px;\n}", "import { createReference, MedplumClient, ProfileResource } from '@medplum/core';\nimport { Attachment, Group, Patient, Reference, ResourceType, ServiceRequest } from '@medplum/fhirtypes';\nimport { ResourceTimeline } from '../ResourceTimeline/ResourceTimeline';\n\nexport interface ServiceRequestTimelineProps {\n serviceRequest: ServiceRequest | Reference<ServiceRequest>;\n}\n\nexport function ServiceRequestTimeline(props: ServiceRequestTimelineProps): JSX.Element {\n return (\n <ResourceTimeline\n value={props.serviceRequest}\n loadTimelineResources={async (medplum: MedplumClient, resourceType: ResourceType, id: string) => {\n const ref = `${resourceType}/${id}`;\n const _count = 100;\n return Promise.allSettled([\n medplum.readHistory('ServiceRequest', id),\n medplum.search('Communication', { 'based-on': ref, _count }),\n medplum.search('DiagnosticReport', { 'based-on': ref, _count }),\n medplum.search('Media', { 'based-on': ref, _count }),\n medplum.search('DocumentReference', { related: ref, _count }),\n medplum.search('Task', { _filter: `based-on eq ${ref} or focus eq ${ref} or subject eq ${ref}`, _count }),\n ]);\n }}\n createCommunication={(resource: ServiceRequest, sender: ProfileResource, text: string) => ({\n resourceType: 'Communication',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject as Reference<Group | Patient>,\n sender: createReference(sender),\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n })}\n createMedia={(resource: ServiceRequest, operator: ProfileResource, content: Attachment) => ({\n resourceType: 'Media',\n status: 'completed',\n basedOn: [createReference(resource)],\n subject: resource.subject,\n operator: createReference(operator),\n issued: new Date().toISOString(),\n content,\n })}\n />\n );\n}\n", "import { Anchor, AnchorProps } from '@mantine/core';\nimport { showNotification } from '@mantine/notifications';\nimport { normalizeErrorString } from '@medplum/core';\nimport { ClientApplication, Encounter, Patient, Reference, SmartAppLaunch } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ReactNode } from 'react';\n\nexport interface SmartAppLaunchLinkProps extends AnchorProps {\n readonly client: ClientApplication;\n readonly patient?: Reference<Patient>;\n readonly encounter?: Reference<Encounter>;\n readonly children?: ReactNode;\n}\n\nexport function SmartAppLaunchLink(props: SmartAppLaunchLinkProps): JSX.Element | null {\n const medplum = useMedplum();\n const { client, patient, encounter, children, ...rest } = props;\n\n function launchApp(): void {\n medplum\n .createResource<SmartAppLaunch>({\n resourceType: 'SmartAppLaunch',\n patient,\n encounter,\n })\n .then((result) => {\n const url = new URL(client.launchUri as string);\n url.searchParams.set('iss', medplum.getBaseUrl() + 'fhir/R4');\n url.searchParams.set('launch', result.id as string);\n window.location.assign(url.toString());\n })\n .catch((err) => showNotification({ color: 'red', message: normalizeErrorString(err), autoClose: false }));\n }\n\n return (\n <Anchor onClick={() => launchApp()} {...rest}>\n {children}\n </Anchor>\n );\n}\n", "import { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ReactNode, useEffect, useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { NewProjectForm } from './NewProjectForm';\nimport { NewUserForm } from './NewUserForm';\n\nexport interface RegisterFormProps {\n readonly type: 'patient' | 'project';\n readonly projectId?: string;\n readonly clientId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey?: string;\n readonly children?: ReactNode;\n readonly onSuccess: () => void;\n}\n\nexport function RegisterForm(props: RegisterFormProps): JSX.Element {\n const { type, projectId, clientId, googleClientId, recaptchaSiteKey, onSuccess } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string>();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n\n useEffect(() => {\n if (type === 'patient' && login) {\n medplum\n .startNewPatient({ login, projectId: projectId as string })\n .then((response) => medplum.processCode(response.code as string))\n .then(() => onSuccess())\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }\n }, [medplum, type, projectId, login, onSuccess]);\n\n function handleAuthResponse(response: LoginAuthenticationResponse): void {\n if (response.code) {\n medplum\n .processCode(response.code)\n .then(() => onSuccess())\n .catch(console.log);\n } else if (response.login) {\n setLogin(response.login);\n }\n }\n\n return (\n <Document width={450}>\n {outcome && <pre>{JSON.stringify(outcome, null, 2)}</pre>}\n {!login && (\n <NewUserForm\n projectId={projectId as string}\n clientId={clientId}\n googleClientId={googleClientId}\n recaptchaSiteKey={recaptchaSiteKey}\n handleAuthResponse={handleAuthResponse}\n >\n {props.children}\n </NewUserForm>\n )}\n {login && type === 'project' && <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />}\n </Document>\n );\n}\n", "import { Anchor, Button, Center, Group, Stack, Text, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface NewProjectFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewProjectForm(props: NewProjectFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n props.handleAuthResponse(\n await medplum.startNewProject({\n login: props.login,\n projectName: formData.projectName,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n >\n <Center style={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Create project</Title>\n </Center>\n <Stack gap=\"xl\">\n <TextInput\n name=\"projectName\"\n label=\"Project Name\"\n placeholder=\"My Project\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <Text c=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy&nbsp;Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms&nbsp;of&nbsp;Service</Anchor>.\n </Text>\n </Stack>\n <Group justify=\"flex-end\" mt=\"xl\" wrap=\"nowrap\">\n <Button type=\"submit\">Create project</Button>\n </Group>\n </Form>\n );\n}\n", "import { Anchor, Button, Center, Checkbox, Divider, Group, PasswordInput, Stack, Text, TextInput } from '@mantine/core';\nimport { GoogleCredentialResponse, LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ReactNode, useEffect, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { GoogleButton } from '../GoogleButton/GoogleButton';\nimport { getGoogleClientId } from '../GoogleButton/GoogleButton.utils';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\nimport { getRecaptcha, initRecaptcha } from '../utils/recaptcha';\n\nexport interface NewUserFormProps {\n readonly projectId: string;\n readonly clientId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey?: string;\n readonly children?: ReactNode;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewUserForm(props: NewUserFormProps): JSX.Element {\n const googleClientId = getGoogleClientId(props.googleClientId);\n const recaptchaSiteKey = props.recaptchaSiteKey;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n useEffect(() => {\n if (recaptchaSiteKey) {\n initRecaptcha(recaptchaSiteKey);\n }\n }, [recaptchaSiteKey]);\n\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n let recaptchaToken = '';\n if (recaptchaSiteKey) {\n recaptchaToken = await getRecaptcha(recaptchaSiteKey);\n }\n props.handleAuthResponse(\n await medplum.startNewUser({\n projectId: props.projectId,\n clientId: props.clientId,\n firstName: formData.firstName,\n lastName: formData.lastName,\n email: formData.email,\n password: formData.password,\n remember: formData.remember === 'true',\n recaptchaSiteKey,\n recaptchaToken,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n >\n <Center style={{ flexDirection: 'column' }}>{props.children}</Center>\n <OperationOutcomeAlert issues={issues} />\n {googleClientId && (\n <>\n <Group justify=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton\n googleClientId={googleClientId}\n handleGoogleCredential={async (response: GoogleCredentialResponse) => {\n try {\n props.handleAuthResponse(\n await medplum.startGoogleLogin({\n googleClientId: response.clientId,\n googleCredential: response.credential,\n createUser: true,\n })\n );\n } catch (err) {\n setOutcome(normalizeOperationOutcome(err));\n }\n }}\n />\n </Group>\n <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />\n </>\n )}\n <Stack gap=\"xl\">\n <TextInput\n name=\"firstName\"\n type=\"text\"\n label=\"First name\"\n placeholder=\"First name\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <TextInput\n name=\"lastName\"\n type=\"text\"\n label=\"Last name\"\n placeholder=\"Last name\"\n required={true}\n error={getErrorsForInput(outcome, 'lastName')}\n />\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n error={getErrorsForInput(outcome, 'email')}\n />\n <PasswordInput\n name=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n <Text c=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum{' '}\n <Anchor href=\"https://www.medplum.com/privacy\">Privacy&nbsp;Policy</Anchor>\n {' and '}\n <Anchor href=\"https://www.medplum.com/terms\">Terms&nbsp;of&nbsp;Service</Anchor>.\n </Text>\n <Text c=\"dimmed\" size=\"xs\">\n This site is protected by reCAPTCHA and the Google{' '}\n <Anchor href=\"https://policies.google.com/privacy\">Privacy&nbsp;Policy</Anchor>\n {' and '}\n <Anchor href=\"https://policies.google.com/terms\">Terms&nbsp;of&nbsp;Service</Anchor> apply.\n </Text>\n </Stack>\n <Group justify=\"space-between\" mt=\"xl\" wrap=\"nowrap\">\n <Checkbox name=\"remember\" label=\"Remember me\" size=\"xs\" />\n <Button type=\"submit\">Create account</Button>\n </Group>\n </Form>\n );\n}\n", "import { GoogleCredentialResponse } from '@medplum/core';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { useEffect, useRef, useState } from 'react';\nimport { createScriptTag } from '../utils/script';\n\ninterface GoogleApi {\n accounts: {\n id: {\n initialize: (args: any) => void;\n renderButton: (parent: HTMLElement, args: any) => void;\n };\n };\n}\n\ndeclare const google: GoogleApi;\n\nexport interface GoogleButtonProps {\n readonly googleClientId?: string;\n readonly handleGoogleCredential: (response: GoogleCredentialResponse) => void;\n}\n\nexport function GoogleButton(props: GoogleButtonProps): JSX.Element | null {\n const medplum = useMedplum();\n const { googleClientId, handleGoogleCredential } = props;\n const parentRef = useRef<HTMLDivElement>(null);\n const [scriptLoaded, setScriptLoaded] = useState<boolean>(typeof google !== 'undefined');\n const [initialized, setInitialized] = useState(false);\n const [buttonRendered, setButtonRendered] = useState(false);\n\n useEffect(() => {\n if (typeof google === 'undefined') {\n createScriptTag('https://accounts.google.com/gsi/client', () => setScriptLoaded(true));\n return;\n }\n\n if (!initialized) {\n google.accounts.id.initialize({\n client_id: googleClientId,\n callback: handleGoogleCredential,\n });\n setInitialized(true);\n }\n\n if (parentRef.current && !buttonRendered) {\n google.accounts.id.renderButton(parentRef.current, {});\n setButtonRendered(true);\n }\n }, [medplum, googleClientId, initialized, scriptLoaded, parentRef, buttonRendered, handleGoogleCredential]);\n\n if (!googleClientId) {\n return null;\n }\n\n return <div ref={parentRef} />;\n}\n", "/**\n * Dynamically creates a script tag for the specified JavaScript file.\n * @param src - The JavaScript file URL.\n * @param onload - Optional callback for the onload event.\n */\nexport function createScriptTag(src: string, onload?: () => void): void {\n const head = document.getElementsByTagName('head')[0];\n const script = document.createElement('script');\n script.async = true;\n script.src = src;\n script.onload = onload ?? null;\n head.appendChild(script);\n}\n", "export function getGoogleClientId(clientId: string | undefined): string | undefined {\n if (clientId) {\n return clientId;\n }\n\n if (typeof window !== 'undefined') {\n const origin = window.location.protocol + '//' + window.location.host;\n const authorizedOrigins = import.meta.env.GOOGLE_AUTH_ORIGINS?.split(',') ?? [];\n if (authorizedOrigins.includes(origin)) {\n return import.meta.env.GOOGLE_CLIENT_ID;\n }\n }\n\n return undefined;\n}\n", "import { createScriptTag } from './script';\n\n// reCAPTCHA type definitions do not work with Vite project aliasing.\n// Project aliasing is more valuable than type definitions,\n// so cheating and using `any` here.\ndeclare let grecaptcha: any;\n\n/**\n * Dynamically loads the recaptcha script.\n * We do not want to load the script on page load unless the user needs it.\n * @param siteKey - The reCAPTCHA site key, available from the reCAPTCHA admin page.\n */\nexport function initRecaptcha(siteKey: string): void {\n if (typeof grecaptcha === 'undefined') {\n createScriptTag('https://www.google.com/recaptcha/api.js?render=' + siteKey);\n }\n}\n\n/**\n * Starts a request to generate a recapcha token.\n * @param siteKey - The reCAPTCHA site key, available from the reCAPTCHA admin page.\n * @returns Promise to a recaptcha token for the current user.\n */\nexport function getRecaptcha(siteKey: string): Promise<string> {\n return new Promise((resolve, reject) => {\n grecaptcha.ready(async () => {\n try {\n resolve(await grecaptcha.execute(siteKey, { action: 'submit' }));\n } catch (err) {\n reject(err);\n }\n });\n });\n}\n", "import { showNotification } from '@mantine/notifications';\nimport { BaseLoginRequest, LoginAuthenticationResponse, normalizeErrorString } from '@medplum/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\nimport { Document } from '../Document/Document';\nimport { AuthenticationForm } from './AuthenticationForm';\nimport { ChooseProfileForm } from './ChooseProfileForm';\nimport { ChooseScopeForm } from './ChooseScopeForm';\nimport { MfaForm } from './MfaForm';\nimport { NewProjectForm } from './NewProjectForm';\n\nexport interface SignInFormProps extends BaseLoginRequest {\n readonly login?: string;\n readonly chooseScopes?: boolean;\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onSuccess?: () => void;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly onCode?: (code: string) => void;\n readonly children?: ReactNode;\n}\n\n/**\n * The SignInForm component allows users to sign in to Medplum.\n *\n * \"Signing in\" is a multi-step process:\n * 1) Authentication - identify the user\n * 2) MFA - If MFA is enabled, prompt for MFA code\n * 3) Choose profile - If the user has multiple profiles, prompt to choose one\n * 4) Choose scope - If the user has multiple scopes, prompt to choose one\n * 5) Success - Return to the caller with either a code or a redirect\n * @param props - The SignInForm React props.\n * @returns The SignInForm React node.\n */\nexport function SignInForm(props: SignInFormProps): JSX.Element {\n const {\n login: loginCode,\n chooseScopes,\n onSuccess,\n onForgotPassword,\n onRegister,\n onCode,\n ...baseLoginRequest\n } = props;\n const medplum = useMedplum();\n const [login, setLogin] = useState<string>();\n const [mfaRequired, setAuthenticatorRequired] = useState(false);\n const [memberships, setMemberships] = useState<ProjectMembership[]>();\n\n const handleCode = useCallback(\n (code: string): void => {\n if (onCode) {\n onCode(code);\n } else {\n medplum\n .processCode(code)\n .then(() => {\n if (onSuccess) {\n onSuccess();\n }\n })\n .catch((err) => showNotification({ color: 'red', message: normalizeErrorString(err) }));\n }\n },\n [medplum, onCode, onSuccess]\n );\n\n const handleAuthResponse = useCallback(\n (response: LoginAuthenticationResponse): void => {\n setAuthenticatorRequired(!!response.mfaRequired);\n\n if (response.login) {\n setLogin(response.login);\n }\n\n if (response.memberships) {\n setMemberships(response.memberships);\n }\n\n if (response.code) {\n if (chooseScopes) {\n setMemberships(undefined);\n } else {\n handleCode(response.code as string);\n }\n }\n },\n [chooseScopes, handleCode]\n );\n\n const handleScopeResponse = useCallback(\n (response: LoginAuthenticationResponse): void => {\n handleCode(response.code as string);\n },\n [handleCode]\n );\n\n useEffect(() => {\n // Beware the race condition here\n // The `useMedplum` hook will return a new instance of the MedplumClient on login\n // We do not want to request the login status again in that case\n // Only request login status once\n if (loginCode && !login) {\n medplum\n .get('auth/login/' + loginCode)\n .then(handleAuthResponse)\n .catch((err) => showNotification({ color: 'red', message: normalizeErrorString(err) }));\n }\n }, [medplum, loginCode, login, handleAuthResponse]);\n\n return (\n <Document width={450}>\n {(() => {\n if (!login) {\n return (\n <AuthenticationForm\n onForgotPassword={onForgotPassword}\n onRegister={onRegister}\n handleAuthResponse={handleAuthResponse}\n disableGoogleAuth={props.disableGoogleAuth}\n disableEmailAuth={props.disableEmailAuth}\n {...baseLoginRequest}\n >\n {props.children}\n </AuthenticationForm>\n );\n } else if (mfaRequired) {\n return <MfaForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (memberships) {\n return <ChooseProfileForm login={login} memberships={memberships} handleAuthResponse={handleAuthResponse} />;\n } else if (props.projectId === 'new') {\n return <NewProjectForm login={login} handleAuthResponse={handleAuthResponse} />;\n } else if (props.chooseScopes) {\n return <ChooseScopeForm login={login} scope={props.scope} handleAuthResponse={handleScopeResponse} />;\n } else {\n return <div>Success</div>;\n }\n })()}\n </Document>\n );\n}\n", "import { Anchor, Button, Center, Checkbox, Divider, Group, PasswordInput, Stack, TextInput } from '@mantine/core';\nimport {\n BaseLoginRequest,\n GoogleCredentialResponse,\n GoogleLoginRequest,\n LoginAuthenticationResponse,\n normalizeOperationOutcome,\n} from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { ReactNode, useCallback, useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { GoogleButton } from '../GoogleButton/GoogleButton';\nimport { getGoogleClientId } from '../GoogleButton/GoogleButton.utils';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\n\nexport interface AuthenticationFormProps extends BaseLoginRequest {\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: ReactNode;\n}\n\nexport function AuthenticationForm(props: AuthenticationFormProps): JSX.Element {\n const [email, setEmail] = useState<string>();\n\n if (!email) {\n return <EmailForm setEmail={setEmail} {...props} />;\n } else {\n return <PasswordForm email={email} {...props} />;\n }\n}\n\nexport interface EmailFormProps extends BaseLoginRequest {\n readonly disableEmailAuth?: boolean;\n readonly disableGoogleAuth?: boolean;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly setEmail: (email: string) => void;\n readonly children?: ReactNode;\n}\n\nexport function EmailForm(props: EmailFormProps): JSX.Element {\n const { setEmail, onRegister, handleAuthResponse, children, disableEmailAuth, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const googleClientId = !props.disableGoogleAuth && getGoogleClientId(props.googleClientId);\n\n const isExternalAuth = useCallback(\n async (authMethod: any): Promise<boolean> => {\n if (!authMethod.authorizeUrl) {\n return false;\n }\n\n const state = JSON.stringify({\n ...(await medplum.ensureCodeChallenge(baseLoginRequest)),\n domain: authMethod.domain,\n });\n const url = new URL(authMethod.authorizeUrl);\n url.searchParams.set('state', state);\n window.location.assign(url.toString());\n return true;\n },\n [medplum, baseLoginRequest]\n );\n\n const handleSubmit = useCallback(\n async (formData: Record<string, string>) => {\n const authMethod = await medplum.post('auth/method', { email: formData.email });\n if (!(await isExternalAuth(authMethod))) {\n setEmail(formData.email);\n }\n },\n [medplum, isExternalAuth, setEmail]\n );\n\n const handleGoogleCredential = useCallback(\n async (response: GoogleCredentialResponse) => {\n const authResponse = await medplum.startGoogleLogin({\n ...baseLoginRequest,\n googleCredential: response.credential,\n } as GoogleLoginRequest);\n if (!(await isExternalAuth(authResponse))) {\n handleAuthResponse(authResponse);\n }\n },\n [medplum, baseLoginRequest, isExternalAuth, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center style={{ flexDirection: 'column' }}>{children}</Center>\n {googleClientId && (\n <>\n <Group justify=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton googleClientId={googleClientId} handleGoogleCredential={handleGoogleCredential} />\n </Group>\n {!disableEmailAuth && <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />}\n </>\n )}\n {!disableEmailAuth && (\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n autoFocus={true}\n />\n )}\n <Group justify=\"space-between\" mt=\"xl\" gap={0} wrap=\"nowrap\">\n <div>\n {onRegister && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={onRegister} size=\"xs\">\n Register\n </Anchor>\n )}\n </div>\n {!disableEmailAuth && <Button type=\"submit\">Next</Button>}\n </Group>\n </Form>\n );\n}\n\nexport interface PasswordFormProps extends BaseLoginRequest {\n readonly email: string;\n readonly onForgotPassword?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: ReactNode;\n}\n\nexport function PasswordForm(props: PasswordFormProps): JSX.Element {\n const { onForgotPassword, handleAuthResponse, children, ...baseLoginRequest } = props;\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n const handleSubmit = useCallback(\n (formData: Record<string, string>) => {\n medplum\n .startLogin({\n ...baseLoginRequest,\n password: formData.password,\n remember: formData.remember === 'on',\n })\n .then(handleAuthResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n },\n [medplum, baseLoginRequest, handleAuthResponse]\n );\n\n return (\n <Form style={{ maxWidth: 400 }} onSubmit={handleSubmit}>\n <Center style={{ flexDirection: 'column' }}>{children}</Center>\n <OperationOutcomeAlert issues={issues} />\n <Stack gap=\"xl\">\n <PasswordInput\n name=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n </Stack>\n <Group justify=\"space-between\" mt=\"xl\" gap={0} wrap=\"nowrap\">\n {onForgotPassword && (\n <Anchor component=\"button\" type=\"button\" c=\"dimmed\" onClick={onForgotPassword} size=\"xs\">\n Forgot password\n </Anchor>\n )}\n <Checkbox id=\"remember\" name=\"remember\" label=\"Remember me\" size=\"xs\" style={{ lineHeight: 1 }} />\n <Button type=\"submit\">Sign in</Button>\n </Group>\n </Form>\n );\n}\n", "import { Avatar, Center, Group, Stack, Text, Title, UnstyledButton } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeOperationOutcome } from '@medplum/core';\nimport { OperationOutcome, ProjectMembership } from '@medplum/fhirtypes';\nimport { useState } from 'react';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '@medplum/react-hooks';\nimport { OperationOutcomeAlert } from '../OperationOutcomeAlert/OperationOutcomeAlert';\n\nexport interface ChooseProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseProfileForm(props: ChooseProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome>();\n return (\n <Stack>\n <Center style={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title order={3}>Choose profile</Title>\n </Center>\n <OperationOutcomeAlert outcome={outcome} />\n {props.memberships.map((membership: ProjectMembership) => (\n <UnstyledButton\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse)\n .catch((err) => setOutcome(normalizeOperationOutcome(err)));\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" fw={500}>\n {membership.profile?.display}\n </Text>\n <Text c=\"dimmed\" size=\"xs\">\n {membership.project?.display}\n </Text>\n </div>\n </Group>\n </UnstyledButton>\n ))}\n </Stack>\n );\n}\n", "import { Button, Center, Checkbox, Group, Stack, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '@medplum/react-hooks';\n\nexport interface ChooseScopeFormProps {\n login: string;\n scope: string | undefined;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function ChooseScopeForm(props: ChooseScopeFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n medplum\n .post('auth/scope', {\n login: props.login,\n scope: Object.keys(formData).join(' '),\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Stack>\n <Center style={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Choose scope</Title>\n </Center>\n <Stack>\n {(props.scope ?? 'openid').split(' ').map((scopeName: string) => (\n <Checkbox key={scopeName} id={scopeName} name={scopeName} label={scopeName} defaultChecked />\n ))}\n </Stack>\n <Group justify=\"flex-end\" mt=\"xl\">\n <Button type=\"submit\">Set scope</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n", "import { Alert, Button, Center, Group, Stack, TextInput, Title } from '@mantine/core';\nimport { LoginAuthenticationResponse, normalizeErrorString } from '@medplum/core';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { Form } from '../Form/Form';\nimport { Logo } from '../Logo/Logo';\nimport { useMedplum } from '@medplum/react-hooks';\n\nexport interface MfaFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function MfaForm(props: MfaFormProps): JSX.Element {\n const medplum = useMedplum();\n const [errorMessage, setErrorMessage] = useState<string>();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n setErrorMessage(undefined);\n medplum\n .post('auth/mfa/verify', {\n login: props.login,\n token: formData.token,\n })\n .then(props.handleAuthResponse)\n .catch((err) => setErrorMessage(normalizeErrorString(err)));\n }}\n >\n <Stack>\n <Center style={{ flexDirection: 'column' }}>\n <Logo size={32} />\n <Title>Enter MFA code</Title>\n </Center>\n {errorMessage && (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Error\" color=\"red\">\n {errorMessage}\n </Alert>\n )}\n <Stack>\n <TextInput name=\"token\" label=\"MFA code\" required />\n </Stack>\n <Group justify=\"flex-end\" mt=\"xl\">\n <Button type=\"submit\">Submit code</Button>\n </Group>\n </Stack>\n </Form>\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Pointer", "l", "diff", "memo", "j", "b", "d", "b", "p", "MissingError", "TestError", "InvalidOperationError", "diff", "createPatch", "useEffect", "useMemo", "useState", "createContext", "useContext", "jsx", "deepEquals", "isReference", "isResource", "normalizeOperationOutcome", "useCallback", "allOk", "reactContext", "useMedplumContext", "useMedplum", "useMedplumNavigate", "useMedplumProfile", "MedplumProvider", "props", "medplum", "navigate", "defaultNavigate", "state", "setState", "s", "eventListener", "medplumContext", "path", "useResource", "value", "setOutcome", "resource", "setResource", "getInitialResource", "setResourceIfChanged", "r", "subscribed", "err", "useSearch", "resourceType", "query", "useSearchImpl", "useSearchOne", "useSearchResources", "searchFn", "searchKey", "setSearchKey", "loading", "setLoading", "result", "setResult", "outcome", "key", "res", "jsx", "TextInput", "useState", "jsx", "TextInput", "MantineAppShell", "showNotification", "useEffect", "useState", "Component", "jsx", "jsx", "main", "Avatar", "Group", "Text", "formatHumanName", "getReferenceString", "useState", "Fragment", "jsx", "jsx", "jsx", "logoButton", "user", "userName", "userActive", "formatHumanName", "getDisplayString", "forwardRef", "useCallback", "Group", "Loader", "normalizeErrorString", "useRef", "useState", "jsx", "jsxs", "defaultValue", "toOption", "useState", "ItemComponent", "useRef", "normalizeErrorString", "option", "v", "Loader", "Group", "searchInput", "Group", "jsx", "jsxs", "getDisplayString", "useCallback", "forwardRef", "Group", "b", "formatHumanName", "jsx", "jsxs", "useState", "Group", "Text", "formatHumanName", "getReferenceString", "Avatar", "Button", "MantineAppShell", "Text", "Fragment", "useState", "Group", "NativeSelect", "Stack", "TextInput", "showNotification", "normalizeErrorString", "jsx", "jsx", "jsxs", "showNotification", "normalizeErrorString", "Stack", "TextInput", "Group", "NativeSelect", "useCallback", "useState", "useState", "useCallback", "jsx", "toOption", "useCallback", "jsx", "defaultValue", "useState", "jsx", "useState", "useCallback", "menuTitle", "link", "linkActive", "Fragment", "jsx", "jsxs", "useState", "MantineAppShell", "Text", "Button", "jsx", "jsxs", "useState", "useEffect", "showNotification", "MantineAppShell", "Anchor", "jsx", "jsxs", "jsx", "v", "useRef", "useState", "useRef", "Fragment", "jsx", "jsxs", "useRef", "jsx", "jsxs", "useState", "useRef", "v", "props", "Button", "useState", "Fragment", "jsx", "jsxs", "useState", "Button", "props", "root", "compact", "Fragment", "jsx", "jsxs", "ActionIcon", "Fragment", "jsx", "Fragment", "jsx", "Fragment", "jsx", "Fragment", "jsx", "jsxs", "jsxs", "Fragment", "jsx", "Fragment", "jsx", "Fragment", "jsx", "Fragment", "jsx", "jsxs", "Fragment", "jsx", "Fragment", "jsx", "v", "Fragment", "jsx", "jsxs", "ActionIcon", "jsx", "jsxs", "tryGetDataType", "useContext", "useMemo", "useState", "Stack", "getPathDisplayName", "isPopulated", "useMemo", "useState", "Group", "jsx", "jsxs", "Group", "Input", "useContext", "jsx", "useContext", "Input", "isEmpty", "Group", "NativeSelect", "Textarea", "TextInput", "capitalize", "PropertyType", "useState", "useState", "jsx", "defaultValue", "useState", "useState", "jsx", "defaultValue", "useState", "Group", "TextInput", "useRef", "useState", "Group", "NativeSelect", "TextInput", "useContext", "useRef", "useState", "jsx", "jsxs", "useContext", "useState", "useRef", "Group", "NativeSelect", "TextInput", "jsx", "jsxs", "useState", "useRef", "Group", "TextInput", "TextInput", "jsx", "TextInput", "stringify", "useEffect", "useMemo", "useState", "jsx", "jsxs", "useState", "useMemo", "useEffect", "stringify", "Group", "NativeSelect", "TextInput", "useState", "jsx", "jsxs", "useState", "Group", "NativeSelect", "TextInput", "Group", "TextInput", "useContext", "useMemo", "useState", "jsx", "jsxs", "useState", "useContext", "useMemo", "Group", "TextInput", "NativeSelect", "TextInput", "useCallback", "useState", "jsx", "NativeSelect", "TextInput", "Group", "useState", "jsx", "jsxs", "useState", "Group", "Group", "NativeSelect", "TextInput", "useState", "jsx", "jsxs", "Group", "useState", "jsx", "jsxs", "useState", "Group", "v", "Group", "useState", "jsx", "jsxs", "useState", "Group", "v", "Group", "NativeSelect", "createReference", "isEmpty", "tryGetProfile", "useCallback", "useEffect", "useMemo", "useRef", "useState", "getDisplayString", "getReferenceString", "forwardRef", "useCallback", "useState", "Group", "Text", "jsx", "jsxs", "toOption", "getReferenceString", "getDisplayString", "useState", "defaultValue", "useCallback", "ItemComponent", "forwardRef", "Group", "Text", "jsx", "jsxs", "useState", "useRef", "useMemo", "useEffect", "useCallback", "createReference", "Group", "NativeSelect", "defaultValue", "tryGetProfile", "isEmpty", "ActionIcon", "Button", "Group", "Stack", "getPathDisplayName", "isEmpty", "tryGetProfile", "useEffect", "useState", "indented", "getTypedPropertyValueWithSchema", "isPopulated", "v", "d", "jsx", "jsxs", "useState", "defaultValue", "useEffect", "isEmpty", "tryGetProfile", "getPathDisplayName", "Stack", "Group", "v", "Button", "ActionIcon", "ActionIcon", "showNotification", "useRef", "useState", "jsx", "jsxs", "ActionIcon", "showNotification", "Button", "Group", "Modal", "NativeSelect", "Stack", "TextInput", "formatTiming", "useRef", "useState", "Fragment", "jsx", "jsxs", "useState", "useRef", "Group", "formatTiming", "Button", "Modal", "Stack", "TextInput", "NativeSelect", "jsx", "jsxs", "defaultValue", "PropertyType", "capitalize", "useState", "Group", "NativeSelect", "TextInput", "Textarea", "p", "jsx", "useState", "useMemo", "Stack", "isPopulated", "getPathDisplayName", "jsx", "jsxs", "useState", "useContext", "useMemo", "tryGetDataType", "Button", "Group", "useMemo", "useState", "table", "jsx", "jsxs", "useState", "useMemo", "Group", "Button", "d", "root", "jsx", "ActionIcon", "Center", "Group", "Loader", "Menu", "ScrollArea", "TextInput", "showNotification", "getReferenceString", "normalizeErrorString", "useCallback", "useEffect", "useRef", "useState", "Group", "Stack", "Text", "capitalize", "formatCodeableConcept", "formatDateTime", "isReference", "useEffect", "useState", "Stack", "noteBody", "noteCite", "noteRoot", "jsx", "Stack", "Group", "Text", "getDisplayString", "normalizeErrorString", "useState", "jsx", "useState", "normalizeErrorString", "getDisplayString", "Text", "jsx", "jsxs", "Group", "jsx", "table", "criticalRow", "noteBody", "noteCite", "noteRoot", "Fragment", "jsx", "jsxs", "useState", "useEffect", "Stack", "Group", "Text", "formatDateTime", "capitalize", "isReference", "formatCodeableConcept", "paper", "fill", "jsx", "capitalize", "useEffect", "useState", "root", "removed", "added", "jsx", "jsxs", "useState", "useEffect", "capitalize", "useEffect", "useState", "jsx", "useState", "useEffect", "ActionIcon", "Group", "Menu", "Text", "formatDateTime", "getReferenceString", "Fragment", "jsx", "jsxs", "Group", "Text", "formatDateTime", "Menu", "ActionIcon", "getReferenceString", "b", "pinnedComment", "Fragment", "jsx", "jsxs", "useRef", "useState", "useCallback", "resource", "useEffect", "normalizeErrorString", "showNotification", "Group", "TextInput", "ActionIcon", "props", "Center", "Loader", "Menu", "getReferenceString", "ScrollArea", "jsx", "jsx", "createReference", "jsx", "createReference", "Button", "Loader", "Table", "normalizeOperationOutcome", "memo", "useEffect", "useRef", "useState", "jsx", "ActionIcon", "Button", "Center", "Group", "Loader", "Menu", "Table", "Text", "UnstyledButton", "DEFAULT_SEARCH_COUNT", "useCallback", "useEffect", "useRef", "useState", "Box", "Button", "Modal", "Text", "jsx", "jsxs", "Button", "Group", "Modal", "Stack", "stringify", "useEffect", "useMemo", "useRef", "useState", "capitalize", "evalFhirPathTyped", "formatDateTime", "Fragment", "jsx", "capitalize", "formatDateTime", "evalFhirPathTyped", "v", "jsx", "jsxs", "useRef", "useState", "stringify", "useEffect", "useMemo", "b", "Modal", "Stack", "Group", "Button", "Button", "Group", "Modal", "NativeSelect", "getSearchParameters", "stringify", "useEffect", "useRef", "useState", "formatDateTime", "getSearchParameterDetails", "Operator", "Fragment", "jsx", "Operator", "getSearchParameterDetails", "formatDateTime", "Checkbox", "TextInput", "getSearchParameterDetails", "SearchParameterType", "jsx", "getSearchParameterDetails", "SearchParameterType", "Checkbox", "TextInput", "jsx", "jsxs", "useState", "stringify", "useRef", "useEffect", "getSearchParameters", "Modal", "Group", "Button", "NativeSelect", "Button", "Modal", "useState", "jsx", "jsxs", "useState", "Modal", "Button", "Menu", "Operator", "Fragment", "jsx", "jsxs", "Menu", "Operator", "root", "table", "tr", "th", "control", "icon", "getSearchParameterDetails", "getSearchParameters", "p", "Fragment", "jsx", "jsxs", "useState", "useRef", "useCallback", "useEffect", "state", "Center", "Loader", "Group", "Button", "Text", "ActionIcon", "Table", "Menu", "UnstyledButton", "p", "DEFAULT_SEARCH_COUNT", "jsx", "jsxs", "useState", "useRef", "useEffect", "normalizeOperationOutcome", "Loader", "Table", "Button", "memo", "jsx", "jsxs", "Box", "Box", "Flex", "Group", "Paper", "Text", "Title", "formatCodeableConcept", "Fragment", "jsx", "jsxs", "Paper", "Group", "Text", "p", "formatCodeableConcept", "Box", "Title", "Flex", "jsx", "jsxs", "Box", "Alert", "jsx", "Alert", "Anchor", "Flex", "Group", "Paper", "Stack", "Text", "formatHumanName", "useEffect", "useState", "Anchor", "Badge", "Box", "Button", "Group", "Modal", "NativeSelect", "Stack", "Text", "TextInput", "createReference", "useCallback", "useState", "Fragment", "jsx", "jsxs", "useState", "useCallback", "createReference", "Group", "Text", "Anchor", "Box", "Badge", "Modal", "Stack", "TextInput", "NativeSelect", "Button", "Anchor", "Badge", "Box", "Button", "Group", "Modal", "Stack", "Text", "useDisclosure", "createReference", "useCallback", "useState", "Fragment", "jsx", "jsxs", "useState", "useDisclosure", "useCallback", "createReference", "Group", "Text", "Anchor", "Box", "Badge", "Modal", "Stack", "Button", "Anchor", "Badge", "Button", "Grid", "Group", "Modal", "NativeSelect", "Stack", "Text", "Textarea", "TextInput", "useDisclosure", "createReference", "Fragment", "useCallback", "useState", "Fragment", "jsx", "jsxs", "useState", "useDisclosure", "useCallback", "createReference", "Group", "Text", "Anchor", "Grid", "Badge", "Modal", "Stack", "TextInput", "NativeSelect", "Textarea", "Button", "Anchor", "Badge", "Box", "Button", "Group", "Modal", "Radio", "Stack", "Text", "useDisclosure", "HTTP_HL7_ORG", "createReference", "useCallback", "useState", "Fragment", "jsx", "jsxs", "useState", "useDisclosure", "useCallback", "HTTP_HL7_ORG", "createReference", "Group", "Text", "Anchor", "Box", "Badge", "Modal", "Stack", "Radio", "Button", "Anchor", "Button", "Grid", "Group", "Modal", "Stack", "Text", "Textarea", "TextInput", "useDisclosure", "useCallback", "useState", "LOINC", "createReference", "Fragment", "jsx", "jsxs", "useState", "useDisclosure", "useCallback", "Group", "Text", "Anchor", "Grid", "Modal", "Stack", "TextInput", "Textarea", "Button", "jsx", "jsxs", "useState", "useEffect", "Text", "formatHumanName", "Paper", "Group", "Flex", "Stack", "Anchor", "createReference", "useCallback", "jsx", "useCallback", "createReference", "Anchor", "Button", "NativeSelect", "Stack", "TextInput", "getReferenceString", "useEffect", "useRef", "useState", "section", "hovering", "editing", "bottomActions", "jsx", "jsxs", "defaultValue", "useState", "useRef", "useEffect", "TextInput", "Button", "Anchor", "Stack", "NativeSelect", "getReferenceString", "Anchor", "Box", "Button", "Group", "NativeSelect", "Space", "Textarea", "TextInput", "Title", "getElementDefinition", "useEffect", "useRef", "useState", "Checkbox", "Group", "MultiSelect", "NativeSelect", "Radio", "Textarea", "TextInput", "capitalize", "formatCodeableConcept", "formatCoding", "getElementDefinition", "getTypedPropertyValue", "stringify", "useContext", "deepClone", "evalFhirPathTyped", "formatCoding", "getReferenceString", "getTypedPropertyValue", "stringify", "QuestionnaireItemType", "option", "generateId", "nextId", "jsx", "useContext", "defaultValue", "getTypedPropertyValue", "Checkbox", "TextInput", "Textarea", "Group", "data", "MultiSelect", "NativeSelect", "capitalize", "formatCoding", "getElementDefinition", "stringify", "Radio", "option", "formatCodeableConcept", "section", "hovering", "editing", "questionBody", "topActions", "bottomActions", "movementActions", "movementIcons", "columnAlignment", "linkIdInput", "typeSelect", "Fragment", "jsx", "jsxs", "defaultValue", "useState", "useEffect", "Button", "isResource", "useRef", "item", "TextInput", "Textarea", "Title", "NativeSelect", "Box", "Anchor", "generateId", "getElementDefinition", "Space", "Group", "nextId", "Title", "createReference", "getReferenceString", "useEffect", "useState", "Button", "Group", "Stack", "Anchor", "useState", "jsx", "jsxs", "useState", "r", "Anchor", "Anchor", "Stack", "Title", "useState", "Fragment", "jsx", "jsxs", "useState", "responses", "r", "Anchor", "newResponse", "Title", "Stack", "Fragment", "jsx", "jsxs", "Stack", "Group", "Button", "jsx", "jsxs", "useState", "useEffect", "getReferenceString", "createReference", "Title", "ActionIcon", "Button", "Divider", "Group", "NativeSelect", "Stack", "Text", "TextInput", "formatRange", "useEffect", "useState", "section", "jsx", "jsxs", "useState", "useEffect", "Stack", "ActionIcon", "Group", "Button", "groupId", "g", "Divider", "TextInput", "NativeSelect", "Text", "nextId", "formatRange", "Button", "Grid", "Text", "formatDateTime", "getReferenceString", "Fragment", "useEffect", "useState", "jsx", "jsxs", "useState", "useEffect", "Grid", "Fragment", "Text", "formatDateTime", "Button", "getReferenceString", "useEffect", "useState", "stringify", "N", "M", "d", "k", "j", "stringify", "b", "k", "container", "root", "startRow", "normalRow", "author", "dateTime", "lineNumber", "line", "pre", "Fragment", "jsx", "jsxs", "useState", "useEffect", "stringify", "removed", "added", "Fragment", "jsx", "jsxs", "stringify", "Button", "Group", "Stack", "TextInput", "deepClone", "tryGetProfile", "useEffect", "useState", "jsx", "jsxs", "defaultValue", "useState", "useEffect", "deepClone", "tryGetProfile", "Stack", "TextInput", "Group", "Button", "Table", "formatDateTime", "normalizeErrorString", "useEffect", "useState", "jsx", "jsxs", "useState", "useEffect", "Table", "formatDateTime", "getVersionUrl", "normalizeErrorString", "Button", "Stack", "Text", "getReferenceString", "isReference", "useState", "container", "info", "selection", "jsx", "jsxs", "useState", "isReference", "getReferenceString", "getStart", "getEnd", "Text", "Stack", "s", "Button", "createReference", "jsx", "createReference", "Anchor", "showNotification", "normalizeErrorString", "jsx", "showNotification", "normalizeErrorString", "Anchor", "normalizeOperationOutcome", "useEffect", "useState", "Anchor", "Button", "Center", "Group", "Stack", "Text", "TextInput", "Title", "normalizeOperationOutcome", "useState", "jsx", "jsxs", "useState", "normalizeOperationOutcome", "Center", "Title", "Stack", "TextInput", "Text", "Anchor", "Group", "Button", "Anchor", "Button", "Center", "Checkbox", "Divider", "Group", "Stack", "Text", "TextInput", "normalizeOperationOutcome", "useEffect", "useState", "useEffect", "useRef", "useState", "jsx", "useRef", "useState", "useEffect", "Fragment", "jsx", "jsxs", "useState", "useEffect", "normalizeOperationOutcome", "Center", "Group", "Divider", "Stack", "TextInput", "Text", "Anchor", "Checkbox", "Button", "jsx", "jsxs", "useState", "useEffect", "normalizeOperationOutcome", "showNotification", "normalizeErrorString", "useCallback", "useEffect", "useState", "Anchor", "Button", "Center", "Checkbox", "Divider", "Group", "PasswordInput", "Stack", "TextInput", "normalizeOperationOutcome", "useCallback", "useState", "Fragment", "jsx", "jsxs", "useState", "useCallback", "Center", "Group", "Divider", "TextInput", "Anchor", "Button", "normalizeOperationOutcome", "Stack", "PasswordInput", "Checkbox", "Avatar", "Center", "Group", "Stack", "Text", "Title", "UnstyledButton", "normalizeOperationOutcome", "useState", "jsx", "jsxs", "useState", "Stack", "Center", "Title", "UnstyledButton", "normalizeOperationOutcome", "Group", "Avatar", "Text", "Button", "Center", "Checkbox", "Group", "Stack", "Title", "jsx", "jsxs", "Stack", "Center", "Title", "Checkbox", "Group", "Button", "Alert", "Button", "Center", "Group", "Stack", "TextInput", "Title", "normalizeErrorString", "useState", "jsx", "jsxs", "useState", "normalizeErrorString", "Stack", "Center", "Title", "Alert", "TextInput", "Group", "Button", "jsx", "useState", "useCallback", "showNotification", "normalizeErrorString", "useEffect"]
7
7
  }