diff --git a/.env b/.env index 75e6c54..2b9c27f 100644 --- a/.env +++ b/.env @@ -24,5 +24,6 @@ VITE_RESPONSE_EXPIRATION_DAYS = 30 VITE_SERVER = http://localhost:8090 VITE_SMART_LAUNCH_URL = http://localhost:4040/ VITE_URL = http://localhost:3000 -VITE_URL_FILTER = http://localhost:3000/* VITE_USER = alice +VITE_HOOK_TO_SEND = patient-view +VITE_URL_FILTER = http://localhost:3000/* diff --git a/package-lock.json b/package-lock.json index 6c28420..b671088 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8157,162 +8157,6 @@ "win32" ] }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", - "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", - "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", - "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", - "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", - "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", - "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", - "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", - "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", - "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", - "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", - "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", - "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", - "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@segment/loosely-validate-event": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", diff --git a/src/components/Dashboard/Dashboard.jsx b/src/components/Dashboard/Dashboard.jsx index 05f626a..e6b3dda 100644 --- a/src/components/Dashboard/Dashboard.jsx +++ b/src/components/Dashboard/Dashboard.jsx @@ -81,7 +81,7 @@ const Dashboard = props => { case Section.MEDICATIONS: return ; case Section.NOTIFICATIONS: - return + return ; default: return ; } diff --git a/src/components/Dashboard/ListSelections/NotificationsSection.jsx b/src/components/Dashboard/ListSelections/NotificationsSection.jsx index b36bdcc..306982d 100644 --- a/src/components/Dashboard/ListSelections/NotificationsSection.jsx +++ b/src/components/Dashboard/ListSelections/NotificationsSection.jsx @@ -7,76 +7,85 @@ import { createMedicationFromMedicationRequest } from '../../../util/fhir'; import { standardsBasedGetEtasu } from '../../../util/util'; const NotificationsSection = () => { - const [globalState, _] = useContext(SettingsContext); - const classes = useStyles(); - const [etasu, setEtasu] = useState([]); - const [medications, setMedications] = useState([]); - useEffect(() => { - setEtasu([]); - getMedicationRequest(); - }, []); + const [globalState, _] = useContext(SettingsContext); + const classes = useStyles(); + const [etasu, setEtasu] = useState([]); + const [medications, setMedications] = useState([]); + useEffect(() => { + setEtasu([]); + getMedicationRequest(); + }, []); - useEffect(() => { - getAllEtasu(); - }, [medications]); + useEffect(() => { + getAllEtasu(); + }, [medications]); - const getMedicationRequest = () => { - const patientsMedications = []; - axios({ - method: 'get', - url: `${globalState.baseUrl}/MedicationRequest?subject=Patient/${globalState.patient.id}` - }).then((result) => { - result?.data.entry.forEach((m) => { - const medication = createMedicationFromMedicationRequest(m.resource); - patientsMedications.push(medication); - }) - setMedications(patientsMedications); - }, (error) =>{ - console.error(error); + const getMedicationRequest = () => { + const patientsMedications = []; + axios({ + method: 'get', + url: `${globalState.baseUrl}/MedicationRequest?subject=Patient/${globalState.patient.id}` + }).then( + result => { + result?.data.entry.forEach(m => { + const medication = createMedicationFromMedicationRequest(m.resource); + patientsMedications.push(medication); }); - }; + setMedications(patientsMedications); + }, + error => { + console.error(error); + } + ); + }; - const compileResponses = (newRequest, body) => { - if (newRequest.contained) { - newRequest.body = body; - setEtasu(prevState => [ ...prevState, newRequest]); - } + const compileResponses = (newRequest, body) => { + if (newRequest.contained) { + newRequest.body = body; + setEtasu(prevState => [...prevState, newRequest]); } + }; - const getAllEtasu = () => { - medications.forEach((medication) => { - const body = makeBody(medication); - const standardEtasuUrl = `${globalState.remsAdminServer}/4_0_0/GuidanceResponse/$rems-etasu`; - standardsBasedGetEtasu(standardEtasuUrl, body, compileResponses); - }); - - } + const getAllEtasu = () => { + medications.forEach(medication => { + const body = makeBody(medication); + const standardEtasuUrl = `${globalState.remsAdminServer}/4_0_0/GuidanceResponse/$rems-etasu`; + standardsBasedGetEtasu(standardEtasuUrl, body, compileResponses); + }); + }; - const makeBody = (medication) => { - return { - resourceType: "Parameters", - parameter: [ - { - name: 'patient', - resource: globalState.patient - }, - { - name: 'medication', - resource: medication - } - ] + const makeBody = medication => { + return { + resourceType: 'Parameters', + parameter: [ + { + name: 'patient', + resource: globalState.patient + }, + { + name: 'medication', + resource: medication } - } + ] + }; + }; - return ( -
-

Notifications

- {etasu.map((remsCase) => { - const display = remsCase.body.parameter[1]?.resource.code.coding[0].display; - return - })} -
- ); + return ( +
+

Notifications

+ {etasu.map(remsCase => { + const display = remsCase.body.parameter[1]?.resource.code.coding[0].display; + return ( + + ); + })} +
+ ); }; export default memo(NotificationsSection); diff --git a/src/components/DisplayBox/DisplayBox.jsx b/src/components/DisplayBox/DisplayBox.jsx index a8d9265..04b37a9 100644 --- a/src/components/DisplayBox/DisplayBox.jsx +++ b/src/components/DisplayBox/DisplayBox.jsx @@ -1,11 +1,19 @@ import React, { useEffect, useState } from 'react'; import './card-list.css'; -import { Button, Card, CardActions, CardContent, Typography } from '@mui/material'; +import { Button, Box, Card, CardActions, CardContent, Typography } from '@mui/material'; import axios from 'axios'; import ReactMarkdown from 'react-markdown'; import PictureAsPdfIcon from '@mui/icons-material/PictureAsPdf'; import { retrieveLaunchContext } from '../../util/util'; import './displayBox.css'; +import ArrowForwardRoundedIcon from '@mui/icons-material/ArrowForwardRounded'; +import Accordion from '@mui/material/Accordion'; +import AccordionSummary from '@mui/material/AccordionSummary'; +import AccordionDetails from '@mui/material/AccordionDetails'; +import KeyboardArrowDownRoundedIcon from '@mui/icons-material/KeyboardArrowDownRounded'; +import List from '@mui/material/List'; +import ListItem from '@mui/material/ListItem'; +import AddCircleOutlineRoundedIcon from '@mui/icons-material/AddCircleOutlineRounded'; const DisplayBox = props => { const [state, setState] = useState({ smartLink: '', response: {} }); @@ -54,6 +62,7 @@ const DisplayBox = props => { const element = document.getElementById(buttonId); element.setAttribute('disabled', 'true'); element.setAttribute('style', 'background-color:#4BB543;'); + element.setAttribute('style'); } if (suggestion.label) { @@ -182,7 +191,7 @@ const DisplayBox = props => { } if (!isDemoCard) { return ( -
+
Source:{' '} { card.suggestions.forEach((item, ind) => { var buttonId = 'suggestion_button-' + cardInd + '-' + ind; buttonList.push(buttonId); - suggestionsSection.push( - + + + ); }); } // -- Links -- - let linksSection; + let linksSection = []; if (card.links) { card.links = modifySmartLaunchUrls(card) || card.links; - linksSection = card.links.map((link, ind) => { + card.links.map((link, ind) => { if (link.type === 'smart') { - return ( - + linksSection.push( + + + + ); + } + }); + } + + let documentationSection = []; + const pdfIcon = ; + if (card.links) { + card.links = modifySmartLaunchUrls(card) || card.links; + card.links.map((link, ind) => { + if (link.type === 'absolute') { + documentationSection.push( + + + + + ); } - const pdfIcon = ; - return ( - - ); }); } const cardSectionHeaderStyle = { marginBottom: '2px', color: 'black' }; const builtCard = ( - - - - - Summary - - - {summarySection} - -
- - Details - - {detailSection} -
- - {sourceSection} - -
- {linksSection} - {suggestionsSection} -
+ + + + + + {summarySection} + + + {/* Forms */} + {linksSection.length !== 0 ? ( +
+ Required Forms + {detailSection} + {linksSection} +
+ ) : ( + <> + )} + + {/* Suggestions */} + {suggestionsSection.length !== 0 ? ( +
+ + Suggestions + + {suggestionsSection} +
+ ) : ( + <> + )} + + {/* Documentation and Guides */} + {documentationSection.length !== 0 ? ( + + }> + + View documentation and guides + + + + {documentationSection} + + + ) : ( + <> + )} + + + {sourceSection} + +
+
+
); diff --git a/src/components/EtasuStatus/EtasuStatus.jsx b/src/components/EtasuStatus/EtasuStatus.jsx index 97417ab..1dc0dc7 100644 --- a/src/components/EtasuStatus/EtasuStatus.jsx +++ b/src/components/EtasuStatus/EtasuStatus.jsx @@ -2,7 +2,7 @@ import { useState, useEffect, useContext } from 'react'; import { SettingsContext } from '../../containers/ContextProvider/SettingsProvider.jsx'; import { EtasuStatusComponent } from './EtasuStatusComponent.jsx'; import { standardsBasedGetEtasu } from '../../util/util.js'; -import { createMedicationFromMedicationRequest } from '../../util/fhir.js'; +import { createMedicationFromMedicationRequest, getDrugCodeableConceptFromMedicationRequest } from '../../util/fhir.js'; // converts code into etasu for the component to render // simplifies usage for applications that only know the code, not the case they want to display @@ -14,26 +14,24 @@ export const EtasuStatus = props => { const [etasuData, setEtasuData] = useState({}); const [display, setDisplay] = useState(''); - useEffect(() => { + useEffect(() => { const medication = createMedicationFromMedicationRequest(request); getEtasuStatus(medication); }, [code]); - const getEtasuStatus = (medication) => { + const getEtasuStatus = medication => { const body = makeBody(medication); setEtasuData(body); - const display = body.parameter[1]?.resource.code.coding[0].display; + const display = body.parameter[1]?.resource.code?.coding[0].display; setDisplay(display); const standardEtasuUrl = `${globalState.remsAdminServer}/4_0_0/GuidanceResponse/$rems-etasu`; standardsBasedGetEtasu(standardEtasuUrl, body, setRemsAdminResponse); - }; - - const makeBody = (medication) => { + const makeBody = medication => { console.log('patient -- > ', globalState.patient); return { - resourceType: "Parameters", + resourceType: 'Parameters', parameter: [ { name: 'patient', @@ -44,13 +42,20 @@ export const EtasuStatus = props => { resource: medication } ] - } - } + }; + }; return ( <> - {remsAdminResponse.contained ? : ""} + {remsAdminResponse.contained ? ( + + ) : ( + '' + )} ); }; - diff --git a/src/components/EtasuStatus/EtasuStatusButton.jsx b/src/components/EtasuStatus/EtasuStatusButton.jsx index ed87d7c..cff24ef 100644 --- a/src/components/EtasuStatus/EtasuStatusButton.jsx +++ b/src/components/EtasuStatus/EtasuStatusButton.jsx @@ -3,8 +3,7 @@ import ListIcon from '@mui/icons-material/List'; import './EtasuStatusButton.css'; export const EtasuStatusButton = props => { - const { baseColor, remsAdminResponse, handleOpenEtasuStatus, lastCheckedEtasuTime } = - props; + const { baseColor, remsAdminResponse, handleOpenEtasuStatus, lastCheckedEtasuTime } = props; return (