Person p = HtmlFormEntryUtil.getPerson(s);
if (p == null) {
throw new RuntimeException("Cannot find Person: " + s);
}
String label = p.getPersonName().getFullName();
providerOptions.add(new Option(label, p.getId().toString(), false));
}
removeNonProviders(providerOptions);
}
// Only if specific person ids are not passed in do we get by user Role
if (providerOptions.isEmpty()) {
List<PersonStub> users = new ArrayList<PersonStub>();
List<Option> providerUsers = new ArrayList<Option>();
// If the "role" attribute is passed in, limit to users with this role
if (parameters.get("role") != null) {
Role role = Context.getUserService().getRole((String) parameters.get("role"));
if (role == null) {
throw new RuntimeException("Cannot find role: " + parameters.get("role"));
} else {
users = Context.getService(HtmlFormEntryService.class).getUsersAsPersonStubs(role.getRole());
}
}
// Otherwise, use default options appropriate to the underlying OpenMRS version
else {
if (openmrsVersionDoesNotSupportProviders()) {
// limit to users with the default OpenMRS PROVIDER role,
String defaultRole = OpenmrsConstants.PROVIDER_ROLE;
Role role = Context.getUserService().getRole(defaultRole);
if (role != null) {
users = Context.getService(HtmlFormEntryService.class).getUsersAsPersonStubs(role.getRole());
}
// If this role isn't used, default to all Users
if (users.isEmpty()) {
users = Context.getService(HtmlFormEntryService.class).getUsersAsPersonStubs(null);
}
} else {
// in OpenMRS 1.9+, get all suitable providers
users = getAllProvidersThatArePersonsAsPersonStubs();
}
}
for (PersonStub personStub : users) {
Option option = new Option(personStub.toString(), personStub.getId().toString(), false);
providerUsers.add(option);
}
providerOptions.addAll(providerUsers);
}
// Set default values as appropriate
Person defaultProvider = null;
Option defProviderOption;
if (context.getExistingEncounter() != null) {
defaultProvider = context.getExistingEncounter().getProvider();
// this is done to avoid default provider being added twice due to that it can be added from the
// users = getAllProvidersThatArePersonsAsPersonStubs(); section with selected="false", therefore this can't be caught when
// searching whether the options list contains the 'defaultProvider'
boolean defaultOptionPresent = false;
if(defaultProvider != null){
for(Option option: providerOptions){
if(option.getValue().equals(defaultProvider.getId().toString())){
defaultOptionPresent = true;
providerOptions.remove(option);
break;
}
}
}
if(defaultOptionPresent) {
defProviderOption
= new Option(defaultProvider.getPersonName().getFullName(), defaultProvider.getId().toString(), true);
providerOptions.add(defProviderOption);
}
} else {
String defParam = (String) parameters.get("default");
if (StringUtils.hasText(defParam)) {
if ("currentuser".equalsIgnoreCase(defParam)) {
defaultProvider = Context.getAuthenticatedUser().getPerson();
} else {
defaultProvider = HtmlFormEntryUtil.getPerson(defParam);
}
if (defaultProvider == null) {
throw new IllegalArgumentException("Invalid default provider specified for encounter: " + defParam);
} else {
defProviderOption
= new Option(defaultProvider.getPersonName().getFullName(), defaultProvider.getId().toString(), true);
for (Option option : providerOptions) {
if (option.getValue().equals(defProviderOption.getValue())) {
providerOptions.remove(option);
break;
}
}
providerOptions.add(defProviderOption);
}
}
}
if (defaultProvider != null) {
providerWidget.setInitialValue(new PersonStub(defaultProvider));
}
Collections.sort(providerOptions,new OptionComparator());
if (("autocomplete").equals(parameters.get("type"))) {
providerWidget.addOption(new Option());
if (!providerOptions.isEmpty()) {
providerWidget.setOptions(providerOptions);
}
} else {
// if initialValueIsSet=false, no initial/default provider, hence this shows the 'select input' field as first option
boolean initialValueIsSet = !(providerWidget.getInitialValue() == null);
providerWidget.addOption(new Option
(Context.getMessageSourceService().getMessage("htmlformentry.chooseAProvider"), "", !initialValueIsSet)); // if no initial or default value
if (!providerOptions.isEmpty()) {
for (Option option : providerOptions) {
providerWidget.addOption(option);
}
}
}
context.registerWidget(providerWidget);
context.registerErrorWidget(providerWidget, providerErrorWidget);
}
if (Boolean.TRUE.equals(parameters.get("encounterType"))) {
encounterTypeWidget = new EncounterTypeWidget();
encounterTypeErrorWidget = new ErrorWidget();
if (parameters.get("types") != null) {
List<EncounterType> encounterTypes = new ArrayList<EncounterType>();
String[] temp = ((String) parameters.get("types")).split(",");
for (String s : temp) {
EncounterType type = HtmlFormEntryUtil.getEncounterType(s);
if (type == null) {
throw new RuntimeException("Cannot find encounter type: " + s);
}
encounterTypes.add(type);
}
encounterTypeWidget.setOptions(encounterTypes);
}
// Set default values
EncounterType defaultEncounterType = null;
if (context.getExistingEncounter() != null) {
defaultEncounterType = context.getExistingEncounter().getEncounterType();
} else {
String defaultTypeId = (String) parameters.get("default");
if (StringUtils.hasText(defaultTypeId)) {
defaultEncounterType = HtmlFormEntryUtil.getEncounterType(defaultTypeId);
}
}
encounterTypeWidget.setInitialValue(defaultEncounterType);
context.registerWidget(encounterTypeWidget);
context.registerErrorWidget(encounterTypeWidget, encounterTypeErrorWidget);
}
// Register Location widgets, if appropriate
if (Boolean.TRUE.equals(parameters.get("location"))) {
locationErrorWidget = new ErrorWidget();
List<Location> locations = new ArrayList<Location>();
List<Option> locationOptions = new ArrayList<Option>();
if ("autocomplete".equals(parameters.get("type"))) {
locationWidget = new AutocompleteWidget(Location.class);
} else {
locationWidget = new DropdownWidget();
}
if (parameters.get("tags") != null && parameters.get("orders") != null) {
throw new RuntimeException("Using both \"order\" and \"tags\" attribute in an encounterLocation tag is not currently supported");
}
// if the "tags" attribute has been specified, load all the locations referenced by tag
if (parameters.get("tags") != null) {
List<LocationTag> tags = new ArrayList<LocationTag>();
String temp[] = ((String) parameters.get("tags")).split(",");
for (String s : temp) {
LocationTag tag = HtmlFormEntryUtil.getLocationTag(s);
if (tag == null) {
throw new RuntimeException("Cannot find tag: " + tag);
}
tags.add(tag);
}
locations.addAll(Context.getLocationService().getLocationsHavingAnyTag(tags));
}
// If the "order" attribute is passed in, limit to the specified locations in order
else if (parameters.get("order") != null) {
String[] temp = ((String) parameters.get("order")).split(",");
for (String s : temp) {
Location loc = HtmlFormEntryUtil.getLocation(s, context);
if (loc == null) {
throw new RuntimeException("Cannot find location: " + loc);
}
locations.add(loc);
}
}
// if no locations have been specified by the order attribute, use all non-retired locations
if (locations.isEmpty()) {
locations = Context.getLocationService().getAllLocations(false);
}
// Set default values
Location defaultLocation = null;
if (context.getExistingEncounter() != null) {
defaultLocation = context.getExistingEncounter().getLocation();
} else {
String defaultLocId = (String) parameters.get("default");
if (StringUtils.hasText(defaultLocId)) {
defaultLocation = HtmlFormEntryUtil.getLocation(defaultLocId, context);
}
}
defaultLocation = defaultLocation == null ? context.getDefaultLocation() : defaultLocation;
locationWidget.setInitialValue(defaultLocation);
// if in EDIT mode, make sure that the default/selected location is one of the location options, so we don't accidentally lose it
if (defaultLocation != null && context.getMode().equals(Mode.EDIT)) {
if (!locations.contains(defaultLocation)) {
locations.add(defaultLocation);
}
}
// now create the actual location options
for (Location location : locations) {
String label = HtmlFormEntryUtil.format(location);
Option option = new Option(label, location.getId().toString(), location.equals(defaultLocation));
locationOptions.add(option);
}
// sort options (if a specific order hasn't been specified
if (parameters.get("order") == null) {
Collections.sort(locationOptions, new OptionComparator());
}
if ("autocomplete".equals(parameters.get("type"))) {
locationWidget.addOption(new Option());
if (!locationOptions.isEmpty()) {
locationWidget.setOptions(locationOptions);
}
} else {
boolean initialValueIsSet = !(locationWidget.getInitialValue() == null);
locationWidget.addOption(new Option
(Context.getMessageSourceService().getMessage("htmlformentry.chooseALocation"), "", !initialValueIsSet));
if (!locationOptions.isEmpty()) {
for (Option option : locationOptions)
locationWidget.addOption(option);
}