From ca2236f62721329459b8a0980a4aa75d7cfba00e Mon Sep 17 00:00:00 2001 From: dehall Date: Thu, 27 Jun 2024 14:34:02 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20syntheti?= =?UTF-8?q?chealth/spt@372835d6dd2ce0a081257d7b1b95ae9cf348f426=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/bundle.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/js/bundle.js b/js/bundle.js index 4bb56af..11690c0 100644 --- a/js/bundle.js +++ b/js/bundle.js @@ -5646,7 +5646,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_data_grid__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-data-grid */ \"./node_modules/react-data-grid/lib/bundle.js\");\n/* harmony import */ var react_data_grid_lib_styles_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-data-grid/lib/styles.css */ \"./node_modules/react-data-grid/lib/styles.css\");\n/* harmony import */ var react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-accessible-accordion */ \"./node_modules/react-accessible-accordion/dist/es/index.js\");\n/* harmony import */ var react_accessible_accordion_dist_fancy_example_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-accessible-accordion/dist/fancy-example.css */ \"./node_modules/react-accessible-accordion/dist/fancy-example.css\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _ViewFhirModal__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ViewFhirModal */ \"./src/ui/components/PatientViewer/ViewFhirModal.jsx\");\n/* harmony import */ var _ViewNoteModal__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ViewNoteModal */ \"./src/ui/components/PatientViewer/ViewNoteModal.jsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils */ \"./src/ui/components/PatientViewer/utils.jsx\");\n\n\n\n\n\n// Demo styles, see 'Styles' section below for some notes on use.\n\n\n\n\n\nconst COLUMNS = [{\n key: 'type',\n name: 'Type'\n}, {\n key: 'code',\n name: 'Code'\n}, {\n key: 'description',\n name: 'Description',\n colSpan: args => {\n if (args.type === 'ROW' && (args.row.type === 'Media' || args.row.type === 'Note')) {\n return 3;\n }\n return 1;\n }\n}, {\n key: 'details',\n name: 'Details',\n colSpan: args => {\n if (args.type === 'ROW') {\n var _args$row;\n return (_args$row = args.row) !== null && _args$row !== void 0 && _args$row.additional ? 1 : 2;\n }\n if (args.type === 'HEADER') {\n return 2;\n }\n return 1;\n }\n}, {\n key: 'additional',\n name: ''\n}, {\n key: 'fhir',\n name: 'View FHIR'\n}];\nconst FORMATTERS = {\n date: str => moment__WEBPACK_IMPORTED_MODULE_4___default()(str).format('YYYY-MM-DD'),\n time: str => moment__WEBPACK_IMPORTED_MODULE_4___default()(str).format('HH:mm:ss'),\n dateTime: str => moment__WEBPACK_IMPORTED_MODULE_4___default()(str).format('YYYY-MM-DD - h:mm:ss a'),\n numberWithCommas: str => str.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"),\n code: code => \"\".concat(code.code, \": \").concat(code.display ? code.display : ''),\n period: period => \"\".concat(moment__WEBPACK_IMPORTED_MODULE_4___default()(period.start).format('YYYY-MM-DD - h:mm:ss a'), \" -> \").concat(moment__WEBPACK_IMPORTED_MODULE_4___default()(period.end).format('YYYY-MM-DD - h:mm:ss a'))\n};\nconst VIEW_FHIR = {\n key: 'fhir',\n getter: resource => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ViewFhirModal__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n resource: resource\n })\n};\nconst renderNote = text => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__.Accordion, {\n allowZeroExpanded: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__.AccordionItem, {\n key: text\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__.AccordionItemHeading, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__.AccordionItemButton, null, \"View Note\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__.AccordionItemPanel, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n textAlign: 'left',\n whiteSpace: 'pre'\n }\n }, text))));\n};\nconst ROW_FUNCTIONS = [{\n getter: e => [e.encounter],\n keyFn: e => e.id,\n columns: [{\n key: 'type',\n getter: () => 'Encounter'\n }, {\n key: 'code',\n getter: n => n.type[0].coding[0].code\n }, {\n key: 'description',\n getter: n => n.type[0].coding[0].display\n }, {\n key: 'details',\n format: 'date',\n getter: n => n.period.start\n }, VIEW_FHIR]\n}, {\n getter: r => r.conditions,\n keyFn: o => o.id,\n columns: [{\n key: 'type',\n getter: () => 'Condition'\n }, {\n key: 'code',\n getter: c => c.code.coding[0].code\n }, {\n key: 'description',\n getter: c => c.code.coding[0].display\n }, VIEW_FHIR]\n}, {\n getter: r => r.procedures,\n keyFn: o => o.id,\n columns: [{\n key: 'type',\n getter: () => 'Procedure'\n }, {\n key: 'code',\n getter: p => p.code.coding[0].code\n }, {\n key: 'description',\n getter: p => p.code.coding[0].display\n }, {\n key: 'details',\n format: 'dateTime',\n getter: p => p.performedPeriod.start\n }, VIEW_FHIR]\n}, {\n getter: r => r.medications,\n keyFn: o => o.id,\n columns: [{\n key: 'type',\n getter: () => 'Medication'\n }, {\n key: 'code',\n getter: c => c.medicationCodeableConcept.coding[0].code\n }, {\n key: 'description',\n getter: c => c.medicationCodeableConcept.coding[0].display\n }, {\n key: 'details',\n format: 'dateTime',\n getter: c => c.authoredOn\n }, {\n key: 'additional',\n getter: c => c.status\n }, VIEW_FHIR]\n}, {\n getter: r => r.observations,\n keyFn: o => o.id,\n columns: [{\n key: 'type',\n getter: () => 'Observation'\n }, {\n key: 'code',\n getter: o => o.code.coding[0].code\n }, {\n key: 'description',\n getter: o => o.code.coding[0].display\n }, {\n key: 'details',\n getter: o => (0,_utils__WEBPACK_IMPORTED_MODULE_7__.obsValue)(o)\n }, VIEW_FHIR]\n}, {\n getter: r => r.notes,\n keyFn: dr => dr.id,\n columns: [{\n key: 'type',\n getter: () => 'Note'\n }, {\n key: 'description',\n getter: dr => renderNote((0,_utils__WEBPACK_IMPORTED_MODULE_7__.getNoteText)(dr)) // \n }, VIEW_FHIR]\n}, {\n getter: r => r.medias,\n keyFn: m => m.id,\n columns: [{\n key: 'type',\n getter: () => 'Media'\n }, {\n key: 'description',\n getter: m => (0,_utils__WEBPACK_IMPORTED_MODULE_7__.extractMedia)(m)\n }, VIEW_FHIR]\n}];\nconst rowHeightFn = row => {\n switch (row.type) {\n case 'Media':\n return 200;\n case 'Note':\n return null;\n // makes it fit to content when expanded\n default:\n return 35;\n // seems to be the default if not set. undefined here makes the app hang. null makes it smaller\n }\n};\nconst EncounterSection = _ref => {\n let {\n encounterData\n } = _ref;\n const rows = [];\n for (const rowDef of ROW_FUNCTIONS) {\n const rawRows = rowDef.getter(encounterData);\n for (const rawRow of rawRows) {\n const row = {};\n for (const c of rowDef.columns) {\n const formatter = FORMATTERS[c.format];\n let result;\n try {\n result = c.getter(rawRow);\n } catch (e) {\n console.error(e);\n result = undefined;\n }\n if (result && formatter) {\n result = formatter(result);\n }\n if (!result && c.defaultValue) {\n result = c.defaultValue;\n }\n row[c.key] = result;\n }\n rows.push(row);\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_data_grid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n columns: COLUMNS,\n rows: rows,\n style: {\n blockSize: '100%'\n } // otherwise it defaults to some fixed size and has a scrollbar\n ,\n rowHeight: rowHeightFn\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EncounterSection);\n\n//# sourceURL=webpack://spt/./src/ui/components/PatientViewer/EncounterSection.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_data_grid__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-data-grid */ \"./node_modules/react-data-grid/lib/bundle.js\");\n/* harmony import */ var react_data_grid_lib_styles_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-data-grid/lib/styles.css */ \"./node_modules/react-data-grid/lib/styles.css\");\n/* harmony import */ var react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-accessible-accordion */ \"./node_modules/react-accessible-accordion/dist/es/index.js\");\n/* harmony import */ var react_accessible_accordion_dist_fancy_example_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-accessible-accordion/dist/fancy-example.css */ \"./node_modules/react-accessible-accordion/dist/fancy-example.css\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _ViewFhirModal__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ViewFhirModal */ \"./src/ui/components/PatientViewer/ViewFhirModal.jsx\");\n/* harmony import */ var _ViewNoteModal__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ViewNoteModal */ \"./src/ui/components/PatientViewer/ViewNoteModal.jsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils */ \"./src/ui/components/PatientViewer/utils.jsx\");\n\n\n\n\n\n// Demo styles, see 'Styles' section below for some notes on use.\n\n\n\n\n\nconst COLUMNS = [{\n key: 'type',\n name: 'Type'\n}, {\n key: 'code',\n name: 'Code'\n}, {\n key: 'description',\n name: 'Description',\n colSpan: args => {\n if (args.type === 'ROW' && (args.row.type === 'Media' || args.row.type === 'Note')) {\n return 3;\n }\n return 1;\n }\n}, {\n key: 'details',\n name: 'Details',\n colSpan: args => {\n if (args.type === 'ROW') {\n var _args$row;\n return (_args$row = args.row) !== null && _args$row !== void 0 && _args$row.additional ? 1 : 2;\n }\n if (args.type === 'HEADER') {\n return 2;\n }\n return 1;\n }\n}, {\n key: 'additional',\n name: ''\n}, {\n key: 'fhir',\n name: 'View FHIR'\n}];\nconst FORMATTERS = {\n date: str => moment__WEBPACK_IMPORTED_MODULE_4___default()(str).format('YYYY-MM-DD'),\n time: str => moment__WEBPACK_IMPORTED_MODULE_4___default()(str).format('HH:mm:ss'),\n dateTime: str => moment__WEBPACK_IMPORTED_MODULE_4___default()(str).format('YYYY-MM-DD - h:mm:ss a'),\n numberWithCommas: str => str.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"),\n code: code => \"\".concat(code.code, \": \").concat(code.display ? code.display : ''),\n period: period => \"\".concat(moment__WEBPACK_IMPORTED_MODULE_4___default()(period.start).format('YYYY-MM-DD - h:mm:ss a'), \" -> \").concat(moment__WEBPACK_IMPORTED_MODULE_4___default()(period.end).format('YYYY-MM-DD - h:mm:ss a'))\n};\nconst VIEW_FHIR = {\n key: 'fhir',\n getter: resource => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ViewFhirModal__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n resource: resource\n })\n};\nconst renderNote = text => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__.Accordion, {\n allowZeroExpanded: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__.AccordionItem, {\n key: text\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__.AccordionItemHeading, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__.AccordionItemButton, null, \"View Note\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_2__.AccordionItemPanel, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n textAlign: 'left',\n whiteSpace: 'pre'\n }\n }, text))));\n};\nconst ROW_FUNCTIONS = [{\n getter: e => [e.encounter],\n keyFn: e => e.id,\n columns: [{\n key: 'type',\n getter: () => 'Encounter'\n }, {\n key: 'code',\n getter: n => n.type[0].coding[0].code\n }, {\n key: 'description',\n getter: n => n.type[0].coding[0].display\n }, {\n key: 'details',\n format: 'date',\n getter: n => n.period.start\n }, VIEW_FHIR]\n}, {\n getter: r => r.conditions,\n keyFn: o => o.id,\n columns: [{\n key: 'type',\n getter: () => 'Condition'\n }, {\n key: 'code',\n getter: c => c.code.coding[0].code\n }, {\n key: 'description',\n getter: c => c.code.coding[0].display\n }, VIEW_FHIR]\n}, {\n getter: r => r.procedures,\n keyFn: o => o.id,\n columns: [{\n key: 'type',\n getter: () => 'Procedure'\n }, {\n key: 'code',\n getter: p => p.code.coding[0].code\n }, {\n key: 'description',\n getter: p => p.code.coding[0].display\n }, {\n key: 'details',\n format: 'dateTime',\n getter: p => p.performedPeriod.start\n }, VIEW_FHIR]\n}, {\n getter: r => r.medications,\n keyFn: o => o.id,\n columns: [{\n key: 'type',\n getter: () => 'Medication'\n }, {\n key: 'code',\n getter: c => c.medicationCodeableConcept.coding[0].code\n }, {\n key: 'description',\n getter: c => c.medicationCodeableConcept.coding[0].display\n }, {\n key: 'details',\n format: 'dateTime',\n getter: c => c.authoredOn\n }, {\n key: 'additional',\n getter: c => c.status\n }, VIEW_FHIR]\n}, {\n getter: r => r.observations,\n keyFn: o => o.id,\n columns: [{\n key: 'type',\n getter: () => 'Observation'\n }, {\n key: 'code',\n getter: o => o.code.coding[0].code\n }, {\n key: 'description',\n getter: o => o.code.coding[0].display\n }, {\n key: 'details',\n getter: o => (0,_utils__WEBPACK_IMPORTED_MODULE_7__.obsValue)(o)\n }, VIEW_FHIR]\n}, {\n getter: r => r.notes,\n keyFn: dr => dr.id,\n columns: [{\n key: 'type',\n getter: () => 'Note'\n }, {\n key: 'description',\n getter: dr => renderNote((0,_utils__WEBPACK_IMPORTED_MODULE_7__.getNoteText)(dr)) // \n }, VIEW_FHIR]\n}, {\n getter: r => r.medias,\n keyFn: m => m.id,\n columns: [{\n key: 'type',\n getter: () => 'Media'\n }, {\n key: 'description',\n getter: m => (0,_utils__WEBPACK_IMPORTED_MODULE_7__.extractMedia)(m)\n }\n // VIEW_FHIR // temporarily disabled\n ]\n}];\nconst rowHeightFn = row => {\n switch (row.type) {\n case 'Media':\n return 200;\n case 'Note':\n return null;\n // makes it fit to content when expanded\n default:\n return 35;\n // seems to be the default if not set. undefined here makes the app hang. null makes it smaller\n }\n};\nconst EncounterSection = _ref => {\n let {\n encounterData\n } = _ref;\n const rows = [];\n for (const rowDef of ROW_FUNCTIONS) {\n const rawRows = rowDef.getter(encounterData);\n for (const rawRow of rawRows) {\n const row = {};\n for (const c of rowDef.columns) {\n const formatter = FORMATTERS[c.format];\n let result;\n try {\n result = c.getter(rawRow);\n } catch (e) {\n console.error(e);\n result = undefined;\n }\n if (result && formatter) {\n result = formatter(result);\n }\n if (!result && c.defaultValue) {\n result = c.defaultValue;\n }\n row[c.key] = result;\n }\n rows.push(row);\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_data_grid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n columns: COLUMNS,\n rows: rows,\n style: {\n blockSize: '100%'\n } // otherwise it defaults to some fixed size and has a scrollbar\n ,\n rowHeight: rowHeightFn\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EncounterSection);\n\n//# sourceURL=webpack://spt/./src/ui/components/PatientViewer/EncounterSection.jsx?"); /***/ }), @@ -5657,7 +5657,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// map a list to a group of fhir ORs, eg [1,2,3] --> string \"'1' | '2' | '3'\"\nconst fhirList = list => list.map(i => \"'\".concat(i, \"'\")).join(' | ');\nconst DR_CONDITIONS = ['44054006',\n// diabetes\n'15777000',\n// prediabetes\n'1551000119108',\n// NPDR\n'1501000119109',\n// PDR\n'97331000119101',\n// DME\n'60951000119105' // blindness\n];\nconst SDOH_CONDITIONS = ['314529007', '5251000175109', '424393004', '160903007', '706893006', '73595000', '160904001', '741062008', '10939881000119105', '422650009', '423315002', '706893006', '266948004', '5251000175109'];\nconst FILTER_PRESETS = Object.freeze({\n \"Hide Resolved Conditions\": {\n description: \"Hides conditions with an abatement date\",\n mode: 'exclude',\n filterOnGroupByEncounter: false,\n filters: {\n Condition: ['Condition.abatement'] // is not null\n }\n },\n \"Hide Stopped Medications\": {\n description: \"Hides medications with a status of 'stopped'\",\n mode: 'exclude',\n filterOnGroupByEncounter: false,\n filters: {\n MedicationRequest: [\"MedicationRequest.status = 'stopped'\"]\n }\n },\n 'Disease Focus: Diabetic Retinopathy': {\n description: 'Keeps entries relevant to Diabetic Retinopathy',\n mode: 'include',\n filterOnGroupByEncounter: true,\n filters: {\n Encounter: [\"Encounter.type.coding.code = '185349003'\"],\n Condition: [\"Condition.code.coding.code in (\".concat(fhirList(DR_CONDITIONS), \")\")],\n Observation: []\n }\n },\n 'Hide SDOH Conditions': {\n description: 'Hides most SDOH conditions, such as \"stress\", employment status, etc',\n mode: 'exclude',\n filterOnGroupByEncounter: true,\n filters: {\n Condition: [\"Condition.code.coding.code in (\".concat(fhirList(SDOH_CONDITIONS), \")\")]\n }\n }\n // Coming soon...\n // 'Cardiology': {\n // description: 'Keeps entries relevant to Cardiology',\n // mode: 'include',\n // filters: {\n\n // }\n // }\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FILTER_PRESETS);\n\n//# sourceURL=webpack://spt/./src/ui/components/PatientViewer/FilterPresets.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// map a list to a group of fhir ORs, eg [1,2,3] --> string \"'1' | '2' | '3'\"\nconst fhirList = list => list.map(i => \"'\".concat(i, \"'\")).join(' | ');\nconst DR_CONDITIONS = ['44054006',\n// diabetes\n'15777000',\n// prediabetes\n'1551000119108',\n// NPDR\n'1501000119109',\n// PDR\n'97331000119101',\n// DME\n'60951000119105' // blindness\n];\nconst DR_OBSERVATIONS = ['413078003',\n// visual acuity\n'41633001',\n// iop\n'71491-5', '71490-7',\n// severity L / R,\n'4548-4',\n// hba1c\n'79819-9', '79818-1',\n// OCT obs L/R\n\n// OCT measurements\n'57119-0', '57108-3', '57109-1', '57110-9', '57111-7', '57112-5', '57113-3', '57114-1', '57115-8', '57116-6', '57117-4', '57118-2'];\nconst SDOH_CONDITIONS = ['314529007', '5251000175109', '424393004', '160903007', '706893006', '73595000', '160904001', '741062008', '10939881000119105', '422650009', '423315002', '706893006', '266948004', '5251000175109'];\nconst FILTER_PRESETS = Object.freeze({\n \"Hide Resolved Conditions\": {\n description: \"Hides conditions with an abatement date\",\n mode: 'exclude',\n filterOnGroupByEncounter: false,\n filters: {\n Condition: ['Condition.abatement'] // is not null\n }\n },\n \"Hide Stopped Medications\": {\n description: \"Hides medications with a status of 'stopped'\",\n mode: 'exclude',\n filterOnGroupByEncounter: false,\n filters: {\n MedicationRequest: [\"MedicationRequest.status = 'stopped'\"]\n }\n },\n 'Disease Focus: Diabetic Retinopathy': {\n description: 'Keeps entries relevant to Diabetic Retinopathy',\n mode: 'include',\n filterOnGroupByEncounter: true,\n filters: {\n Encounter: [\"Encounter.type.coding.code = '185349003'\"],\n Condition: [\"Condition.code.coding.code in (\".concat(fhirList(DR_CONDITIONS), \")\")],\n Observation: [\"Observation.code.coding.where($this.code in (\".concat(fhirList(DR_OBSERVATIONS), \"))\")],\n CarePlan: [],\n Immunization: []\n }\n },\n 'Hide SDOH Conditions': {\n description: 'Hides most SDOH conditions, such as \"stress\", employment status, etc',\n mode: 'exclude',\n filterOnGroupByEncounter: true,\n filters: {\n Condition: [\"Condition.code.coding.code in (\".concat(fhirList(SDOH_CONDITIONS), \")\")]\n }\n }\n // Coming soon...\n // 'Cardiology': {\n // description: 'Keeps entries relevant to Cardiology',\n // mode: 'include',\n // filters: {\n\n // }\n // }\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FILTER_PRESETS);\n\n//# sourceURL=webpack://spt/./src/ui/components/PatientViewer/FilterPresets.jsx?"); /***/ }), @@ -5668,7 +5668,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var use_local_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! use-local-storage */ \"./node_modules/use-local-storage/dist/index.js\");\n/* harmony import */ var use_local_storage__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(use_local_storage__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var fhir_visualizers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! fhir-visualizers */ \"./node_modules/fhir-visualizers/build/index.js\");\n/* harmony import */ var _ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ResourceTables/ResourceTables */ \"./src/ui/components/ResourceTables/ResourceTables.jsx\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router_hash_link__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! react-router-hash-link */ \"./node_modules/react-router-hash-link/dist/react-router-hash-link.esm.js\");\n/* harmony import */ var _mui_material_Box__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material/Box */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material_Paper__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material/Paper */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material_Button__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material/Button */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var react_accessible_accordion__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-accessible-accordion */ \"./node_modules/react-accessible-accordion/dist/es/index.js\");\n/* harmony import */ var _EncounterGroupedRecord__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./EncounterGroupedRecord */ \"./src/ui/components/PatientViewer/EncounterGroupedRecord.jsx\");\n/* harmony import */ var _Settings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Settings */ \"./src/ui/components/PatientViewer/Settings.jsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils */ \"./src/ui/components/PatientViewer/utils.jsx\");\n/* harmony import */ var react_accessible_accordion_dist_fancy_example_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-accessible-accordion/dist/fancy-example.css */ \"./node_modules/react-accessible-accordion/dist/fancy-example.css\");\n/* harmony import */ var react_dropzone__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! react-dropzone */ \"./node_modules/react-dropzone/dist/es/index.js\");\n/* harmony import */ var _SyntheticMass_api__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../SyntheticMass/api */ \"./src/ui/components/SyntheticMass/api.js\");\n/* harmony import */ var _github__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../github */ \"./src/ui/github.jsx\");\n/* harmony import */ var _csvToFhir__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./csvToFhir */ \"./src/ui/components/PatientViewer/csvToFhir.js\");\n/* harmony import */ var _fhirpath_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../fhirpath_utils */ \"./src/ui/fhirpath_utils.jsx\");\n/* harmony import */ var _FilterPresets__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./FilterPresets */ \"./src/ui/components/PatientViewer/FilterPresets.jsx\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Demo styles, see 'Styles' section below for some notes on use.\n\n\n\n\n\n\n\nconst getDropzone = (setLoading, callback) => {\n const onDrop = files => {\n const reader = new FileReader();\n reader.readAsText(files[0]);\n setLoading(true);\n reader.onload = () => {\n if (reader.result) {\n const json = JSON.parse(reader.result);\n setLoading(false);\n callback(json);\n }\n };\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_dropzone__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n onDrop: onDrop\n }, _ref => {\n let {\n getRootProps,\n getInputProps\n } = _ref;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", getRootProps({\n style: {\n height: '100vh',\n width: '100%',\n background: '#F0F8FF',\n padding: \"2rem\"\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", getInputProps()), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n minHeight: \"100%\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: {\n p: 2,\n border: '1px dashed grey',\n textAlign: 'center'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", null, \"Drag & drop a FHIR JSON file here\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", null, \"or \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n style: {\n textDecoration: 'underline',\n color: 'blue'\n }\n }, \"click to select a file\"), \".\")))));\n });\n};\nfunction getPatient(id) {\n if (id.startsWith('csv/')) {\n return (0,_csvToFhir__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(id.slice(4)); // slice off the \"csv/\" bit\n } else if (id.startsWith('github/')) {\n return (0,_github__WEBPACK_IMPORTED_MODULE_10__.getPatientOnGitHub)(id);\n } else {\n return (0,_SyntheticMass_api__WEBPACK_IMPORTED_MODULE_9__.getPatientById)(id);\n }\n}\nconst PatientViewer = props => {\n const location = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_16__.useLocation)();\n const [urlParams, setUrlParams] = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_17__.useSearchParams)();\n const id = props.id || urlParams.get('patient');\n const [bundle, _setBundle] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();\n const [previousBundle, setPreviousBundle] = use_local_storage__WEBPACK_IMPORTED_MODULE_1___default()(\"previousBundle\", bundle);\n const [isLoading, setIsLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!bundle);\n const setBundle = bundle => {\n _setBundle(bundle);\n setPreviousBundle(bundle);\n setIsLoading(false);\n };\n const [isGroupByEncounter, setIsGroupByEncounter] = use_local_storage__WEBPACK_IMPORTED_MODULE_1___default()(\"group-by-encounter\", false);\n const loadedPresets = [];\n for (const presetKey of Object.keys(_FilterPresets__WEBPACK_IMPORTED_MODULE_13__[\"default\"])) {\n const [isPresetLoaded] = use_local_storage__WEBPACK_IMPORTED_MODULE_1___default()(presetKey, false);\n if (isPresetLoaded) {\n loadedPresets.push(presetKey);\n }\n }\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (id && !bundle) {\n setIsLoading(true);\n getPatient(id).then(patientEverythingBundle => {\n setBundle(patientEverythingBundle);\n });\n }\n }, [id, bundle]);\n if (!id && !bundle) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, previousBundle && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n variant: \"contained\",\n onClick: () => setBundle(previousBundle),\n style: {\n textTransform: \"none\"\n }\n }, \"Reload Last Patient\"), getDropzone(setIsLoading, setBundle));\n }\n if (isLoading) return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: \"https://i.giphy.com/media/3oEjI6SIIHBdRxXI40/giphy.webp\",\n alt: \"loading...\"\n });\n let allResources = bundle.entry.map(e => e.resource);\n for (const presetKey of loadedPresets) {\n const preset = _FilterPresets__WEBPACK_IMPORTED_MODULE_13__[\"default\"][presetKey];\n if (isGroupByEncounter && !preset.filterOnGroupByEncounter) continue;\n allResources = allResources.filter(r => {\n const filtersByResourceType = preset.filters[r.resourceType];\n if (!filtersByResourceType) return true;\n const anyMatch = filtersByResourceType.some(f => (0,_fhirpath_utils__WEBPACK_IMPORTED_MODULE_12__.appliesToResource)(r, f));\n return preset.mode === 'exclude' ? !anyMatch : anyMatch;\n });\n }\n const patient = allResources.find(r => r.resourceType === 'Patient');\n const toggleGroup = event => {\n event.preventDefault();\n setIsGroupByEncounter(!isGroupByEncounter);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Paper__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n style: {\n margin: \"1rem\",\n padding: \"1rem\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Settings__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(fhir_visualizers__WEBPACK_IMPORTED_MODULE_2__.PatientVisualizer, {\n patient: patient\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\",\n onClick: toggleGroup\n }, isGroupByEncounter ? \"Ungroup\" : \"Group\", \" by Encounter\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), isGroupByEncounter ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_EncounterGroupedRecord__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n allResources: allResources\n }) :\n /*#__PURE__*/\n // !isGroupByEncounter\n react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(LinksByType, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(EntireRecord, {\n allResources: allResources\n })));\n};\nconst LinksByType = () => {\n const types = ['Conditions', 'Medications', 'Observations', 'Reports', 'CarePlans', 'Procedures', 'Encounters', 'Allergies', 'Immunizations', 'Documents'];\n const location = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_16__.useLocation)();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, \"Jump To:\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), types.map((t, i) => {\n // newLocation preserves any query, like if we're in a patient via syntheticmass\n const newLocation = {\n ...location,\n hash: '#' + t\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, i > 0 && ' | ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_hash_link__WEBPACK_IMPORTED_MODULE_20__.HashLink, {\n to: newLocation\n }, t));\n }));\n};\nconst EntireRecord = props => {\n const {\n allResources\n } = props;\n const getByType = type => allResources.filter(r => r.resourceType === type);\n const conditions = getByType('Condition');\n const medications = getByType('MedicationRequest');\n const meds = getByType('Medication');\n medications.forEach(m => {\n if (m.medicationReference) {\n const referencedMed = meds.find(med => (0,_utils__WEBPACK_IMPORTED_MODULE_7__.isMatchingReference)(med, m.medicationReference.reference, 'Medication'));\n if (referencedMed) {\n m.medicationCodeableConcept = referencedMed.code;\n }\n }\n });\n let observations = getByType('Observation');\n const reports = getByType('DiagnosticReport');\n reports.forEach(r => {\n if (r.result) {\n r.observations = r.result.map(res => observations.find(o => (0,_utils__WEBPACK_IMPORTED_MODULE_7__.isMatchingReference)(o, res.reference, 'Observation')));\n observations = observations.filter(o => !r.observations.includes(o));\n }\n });\n const careplans = getByType('CarePlan');\n const goals = getByType('Goal');\n // note that the syntheticmass server doesn't currently return goals in Patient$everything\n\n careplans.forEach(cp => {\n if (cp.goal) {\n cp.goals = cp.goal.map(cpg => goals.find(g => (0,_utils__WEBPACK_IMPORTED_MODULE_7__.isMatchingReference)(g, cpg.reference, 'Goal'))).filter(g => g);\n }\n });\n const procedures = getByType('Procedure');\n const encounters = getByType('Encounter');\n const allergies = getByType('AllergyIntolerance');\n const immunizations = getByType('Immunization');\n const documents = getByType('DocumentReference');\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Section, {\n conditions: conditions,\n medications: medications,\n observations: observations,\n reports: reports,\n careplans: careplans,\n procedures: procedures,\n encounters: encounters,\n allergies: allergies,\n immunizations: immunizations,\n documents: documents\n });\n};\nconst isNotEmpty = rows => rows != null && rows.length > 0;\nconst Section = props => {\n const show = props.showEmptySections ? _rows => true : rows => isNotEmpty(rows);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, show(props.conditions) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.ConditionsTable, {\n rows: props.conditions\n }), show(props.medications) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.MedicationRequestsTable, {\n rows: props.medications\n }), show(props.observations) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.ObservationsTable, {\n rows: props.observations\n }), show(props.reports) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.ReportsTable, {\n rows: props.reports\n }), show(props.careplans) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.CarePlansTable, {\n rows: props.careplans\n }), show(props.procedures) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.ProceduresTable, {\n rows: props.procedures\n }), show(props.encounters) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.EncountersTable, {\n rows: props.encounters\n }), show(props.allergies) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.AllergiesTable, {\n rows: props.allergies\n }), show(props.immunizations) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.ImmunizationsTable, {\n rows: props.immunizations\n }), show(props.documents) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.DocumentReferencesTable, {\n rows: props.documents\n }));\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PatientViewer);\n\n//# sourceURL=webpack://spt/./src/ui/components/PatientViewer/PatientViewer.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/dist/index.js\");\n/* harmony import */ var use_local_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! use-local-storage */ \"./node_modules/use-local-storage/dist/index.js\");\n/* harmony import */ var use_local_storage__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(use_local_storage__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var fhir_visualizers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! fhir-visualizers */ \"./node_modules/fhir-visualizers/build/index.js\");\n/* harmony import */ var _ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ResourceTables/ResourceTables */ \"./src/ui/components/ResourceTables/ResourceTables.jsx\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/dist/index.js\");\n/* harmony import */ var react_router_hash_link__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! react-router-hash-link */ \"./node_modules/react-router-hash-link/dist/react-router-hash-link.esm.js\");\n/* harmony import */ var _mui_material_Box__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material/Box */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material_Paper__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material/Paper */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material_Button__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material/Button */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var react_accessible_accordion__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-accessible-accordion */ \"./node_modules/react-accessible-accordion/dist/es/index.js\");\n/* harmony import */ var _EncounterGroupedRecord__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./EncounterGroupedRecord */ \"./src/ui/components/PatientViewer/EncounterGroupedRecord.jsx\");\n/* harmony import */ var _Settings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Settings */ \"./src/ui/components/PatientViewer/Settings.jsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils */ \"./src/ui/components/PatientViewer/utils.jsx\");\n/* harmony import */ var react_accessible_accordion_dist_fancy_example_css__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react-accessible-accordion/dist/fancy-example.css */ \"./node_modules/react-accessible-accordion/dist/fancy-example.css\");\n/* harmony import */ var react_dropzone__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! react-dropzone */ \"./node_modules/react-dropzone/dist/es/index.js\");\n/* harmony import */ var _SyntheticMass_api__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../SyntheticMass/api */ \"./src/ui/components/SyntheticMass/api.js\");\n/* harmony import */ var _github__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../github */ \"./src/ui/github.jsx\");\n/* harmony import */ var _csvToFhir__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./csvToFhir */ \"./src/ui/components/PatientViewer/csvToFhir.js\");\n/* harmony import */ var _fhirpath_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../fhirpath_utils */ \"./src/ui/fhirpath_utils.jsx\");\n/* harmony import */ var _FilterPresets__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./FilterPresets */ \"./src/ui/components/PatientViewer/FilterPresets.jsx\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Demo styles, see 'Styles' section below for some notes on use.\n\n\n\n\n\n\n\nconst getDropzone = (setLoading, callback) => {\n const onDrop = files => {\n const reader = new FileReader();\n reader.readAsText(files[0]);\n setLoading(true);\n reader.onload = () => {\n if (reader.result) {\n const json = JSON.parse(reader.result);\n setLoading(false);\n callback(json);\n }\n };\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_dropzone__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n onDrop: onDrop\n }, _ref => {\n let {\n getRootProps,\n getInputProps\n } = _ref;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", getRootProps({\n style: {\n height: '100vh',\n width: '100%',\n background: '#F0F8FF',\n padding: \"2rem\"\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", getInputProps()), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n minHeight: \"100%\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Box__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: {\n p: 2,\n border: '1px dashed grey',\n textAlign: 'center'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", null, \"Drag & drop a FHIR JSON file here\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h2\", null, \"or \", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n style: {\n textDecoration: 'underline',\n color: 'blue'\n }\n }, \"click to select a file\"), \".\")))));\n });\n};\nfunction getPatient(id) {\n if (id.startsWith('csv/')) {\n return (0,_csvToFhir__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(id.slice(4)); // slice off the \"csv/\" bit\n } else if (id.startsWith('github/')) {\n return (0,_github__WEBPACK_IMPORTED_MODULE_10__.getPatientOnGitHub)(id);\n } else {\n return (0,_SyntheticMass_api__WEBPACK_IMPORTED_MODULE_9__.getPatientById)(id);\n }\n}\nconst PatientViewer = props => {\n const location = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_16__.useLocation)();\n const [urlParams, setUrlParams] = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_17__.useSearchParams)();\n const id = props.id || urlParams.get('patient');\n const [bundle, _setBundle] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();\n const [previousBundle, setPreviousBundle] = use_local_storage__WEBPACK_IMPORTED_MODULE_1___default()(\"previousBundle\", bundle);\n const [isLoading, setIsLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!bundle);\n const setBundle = bundle => {\n _setBundle(bundle);\n setPreviousBundle(bundle);\n setIsLoading(false);\n };\n const [isGroupByEncounter, setIsGroupByEncounter] = use_local_storage__WEBPACK_IMPORTED_MODULE_1___default()(\"group-by-encounter\", false);\n const loadedPresets = [];\n for (const presetKey of Object.keys(_FilterPresets__WEBPACK_IMPORTED_MODULE_13__[\"default\"])) {\n const [isPresetLoaded] = use_local_storage__WEBPACK_IMPORTED_MODULE_1___default()(presetKey, false);\n if (isPresetLoaded) {\n loadedPresets.push(presetKey);\n }\n }\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (id && !bundle) {\n setIsLoading(true);\n getPatient(id).then(patientEverythingBundle => {\n setBundle(patientEverythingBundle);\n });\n }\n }, [id, bundle]);\n if (!id && !bundle) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, previousBundle && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Button__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n variant: \"contained\",\n onClick: () => setBundle(previousBundle),\n style: {\n textTransform: \"none\"\n }\n }, \"Reload Last Patient\"), getDropzone(setIsLoading, setBundle));\n }\n if (isLoading) return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: \"https://i.giphy.com/media/3oEjI6SIIHBdRxXI40/giphy.webp\",\n alt: \"loading...\"\n });\n let allResources = bundle.entry.map(e => e.resource);\n for (const presetKey of loadedPresets) {\n const preset = _FilterPresets__WEBPACK_IMPORTED_MODULE_13__[\"default\"][presetKey];\n if (isGroupByEncounter && !preset.filterOnGroupByEncounter) continue;\n allResources = allResources.filter(r => {\n const filtersByResourceType = preset.filters[r.resourceType];\n if (!filtersByResourceType) return true;\n const anyMatch = filtersByResourceType.some(f => (0,_fhirpath_utils__WEBPACK_IMPORTED_MODULE_12__.appliesToResource)(r, f));\n return preset.mode === 'exclude' ? !anyMatch : anyMatch;\n });\n }\n const patient = allResources.find(r => r.resourceType === 'Patient');\n const toggleGroup = event => {\n event.preventDefault();\n setIsGroupByEncounter(!isGroupByEncounter);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_Paper__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n style: {\n margin: \"1rem\",\n padding: \"1rem\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Settings__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(fhir_visualizers__WEBPACK_IMPORTED_MODULE_2__.PatientVisualizer, {\n patient: patient\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\",\n onClick: toggleGroup\n }, isGroupByEncounter ? \"Ungroup\" : \"Group\", \" by Encounter\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), isGroupByEncounter ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_EncounterGroupedRecord__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n allResources: allResources\n }) :\n /*#__PURE__*/\n // !isGroupByEncounter\n react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(LinksByType, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(EntireRecord, {\n allResources: allResources\n })));\n};\nconst LinksByType = () => {\n const types = ['Conditions', 'Medications', 'Observations', 'Reports', 'CarePlans', 'Procedures', 'Encounters', 'Allergies', 'Immunizations', 'Documents', 'Images'];\n const location = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_16__.useLocation)();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, \"Jump To:\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), types.map((t, i) => {\n // newLocation preserves any query, like if we're in a patient via syntheticmass\n const newLocation = {\n ...location,\n hash: '#' + t\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, i > 0 && ' | ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_hash_link__WEBPACK_IMPORTED_MODULE_20__.HashLink, {\n to: newLocation\n }, t));\n }));\n};\nconst EntireRecord = props => {\n const {\n allResources\n } = props;\n const getByType = type => allResources.filter(r => r.resourceType === type);\n const conditions = getByType('Condition');\n const medications = getByType('MedicationRequest');\n const meds = getByType('Medication');\n medications.forEach(m => {\n if (m.medicationReference) {\n const referencedMed = meds.find(med => (0,_utils__WEBPACK_IMPORTED_MODULE_7__.isMatchingReference)(med, m.medicationReference.reference, 'Medication'));\n if (referencedMed) {\n m.medicationCodeableConcept = referencedMed.code;\n }\n }\n });\n let observations = getByType('Observation');\n const reports = getByType('DiagnosticReport');\n reports.forEach(r => {\n if (r.result) {\n r.observations = r.result.map(res => observations.find(o => (0,_utils__WEBPACK_IMPORTED_MODULE_7__.isMatchingReference)(o, res.reference, 'Observation')));\n observations = observations.filter(o => !r.observations.includes(o));\n }\n });\n const careplans = getByType('CarePlan');\n const goals = getByType('Goal');\n // note that the syntheticmass server doesn't currently return goals in Patient$everything\n\n careplans.forEach(cp => {\n if (cp.goal) {\n cp.goals = cp.goal.map(cpg => goals.find(g => (0,_utils__WEBPACK_IMPORTED_MODULE_7__.isMatchingReference)(g, cpg.reference, 'Goal'))).filter(g => g);\n }\n });\n const procedures = getByType('Procedure');\n const encounters = getByType('Encounter');\n const allergies = getByType('AllergyIntolerance');\n const immunizations = getByType('Immunization');\n const documents = getByType('DocumentReference');\n const medias = getByType('Media');\n medias.forEach(m => {\n if (m.partOf && m.partOf[0]) {\n const partOf = allResources.find(r => \"urn:uuid:\".concat(r.id) === m.partOf[0].reference);\n if ((partOf === null || partOf === void 0 ? void 0 : partOf.resourceType) === 'ImagingStudy') {\n m.partOf[0].resource = partOf;\n }\n }\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Section, {\n conditions: conditions,\n medications: medications,\n observations: observations,\n reports: reports,\n careplans: careplans,\n procedures: procedures,\n encounters: encounters,\n allergies: allergies,\n immunizations: immunizations,\n documents: documents,\n medias: medias\n });\n};\nconst isNotEmpty = rows => rows != null && rows.length > 0;\nconst Section = props => {\n const show = props.showEmptySections ? _rows => true : rows => isNotEmpty(rows);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, show(props.conditions) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.ConditionsTable, {\n rows: props.conditions\n }), show(props.medications) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.MedicationRequestsTable, {\n rows: props.medications\n }), show(props.observations) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.ObservationsTable, {\n rows: props.observations\n }), show(props.reports) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.ReportsTable, {\n rows: props.reports\n }), show(props.careplans) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.CarePlansTable, {\n rows: props.careplans\n }), show(props.procedures) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.ProceduresTable, {\n rows: props.procedures\n }), show(props.encounters) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.EncountersTable, {\n rows: props.encounters\n }), show(props.allergies) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.AllergiesTable, {\n rows: props.allergies\n }), show(props.immunizations) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.ImmunizationsTable, {\n rows: props.immunizations\n }), show(props.documents) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.DocumentReferencesTable, {\n rows: props.documents\n }), show(props.medias) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ResourceTables_ResourceTables__WEBPACK_IMPORTED_MODULE_3__.MediasTable, {\n rows: props.medias\n }));\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PatientViewer);\n\n//# sourceURL=webpack://spt/./src/ui/components/PatientViewer/PatientViewer.jsx?"); /***/ }), @@ -5723,7 +5723,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AllergiesTable: () => (/* binding */ AllergiesTable),\n/* harmony export */ CarePlansTable: () => (/* binding */ CarePlansTable),\n/* harmony export */ ConditionsTable: () => (/* binding */ ConditionsTable),\n/* harmony export */ DocumentReferencesTable: () => (/* binding */ DocumentReferencesTable),\n/* harmony export */ EncountersTable: () => (/* binding */ EncountersTable),\n/* harmony export */ ImmunizationsTable: () => (/* binding */ ImmunizationsTable),\n/* harmony export */ MedicationRequestsTable: () => (/* binding */ MedicationRequestsTable),\n/* harmony export */ ObservationsTable: () => (/* binding */ ObservationsTable),\n/* harmony export */ ProceduresTable: () => (/* binding */ ProceduresTable),\n/* harmony export */ ReportsTable: () => (/* binding */ ReportsTable)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_data_grid__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-data-grid */ \"./node_modules/react-data-grid/lib/bundle.js\");\n/* harmony import */ var react_data_grid_lib_styles_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-data-grid/lib/styles.css */ \"./node_modules/react-data-grid/lib/styles.css\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _PatientViewer_ViewFhirModal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../PatientViewer/ViewFhirModal */ \"./src/ui/components/PatientViewer/ViewFhirModal.jsx\");\n/* harmony import */ var _PatientViewer_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../PatientViewer/utils */ \"./src/ui/components/PatientViewer/utils.jsx\");\n/* harmony import */ var react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-accessible-accordion */ \"./node_modules/react-accessible-accordion/dist/es/index.js\");\n/* harmony import */ var react_accessible_accordion_dist_fancy_example_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-accessible-accordion/dist/fancy-example.css */ \"./node_modules/react-accessible-accordion/dist/fancy-example.css\");\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n\n\n// Demo styles, see 'Styles' section below for some notes on use.\n\nconst FORMATTERS = {\n date: str => moment__WEBPACK_IMPORTED_MODULE_2___default()(str).format('YYYY-MM-DD'),\n time: str => moment__WEBPACK_IMPORTED_MODULE_2___default()(str).format('HH:mm:ss'),\n dateTime: str => moment__WEBPACK_IMPORTED_MODULE_2___default()(str).format('YYYY-MM-DD - h:mm a'),\n // to re-add seconds: 'YYYY-MM-DD - h:mm:ss a'\n numberWithCommas: str => str.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"),\n code: code => \"\".concat(code.code, \": \").concat(code.display ? code.display : ''),\n period: period => \"\".concat(moment__WEBPACK_IMPORTED_MODULE_2___default()(period.start).format('YYYY-MM-DD - h:mm a'), \" -> \").concat(moment__WEBPACK_IMPORTED_MODULE_2___default()(period.end).format('YYYY-MM-DD - h:mm a'))\n};\nconst WIDTHS = {\n date: 145,\n dateTime: 300,\n snomed: 125\n};\nconst VIEW_FHIR = {\n key: 'fhir',\n name: 'View FHIR',\n width: 100,\n getter: resource => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PatientViewer_ViewFhirModal__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n resource: resource\n })\n};\nconst attributeXTime = (entry, type) => {\n if (entry == null) {\n return '';\n } else if (entry[\"\".concat(type, \"DateTime\")]) {\n return FORMATTERS['dateTime'](entry[\"\".concat(type, \"DateTime\")]);\n } else if (entry[\"\".concat(type, \"Period\")]) {\n return FORMATTERS['period'](entry[\"\".concat(type, \"Period\")]);\n }\n return '';\n};\nconst duration = period => {\n if (!period.end) {\n return '';\n }\n let start = moment__WEBPACK_IMPORTED_MODULE_2___default()(period.start);\n let end = moment__WEBPACK_IMPORTED_MODULE_2___default()(period.end);\n return moment__WEBPACK_IMPORTED_MODULE_2___default().duration(start.diff(end)).humanize();\n};\nfunction applyColumns(resource, columns) {\n const row = {};\n for (const c of columns) {\n if (!c.key) {\n c.key = c.name;\n }\n const formatter = FORMATTERS[c.format];\n let result;\n try {\n result = c.getter(resource);\n } catch (e) {\n console.error(e);\n result = undefined;\n }\n if (result && formatter) {\n result = formatter(result);\n }\n if (!result && c.defaultValue) {\n result = c.defaultValue;\n }\n row[c.key] = result;\n }\n return row;\n}\nclass GenericTable extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {\n render() {\n const rows = [];\n for (const rawRow of this.props.rows.slice().reverse()) {\n const row = applyColumns(rawRow, this.props.columns);\n rows.push(row);\n if (this.props.nestedRows) {\n for (const nestedRow of this.props.nestedRows) {\n let subRowLines;\n try {\n subRowLines = nestedRow.getter(rawRow);\n } catch (e) {\n subRowLines = undefined;\n }\n if (!subRowLines) continue;\n const subColumns = nestedRow.columns;\n for (const subRowLine of subRowLines) {\n const nestedRow = applyColumns(subRowLine, subColumns);\n rows.push(nestedRow);\n }\n }\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"health-record__header\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"header-title\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n id: this.props.title\n }, this.props.title)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"header-divider\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_data_grid__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n columns: this.props.columns,\n rows: rows,\n style: {\n blockSize: '100%'\n } // otherwise it defaults to some fixed size and has a scrollbar\n ,\n rowHeight: this.props.rowHeight || 35\n }));\n }\n}\nclass ConditionsTable extends GenericTable {}\n_defineProperty(ConditionsTable, \"defaultProps\", {\n title: 'Conditions',\n columns: [{\n name: 'SNOMED',\n getter: c => c.code.coding[0].code,\n width: WIDTHS.snomed\n }, {\n name: 'Condition',\n getter: c => c.code.coding[0].display\n }, {\n name: 'Date of Onset',\n format: 'date',\n getter: c => c.onsetDateTime,\n width: WIDTHS.date\n }, {\n name: 'Date Resolved',\n format: 'date',\n getter: c => c.abatementDateTime,\n width: WIDTHS.date\n }, VIEW_FHIR],\n keyFn: c => c.id\n});\nclass ObservationsTable extends GenericTable {}\n_defineProperty(ObservationsTable, \"defaultProps\", {\n title: 'Observations',\n columns: [{\n name: 'LOINC',\n getter: o => o.code.coding[0].code\n }, {\n name: 'Observation',\n getter: o => o.code.coding[0].display\n }, {\n name: 'Value',\n getter: o => (0,_PatientViewer_utils__WEBPACK_IMPORTED_MODULE_4__.obsValue)(o)\n }, {\n name: 'Date Recorded',\n getter: o => attributeXTime(o, 'effective')\n }, VIEW_FHIR],\n keyFn: o => o.id\n});\nclass ReportsTable extends GenericTable {}\n_defineProperty(ReportsTable, \"defaultProps\", {\n title: 'Reports',\n columns: [{\n name: 'LOINC',\n getter: r => r.code.coding[0].code\n }, {\n name: 'Report/Observation',\n getter: r => r.code.coding[0].display,\n colSpan: args => {\n if (args.type === 'ROW' && args.row.type === 'Note') {\n return 3;\n }\n return 1;\n }\n }, {\n name: 'Value',\n getter: () => ''\n }, {\n name: 'Effective',\n getter: r => attributeXTime(r, 'effective'),\n defaultValue: 'N/A'\n }, VIEW_FHIR],\n rowClass: 'report-line',\n nestedRows: [{\n getter: rpt => rpt.observations,\n keyFn: o => o.id,\n columns: [{\n name: 'LOINC',\n getter: o => o.code.coding[0].code\n }, {\n name: 'Report/Observation',\n getter: o => o.code.coding[0].display\n }, {\n name: 'Value',\n getter: o => (0,_PatientViewer_utils__WEBPACK_IMPORTED_MODULE_4__.obsValue)(o)\n }, VIEW_FHIR]\n }, {\n getter: rpt => rpt.presentedForm,\n keyFn: p => Math.floor(Math.random() * 100),\n // TODO, pass in index\n columns: [{\n name: 'Content',\n key: 'Report/Observation',\n getter: p => renderNote(atob(p.data))\n }, {\n key: 'type',\n getter: () => 'Note'\n }, VIEW_FHIR]\n }],\n rowHeight: row => row.type === 'Note' ? null : 35,\n // makes the row height dynamic when the note is opened/closed\n keyFn: r => r.id\n});\nclass AllergiesTable extends GenericTable {}\n_defineProperty(AllergiesTable, \"defaultProps\", {\n title: 'Allergies',\n columns: [{\n name: 'Allergy',\n format: 'code',\n getter: a => a.code.coding[0]\n }, {\n name: 'Date Recorded',\n getter: a => a.recordedDate\n }, {\n name: 'Date Recorded',\n format: 'date',\n getter: a => a.assertedDate\n }, {\n name: 'Onset',\n format: 'date',\n getter: a => a.onsetDateTime\n }, {\n name: 'Resolution Age',\n format: 'date',\n getter: a => a.extension.resolutionAge\n }, VIEW_FHIR],\n keyFn: c => c.id\n});\nconst goalDescriptionDSTU2 = goal => {\n if (goal.description) return goal.description;\n return '';\n};\nconst goalDescriptionSTU3R4 = goal => {\n if (goal.description) return goal.description.text;\n return '';\n};\nclass CarePlansTable extends GenericTable {}\n_defineProperty(CarePlansTable, \"defaultProps\", {\n title: 'CarePlans',\n columns: [\n // note the -1, us core category \"assess-plan\" gets added at slot 0\n // but us core is not always active\n // so we want the last one not necessarily always 0 or 1\n {\n name: 'SNOMED',\n getter: c => c.category.at(-1).coding[0].code\n }, {\n name: 'Care Plan',\n getter: c => c.category.at(-1).coding[0].display\n }, {\n name: 'StartDate',\n format: 'date',\n getter: c => c.period.start\n }, VIEW_FHIR],\n nestedRows: [{\n getter: cp => cp.goals,\n keyFn: g => g.id,\n columns: [{\n name: 'Goal',\n key: 'Care Plan',\n getter: g => \"Goal: \".concat(goalDescriptionSTU3R4(g))\n }, VIEW_FHIR]\n }, {\n getter: cp => cp.activity,\n keyFn: a => Math.random(),\n columns: [{\n name: 'Activity',\n key: 'Care Plan',\n getter: a => \"Activity: \".concat(a.detail.code.coding[0].display)\n }, VIEW_FHIR]\n }],\n keyFn: c => c.id\n});\nclass ProceduresTable extends GenericTable {}\n_defineProperty(ProceduresTable, \"defaultProps\", {\n title: 'Procedures',\n columns: [{\n name: 'SNOMED',\n getter: p => p.code.coding[0].code\n }, {\n name: 'Procedure',\n getter: p => p.code.coding[0].display\n }, {\n name: 'Performed',\n format: 'dateTime',\n getter: p => p.performedDateTime || p.performedPeriod.start\n }, VIEW_FHIR],\n keyFn: c => c.id\n});\nclass EncountersTable extends GenericTable {}\n_defineProperty(EncountersTable, \"defaultProps\", {\n title: 'Encounters',\n columns: [{\n name: 'SNOMED',\n getter: e => e.type[0].coding[0].code\n }, {\n name: 'Encounter',\n getter: e => e.type[0].coding[0].display\n }, {\n name: 'Start Time',\n format: 'dateTime',\n getter: e => e.period.start\n }, {\n name: 'Duration',\n getter: e => duration(e.period)\n }, VIEW_FHIR],\n keyFn: c => c.id\n});\nclass ImmunizationsTable extends GenericTable {}\n_defineProperty(ImmunizationsTable, \"defaultProps\", {\n title: 'Immunizations',\n columns: [{\n name: 'CVX',\n getter: i => i.vaccineCode.coding[0].code\n }, {\n name: 'Vaccine',\n getter: i => i.vaccineCode.coding[0].display\n }, {\n name: 'Date Given',\n format: 'date',\n getter: i => i.occurrenceDateTime\n }, VIEW_FHIR],\n keyFn: c => c.id\n});\nconst renderNote = text => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__.Accordion, {\n allowZeroExpanded: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__.AccordionItem, {\n key: text\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__.AccordionItemHeading, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__.AccordionItemButton, null, \"View Note\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__.AccordionItemPanel, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n textAlign: 'left',\n whiteSpace: 'pre'\n }\n }, text))));\n};\nclass DocumentReferencesTable extends GenericTable {}\n_defineProperty(DocumentReferencesTable, \"defaultProps\", {\n title: 'Documents',\n columns: [{\n name: 'Date',\n format: 'date',\n getter: d => d.date,\n width: WIDTHS.date\n }, {\n name: 'Content',\n getter: d => renderNote(atob(d.content[0].attachment.data))\n }, VIEW_FHIR],\n rowHeight: () => null,\n // makes the row height dynamic when the note is opened/closed\n keyFn: dr => dr.id\n});\nclass MedicationRequestsTable extends GenericTable {}\n_defineProperty(MedicationRequestsTable, \"defaultProps\", {\n title: 'Medication Requests',\n columns: [{\n name: 'RxNorm',\n getter: m => m.medicationCodeableConcept.coding[0].code\n }, {\n name: 'Medication',\n getter: m => m.medicationCodeableConcept.coding[0].display\n }, {\n name: 'Date Prescribed',\n format: 'date',\n getter: c => c.authoredOn\n }, {\n name: 'Status',\n getter: c => c.status\n }, VIEW_FHIR],\n keyFn: m => m.id\n});\n\n\n//# sourceURL=webpack://spt/./src/ui/components/ResourceTables/ResourceTables.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AllergiesTable: () => (/* binding */ AllergiesTable),\n/* harmony export */ CarePlansTable: () => (/* binding */ CarePlansTable),\n/* harmony export */ ConditionsTable: () => (/* binding */ ConditionsTable),\n/* harmony export */ DocumentReferencesTable: () => (/* binding */ DocumentReferencesTable),\n/* harmony export */ EncountersTable: () => (/* binding */ EncountersTable),\n/* harmony export */ ImmunizationsTable: () => (/* binding */ ImmunizationsTable),\n/* harmony export */ MediasTable: () => (/* binding */ MediasTable),\n/* harmony export */ MedicationRequestsTable: () => (/* binding */ MedicationRequestsTable),\n/* harmony export */ ObservationsTable: () => (/* binding */ ObservationsTable),\n/* harmony export */ ProceduresTable: () => (/* binding */ ProceduresTable),\n/* harmony export */ ReportsTable: () => (/* binding */ ReportsTable)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_data_grid__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-data-grid */ \"./node_modules/react-data-grid/lib/bundle.js\");\n/* harmony import */ var react_data_grid_lib_styles_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-data-grid/lib/styles.css */ \"./node_modules/react-data-grid/lib/styles.css\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _PatientViewer_ViewFhirModal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../PatientViewer/ViewFhirModal */ \"./src/ui/components/PatientViewer/ViewFhirModal.jsx\");\n/* harmony import */ var _PatientViewer_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../PatientViewer/utils */ \"./src/ui/components/PatientViewer/utils.jsx\");\n/* harmony import */ var react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-accessible-accordion */ \"./node_modules/react-accessible-accordion/dist/es/index.js\");\n/* harmony import */ var react_accessible_accordion_dist_fancy_example_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-accessible-accordion/dist/fancy-example.css */ \"./node_modules/react-accessible-accordion/dist/fancy-example.css\");\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n\n\n// Demo styles, see 'Styles' section below for some notes on use.\n\nconst FORMATTERS = {\n date: str => moment__WEBPACK_IMPORTED_MODULE_2___default()(str).format('YYYY-MM-DD'),\n time: str => moment__WEBPACK_IMPORTED_MODULE_2___default()(str).format('HH:mm:ss'),\n dateTime: str => moment__WEBPACK_IMPORTED_MODULE_2___default()(str).format('YYYY-MM-DD - h:mm a'),\n // to re-add seconds: 'YYYY-MM-DD - h:mm:ss a'\n numberWithCommas: str => str.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"),\n code: code => \"\".concat(code.code, \": \").concat(code.display ? code.display : ''),\n period: period => \"\".concat(moment__WEBPACK_IMPORTED_MODULE_2___default()(period.start).format('YYYY-MM-DD - h:mm a'), \" -> \").concat(moment__WEBPACK_IMPORTED_MODULE_2___default()(period.end).format('YYYY-MM-DD - h:mm a'))\n};\nconst WIDTHS = {\n date: 145,\n dateTime: 300,\n snomed: 125\n};\nconst VIEW_FHIR = {\n key: 'fhir',\n name: 'View FHIR',\n width: 100,\n getter: resource => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PatientViewer_ViewFhirModal__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n resource: resource\n })\n};\nconst attributeXTime = (entry, type) => {\n if (entry == null) {\n return '';\n } else if (entry[\"\".concat(type, \"DateTime\")]) {\n return FORMATTERS['dateTime'](entry[\"\".concat(type, \"DateTime\")]);\n } else if (entry[\"\".concat(type, \"Period\")]) {\n return FORMATTERS['period'](entry[\"\".concat(type, \"Period\")]);\n }\n return '';\n};\nconst duration = period => {\n if (!period.end) {\n return '';\n }\n let start = moment__WEBPACK_IMPORTED_MODULE_2___default()(period.start);\n let end = moment__WEBPACK_IMPORTED_MODULE_2___default()(period.end);\n return moment__WEBPACK_IMPORTED_MODULE_2___default().duration(start.diff(end)).humanize();\n};\nfunction applyColumns(resource, columns) {\n const row = {};\n for (const c of columns) {\n if (!c.key) {\n c.key = c.name;\n }\n const formatter = FORMATTERS[c.format];\n let result;\n try {\n result = c.getter(resource);\n } catch (e) {\n console.error(e);\n result = undefined;\n }\n if (result && formatter) {\n result = formatter(result);\n }\n if (!result && c.defaultValue) {\n result = c.defaultValue;\n }\n row[c.key] = result;\n }\n return row;\n}\nclass GenericTable extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) {\n render() {\n const rows = [];\n for (const rawRow of this.props.rows.slice().reverse()) {\n const row = applyColumns(rawRow, this.props.columns);\n rows.push(row);\n if (this.props.nestedRows) {\n for (const nestedRow of this.props.nestedRows) {\n let subRowLines;\n try {\n subRowLines = nestedRow.getter(rawRow);\n } catch (e) {\n subRowLines = undefined;\n }\n if (!subRowLines) continue;\n const subColumns = nestedRow.columns;\n for (const subRowLine of subRowLines) {\n const nestedRow = applyColumns(subRowLine, subColumns);\n rows.push(nestedRow);\n }\n }\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"health-record__header\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"header-title\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n id: this.props.title\n }, this.props.title)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"header-divider\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_data_grid__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n columns: this.props.columns,\n rows: rows,\n style: {\n blockSize: '100%'\n } // otherwise it defaults to some fixed size and has a scrollbar\n ,\n rowHeight: this.props.rowHeight || 35\n }));\n }\n}\nclass ConditionsTable extends GenericTable {}\n_defineProperty(ConditionsTable, \"defaultProps\", {\n title: 'Conditions',\n columns: [{\n name: 'SNOMED',\n getter: c => c.code.coding[0].code,\n width: WIDTHS.snomed\n }, {\n name: 'Condition',\n getter: c => c.code.coding[0].display\n }, {\n name: 'Date of Onset',\n format: 'date',\n getter: c => c.onsetDateTime,\n width: WIDTHS.date\n }, {\n name: 'Date Resolved',\n format: 'date',\n getter: c => c.abatementDateTime,\n width: WIDTHS.date\n }, VIEW_FHIR],\n keyFn: c => c.id\n});\nclass ObservationsTable extends GenericTable {}\n_defineProperty(ObservationsTable, \"defaultProps\", {\n title: 'Observations',\n columns: [{\n name: 'LOINC',\n getter: o => o.code.coding[0].code\n }, {\n name: 'Observation',\n getter: o => o.code.coding[0].display\n }, {\n name: 'Value',\n getter: o => (0,_PatientViewer_utils__WEBPACK_IMPORTED_MODULE_4__.obsValue)(o)\n }, {\n name: 'Date Recorded',\n getter: o => attributeXTime(o, 'effective')\n }, VIEW_FHIR],\n keyFn: o => o.id\n});\nclass ReportsTable extends GenericTable {}\n_defineProperty(ReportsTable, \"defaultProps\", {\n title: 'Reports',\n columns: [{\n name: 'LOINC',\n getter: r => r.code.coding[0].code\n }, {\n name: 'Report/Observation',\n getter: r => r.code.coding[0].display,\n colSpan: args => {\n if (args.type === 'ROW' && args.row.type === 'Note') {\n return 3;\n }\n return 1;\n }\n }, {\n name: 'Value',\n getter: () => ''\n }, {\n name: 'Effective',\n getter: r => attributeXTime(r, 'effective'),\n defaultValue: 'N/A'\n }\n // VIEW_FHIR // temporarily disabled\n ],\n rowClass: 'report-line',\n nestedRows: [{\n getter: rpt => rpt.observations,\n keyFn: o => o.id,\n columns: [{\n name: 'LOINC',\n getter: o => o.code.coding[0].code\n }, {\n name: 'Report/Observation',\n getter: o => o.code.coding[0].display\n }, {\n name: 'Value',\n getter: o => (0,_PatientViewer_utils__WEBPACK_IMPORTED_MODULE_4__.obsValue)(o)\n }, VIEW_FHIR]\n }, {\n getter: rpt => rpt.presentedForm,\n keyFn: p => Math.floor(Math.random() * 100),\n // TODO, pass in index\n columns: [{\n name: 'Content',\n key: 'Report/Observation',\n getter: p => renderNote(atob(p.data))\n }, {\n key: 'type',\n getter: () => 'Note'\n }, VIEW_FHIR]\n }],\n rowHeight: row => row.type === 'Note' ? null : 35,\n // makes the row height dynamic when the note is opened/closed\n keyFn: r => r.id\n});\nclass AllergiesTable extends GenericTable {}\n_defineProperty(AllergiesTable, \"defaultProps\", {\n title: 'Allergies',\n columns: [{\n name: 'Allergy',\n format: 'code',\n getter: a => a.code.coding[0]\n }, {\n name: 'Date Recorded',\n getter: a => a.recordedDate\n }, {\n name: 'Date Recorded',\n format: 'date',\n getter: a => a.assertedDate\n }, {\n name: 'Onset',\n format: 'date',\n getter: a => a.onsetDateTime\n }, {\n name: 'Resolution Age',\n format: 'date',\n getter: a => a.extension.resolutionAge\n }, VIEW_FHIR],\n keyFn: c => c.id\n});\nconst goalDescriptionDSTU2 = goal => {\n if (goal.description) return goal.description;\n return '';\n};\nconst goalDescriptionSTU3R4 = goal => {\n if (goal.description) return goal.description.text;\n return '';\n};\nclass CarePlansTable extends GenericTable {}\n_defineProperty(CarePlansTable, \"defaultProps\", {\n title: 'CarePlans',\n columns: [\n // note the -1, us core category \"assess-plan\" gets added at slot 0\n // but us core is not always active\n // so we want the last one not necessarily always 0 or 1\n {\n name: 'SNOMED',\n getter: c => c.category.at(-1).coding[0].code\n }, {\n name: 'Care Plan',\n getter: c => c.category.at(-1).coding[0].display\n }, {\n name: 'StartDate',\n format: 'date',\n getter: c => c.period.start\n }, VIEW_FHIR],\n nestedRows: [{\n getter: cp => cp.goals,\n keyFn: g => g.id,\n columns: [{\n name: 'Goal',\n key: 'Care Plan',\n getter: g => \"Goal: \".concat(goalDescriptionSTU3R4(g))\n }, VIEW_FHIR]\n }, {\n getter: cp => cp.activity,\n keyFn: a => Math.random(),\n columns: [{\n name: 'Activity',\n key: 'Care Plan',\n getter: a => \"Activity: \".concat(a.detail.code.coding[0].display)\n }, VIEW_FHIR]\n }],\n keyFn: c => c.id\n});\nclass ProceduresTable extends GenericTable {}\n_defineProperty(ProceduresTable, \"defaultProps\", {\n title: 'Procedures',\n columns: [{\n name: 'SNOMED',\n getter: p => p.code.coding[0].code\n }, {\n name: 'Procedure',\n getter: p => p.code.coding[0].display\n }, {\n name: 'Performed',\n format: 'dateTime',\n getter: p => p.performedDateTime || p.performedPeriod.start\n }, VIEW_FHIR],\n keyFn: c => c.id\n});\nclass EncountersTable extends GenericTable {}\n_defineProperty(EncountersTable, \"defaultProps\", {\n title: 'Encounters',\n columns: [{\n name: 'SNOMED',\n getter: e => e.type[0].coding[0].code\n }, {\n name: 'Encounter',\n getter: e => e.type[0].coding[0].display\n }, {\n name: 'Start Time',\n format: 'dateTime',\n getter: e => e.period.start\n }, {\n name: 'Duration',\n getter: e => duration(e.period)\n }, VIEW_FHIR],\n keyFn: c => c.id\n});\nclass ImmunizationsTable extends GenericTable {}\n_defineProperty(ImmunizationsTable, \"defaultProps\", {\n title: 'Immunizations',\n columns: [{\n name: 'CVX',\n getter: i => i.vaccineCode.coding[0].code\n }, {\n name: 'Vaccine',\n getter: i => i.vaccineCode.coding[0].display\n }, {\n name: 'Date Given',\n format: 'date',\n getter: i => i.occurrenceDateTime\n }, VIEW_FHIR],\n keyFn: c => c.id\n});\nconst renderNote = text => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__.Accordion, {\n allowZeroExpanded: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__.AccordionItem, {\n key: text\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__.AccordionItemHeading, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__.AccordionItemButton, null, \"View Note\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_accessible_accordion__WEBPACK_IMPORTED_MODULE_5__.AccordionItemPanel, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n textAlign: 'left',\n whiteSpace: 'pre'\n }\n }, text))));\n};\nclass DocumentReferencesTable extends GenericTable {}\n_defineProperty(DocumentReferencesTable, \"defaultProps\", {\n title: 'Documents',\n columns: [{\n name: 'Date',\n format: 'date',\n getter: d => d.date,\n width: WIDTHS.date\n }, {\n name: 'Content',\n getter: d => renderNote(atob(d.content[0].attachment.data))\n }, VIEW_FHIR],\n rowHeight: () => null,\n // makes the row height dynamic when the note is opened/closed\n keyFn: dr => dr.id\n});\nclass MedicationRequestsTable extends GenericTable {}\n_defineProperty(MedicationRequestsTable, \"defaultProps\", {\n title: 'Medication Requests',\n columns: [{\n name: 'RxNorm',\n getter: m => m.medicationCodeableConcept.coding[0].code\n }, {\n name: 'Medication',\n getter: m => m.medicationCodeableConcept.coding[0].display\n }, {\n name: 'Date Prescribed',\n format: 'date',\n getter: c => c.authoredOn\n }, {\n name: 'Status',\n getter: c => c.status\n }, VIEW_FHIR],\n keyFn: m => m.id\n});\nclass MediasTable extends GenericTable {}\n_defineProperty(MediasTable, \"defaultProps\", {\n title: 'Images',\n columns: [{\n name: 'Code',\n getter: m => m.partOf[0].resource.procedureCode[0].coding[0].display\n }, {\n name: 'Media',\n getter: m => (0,_PatientViewer_utils__WEBPACK_IMPORTED_MODULE_4__.extractMedia)(m)\n }, {\n name: 'Date',\n getter: m => m.partOf[0].resource.started\n }\n // VIEW_FHIR // temporarily disabled\n ],\n keyFn: m => m.id,\n rowHeight: () => 200\n});\n\n\n//# sourceURL=webpack://spt/./src/ui/components/ResourceTables/ResourceTables.jsx?"); /***/ }), @@ -5745,7 +5745,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ appliesToBundle: () => (/* binding */ appliesToBundle),\n/* harmony export */ appliesToResource: () => (/* binding */ appliesToResource),\n/* harmony export */ evaluateBundle: () => (/* binding */ evaluateBundle),\n/* harmony export */ evaluateResource: () => (/* binding */ evaluateResource)\n/* harmony export */ });\n/* harmony import */ var fhirpath__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fhirpath */ \"./node_modules/fhirpath/src/fhirpath.js\");\n/* harmony import */ var fhirpath__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fhirpath__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var fhirpath_fhir_context_r4__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fhirpath/fhir-context/r4 */ \"./node_modules/fhirpath/fhir-context/r4/index.js\");\n/* harmony import */ var fhirpath_fhir_context_r4__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fhirpath_fhir_context_r4__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\n// inspired by the Flexporter:\n// https://github.com/synthetichealth/synthea/blob/master/src/main/java/org/mitre/synthea/export/flexporter/FhirPathUtils.java\n\n/**\n * Execute the given FHIRPath against the given resource and return the results.\n *\n * @param resource FHIR resource to execute FHIRPath against\n * @param fhirpath FHIRPath string\n * @return Raw values from FHIRPath engine evaluating the string\n */\nfunction evaluateResource(resource, path) {\n let variables = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return fhirpath__WEBPACK_IMPORTED_MODULE_0___default().evaluate(resource, path, variables, (fhirpath_fhir_context_r4__WEBPACK_IMPORTED_MODULE_1___default()));\n}\n\n/**\n * Execute the given FHIRPath against the given Bundle and return the results. There are a few\n * different possibilities in how this works.\n * - If the FHIRPath string starts with \"Bundle\" then this will execute the FHIRPath once\n * against the Bundle as a whole, otherwise it will be executed against each resource.\n * - If \"returnResources\" is true, then resources from the Bundle\n * that return a truthy value will be returned, otherwise the raw value from the FHIRpath engine\n * will be returned.\n *\n * @param bundle FHIR bundle to evaluate FHIRpath against\n * @param fhirpath FHIRPath string\n * @param returnResources If true, return resources from bundle matching FHIRPath; if false,\n * return raw values from FHIRPath engine\n * @return Differs based on input - see above\n */\nfunction evaluateBundle(bundle, fhirpath, variables, returnResources) {\n if (fhirpath.startsWith(\"Bundle\")) {\n // run it on the entire bundle\n\n // NOTE: this doesn't check returnResources -- would that be useful here?\n return evaluateResource(bundle, fhirpath, variables);\n } else {\n // the fhirpath doesn't start with \"Bundle\"\n // so we'll apply it to each resource within the bundle\n results = [];\n for (const entry of bundle.entry) {\n const resourceResults = evaluateResource(entry.resource, fhirpath);\n if (returnResources) {\n if (isTruthy(resourceResults)) {\n results.push(entry.resource);\n }\n } else {\n results.push(...resourceResults);\n }\n }\n return results;\n }\n}\nfunction appliesToResource(resource, fhirpath) {\n return isTruthy(evaluateResource(resource, fhirpath));\n}\nfunction appliesToBundle(bundle, fhirpath, variables) {\n return isTruthy(evaluateBundle(bundle, fhirpath, variables, false));\n}\n\n/**\n * Helper function to convert FHIRPath evaluation into a boolean.\n * Nulls, empty strings, and boolean false all mean \"false\" here. Everything else means \"true\".\n */\nfunction isTruthy(result) {\n if (result == null) {\n return false;\n // } else if (result instanceof StringType) {\n // StringType str = ((StringType) result);\n // return !str.isEmpty() && !str.getValue().isEmpty();\n // } else if (result instanceof BooleanType) {\n // BooleanType bool = ((BooleanType) result);\n // return !bool.isEmpty() && bool.booleanValue();\n } else if (Array.isArray(result)) {\n return !!result.find(i => isTruthy(i));\n }\n return true;\n}\n\n//# sourceURL=webpack://spt/./src/ui/fhirpath_utils.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ appliesToBundle: () => (/* binding */ appliesToBundle),\n/* harmony export */ appliesToResource: () => (/* binding */ appliesToResource),\n/* harmony export */ evaluateBundle: () => (/* binding */ evaluateBundle),\n/* harmony export */ evaluateResource: () => (/* binding */ evaluateResource)\n/* harmony export */ });\n/* harmony import */ var fhirpath__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fhirpath */ \"./node_modules/fhirpath/src/fhirpath.js\");\n/* harmony import */ var fhirpath__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fhirpath__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var fhirpath_fhir_context_r4__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fhirpath/fhir-context/r4 */ \"./node_modules/fhirpath/fhir-context/r4/index.js\");\n/* harmony import */ var fhirpath_fhir_context_r4__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fhirpath_fhir_context_r4__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\n// inspired by the Flexporter:\n// https://github.com/synthetichealth/synthea/blob/master/src/main/java/org/mitre/synthea/export/flexporter/FhirPathUtils.java\n\n/**\n * Execute the given FHIRPath against the given resource and return the results.\n *\n * @param resource FHIR resource to execute FHIRPath against\n * @param fhirpath FHIRPath string\n * @return Raw values from FHIRPath engine evaluating the string\n */\nfunction evaluateResource(resource, path) {\n let variables = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return fhirpath__WEBPACK_IMPORTED_MODULE_0___default().evaluate(resource, path, variables, (fhirpath_fhir_context_r4__WEBPACK_IMPORTED_MODULE_1___default()));\n}\n\n/**\n * Execute the given FHIRPath against the given Bundle and return the results. There are a few\n * different possibilities in how this works.\n * - If the FHIRPath string starts with \"Bundle\" then this will execute the FHIRPath once\n * against the Bundle as a whole, otherwise it will be executed against each resource.\n * - If \"returnResources\" is true, then resources from the Bundle\n * that return a truthy value will be returned, otherwise the raw value from the FHIRpath engine\n * will be returned.\n *\n * @param bundle FHIR bundle to evaluate FHIRpath against\n * @param fhirpath FHIRPath string\n * @param returnResources If true, return resources from bundle matching FHIRPath; if false,\n * return raw values from FHIRPath engine\n * @return Differs based on input - see above\n */\nfunction evaluateBundle(bundle, path, variables, returnResources) {\n if (path.startsWith(\"Bundle\")) {\n // run it on the entire bundle\n\n // NOTE: this doesn't check returnResources -- would that be useful here?\n return evaluateResource(bundle, path, variables);\n } else {\n // the fhirpath doesn't start with \"Bundle\"\n // so we'll apply it to each resource within the bundle\n results = [];\n for (const entry of bundle.entry) {\n const resourceResults = evaluateResource(entry.resource, path);\n if (returnResources) {\n if (isTruthy(resourceResults)) {\n results.push(entry.resource);\n }\n } else {\n results.push(...resourceResults);\n }\n }\n return results;\n }\n}\nfunction appliesToResource(resource, path) {\n return isTruthy(evaluateResource(resource, path));\n}\nfunction appliesToBundle(bundle, path, variables) {\n return isTruthy(evaluateBundle(bundle, path, variables, false));\n}\n\n/**\n * Helper function to convert FHIRPath evaluation into a boolean.\n * Nulls, empty strings, and boolean false all mean \"false\" here. Everything else means \"true\".\n */\nfunction isTruthy(result) {\n if (result == null) {\n return false;\n // } else if (result instanceof StringType) {\n // StringType str = ((StringType) result);\n // return !str.isEmpty() && !str.getValue().isEmpty();\n // } else if (result instanceof BooleanType) {\n // BooleanType bool = ((BooleanType) result);\n // return !bool.isEmpty() && bool.booleanValue();\n } else if (Array.isArray(result)) {\n return !!result.find(i => isTruthy(i));\n }\n return true;\n}\n\n//# sourceURL=webpack://spt/./src/ui/fhirpath_utils.jsx?"); /***/ }),