Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTML-726:Enable filtering by userRoles in EncounterProviderAndRoles tag #188

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -1463,7 +1467,7 @@ private static Obs returnObsCopy(Obs obsToCopy, Map<Obs, Obs> replacements) thro
*/
private static Object returnOrderCopy(Order source, Map<Order, Order> replacementOrders) throws Exception {
Object ret = returnCopy(source);
replacementOrders.put((Order) ret, (Order) source);
replacementOrders.put((Order) ret, source);
return ret;
}

Expand Down Expand Up @@ -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)));
Expand Down Expand Up @@ -2224,6 +2227,24 @@ private static Object getProviderRoleByUuid(String providerRoleUuid) {

}

public static ArrayList<Provider> getProviderByUserRoles(List<String> userRoles) {
Set<Provider> providersByUserRoles = new HashSet<Provider>();
UserService userService = Context.getUserService();
ProviderService providerService = Context.getProviderService();
for (String userRole : userRoles) {
Role role = userService.getRole(userRole);
List<User> usersByRole = userService.getUsersByRole(role);
for (User user : usersByRole) {
Person person = user.getPerson();
Collection<Provider> providersByPerson = providerService.getProvidersByPerson(person);
if (!CollectionUtils.isEmpty(providersByPerson)) {
providersByUserRoles.add(providersByPerson.iterator().next());
}
}
}
return new ArrayList<Provider>(providersByUserRoles);
}

public static List<Provider> getProviders(List<ProviderRole> providerRoles) {

if (providerRoles == null || providerRoles.size() == 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -42,6 +43,9 @@ public class EncounterProviderAndRoleTag {

private List<String> providerRoles; // Comma-separated list of roles to limit providers to

private List<String> 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
Expand All @@ -60,14 +64,22 @@ public EncounterProviderAndRoleTag(Map<String, String> 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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public class ProviderAjaxAutoCompleteWidget implements Widget {

private List<String> providerRoles;

private final List<String> userRoles;

private MatchMode matchMode;

private Provider initialValue;
Expand All @@ -31,9 +33,10 @@ public void setMatchMode(MatchMode matchMode) {
}
}

public ProviderAjaxAutoCompleteWidget(MatchMode matchMode, List<String> providerRoles) {
public ProviderAjaxAutoCompleteWidget(MatchMode matchMode, List<String> providerRoles, List<String> userRoles) {
setMatchMode(matchMode);
this.providerRoles = providerRoles;
this.userRoles = userRoles;
}

@Override
Expand Down Expand Up @@ -75,6 +78,13 @@ public String generateHtml(FormEntryContext context) {
sb.append("<input type='hidden' id='").append(context.getFieldName(this) + "_providerRoles_hid'");
sb.append(" value='").append(escapedCsvRoles).append("' />\n");

//Add hidden field for user roles
String csvUserRoles = StringUtils.collectionToCommaDelimitedString(userRoles);
String escapedCsvUserRoles = StringEscapeUtils.escapeJavaScript(csvUserRoles);
sb.append("<input type='hidden' id='").append(context.getFieldName(this)+"_userRoles_hid'");
sb.append(" value='").append(escapedCsvUserRoles).append("' />\n");


sb.append("<input name=\"" + context.getFieldName(this) + "_hid" + "\" id=\"");
sb.append(context.getFieldName(this) + "_hid" + "\"");
sb.append(" type=\"hidden\" class=\"autoCompleteHidden\" ");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@
*/
package org.openmrs.module.htmlformentry;

import junit.framework.Assert;
import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
Expand All @@ -24,10 +28,7 @@
import org.openmrs.test.BaseModuleContextSensitiveTest;
import org.springframework.mock.web.MockHttpServletRequest;

import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import junit.framework.Assert;

/**
* Integration test for the <encounterProviderAndRole/> tag
Expand Down Expand Up @@ -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();
Copy link
Member

@sherrif10 sherrif10 Jun 30, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gitcliff something small here with space but no effective

new RegressionTestHelper() {

@Override
Expand All @@ -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();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<htmlform>
Date: <encounterDate/>
Location: <encounterLocation/>
ProviderAndRole: <encounterProviderAndRole userRoles="Doctor"/>
<submit/>
</htmlform>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<htmlform>
Date: <encounterDate/>
Location: <encounterLocation/>
ProviderAndRole: <encounterProviderAndRole userRoles="Doctor,Nurse"/>
<submit/>
</htmlform>
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<dataset>

<role role="Doctor" description="This is a test role" uuid="94d62f4b-dd14-4597-be10-402def31094c"/>
<role role="Nurse" description="This is a test role" uuid="24v32d4b-dd14-4597-be10-402def31094c"/>
<role role="Surgeon" description="This is a test parent role" uuid="8de52b9e-e07d-4978-ba4a-a3828c13e482"/>
<role_role parent_role="Parent" child_role="Some Role" />
<role_role parent_role="Parent" child_role="Some Role To Delete" />

<person person_id="5505" gender="F" dead="false" creator="1" date_created="2008-08-15 15:46:47.0" voided="false" uuid="c4d125f7-5315-446c-9a45-c2f5e0fe96a8"/>
<person_name person_name_id="4" preferred="true" person_id="5505" given_name="Susy" middle_name=" " family_name="Kingman" creator="1" date_created="2005-01-01 00:00:00.0" voided="false" uuid="8d6142e2-f256-4fc7-a085-073646c66333"/>

<person person_id="5506" gender="M" dead="false" creator="1" date_created="2008-08-15 15:57:09.0" voided="false" uuid="4e7f6953-0f86-4702-a06b-17112e8f144b"/>
<person_name person_name_id="5" preferred="true" person_id="5506" given_name="Jack" middle_name=" " family_name="Black" creator="1" date_created="2005-01-01 00:00:00.0" voided="false" uuid="6fc41fe3-b01f-42a8-a825-547d779b27d5"/>

<person person_id="5507" gender="M" dead="false" creator="1" date_created="2008-08-15 15:57:09.0" voided="false" uuid="dc99369f-f88e-4d54-be56-100e1ff45cf0"/>
<person_name person_name_id="6" preferred="true" person_id="5507" given_name="Hank" middle_name=" " family_name="Williams" creator="1" date_created="2005-01-01 00:00:00.0" voided="false" uuid="642e1d7f-00b8-45db-9705-b68341e61782"/>

<person person_id="5508" gender="M" dead="false" creator="1" date_created="2008-08-15 15:57:09.0" voided="false" uuid="dc99369fbvjhbj-njhgvj97-vc6-0nn7"/>
<person_name person_name_id="7" preferred="true" person_id="5508" given_name="Super" middle_name=" " family_name="User" creator="1" date_created="2005-01-01 00:00:00.0" voided="false" uuid="6jhloijo-jhbjh877b-jghvky-m888hhy6"/>

<users user_id="5505" person_id="5505" system_id="6-7" username="incorrectlyhashedSha1" password="4a1750c8607dfa237de36c6305715c223415189" salt="c788c6ad82a157b712392ca695dfcf2eed193d7f" secret_question="" creator="1" date_created="2008-08-15 15:57:09.0" changed_by="1" date_changed="2008-08-18 11:51:56.0" retired="false" retire_reason="" uuid="013c49c6-e132-11de-babe-001e378eb67e"/>
<users user_id="5506" person_id="5506" system_id="7-5" username="correctlyhashedSha1" password="4a1750c8607d0fa237de36c6305715c223415189" salt="c788c6ad82a157b712392ca695dfcf2eed193d7f" secret_question="" creator="1" date_created="2008-08-15 15:57:09.0" changed_by="1" date_changed="2008-08-18 11:51:56.0" retired="false" retire_reason="" uuid="06d05314-e132-11de-babe-001e378eb67e"/>
<users user_id="5507" person_id="5507" system_id="8-3" username="userWithSha512Hash" password="74e3ed4f9e5b955de443feabc9f12ecd291ac6a7eaa2f09a72a5c811ec618b044d7131f687c0a0465fc0c660d09fd245e410e12ffe77d78b2a0c504b40afa202" salt="1c30292f0b438b49b181950f3e831c6a9f38ef1c7d559fca566e8cd6b4efb417150585d4c3345f0fb0b520fc0884ad82ea7c1a28f48c2c562106a3d110716cfc" secret_question="secret" secret_answer="answer" creator="1" date_created="2008-08-15 15:57:09.0" changed_by="1" date_changed="2008-08-18 11:51:56.0" retired="false" retire_reason="" uuid="0bc18050-e132-11de-babe-001e378eb67e"/>
<users user_id="5508" person_id="5508" system_id="9-9" username="userThatReplacesDaemonForAmbiguousUseCases" password="eeeda5c0cc3837151b2d61cfeab54a91kjbkjb88" salt="42af4c437a47cd778a54flh6gy" secret_question="" secret_answer="" creator="1" date_created="2008-08-15 15:57:09.0" changed_by="1" date_changed="2008-08-18 11:51:56.0" retired="false" retire_reason="" uuid="0bc18050-e132-11de-11kb-hjhh87hui"/>

<user_role user_id="5505" role="Doctor" />
<user_role user_id="5506" role="Nurse" />
<user_role user_id="5507" role="Surgeon" />

<provider provider_id="1003" person_id="5505" identifier="2a5" creator="1" date_created="2005-01-01 00:00:00.0" retired="false" uuid="da7f533f-cca9-11e0-9572-0800200c9a66" />
<provider provider_id="1004" person_id="5506" identifier="2a6" creator="1" date_created="2005-01-01 00:00:00.0" retired="false" uuid="da7f573f-cca9-11e0-9572-0800200c9a66" />
<provider provider_id="1005" person_id="5507" identifier="2a7" creator="1" date_created="2005-01-01 00:00:00.0" retired="false" uuid="da7f513f-cca9-11e0-9572-0800200c9a66" />




</dataset>
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,31 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import static java.util.Arrays.asList;

@Controller
public class ProviderSearchController {

@RequestMapping("/module/htmlformentry/providers")
@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<Provider> providerList;

List<String> providerRoleIds = new ArrayList<String>();
if (StringUtils.isNotBlank(providerRoles)) {
for (String roleId : providerRoles.split(",")) {
providerRoleIds.add(roleId);
}
List<String> providerRoleIds = asList(providerRoles.split(","));
providerList = HtmlFormEntryUtil.getProviders(providerRoleIds, true);
}else if (StringUtils.isNotBlank(userRoles)){
List<String> userRolesList = asList(userRoles.split(","));
providerList = HtmlFormEntryUtil.getProviderByUserRoles(userRolesList);
}else{
providerList = HtmlFormEntryUtil.getAllProviders();
}

List<Provider> providerList = HtmlFormEntryUtil.getProviders(providerRoleIds, true);


List<ProviderStub> stubs;
if (searchParam == null) {
stubs = HtmlFormEntryUtil.getProviderStubs(providerList);
Expand Down
6 changes: 4 additions & 2 deletions omod/src/main/webapp/resources/htmlFormEntry.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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) {
Expand Down