diff --git a/src/PrefetchTemplate.js b/src/PrefetchTemplate.js index fb485a93..52d8fa42 100644 --- a/src/PrefetchTemplate.js +++ b/src/PrefetchTemplate.js @@ -6,83 +6,29 @@ export class PrefetchTemplate { const prefetchMap = new Map(); - const COVERAGE_PREFETCH_QUERY = new PrefetchTemplate( - "Coverage?patient={{context.patientId}}"); + const PRACTITIONER_PREFETCH = new PrefetchTemplate( + "{{context.userId}}"); + const PATIENT_PREFETCH = new PrefetchTemplate("{{context.patientId}}"); - const DEVICE_REQUEST_BUNDLE = new PrefetchTemplate( - "DeviceRequest?_id={{context.draftOrders.DeviceRequest.id}}" - + "&_include=DeviceRequest:patient" - + "&_include=DeviceRequest:performer" - + "&_include=DeviceRequest:requester" - + "&_include=DeviceRequest:device" - + "&_include:iterate=PractitionerRole:organization" - + "&_include:iterate=PractitionerRole:practitioner"); - - const MEDICATION_REQUEST_BUNDLE = new PrefetchTemplate( - "MedicationRequest?_id={{context.medications.MedicationRequest.id}}" - + "&_include=MedicationRequest:patient" - + "&_include=MedicationRequest:intended-dispenser" - + "&_include=MedicationRequest:requester:PractitionerRole" - + "&_include=MedicationRequest:medication" - + "&_include:iterate=PractitionerRole:organization" - + "&_include:iterate=PractitionerRole:practitioner"); - - const MEDICATION_DISPENSE_BUNDLE = new PrefetchTemplate( - "MedicationDispense?_id={{context.medications.MedicationDispense.id}}" - + "&_include=MedicationDispense:patient" - + "&_include=MedicationDispense:intended-dispenser" - + "&_include=MedicationDispense:requester:PractitionerRole" - + "&_include=MedicationDispense:medication" - + "&_include:iterate=PractitionerRole:organization" - + "&_include:iterate=PractitionerRole:practitioner"); - - const NUTRITION_ORDER_BUNDLE = new PrefetchTemplate( - "NutritionOrder?_id={{context.draftOrders.NutritionOrder.id}}" - + "&_include=NutritionOrder:patient" - + "&_include=NutritionOrder:provider" - + "&_include=NutritionOrder:requester" - + "&_include=PractitionerRole:organization" - + "&_include=PractitionerRole:practitioner" - + "&_include=NutritionOrder:encounter" - + "&_include=Encounter:location"); - - const SERVICE_REQUEST_BUNDLE = new PrefetchTemplate( - "ServiceRequest?_id={{context.draftOrders.ServiceRequest.id}}" - + "&_include=ServiceRequest:patient" - + "&_include=ServiceRequest:performer" - + "&_include=ServiceRequest:requester" - + "&_include:iterate=PractitionerRole:organization" - + "&_include:iterate=PractitionerRole:practitioner"); - - const APPOINTMENT_BUNDLE = new PrefetchTemplate( - "appointmentBundle", - "Appointment?_id={{context.appointments.Appointment.id}}" - + "&_include=Appointment:patient" - + "&_include=Appointment:practitioner:PractitionerRole" - + "&_include:iterate=PractitionerRole:organization" - + "&_include:iterate=PractitionerRole:practitioner" - + "&_include=Appointment:location"); - - const ENCOUNTER_BUNDLE = new PrefetchTemplate( - "encounterBundle", - "Encounter?_id={{context.encounterId}}" - + "&_include=Encounter:patient" - + "&_include=Encounter:service-provider" - + "&_include=Encounter:practitioner" - + "&_include=Encounter:location"); - - prefetchMap.set("Coverage", COVERAGE_PREFETCH_QUERY); - prefetchMap.set("DeviceRequest", DEVICE_REQUEST_BUNDLE); - prefetchMap.set("MedicationRequest", MEDICATION_REQUEST_BUNDLE); - prefetchMap.set("MedicationDispense", MEDICATION_DISPENSE_BUNDLE); - prefetchMap.set("ServiceRequest", SERVICE_REQUEST_BUNDLE); - prefetchMap.set("Encounter", ENCOUNTER_BUNDLE); + // prefetchMap.set("Coverage", COVERAGE_PREFETCH_QUERY); + prefetchMap.set("practitioner", PRACTITIONER_PREFETCH); + prefetchMap.set("patient", PATIENT_PREFETCH); + // prefetchMap.set("ServiceRequest", SERVICE_REQUEST_BUNDLE); + // prefetchMap.set("Encounter", ENCOUNTER_BUNDLE); return prefetchMap; } static generateParamElementMap() { const paramElementMap = new Map(); + // TODO - this should just be inferred based on context. Or rather + // the instructions from the hook about what context to fill in + // Quite literally, the "context" here refers to the "context" of the + // cds-hook, which as of now is just hard-coded in buildRequest.js + // Rather than do this, which searches the request resource for information, + // the cds-hook should be constructed and then the context used to actually make + // the appropriate requests. + paramElementMap.set('context.userId', ['requester', 'reference']) paramElementMap.set('context.draftOrders.DeviceRequest.id', ['id']); paramElementMap.set('context.medications.MedicationRequest.id', ['id']); paramElementMap.set('context.medications.MedicationDispense.id', ['id']); diff --git a/src/components/RequestBox/RequestBox.js b/src/components/RequestBox/RequestBox.js index 31f21b17..ad864301 100644 --- a/src/components/RequestBox/RequestBox.js +++ b/src/components/RequestBox/RequestBox.js @@ -57,9 +57,15 @@ export default class RequestBox extends Component { prepPrefetch() { const preppedResources = new Map(); Object.keys(this.state.prefetchedResources).forEach((resourceKey) => { - const resourceList = this.state.prefetchedResources[resourceKey].map((resource) => { - return resource; - }) + let resourceList = [] + if(Array.isArray(this.state.prefetchedResources[resourceKey])){ + resourceList = this.state.prefetchedResources[resourceKey].map((resource) => { + return resource; + }) + } else { + resourceList = this.state.prefetchedResources[resourceKey] + } + preppedResources.set(resourceKey, resourceList); }); return preppedResources; @@ -92,7 +98,7 @@ export default class RequestBox extends Component { if(!prevState[elementName][key]){ prevState[elementName][key] = []; } - return {[elementName]: {...prevState[elementName], [key]: [...prevState[elementName][key], text]}}; + return {[elementName]: {...prevState[elementName], [key]: text}}; }); }; @@ -212,11 +218,16 @@ export default class RequestBox extends Component { var renderedPrefetches = new Map(); requestResources.forEach((resourceList, resourceKey) => { const renderedList = []; - resourceList.forEach((resource) => { - console.log("Request resources:" + JSON.stringify(requestResources)); - console.log("Request key:" + resourceKey); - renderedList.push(this.renderResource(resource)) - }); + if(Array.isArray(resourceList)){ + resourceList.forEach((resource) => { + console.log("Request resources:" + JSON.stringify(requestResources)); + console.log("Request key:" + resourceKey); + renderedList.push(this.renderResource(resource)) + }); + } else { + renderedList.push(this.renderResource(resourceList)) + } + renderedPrefetches.set(resourceKey, renderedList); }); console.log(renderedPrefetches); diff --git a/src/components/SMARTBox/PatientBox.js b/src/components/SMARTBox/PatientBox.js index e638ac5d..11e9bd7f 100644 --- a/src/components/SMARTBox/PatientBox.js +++ b/src/components/SMARTBox/PatientBox.js @@ -38,7 +38,7 @@ export default class SMARTBox extends Component { } else if (request.resourceType === "ServiceRequest") { code = request.code.coding[0]; } else if (request.resourceType === "MedicationRequest" - || request.resourceType === "MedicationDispense") { + || request.resourceType === "MedicationDispense") { code = request.medicationCodeableConcept.coding[0]; } if (code) { @@ -77,7 +77,7 @@ export default class SMARTBox extends Component { this.props.callback("patient", patient); this.props.callback("openPatient", false); this.props.clearCallback(); - if(this.state.request !== "none" ) { + if (this.state.request !== "none") { const request = JSON.parse(this.state.request); if (request.resourceType === "DeviceRequest" || request.resourceType === "ServiceRequest" || request.resourceType === "MedicationRequest" || request.resourceType === "MedicationDispense") { this.updatePrefetchRequest(request); @@ -85,8 +85,8 @@ export default class SMARTBox extends Component { this.props.clearCallback(); } } - - if(this.state.response !== "none") { + + if (this.state.response !== "none") { const response = JSON.parse(this.state.response); this.updateQRResponse(patient, response); } @@ -98,7 +98,7 @@ export default class SMARTBox extends Component { updatePrefetchRequest(request) { this.props.callback(request.resourceType, request); - const queries = this.props.updatePrefetchCallback(request, request.resourceType, "Coverage"); + const queries = this.props.updatePrefetchCallback(request, "patient", "practitioner"); queries.forEach((query, queryKey) => { const urlQuery = this.props.ehrUrl + '/' + query; fetch(urlQuery, { @@ -106,10 +106,8 @@ export default class SMARTBox extends Component { }).then((response) => { const responseJson = response.json() return responseJson; - }).then((bundle) => { - bundle['entry'].forEach((fullResource) => { - this.props.callbackMap("prefetchedResources", queryKey, fullResource); - }); + }).then((resource) => { + this.props.callbackMap("prefetchedResources", queryKey, resource); }); }); this.props.callback("request", request); @@ -163,7 +161,7 @@ export default class SMARTBox extends Component { flat: true, }) .then((result) => { - this.setState({ medicationDispenses: result}); + this.setState({ medicationDispenses: result }); }); } @@ -191,17 +189,17 @@ export default class SMARTBox extends Component { this.setState({ response: "none" }); - } else { + } else { this.setState({ response: data.value }); } } - + getRequests() { const client = FHIR.client( - this.props.params - ); + this.props.params + ); const patientId = this.props.patient.id; this.getDeviceRequest(patientId, client); this.getServiceRequest(patientId, client); @@ -235,7 +233,7 @@ export default class SMARTBox extends Component { const display = `${qr.questionnaire}: created at ${qr.authored}`; let option = { key: qr.id, - text: display, + text: display, value: JSON.stringify(qr), content: (
@@ -270,24 +268,25 @@ export default class SMARTBox extends Component { }); } if (this.state.medicationRequests.data) { - this.state.medicationRequests.data.forEach((e) => { + this.state.medicationRequests.data.forEach((e) => { this.makeOption(e, options); }); } if (this.state.medicationDispenses.data) { this.state.medicationDispenses.data.forEach((e) => { - this.makeOption(e, options); - })}; + this.makeOption(e, options); + }) + }; - if(this.state.questionnaireResponses.data) { + if (this.state.questionnaireResponses.data) { returned = true; this.state.questionnaireResponses.data.forEach(qr => this.makeQROption(qr, responseOptions)); } - + let noResults = 'No results found.' - if(!returned) { - noResults = 'Loading...'; + if (!returned) { + noResults = 'Loading...'; } return ( @@ -321,10 +320,10 @@ export default class SMARTBox extends Component { Request: - In Progress Form: - { - if (key === 'DeviceRequest') { - r4json.prefetch.deviceRequestBundle = { - "resourceType": "Bundle", - "type": "collection", - "entry": resource - }; - } else if (key === 'ServiceRequest') { - r4json.prefetch.serviceRequestBundle = { - "resourceType": "Bundle", - "type": "collection", - "entry": resource - }; - } else if(key === 'MedicationRequest') { - r4json.prefetch.medicationRequestBundle = { - "resourceType": "Bundle", - "type": "collection", - "entry": resource - }; - } else if (key === 'MedicationDispense') { - r4json.prefetch.medicationDispenseBundle = { - "resourceType": "Bundle", - "type": "collection", - "entry": resource - }; - } else if (key === 'Coverage') { - r4json.prefetch.coverageBundle = { - "resourceType": "Bundle", - "type": "collection", - "entry": resource - }; - } else { - console.error("Invalid prefetch key used: " + key + "."); - } + r4json.prefetch[key] = resource }); }