diff --git a/api-tests/src/test/java/org/openmrs/module/htmlformentry/widget/OrderWidgetTest.java b/api-tests/src/test/java/org/openmrs/module/htmlformentry/widget/OrderWidgetTest.java index 2b5da339e..a4f004f0f 100644 --- a/api-tests/src/test/java/org/openmrs/module/htmlformentry/widget/OrderWidgetTest.java +++ b/api-tests/src/test/java/org/openmrs/module/htmlformentry/widget/OrderWidgetTest.java @@ -10,9 +10,12 @@ import org.apache.commons.logging.LogFactory; import org.junit.Before; import org.junit.Test; +import org.openmrs.Drug; +import org.openmrs.api.context.Context; import org.openmrs.module.htmlformentry.BaseHtmlFormEntryTest; import org.openmrs.module.htmlformentry.tester.FormSessionTester; import org.openmrs.module.htmlformentry.tester.FormTester; +import org.openmrs.module.htmlformentry.util.JsonObject; public class OrderWidgetTest extends BaseHtmlFormEntryTest { @@ -77,4 +80,28 @@ public void shouldRenderTemplateWithWidgetsForTestOrder() { fst.assertHtmlContains(propertyWidget.generateHtml(fst.getFormEntrySession().getContext())); } } + + @Test + public void shouldIndicateWhenDrugOrderHistoryDrugIsRetired() { + FormTester formTester = FormTester.buildForm("orderTestForm.xml"); + + // Patient 2 has an existing, open order for drug 2, which is not retired + FormSessionTester fst = formTester.openNewForm(2); + OrderWidget widget = fst.getWidgets(OrderWidget.class).get(0); + JsonObject config = widget.constructJavascriptConfig(fst.getFormEntrySession().getContext()); + JsonObject historyOrder = config.getObjectArray("history").get(0); + assertThat(historyOrder.getObject("drug").getString("retired"), is("false")); + + // Once the drug is retired, the history entry for the existing order should reflect this + Drug drug = Context.getConceptService().getDrug(2); + drug.setRetired(true); + Context.getConceptService().saveDrug(drug); + + FormSessionTester fstAfterRetiring = formTester.openNewForm(2); + OrderWidget widgetAfterRetiring = fstAfterRetiring.getWidgets(OrderWidget.class).get(0); + JsonObject configAfterRetiring = widgetAfterRetiring + .constructJavascriptConfig(fstAfterRetiring.getFormEntrySession().getContext()); + JsonObject historyOrderAfterRetiring = configAfterRetiring.getObjectArray("history").get(0); + assertThat(historyOrderAfterRetiring.getObject("drug").getString("retired"), is("true")); + } } diff --git a/api/src/main/java/org/openmrs/module/htmlformentry/widget/OrderWidget.java b/api/src/main/java/org/openmrs/module/htmlformentry/widget/OrderWidget.java index 23db0dd79..388822ed0 100644 --- a/api/src/main/java/org/openmrs/module/htmlformentry/widget/OrderWidget.java +++ b/api/src/main/java/org/openmrs/module/htmlformentry/widget/OrderWidget.java @@ -169,7 +169,7 @@ public JsonObject constructJavascriptConfig(FormEntryContext context) { String[] messageCodes = { "encounterDateChangeWarning", "delete", "editDeleteWarning", "editOrder", "deleteOrder", "previousOrder", "orderReason", "starting", "until", "for", "discontinueReason", "asNeeded", "quantity", "refills", "active", "cancelAction", "existingOrdersViewTitle", "existingOrdersEditTitle", "newOrdersTitle", - "noOrders" }; + "noOrders", "drugRetired" }; for (String messageCode : messageCodes) { translations.addTranslation(prefix, messageCode); } @@ -258,6 +258,7 @@ public JsonObject constructJavascriptConfig(FormEntryContext context) { if (o instanceof DrugOrder) { DrugOrder d = (DrugOrder) o; addToJsonObject(jho, "drug", d.getDrug()); + jho.getObject("drug").addString("retired", Boolean.toString(d.getDrug() != null && d.getDrug().getRetired())); addToJsonObject(jho, "drugNonCoded", d.getDrugNonCoded()); addToJsonObject(jho, "dosingType", d.getDosingType()); addToJsonObject(jho, "dosingInstructions", d.getDosingInstructions()); diff --git a/api/src/main/resources/messages.properties b/api/src/main/resources/messages.properties index 47f6b033f..67aa898ea 100644 --- a/api/src/main/resources/messages.properties +++ b/api/src/main/resources/messages.properties @@ -146,6 +146,7 @@ htmlformentry.orders.laterality = Laterality htmlformentry.orders.clinicalHistory = Clinical History htmlformentry.orders.numberOfRepeats = Number of Repeats htmlformentry.orders.location = Location +htmlformentry.orders.drugRetired = This drug is retired and is no longer orderable. htmlformentry.orders.previousOrderRequired = You must specify an existing order in order to revise it htmlformentry.orders.drugChangedForRevision = No drug changes are permitted when issuing a revise order diff --git a/api/src/main/resources/messages_es.properties b/api/src/main/resources/messages_es.properties index a0ad25efd..7492de79b 100644 --- a/api/src/main/resources/messages_es.properties +++ b/api/src/main/resources/messages_es.properties @@ -137,6 +137,7 @@ htmlformentry.orders.deleteOrder = Eliminar htmlformentry.orders.existingOrdersViewTitle = Solicitudes revisadas htmlformentry.orders.existingOrdersEditTitle = Ordenes activas htmlformentry.orders.newOrdersTitle = Nuevas órdenes +htmlformentry.orders.drugRetired = Este medicamento está retirado y ya no se puede solicitar. htmlformentry.orders.previousOrderRequired = Debe especificar una orden existente para revisarla htmlformentry.orders.drugChangedForRevision = No se permiten cambios de drogas al emitir una orden de revisión. diff --git a/api/src/main/resources/messages_fr.properties b/api/src/main/resources/messages_fr.properties index b4c1a6a52..b42f629e8 100644 --- a/api/src/main/resources/messages_fr.properties +++ b/api/src/main/resources/messages_fr.properties @@ -137,6 +137,7 @@ htmlformentry.orders.deleteOrder = Supprimer htmlformentry.orders.existingOrdersViewTitle = Commandes révisées htmlformentry.orders.existingOrdersEditTitle = Commandes actives htmlformentry.orders.newOrdersTitle = Nouvelles commandes +htmlformentry.orders.drugRetired = Ce médicament est retiré et ne peut plus être commandé. htmlformentry.orders.previousOrderRequired = Vous devez specifier une ordonnance existante afin de pouvoir la réviser htmlformentry.orders.drugChangedForRevision = Aucun changement de médicaments n’est permis quand une revision d’ordonnance est émise diff --git a/api/src/main/resources/messages_ht.properties b/api/src/main/resources/messages_ht.properties index 60f3d1177..89c3ffd12 100644 --- a/api/src/main/resources/messages_ht.properties +++ b/api/src/main/resources/messages_ht.properties @@ -137,6 +137,7 @@ htmlformentry.orders.deleteOrder = Delete htmlformentry.orders.existingOrdersViewTitle = Revised Orders htmlformentry.orders.existingOrdersEditTitle = Active Orders htmlformentry.orders.newOrdersTitle = New Orders +htmlformentry.orders.drugRetired = Medikaman sa a te retire e li pa kapab kòmande ankò. htmlformentry.orders.previousOrderRequired = You must specify an existing order in order to revise it htmlformentry.orders.drugChangedForRevision = No drug changes are permitted when issuing a revise order diff --git a/omod/src/main/webapp/resources/orderWidget.css b/omod/src/main/webapp/resources/orderWidget.css index 49506026c..137eb3e18 100644 --- a/omod/src/main/webapp/resources/orderWidget.css +++ b/omod/src/main/webapp/resources/orderWidget.css @@ -152,6 +152,18 @@ box-shadow: 0 0 5px -1px rgba(0,0,0,0.6); } +.order-action-button.orderwidget-disabled-action { + cursor: not-allowed; + opacity: 0.5; +} +.order-action-button.orderwidget-disabled-action:hover, +.order-action-button.orderwidget-disabled-action:active { + background: -webkit-linear-gradient(top, #ffffff, #dddddd); + border-color: #dddddd; + box-shadow: 0 0 5px -1px rgba(0,0,0,0.2); + font-weight: normal; +} + .orderwidget-autocomplete-textbox { display: inline-block; max-width: 600px; diff --git a/omod/src/main/webapp/resources/orderWidget.js b/omod/src/main/webapp/resources/orderWidget.js index 18a312168..3988d6edc 100644 --- a/omod/src/main/webapp/resources/orderWidget.js +++ b/omod/src/main/webapp/resources/orderWidget.js @@ -114,6 +114,11 @@ return supportsAction && (inEncounter || notDiscontinued); } + // True if the given order is a drug order whose drug has since been retired + orderWidget.isDrugRetired = function(order) { + return order.isDrugOrder === 'true' && order.drug && order.drug.retired === 'true'; + } + orderWidget.getActionOption = function(config, action) { var $orderTemplate = $('#' + config.fieldName + '_template'); var $actionSection = $orderTemplate.find('.order-field.order-action'); @@ -379,25 +384,31 @@ var actionLabel = isVoidAndEdit ? config.translations.editOrder : isVoid ? config.translations.deleteOrder : $actionOption.html(); var $actionButton = orderWidget.createActionButton(idSuffix, action, actionLabel); - $actionButton.click(function() { - var $orderForm = $orderActionForms.find('.orderwidget-order-form'); - $orderActionSection.find(".order-action-button").removeClass('orderwidget-selected-action'); - if ($orderForm.length > 0) { - $orderForm.remove(); - } - $actionButton.addClass('orderwidget-selected-action'); - $actionButton.show(); - $orderForm = orderWidget.constructOrderForm($orderActionForms, idSuffix, config, action, $actionButton); - orderWidget.populateOrderForm(config, $orderForm, order); - - if (isVoidAndEdit || isVoid) { - if (isVoid) { - $orderForm.find('.order-field').hide(); + + if ((action === 'RENEW' || action === 'REVISE') && orderWidget.isDrugRetired(order)) { + $actionButton.addClass('orderwidget-disabled-action'); + $actionButton.attr('title', config.translations.drugRetired); + } else { + $actionButton.click(function() { + var $orderForm = $orderActionForms.find('.orderwidget-order-form'); + $orderActionSection.find(".order-action-button").removeClass('orderwidget-selected-action'); + if ($orderForm.length > 0) { + $orderForm.remove(); } - $orderForm.prepend("