Skip to content
This repository was archived by the owner on Jul 31, 2023. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .dockerignore

This file was deleted.

14 changes: 0 additions & 14 deletions .github/auto_assign.yml

This file was deleted.

22 changes: 0 additions & 22 deletions .github/workflows/ForkSync.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/docker-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ jobs:
with:
context: .
push: true
tags: codexrems/dtr:REMSvCurrent
tags: smalho01234/dtr:latest
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

123 changes: 71 additions & 52 deletions src/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import ReactDOM from 'react-dom'
import "./App.css";
import cqlfhir from "cql-exec-fhir";
import executeElm from "./elmExecutor/executeElm";
import fetchArtifacts from "./util/fetchArtifacts";
import {fetchArtifacts, fetchArtifactsOperation, fetchFromQuestionnaireResponse, searchByOrder} from "./util/fetchArtifacts";
import fetchFhirVersion from "./util/fetchFhirVersion";
import { buildFhirUrl } from "./util/util";
import PriorAuth from "./components/PriorAuth/PriorAuth";
Expand All @@ -12,7 +12,6 @@ import Testing from "./components/ConsoleBox/Testing";
import UserMessage from "./components/UserMessage/UserMessage";
import TaskPopup from "./components/Popup/TaskPopup";
import PatientSelect from "./components/PatientSelect/PatientSelect";
import RemsInterface from "./components/RemsInterface/RemsInterface";

// uncomment for testing UserMessage
// let sampleError = {
Expand All @@ -37,9 +36,8 @@ export default class App extends Component {
questionnaire: null,
response: null,
priorAuthClaim: null,
specialtyRxBundle: null,
cqlPrepopulationResults: null,
deviceRequest: null,
orderResource: null,
bundle: null,
filter: true,
filterChecked: true,
Expand Down Expand Up @@ -73,6 +71,7 @@ export default class App extends Component {
this.standaloneLaunch = this.standaloneLaunch.bind(this);
this.filter = this.filter.bind(this);
this.onFilterCheckboxRefChange = this.onFilterCheckboxRefChange.bind(this);
this.fetchResourcesAndExecuteCql = this.fetchResourcesAndExecuteCql.bind(this);
}

componentDidMount() {
Expand All @@ -82,15 +81,15 @@ export default class App extends Component {
}

standaloneLaunch(patient, response) {
const template = `Questionnaire/${response.questionnaire}`;
fetchFhirVersion(this.props.smart.state.serverUrl)
.then(fhirVersion => {
this.fhirVersion = fhirVersion;
const questionnaireUrl = buildFhirUrl(template, this.props.FHIR_PREFIX, this.fhirVersion);
const questionnaireUrl = response.questionnaire;
fetch(questionnaireUrl).then(r => r.json())
.then(questionnaire => {
this.setState({ questionnaire: questionnaire });
this.setState({ response: response});
this.setState({ isFetchingArtifacts: false});
});
});
}
Expand All @@ -102,63 +101,91 @@ export default class App extends Component {
})
}


ehrLaunch(isContainedQuestionnaire, questionnaire) {
// Temporary indication before full supports for relaunch is implemented
if(!this.appContext.request) {
alert("Supports for relaunch will be added in the near future!");
this.consoleLog("Supports for relaunch will be added in the near future!", "errorClass");
return;
let acOrder = this.appContext.order;
let acCoverage = this.appContext.coverage;
let acQuestionnaire = this.appContext.questionnaire;
let acResponse = this.appContext.response;
if(isContainedQuestionnaire && questionnaire) {
// TODO: This is a workaround for getting adaptive forms to work
// in its current form, adaptive forms do not operate with the
// package operation
const reloadQuestionnaire = questionnaire !== undefined;
this.setState({
isFetchingArtifacts: true,
reloadQuestionnaire
})
this.fetchResourcesAndExecuteCql(acOrder, acCoverage, acQuestionnaire, questionnaire);

} else if(acOrder && acCoverage && !acQuestionnaire && !acResponse) {
searchByOrder(acOrder, this.smart).then((res) => {
// TODO: Don't know how to deal with multiple QRs
// Let user pick with a UI? Force orders to
// uniquely identify QRs?
// for now just pick the first one
acResponse = res[0].resource;
acQuestionnaire = acResponse.questionnaire;
this.setState({response: acResponse});
this.fetchResourcesAndExecuteCql(acOrder, acCoverage, acQuestionnaire);
});
} else if(acResponse) {
// start relaunch
// TODO: could potentially pass order to this function and avoid
// needing to search the QR context extension for it
// which would also support QRs without the extension.
fetchFromQuestionnaireResponse(acResponse, this.smart).then((relaunchContext) => {
this.setState({response: relaunchContext.response})
this.fetchResourcesAndExecuteCql(relaunchContext.order, relaunchContext.coverage, relaunchContext.questionnaire);
});
} else if(acQuestionnaire && acOrder && acCoverage){
this.consoleLog("fetching artifacts", "infoClass");
this.setState({
isFetchingArtifacts: true
})
const reloadQuestionnaire = questionnaire !== undefined;
this.setState({reloadQuestionnaire});
this.fetchResourcesAndExecuteCql(acOrder, acCoverage, acQuestionnaire);
} else {
alert("invalid app context")
}
const deviceRequest = JSON.parse(this.appContext.request.replace(/\\/g,""));
this.consoleLog("fetching artifacts", "infoClass");
this.setState({
isFetchingArtifacts: true
})
const reloadQuestionnaire = questionnaire !== undefined;

}

fetchResourcesAndExecuteCql(order, coverage, questionnaire, containedQuestionnaire) {
fetchFhirVersion(this.props.smart.state.serverUrl)
.then(fhirVersion => {
this.fhirVersion = fhirVersion;

fetchArtifacts(
this.props.FHIR_PREFIX,
this.props.FILE_PREFIX,
!isContainedQuestionnaire ? this.appContext.template : questionnaire,
this.fhirVersion,
this.smart,
this.consoleLog,
isContainedQuestionnaire
)
fetchArtifactsOperation(order, coverage, questionnaire, this.smart, this.consoleLog, containedQuestionnaire)
.then(artifacts => {
console.log("fetched needed artifacts:", artifacts);

const orderResource = artifacts.order;
let fhirWrapper = this.getFhirWrapper(this.fhirVersion);

this.setState({ questionnaire: artifacts.questionnaire });
this.setState({ deviceRequest: deviceRequest });
this.setState({ orderResource: orderResource });
this.setState({ isAdaptiveFormWithoutExtension: artifacts.questionnaire.meta && artifacts.questionnaire.meta.profile && artifacts.questionnaire.meta.profile.includes("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-adapt") && (artifacts.questionnaire.extension === undefined || !artifacts.questionnaire.extension.includes(e => e.url === "http://hl7.org/fhir/StructureDefinition/cqf-library")) });
this.setState({ });
// execute for each main library
return Promise.all(
artifacts.mainLibraryElms.map(mainLibraryElm => {
let parameterObj;
if (deviceRequest.resourceType === "DeviceRequest") {
if (orderResource.resourceType === "DeviceRequest") {
parameterObj = {
device_request: fhirWrapper.wrap(deviceRequest)
device_request: fhirWrapper.wrap(orderResource)
};
} else if (
deviceRequest.resourceType === "ServiceRequest"
orderResource.resourceType === "ServiceRequest"
) {
parameterObj = {
service_request: fhirWrapper.wrap(deviceRequest)
service_request: fhirWrapper.wrap(orderResource)
};
} else if (deviceRequest.resourceType === "MedicationRequest") {
} else if (orderResource.resourceType === "MedicationRequest") {
parameterObj = {
medication_request: fhirWrapper.wrap(deviceRequest)
medication_request: fhirWrapper.wrap(orderResource)
};
} else if (deviceRequest.resourceType === "MedicationDispense") {
} else if (orderResource.resourceType === "MedicationDispense") {
parameterObj = {
medication_dispense: fhirWrapper.wrap(deviceRequest)
medication_dispense: fhirWrapper.wrap(orderResource)
};
}

Expand Down Expand Up @@ -194,7 +221,7 @@ export default class App extends Component {
return executeElm(
this.smart,
this.fhirVersion,
deviceRequest,
orderResource,
executionInputs,
this.consoleLog
);
Expand Down Expand Up @@ -247,13 +274,11 @@ export default class App extends Component {
this.setState({
bundle: fullBundle,
cqlPrepopulationResults: allLibrariesResults,
isFetchingArtifacts: false,
reloadQuestionnaire
isFetchingArtifacts: false
});
});
});
}

getFhirWrapper(fhirVersion) {
if (fhirVersion == "r4") {
return cqlfhir.FHIRWrapper.FHIRv400();
Expand Down Expand Up @@ -360,10 +385,6 @@ export default class App extends Component {
this.setState({ priorAuthClaim: claimBundle });
}

setSpecialtyRxBundle(specialtyRxBundleParam) {
this.setState({ specialtyRxBundle: specialtyRxBundleParam });
}

getQuestionByName(question) {
//question should be the HTML node
const temp = question.getElementsByClassName("lf-item-code ng-hide")[0].innerText.trim();
Expand Down Expand Up @@ -610,25 +631,23 @@ export default class App extends Component {
>

</div>
{this.state.specialtyRxBundle ? (
<RemsInterface specialtyRxBundle={this.state.specialtyRxBundle} />
{this.state.priorAuthClaim ? (
<PriorAuth claimBundle={this.state.priorAuthClaim} />
) : (
<QuestionnaireForm
qform={this.state.questionnaire}
appContext = {this.appContext}
cqlPrepopulationResults={this.state.cqlPrepopulationResults}
deviceRequest={this.state.deviceRequest}
deviceRequest={this.state.orderResource}
bundle={this.state.bundle}
patientId={this.patientId}
standalone={this.props.standalone}
response={this.state.response}
attested={this.state.attested}
priorAuthReq={this.props.priorAuthReq === "true" ? true : false}
setPriorAuthClaim={this.setPriorAuthClaim.bind(this)}
setSpecialtyRxBundle={this.setSpecialtyRxBundle.bind(this)}
fhirVersion={this.fhirVersion.toUpperCase()}
smart={this.smart}
FHIR_PREFIX={this.props.FHIR_PREFIX}
FILE_PATH={this.props.FILE_PREFIX}
renderButtons={this.renderButtons}
filterFieldsFn={this.filter}
filterChecked={this.state.filter}
Expand Down
2 changes: 1 addition & 1 deletion src/LogPage.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class LogPage extends Component {

componentDidMount(){
const logRequest = new XMLHttpRequest();
logRequest.open("GET", "../logs");
logRequest.open("GET", "../api/logs");
logRequest.setRequestHeader("Content-Type", "application/json");
logRequest.onload = (e) => {
this.setState({logs: JSON.parse(logRequest.responseText).sort((a,b)=>{return b.createdAt - a.createdAt})});
Expand Down
13 changes: 9 additions & 4 deletions src/backend/database/impl.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,22 @@ function getCountAndIncrement() {
}

function postLog(log) {
log.createdAt = Date.now();
db.get("logs").push(log).write();
}

function getLog(id) {
return db.get("logs").find({id: id}).value();
}
function getLogs() {
return db.get("logs").value();
}

function putLog(id, log) {
db.get("logs")
.find({ id: id })
.assign(log)
.write();
.find({ id: id })
.assign(log).write();
}

function deleteClient(id) {
Expand All @@ -56,6 +60,7 @@ module.exports = {
deleteClient,
postLog,
getLog,
getLogs,
putLog,
getCountAndIncrement
};
};
11 changes: 10 additions & 1 deletion src/backend/routes/database.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ router.post("/logs", (req, res) => {

router.put("/logs/:id", (req, res) => {
const newLog = req.body;
db.putLog(req.params.id, newLog);
db.putLog(parseInt(req.params.id), newLog);
res.sendStatus(200);
});

Expand All @@ -84,4 +84,13 @@ router.get("/logs/:id", (req, res) => {
}
});

router.get("/api/logs", (req, res) => {
const result = db.getLogs();
if(result) {
res.send(result);
} else {
res.sendStatus(404)
}
})

module.exports = router;
Loading