Skip to content

Commit

Permalink
Changes to support PIH having order entry functionality from within a…
Browse files Browse the repository at this point in the history
… visit dashboard (in addition to the global order entry page)
  • Loading branch information
djazayeri committed May 18, 2015
1 parent abfc9e7 commit 11d6921
Show file tree
Hide file tree
Showing 8 changed files with 399 additions and 53 deletions.
8 changes: 7 additions & 1 deletion api/src/main/resources/messages.properties
Expand Up @@ -2,4 +2,10 @@ ${project.parent.artifactId}.title=Order Entry UI Module
orderentryui.patientdashboard.activeDrugOrders=Prescribed Medication

orderentryui.pastAction.REVISE = Revised
orderentryui.pastAction.DISCONTINUE = Discontinued
orderentryui.pastAction.DISCONTINUE = Discontinued

orderentryui.action.NEW = New
orderentryui.action.REVISE = Revise
orderentryui.action.DISCONTINUE = Discontinue

orderentryui.dispense = Dispense
16 changes: 12 additions & 4 deletions omod/src/main/compass/sass/drugOrders.scss
Expand Up @@ -40,14 +40,14 @@ form#new-order {
padding-left: 10px;
padding-right: 10px;

.instructions.heading {
.dosing-type {
span {
margin-right: 100px;
margin-right: 15px;
}
a {
font-size: 0.7em;
font-size: 0.9em;
display: inline-block;
width: 150px;
padding-right: 15px;
&.active {
font-family: $primaryBoldFont;
font-weight: normal;
Expand Down Expand Up @@ -100,4 +100,12 @@ form.sized-inputs {
display: block;
}
}
}

div.editing-draft-order {
border: 1px $darkerGrey solid;
background-color: $lighterGrey;
padding: 5px;
margin-top: 5px;
margin-bottom: 5px;
}
Expand Up @@ -18,7 +18,7 @@
<h3>${ ui.message("orderentryui.patientdashboard.activeDrugOrders").toUpperCase() }</h3>
<% if (context.hasPrivilege("App: orderentryui.drugOrders")) { %>
<a href="${ ui.pageLink("orderentryui", "drugOrders", [patient: patient.id, returnUrl: ui.thisUrl()]) }">
<i class="icon-pencil edit-action right" title="${ ui.message("coreapps.edit") }"></i>
<i class="icon-share-alt edit-action right" title="${ ui.message("coreapps.edit") }"></i>
</a>
<% } %>
</div>
Expand Down
3 changes: 3 additions & 0 deletions omod/src/main/webapp/pages/drugOrders.gsp
Expand Up @@ -8,14 +8,17 @@
ui.includeJavascript("uicommons", "angular-ui/ui-bootstrap-tpls-0.11.2.js")
ui.includeJavascript("uicommons", "ngDialog/ngDialog.js")
ui.includeJavascript("uicommons", "filters/display.js")
ui.includeJavascript("uicommons", "filters/serverDate.js")
ui.includeJavascript("uicommons", "services/conceptService.js")
ui.includeJavascript("uicommons", "services/drugService.js")
ui.includeJavascript("uicommons", "services/encounterService.js")
ui.includeJavascript("uicommons", "services/orderService.js")
ui.includeJavascript("uicommons", "services/session.js")
ui.includeJavascript("uicommons", "directives/select-concept-from-list.js")
ui.includeJavascript("uicommons", "directives/select-order-frequency.js")
ui.includeJavascript("uicommons", "directives/select-drug.js")
ui.includeJavascript("orderentryui", "drugOrderModel.js")
ui.includeJavascript("orderentryui", "order-entry.js")
ui.includeJavascript("orderentryui", "drugOrders.js")
ui.includeCss("uicommons", "ngDialog/ngDialog.min.css")
Expand Down
55 changes: 55 additions & 0 deletions omod/src/main/webapp/pages/templates/editDraftDrugOrder.gsp
@@ -0,0 +1,55 @@
<form id="new-order" class="sized-inputs css-form" name="newOrderForm" novalidate>
<h4>
{{ draftOrder.action | omrs.display:"orderentryui.action." }}:
{{ draftOrder.drug | omrs.display}}
</h4>

<p ng-show="draftOrder.drug">
<label class="dosing-type heading">
<span>Dosing Type:</span>
<a ng-repeat="dosingType in dosingTypes" tabindex="-1"
ng-click="draftOrder.dosingType = dosingType.javaClass"
ng-class="{ active: draftOrder.dosingType == dosingType.javaClass }">
<i class="{{ dosingType.icon }}"></i>
{{ dosingType.display }}
</a>
</label>

<span ng-if="draftOrder.dosingType == 'org.openmrs.SimpleDosingInstructions'">
<input ng-model="draftOrder.dose" type="number" placeholder="Dose" min="0" required/>
<select-concept-from-list ng-model="draftOrder.doseUnits" concepts="orderContext.config.drugDosingUnits" placeholder="Units" size="5" required></select-concept-from-list>

<select-order-frequency ng-model="draftOrder.frequency" frequencies="orderContext.config.orderFrequencies" placeholder="Frequency" required></select-order-frequency>

<select-concept-from-list ng-model="draftOrder.route" concepts="orderContext.config.drugRoutes" placeholder="Route" size="20" required></select-concept-from-list>
<br/>

<label ng-class="{ disabled: !draftOrder.asNeededCondition }">As needed for</label>
<input ng-model="draftOrder.asNeededCondition" type="text" size="30" placeholder="reason (optional)"/>
<br/>

<label ng-class="{ disabled: !draftOrder.duration }">For</label>
<input ng-model="draftOrder.duration" type="number" min="0" placeholder="Duration" />
<select-concept-from-list ng-model="draftOrder.durationUnits" concepts="orderContext.config.durationUnits" placeholder="Units" size="8" required-if="draftOrder.duration"></select-concept-from-list>
<label ng-class="{ disabled: !draftOrder.duration }">total</label>
<br/>
<textarea ng-model="draftOrder.dosingInstructions" rows="2" cols="60" placeholder="Additional instruction not covered above"></textarea>
</span>

<span ng-if="draftOrder.dosingType == 'org.openmrs.FreeTextDosingInstructions'">
<textarea ng-model="draftOrder.dosingInstructions" rows="4" cols="60" placeholder="Complete instructions"></textarea>
</span>
</p>

<p ng-if="draftOrder.drug && draftOrder.careSetting.careSettingType == 'OUTPATIENT'">
<label class="heading">For outpatient orders</label>
Dispense:
<input ng-model="draftOrder.quantity" type="number" min="0" placeholder="Quantity" required/>
<select-concept-from-list ng-model="draftOrder.quantityUnits" concepts="orderContext.config.drugDispensingUnits" placeholder="Units" size="8"></select-concept-from-list>
</p>

<p ng-show="draftOrder.drug">
<button type="submit" class="confirm right" ng-disabled="newOrderForm.\$invalid" ng-click="readyDraft(draftOrder)">Add</button>
<button class="cancel" ng-click="cancelDraft(draftOrder)">Cancel</button>
</p>
</form>
69 changes: 61 additions & 8 deletions omod/src/main/webapp/resources/scripts/drugOrderModel.js
Expand Up @@ -3,6 +3,24 @@

var OpenMRS = window.OpenMRS;

// helper to use a fuller representation rather than a ref one
function replaceWithReferenceData(object, property, referenceList) {
var ref = object[property];
if (ref) {
var replacement = _.findWhere(referenceList, {uuid: ref.uuid});
if (replacement) {
object[property] = replacement;
}
}
}

OpenMRS.snomedCodes = {
tablet: "385055001",
capsule: "428641000",

oralAdministration: "26643006"
}

OpenMRS.dosingTypes = [
{
display: 'Standard Dosing',
Expand All @@ -26,6 +44,9 @@
}
return valid;
},
cleanup: function(order) {
order.asNeeded = order.asNeededCondition ? true : false;
},
format: function(order) {
var str = order.drug.display + ": " +
order.dose + " " + order.doseUnits.display + ", " +
Expand All @@ -39,6 +60,22 @@
str += " (" + order.dosingInstructions + ")";
}
return str;
},
inferFields: function(order, orderContext) {
if (!order.drug || !order.drug.dosageForm || !orderContext || !orderContext.config) {
return;
}
// if drug.dosageForm is Tablet => route = Oral, dose = Tablet
var sameDoseUnitAsForm = false;
if (emr.hasMapping(order.drug.dosageForm, "SNOMED CT", OpenMRS.snomedCodes.tablet)) {
if (!order.route) {
order.route = emr.findConceptWithMapping(orderContext.config.drugRoutes, "SNOMED CT", OpenMRS.snomedCodes.oralAdministration);
}
sameDoseUnitAsForm = true;
}
if (sameDoseUnitAsForm && !order.doseUnits) {
order.doseUnits = _.findWhere(orderContext.config.drugDosingUnits, {uuid: order.drug.dosageForm.uuid});
}
}
},
{
Expand All @@ -60,17 +97,18 @@

OpenMRS.DrugOrderModel = function(obj) {
if (obj === undefined) {
console.log("here");
console.log("Error: null obj");
}
$.extend(this, obj);
}

OpenMRS.createEmptyDraftOrder = function(careSetting) {
OpenMRS.createEmptyDraftOrder = function(orderContext) {
var obj = $.extend({}, {
editing: true,
action: 'NEW',
type: 'drugorder',
careSetting: careSetting,
orderer: OpenMRS.drugOrdersConfig.provider,
careSetting: orderContext.careSetting,
orderer: orderContext.provider,
commentToFulfiller: '',
drug: '',
dosingType: 'org.openmrs.SimpleDosingInstructions',
Expand All @@ -89,25 +127,40 @@

constructor: OpenMRS.DrugOrderModel,

createDiscontinueOrder: function() {
inferFields: function(orderContext) {
var dt = this.getDosingType();
if (dt && dt.inferFields) {
dt.inferFields(this, orderContext);
}
},

createDiscontinueOrder: function(orderContext) {
return new OpenMRS.DrugOrderModel({
action: 'DISCONTINUE',
type: 'drugorder',
careSetting: this.careSetting,
orderer: OpenMRS.drugOrdersConfig.provider,
orderer: orderContext.provider,
drug: this.drug,
previousOrder: this,
orderReasonNonCoded: ''
});
},

createRevisionOrder: function() {
createRevisionOrder: function(orderContext) {
var draft = OpenMRS.createEmptyDraftOrder(this.careSetting);
var copyProperties = _.pick(this,
'commentToFulfiller', 'drug', 'dosingType', 'numRefills', 'quantity', 'quantityUnits', 'dose',
'doseUnits', 'frequency', 'asNeeded', 'asNeededCondition', 'route', 'duration', 'durationUnits',
'dosingInstructions'
'dosingInstructions', 'careSetting'
);
if (orderContext && orderContext.config) {
replaceWithReferenceData(copyProperties, 'quantityUnits', orderContext.config.drugDispensingUnits);
replaceWithReferenceData(copyProperties, 'doseUnits', orderContext.config.drugDosingUnits);
replaceWithReferenceData(copyProperties, 'frequency', orderContext.config.orderFrequencies);
replaceWithReferenceData(copyProperties, 'route', orderContext.config.drugRoutes);
replaceWithReferenceData(copyProperties, 'durationUnits', orderContext.config.durationUnits);
replaceWithReferenceData(copyProperties, 'doseUnits', orderContext.config.drugDosingUnits);
}
var override = {
action: 'REVISE',
previousOrder: this
Expand Down

0 comments on commit 11d6921

Please sign in to comment.