From 00dc948579a52dee775cdb4e81e3c2337093c7c2 Mon Sep 17 00:00:00 2001 From: gita cliff Date: Thu, 25 Jun 2020 19:09:14 +0300 Subject: [PATCH] HTML-726:Enable filtering by userRoles in EncounterProviderAndRoles tag --- .../htmlformentry/HtmlFormEntryUtil.java | 27 ++++++- .../tag/EncounterProviderAndRoleTag.java | 16 ++++- .../ProviderAjaxAutoCompleteWidget.java | 12 +++- .../EncounterProviderAndRoleTagTest.java | 72 +++++++++++++++++-- ...roviderAndRoleTagWithUserRoleAttribute.xml | 6 ++ ...oviderAndRoleTagWithUserRolesAttribute.xml | 6 ++ .../include/userRoles-dataset.xml | 38 ++++++++++ .../controller/ProviderSearchController.java | 23 +++--- .../main/webapp/resources/htmlFormEntry.js | 6 +- 9 files changed, 183 insertions(+), 23 deletions(-) create mode 100644 api/src/test/resources/org/openmrs/module/htmlformentry/include/encounterProviderAndRoleTagWithUserRoleAttribute.xml create mode 100644 api/src/test/resources/org/openmrs/module/htmlformentry/include/encounterProviderAndRoleTagWithUserRolesAttribute.xml create mode 100644 api/src/test/resources/org/openmrs/module/htmlformentry/include/userRoles-dataset.xml diff --git a/api/src/main/java/org/openmrs/module/htmlformentry/HtmlFormEntryUtil.java b/api/src/main/java/org/openmrs/module/htmlformentry/HtmlFormEntryUtil.java index 5efe1b394..43b9d6119 100644 --- a/api/src/main/java/org/openmrs/module/htmlformentry/HtmlFormEntryUtil.java +++ b/api/src/main/java/org/openmrs/module/htmlformentry/HtmlFormEntryUtil.java @@ -39,6 +39,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; @@ -71,8 +72,11 @@ import org.openmrs.ProgramWorkflow; import org.openmrs.ProgramWorkflowState; import org.openmrs.Provider; +import org.openmrs.Role; import org.openmrs.User; import org.openmrs.api.APIException; +import org.openmrs.api.ProviderService; +import org.openmrs.api.UserService; import org.openmrs.api.context.Context; import org.openmrs.messagesource.MessageSourceService; import org.openmrs.module.htmlformentry.FormEntryContext.Mode; @@ -1463,7 +1467,7 @@ private static Obs returnObsCopy(Obs obsToCopy, Map replacements) thro */ private static Object returnOrderCopy(Order source, Map replacementOrders) throws Exception { Object ret = returnCopy(source); - replacementOrders.put((Order) ret, (Order) source); + replacementOrders.put((Order) ret, source); return ret; } @@ -1996,8 +2000,7 @@ public static String getArchiveDirPath() { String value = Context.getAdministrationService().getGlobalProperty("htmlformentry.archiveDir"); if (value != null && org.springframework.util.StringUtils.hasLength(value)) { - //Replace %Y and %M if any - Date today = new Date(); + new Date(); GregorianCalendar gCal = new GregorianCalendar(); value = value.replace("%Y", String.valueOf(gCal.get(Calendar.YEAR))); value = value.replace("%y", String.valueOf(gCal.get(Calendar.YEAR))); @@ -2224,6 +2227,24 @@ private static Object getProviderRoleByUuid(String providerRoleUuid) { } + public static ArrayList getProviderByUserRoles(List userRoles) { + Set providersByUserRoles = new HashSet(); + UserService userService = Context.getUserService(); + ProviderService providerService = Context.getProviderService(); + for (String userRole : userRoles) { + Role role = userService.getRole(userRole); + List usersByRole = userService.getUsersByRole(role); + for (User user : usersByRole) { + Person person = user.getPerson(); + Collection providersByPerson = providerService.getProvidersByPerson(person); + if (!CollectionUtils.isEmpty(providersByPerson)) { + providersByUserRoles.add(providersByPerson.iterator().next()); + } + } + } + return new ArrayList(providersByUserRoles); + } + public static List getProviders(List providerRoles) { if (providerRoles == null || providerRoles.size() == 0) { diff --git a/api/src/main/java/org/openmrs/module/htmlformentry/tag/EncounterProviderAndRoleTag.java b/api/src/main/java/org/openmrs/module/htmlformentry/tag/EncounterProviderAndRoleTag.java index c1d97a6da..57e46f4f6 100644 --- a/api/src/main/java/org/openmrs/module/htmlformentry/tag/EncounterProviderAndRoleTag.java +++ b/api/src/main/java/org/openmrs/module/htmlformentry/tag/EncounterProviderAndRoleTag.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; +import org.apache.commons.collections.CollectionUtils; import org.openmrs.EncounterRole; import org.openmrs.Provider; import org.openmrs.module.htmlformentry.HtmlFormEntryUtil; @@ -42,6 +43,9 @@ public class EncounterProviderAndRoleTag { private List providerRoles; // Comma-separated list of roles to limit providers to + private List userRoles; // Comma-separated list of user roles to limit providers to; ignored if + // providerRoles are given + private MatchMode providerMatchMode; // For autocomplete, what match mode to use for searching private Provider defaultValue; // Can set to "currentuser" or a specific provider id/uuid @@ -60,14 +64,22 @@ public EncounterProviderAndRoleTag(Map parameters) { providerMatchMode = TagUtil.parseParameter(parameters, "providerMatchMode", MatchMode.class, MatchMode.ANYWHERE); defaultValue = TagUtil.parseParameter(parameters, "default", Provider.class); providerRoles = TagUtil.parseListParameter(parameters, "providerRoles", String.class); + userRoles = TagUtil.parseListParameter(parameters, "userRoles", String.class); if (!autocompleteProvider) { - providers = HtmlFormEntryUtil.getProviders(providerRoles, true); + + if (CollectionUtils.isNotEmpty(providerRoles)) { + providers = HtmlFormEntryUtil.getProviders(providerRoles, true); + } else if (CollectionUtils.isNotEmpty(userRoles)) { + providers = HtmlFormEntryUtil.getProviderByUserRoles(userRoles); + } else { + providers = HtmlFormEntryUtil.getAllProviders(); + } } } public Widget instantiateProviderWidget() { if (isAutocompleteProvider()) { - return new ProviderAjaxAutoCompleteWidget(getProviderMatchMode(), providerRoles); + return new ProviderAjaxAutoCompleteWidget(getProviderMatchMode(), providerRoles, userRoles); } else { return new ProviderWidget(providers); } diff --git a/api/src/main/java/org/openmrs/module/htmlformentry/widget/ProviderAjaxAutoCompleteWidget.java b/api/src/main/java/org/openmrs/module/htmlformentry/widget/ProviderAjaxAutoCompleteWidget.java index 101b622f9..26fe74881 100644 --- a/api/src/main/java/org/openmrs/module/htmlformentry/widget/ProviderAjaxAutoCompleteWidget.java +++ b/api/src/main/java/org/openmrs/module/htmlformentry/widget/ProviderAjaxAutoCompleteWidget.java @@ -15,6 +15,8 @@ public class ProviderAjaxAutoCompleteWidget implements Widget { private List providerRoles; + private final List userRoles; + private MatchMode matchMode; private Provider initialValue; @@ -31,9 +33,10 @@ public void setMatchMode(MatchMode matchMode) { } } - public ProviderAjaxAutoCompleteWidget(MatchMode matchMode, List providerRoles) { + public ProviderAjaxAutoCompleteWidget(MatchMode matchMode, List providerRoles, List userRoles) { setMatchMode(matchMode); this.providerRoles = providerRoles; + this.userRoles = userRoles; } @Override @@ -75,6 +78,13 @@ public String generateHtml(FormEntryContext context) { sb.append("\n"); + //Add hidden field for user roles + String csvUserRoles = StringUtils.collectionToCommaDelimitedString(userRoles); + String escapedCsvUserRoles = StringEscapeUtils.escapeJavaScript(csvUserRoles); + sb.append("\n"); + + sb.append(" tag @@ -459,7 +460,7 @@ public void encounterProviderAndRole_testWithProviderRoleAttribute() throws Exce // load the provider role specific test dataset executeDataSet("org/openmrs/module/htmlformentry/include/providerRoles-dataset.xml"); - final Date date = new Date(); + final Date date =new Date(); new RegressionTestHelper() { @Override @@ -483,5 +484,62 @@ public void testBlankFormHtml(String html) { }.run(); } - + + + @Test + public void encounterProviderAndRole_testWithSingleUserRoleAttribute() throws Exception { + + // load the user role specific test dataset + executeDataSet("org/openmrs/module/htmlformentry/include/userRoles-dataset.xml"); + + final Date date =new Date(); + new RegressionTestHelper() { + + @Override + protected String getXmlDatasetPath() { + return "org/openmrs/module/htmlformentry/include/"; + } + + @Override + public String getFormName() { + return "encounterProviderAndRoleTagWithUserRoleAttribute"; + } + + @Override + public void testBlankFormHtml(String html) { + TestUtil.assertFuzzyContains("Doctor", html); + + } + + }.run(); + } + + @Test + public void encounterProviderAndRole_testWithMultipleUserRolesAttribute() throws Exception { + + // load the user role specific test dataset + executeDataSet("org/openmrs/module/htmlformentry/include/userRoles-dataset.xml"); + + final Date date =new Date(); + new RegressionTestHelper() { + + @Override + protected String getXmlDatasetPath() { + return "org/openmrs/module/htmlformentry/include/"; + } + + @Override + public String getFormName() { + return "encounterProviderAndRoleTagWithUserRolesAttribute"; + } + + @Override + public void testBlankFormHtml(String html) { + TestUtil.assertFuzzyContains("Doctor", html); + TestUtil.assertFuzzyContains("Nurse", html); + } + + }.run(); + } + } diff --git a/api/src/test/resources/org/openmrs/module/htmlformentry/include/encounterProviderAndRoleTagWithUserRoleAttribute.xml b/api/src/test/resources/org/openmrs/module/htmlformentry/include/encounterProviderAndRoleTagWithUserRoleAttribute.xml new file mode 100644 index 000000000..98297b7b4 --- /dev/null +++ b/api/src/test/resources/org/openmrs/module/htmlformentry/include/encounterProviderAndRoleTagWithUserRoleAttribute.xml @@ -0,0 +1,6 @@ + + Date: + Location: + ProviderAndRole: + + \ No newline at end of file diff --git a/api/src/test/resources/org/openmrs/module/htmlformentry/include/encounterProviderAndRoleTagWithUserRolesAttribute.xml b/api/src/test/resources/org/openmrs/module/htmlformentry/include/encounterProviderAndRoleTagWithUserRolesAttribute.xml new file mode 100644 index 000000000..692bb506e --- /dev/null +++ b/api/src/test/resources/org/openmrs/module/htmlformentry/include/encounterProviderAndRoleTagWithUserRolesAttribute.xml @@ -0,0 +1,6 @@ + + Date: + Location: + ProviderAndRole: + + \ No newline at end of file diff --git a/api/src/test/resources/org/openmrs/module/htmlformentry/include/userRoles-dataset.xml b/api/src/test/resources/org/openmrs/module/htmlformentry/include/userRoles-dataset.xml new file mode 100644 index 000000000..8c2303046 --- /dev/null +++ b/api/src/test/resources/org/openmrs/module/htmlformentry/include/userRoles-dataset.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/omod/src/main/java/org/openmrs/module/htmlformentry/web/controller/ProviderSearchController.java b/omod/src/main/java/org/openmrs/module/htmlformentry/web/controller/ProviderSearchController.java index b3c942315..b735d8639 100644 --- a/omod/src/main/java/org/openmrs/module/htmlformentry/web/controller/ProviderSearchController.java +++ b/omod/src/main/java/org/openmrs/module/htmlformentry/web/controller/ProviderSearchController.java @@ -15,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import static java.util.Arrays.asList; + @Controller public class ProviderSearchController { @@ -22,17 +24,22 @@ public class ProviderSearchController { @ResponseBody public Object getProviders(@RequestParam(value = "searchParam", required = false) String searchParam, @RequestParam(value = "matchMode", required = false) MatchMode matchMode, - @RequestParam(value = "providerRoles", required = false) String providerRoles) throws Exception { + @RequestParam(value = "providerRoles", required = false) String providerRoles, + @RequestParam(value="userRoles", required=false) String userRoles + ) throws Exception { + + List providerList; - List providerRoleIds = new ArrayList(); if (StringUtils.isNotBlank(providerRoles)) { - for (String roleId : providerRoles.split(",")) { - providerRoleIds.add(roleId); - } + List providerRoleIds = asList(providerRoles.split(",")); + providerList = HtmlFormEntryUtil.getProviders(providerRoleIds, true); + }else if (StringUtils.isNotBlank(userRoles)){ + List userRolesList = asList(userRoles.split(",")); + providerList = HtmlFormEntryUtil.getProviderByUserRoles(userRolesList); + }else{ + providerList = HtmlFormEntryUtil.getAllProviders(); } - - List providerList = HtmlFormEntryUtil.getProviders(providerRoleIds, true); - + List stubs; if (searchParam == null) { stubs = HtmlFormEntryUtil.getProviderStubs(providerList); diff --git a/omod/src/main/webapp/resources/htmlFormEntry.js b/omod/src/main/webapp/resources/htmlFormEntry.js index e4e200a79..b3f9cadba 100644 --- a/omod/src/main/webapp/resources/htmlFormEntry.js +++ b/omod/src/main/webapp/resources/htmlFormEntry.js @@ -247,7 +247,8 @@ function setupProviderAutocomplete(element) { var hiddenField = jQuery("#"+element.id+"_hid"); var textField = jQuery(element); var providerMatchMode = jQuery("#"+element.id+"_matchMode_hid"); - var providerRoles = jQuery("#"+element.id+"_providerRoles_hid"); + var providerRoles = jQuery("#"+element.id+"_providerRoles_hid"); + var userRoles = jQuery("#"+element.id+"_userRoles_hid"); var select = false; if (hiddenField.length > 0 && textField.length > 0) { @@ -258,7 +259,8 @@ function setupProviderAutocomplete(element) { var urlParams = { "searchParam": textField.val(), "matchMode": providerMatchMode.val(), - "providerRoles": providerRoles.val() + "providerRoles": providerRoles.val(), + "userRoles": userRoles.val() }; jQuery.getJSON(url, urlParams, function(data) {