From acac327104042c6fc3d8512be6016300c3107878 Mon Sep 17 00:00:00 2001 From: Chi Bong Ho Date: Mon, 8 Jun 2026 16:32:07 -0400 Subject: [PATCH 1/3] HTML-885: Add a way to input provider obs with autocomplete search --- .../htmlformentry/HtmlFormEntryUtilTest.java | 15 ++++ .../htmlformentry/HtmlFormEntryUtil.java | 2 + .../element/ObsSubmissionElement.java | 73 ++++++++++++------- .../controller/ProviderSearchController.java | 4 + 4 files changed, 66 insertions(+), 28 deletions(-) diff --git a/api-tests/src/test/java/org/openmrs/module/htmlformentry/HtmlFormEntryUtilTest.java b/api-tests/src/test/java/org/openmrs/module/htmlformentry/HtmlFormEntryUtilTest.java index b2f504b83..d1bdb6e27 100644 --- a/api-tests/src/test/java/org/openmrs/module/htmlformentry/HtmlFormEntryUtilTest.java +++ b/api-tests/src/test/java/org/openmrs/module/htmlformentry/HtmlFormEntryUtilTest.java @@ -1114,6 +1114,21 @@ public void stringToDocument_shouldNotAccessFilesystemResources() throws java.io } + @Test + @Verifies(value = "shouldSetValueTextToProviderIdGivenAProvider", method = "createObs(Concept concept, Object value, Date datetime, String accessionNumber)") + public void createObs_shouldSetValueTextToProviderIdGivenAProvider() { + Provider provider = new Provider(); + provider.setId(42); + + Concept c = new Concept(); + ConceptDatatype cd = new ConceptDatatype(); + cd.setUuid("8d4a4ab4-c2cc-11de-8d13-0010c6dffd0f"); + c.setDatatype(cd); + + Obs o = HtmlFormEntryUtil.createObs(c, provider, null, null); + Assert.assertEquals("42", o.getValueText()); + } + @Test @Verifies(value = "shouldSetTheValueComplexOfObsIfConceptIsComplex", method = "createObs(Concept concept, Object value, Date datetime, String accessionNumber)") public void createObs_shouldSetTheValueComplexOfObsIfConceptIsComplex() { 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 8a6a8d94e..043a29b18 100644 --- a/api/src/main/java/org/openmrs/module/htmlformentry/HtmlFormEntryUtil.java +++ b/api/src/main/java/org/openmrs/module/htmlformentry/HtmlFormEntryUtil.java @@ -282,6 +282,8 @@ public static Obs createObs(Concept concept, Object value, Date datetime, String } else if (value instanceof Person) { Person person = (Person) value; obs.setValueText(person.getId().toString() + " - " + person.getPersonName().toString()); + } else if (value instanceof Provider) { + obs.setValueText(((Provider) value).getId().toString()); } else { obs.setValueText(value.toString()); } diff --git a/api/src/main/java/org/openmrs/module/htmlformentry/element/ObsSubmissionElement.java b/api/src/main/java/org/openmrs/module/htmlformentry/element/ObsSubmissionElement.java index a17264de4..e941311c2 100644 --- a/api/src/main/java/org/openmrs/module/htmlformentry/element/ObsSubmissionElement.java +++ b/api/src/main/java/org/openmrs/module/htmlformentry/element/ObsSubmissionElement.java @@ -30,8 +30,10 @@ import org.openmrs.module.htmlformentry.widget.ConceptSearchAutocompleteWidget; import org.openmrs.module.htmlformentry.widget.DateTimeWidget; import org.openmrs.module.htmlformentry.widget.DateWidget; +import org.openmrs.module.htmlformentry.util.MatchMode; import org.openmrs.module.htmlformentry.widget.DropdownWidget; import org.openmrs.module.htmlformentry.widget.DynamicAutocompleteWidget; +import org.openmrs.module.htmlformentry.widget.ProviderAjaxAutoCompleteWidget; import org.openmrs.module.htmlformentry.widget.ErrorWidget; import org.openmrs.module.htmlformentry.widget.NumberFieldWidget; import org.openmrs.module.htmlformentry.widget.Option; @@ -241,7 +243,7 @@ else if (conceptId == null && conceptIds == null) isLocationObs = "location".equals(parameters.get("style")) || "location_radio".equals(parameters.get("style")) || "location_dropdown".equals(parameters.get("style")); isProviderObs = "provider".equals(parameters.get("style")) || "provider_radio".equals(parameters.get("style")) - || "provider_dropdown".equals(parameters.get("style")); + || "provider_dropdown".equals(parameters.get("style")) || "provider_autocomplete".equals(parameters.get("style")); isRadioSet = "radio".equals(parameters.get("style")) || "location_radio".equals(parameters.get("style")) || "provider_radio".equals(parameters.get("style")); @@ -565,19 +567,6 @@ private void prepareWidgets(T context, Map parameters) { } // configure the special obs type that allows selection of a provider (the provider_id PK is stored as the valueText) else if (isProviderObs) { - if (isRadioSet) { - valueWidget = new RadioButtonsWidget(); - if (answerSeparator != null) { - ((RadioButtonsWidget) valueWidget).setAnswerSeparator(answerSeparator); - } - } else { // dropdown - valueWidget = new DropdownWidget(); - // if initialValueIsSet=false, no initial/default location, hence this shows the 'select input' field as first option - boolean initialValueIsSet = !(initialValue == null); - ((SingleOptionWidget) valueWidget).addOption( - new Option(Context.getMessageSourceService().getMessage("htmlformentry.chooseAProvider"), "", - !initialValueIsSet)); - } List roleIds = new ArrayList<>(); String roleParam = parameters.get("providerRoles"); if (StringUtils.isNotBlank(roleParam)) { @@ -585,20 +574,48 @@ else if (isProviderObs) { roleIds.add(roleId.trim()); } } - List providers = HtmlFormEntryUtil.getProviders(roleIds, true); - - List