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

GSoC 2019: Patient Search Criteria Module #216

Closed
wants to merge 1 commit into from
Closed
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
8 changes: 6 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
language: java
jdk:
- oraclejdk8
- openjdk8
addons:
firefox: "43.0"
cache:
directories:
- .autoconf
- $HOME/.m2
install:
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
- tar -xjf /tmp/firefox-43.0.tar.bz2 --directory /tmp
- export PATH="/tmp/firefox:$PATH"
script: mvn clean install
script: mvn clean install -q
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ public class EncounterDiagnosesElement implements HtmlGeneratorElement, FormSubm
private String diagnosisConceptSources;

private String preferredCodingSource;

private String diagnosisConceptClasses;

private EmrApiProperties emrApiProperties;

Expand Down Expand Up @@ -141,9 +143,12 @@ public String generateHtml(FormEntryContext context) {
Map<String, Object> fragmentConfig = new HashMap<String, Object>();
fragmentConfig.put("formFieldName", "encounterDiagnoses");
fragmentConfig.put("existingDiagnoses", existingDiagnoses);
fragmentConfig.put("diagnosisSets", validateAndFormat(diagnosisSets));
// Parse '0' to config attribute if specified such that null value can be used during the search in 'DiagnosesFragmentController' class
fragmentConfig.put("diagnosisSets", "0".equals(diagnosisSets) ? "0" : validateAndFormat(diagnosisSets));

fragmentConfig.put("preferredCodingSource", preferredCodingSource);
fragmentConfig.put("diagnosisConceptSources", StringUtils.deleteWhitespace(diagnosisConceptSources));
fragmentConfig.put("diagnosisConceptClasses", StringUtils.deleteWhitespace(diagnosisConceptClasses));

// add the prior diagnoses if requested
if (FormEntryContext.Mode.ENTER == context.getMode() && dispositionTypeForPriorDiagnoses != null) {
Expand Down Expand Up @@ -181,8 +186,8 @@ public String generateHtml(FormEntryContext context) {
* @throws IllegalArgumentException if one or more sets cannot be fetched from the database.
*/
private String validateAndFormat(String diagnosisSetIds) {
if ("".equals(diagnosisSetIds)) {
return diagnosisSetIds;
if (diagnosisSetIds == null) {
return null;
}
List<Concept> concepts = new ArrayList<Concept>();
for (StringTokenizer st = new StringTokenizer(diagnosisSetIds, ","); st.hasMoreTokens();) {
Expand Down Expand Up @@ -430,6 +435,14 @@ public void setPreferredCodingSource(String preferredCodingSource) {
public String getPreferredCodingSource() {
return preferredCodingSource;
}

public void setDiagnosisConceptClasses(String diagnosisConceptClasses) {
this.diagnosisConceptClasses = diagnosisConceptClasses;
}

public String getDiagnosisConceptClasses() {
return diagnosisConceptClasses;
}

public void setUiUtils(UiUtils uiUtils) {
this.uiUtils = uiUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ public class EncounterDiagnosesElement implements HtmlGeneratorElement, FormSubm
private String diagnosisSets;

private String diagnosisConceptSources;

private String diagnosisConceptClasses;

private AdtService adtService;

Expand Down Expand Up @@ -120,9 +122,12 @@ public String generateHtml(FormEntryContext context) {
Map<String, Object> fragmentConfig = new HashMap<String, Object>();
fragmentConfig.put("formFieldName", "encounterDiagnoses");
fragmentConfig.put("existingDiagnoses", existingDiagnoses);
fragmentConfig.put("diagnosisSets", validateAndFormat(diagnosisSets));
// Parse '0' to config attribute if specified such that null value can be used during the search in 'DiagnosesFragmentController' class
fragmentConfig.put("diagnosisSets", "0".equals(diagnosisSets) ? "0" : validateAndFormat(diagnosisSets));

fragmentConfig.put("preferredCodingSource", preferredCodingSource);
fragmentConfig.put("diagnosisConceptSources", StringUtils.deleteWhitespace(diagnosisConceptSources));
fragmentConfig.put("diagnosisConceptClasses", StringUtils.deleteWhitespace(diagnosisConceptClasses));

// add the prior diagnoses if requested
if (FormEntryContext.Mode.ENTER == context.getMode() && dispositionTypeForPriorDiagnoses != null) {
Expand Down Expand Up @@ -160,8 +165,8 @@ public String generateHtml(FormEntryContext context) {
* @throws IllegalArgumentException if one or more sets cannot be fetched from the database.
*/
private String validateAndFormat(String diagnosisSetIds) {
if (StringUtils.isEmpty(diagnosisSetIds)) {
return "";
if (diagnosisSetIds == null) {
return null;
}
List<Concept> concepts = new ArrayList<Concept>();
for (StringTokenizer st = new StringTokenizer(diagnosisSetIds, ","); st.hasMoreTokens();) {
Expand Down Expand Up @@ -379,6 +384,14 @@ public void setPreferredCodingSource(String preferredCodingSource) {
public String getPreferredCodingSource() {
return preferredCodingSource;
}

public void setDiagnosisConceptClasses(String diagnosisConceptClasses) {
this.diagnosisConceptClasses = diagnosisConceptClasses;
}

public String getDiagnosisConceptClasses() {
return diagnosisConceptClasses;
}

public void setUiUtils(UiUtils uiUtils) {
this.uiUtils = uiUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ public class EncounterDiagnosesByObsElement implements HtmlGeneratorElement, For
private String diagnosisConceptSources;

private String preferredCodingSource;

private String diagnosisConceptClasses;

private AdtService adtService;

Expand Down Expand Up @@ -120,9 +122,12 @@ public String generateHtml(FormEntryContext context) {
Map<String, Object> fragmentConfig = new HashMap<String, Object>();
fragmentConfig.put("formFieldName", "encounterDiagnoses");
fragmentConfig.put("existingDiagnoses", existingDiagnoses);
fragmentConfig.put("diagnosisSets", validateAndFormat(diagnosisSets));
// Parse '0' to config attribute if specified such that null value can be used during the search in 'DiagnosesFragmentController' class
fragmentConfig.put("diagnosisSets", "0".equals(diagnosisSets) ? "0" : validateAndFormat(diagnosisSets));

fragmentConfig.put("preferredCodingSource", preferredCodingSource);
fragmentConfig.put("diagnosisConceptSources", StringUtils.deleteWhitespace(diagnosisConceptSources));
fragmentConfig.put("diagnosisConceptClasses", StringUtils.deleteWhitespace(diagnosisConceptClasses));

// add the prior diagnoses if requested
if (FormEntryContext.Mode.ENTER == context.getMode() && dispositionTypeForPriorDiagnoses != null) {
Expand Down Expand Up @@ -160,8 +165,8 @@ public String generateHtml(FormEntryContext context) {
* @throws IllegalArgumentException if one or more sets cannot be fetched from the database.
*/
private String validateAndFormat(String diagnosisSetIds) {
if ("".equals(diagnosisSetIds)) {
return diagnosisSetIds;
if (diagnosisSetIds == null) {
return null;
}
List<Concept> concepts = new ArrayList<Concept>();
for (StringTokenizer st = new StringTokenizer(diagnosisSetIds, ","); st.hasMoreTokens();) {
Expand Down Expand Up @@ -379,6 +384,14 @@ public void setPreferredCodingSource(String preferredCodingSource) {
public String getPreferredCodingSource() {
return preferredCodingSource;
}

public void setDiagnosisConceptClasses(String diagnosisConceptClasses) {
this.diagnosisConceptClasses = diagnosisConceptClasses;
}

public String getDiagnosisConceptClasses() {
return diagnosisConceptClasses;
}

public void setUiUtils(UiUtils uiUtils) {
this.uiUtils = uiUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,9 @@ protected String getSubstitution(FormEntrySession session, FormSubmissionControl
element.setEmrApiProperties(emrApiProperties);
element.setConceptService(conceptService);
element.setAdtService(adtService);
element.setDiagnosisSets(attributes.get("diagnosisSets") != null ? attributes.get("diagnosisSets") : "");
element.setDiagnosisConceptSources(attributes.get("diagnosisConceptSources") != null ? attributes.get("diagnosisConceptSources") : "");
element.setDiagnosisSets(attributes.get("diagnosisSets"));
element.setDiagnosisConceptClasses(attributes.get("diagnosisConceptClasses"));
element.setDiagnosisConceptSources(attributes.get("diagnosisConceptSources"));
element.setPreferredCodingSource(attributes.get("preferredCodingSource") != null ? attributes.get("preferredCodingSource"): CoreAppsConstants.DEFAULT_CODING_SOURCE);

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,9 @@ protected String getSubstitution(FormEntrySession session, FormSubmissionControl
element.setEmrApiProperties(emrApiProperties);
element.setConceptService(conceptService);
element.setAdtService(adtService);
element.setDiagnosisSets(attributes.get("diagnosisSets") != null ? attributes.get("diagnosisSets") : "");
element.setDiagnosisConceptSources(attributes.get("diagnosisConceptSources") != null ? attributes.get("diagnosisConceptSources") : "");
element.setDiagnosisSets(attributes.get("diagnosisSets"));
element.setDiagnosisConceptClasses(attributes.get("diagnosisConceptClasses"));
element.setDiagnosisConceptSources(attributes.get("diagnosisConceptSources"));
element.setPreferredCodingSource(attributes.get("preferredCodingSource") != null ? attributes.get("preferredCodingSource"): CoreAppsConstants.DEFAULT_CODING_SOURCE);

/**
Expand Down
21 changes: 21 additions & 0 deletions omod/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@
<gem.path>${basedir}/.rubygems</gem.path>
</properties>

<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>

<dependencies>

<!--
Expand Down Expand Up @@ -255,6 +262,20 @@
<scope>provided</scope>
</dependency>

<!-- Patient search criteria module -->
<dependency>
<groupId>com.github.Reyano132.openmrs-module-patientsearchcriteria</groupId>
<artifactId>patientsearch-api</artifactId>
<version>v1.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.Reyano132.openmrs-module-patientsearchcriteria</groupId>
<artifactId>patientsearch-omod</artifactId>
<version>v1.0.0</version>
<scope>provided</scope>
</dependency>

</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@
package org.openmrs.module.coreapps.fragment.controller;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.openmrs.Concept;
import org.openmrs.ConceptClass;
import org.openmrs.ConceptName;
import org.openmrs.ConceptSearchResult;
import org.openmrs.ConceptSource;
Expand Down Expand Up @@ -50,49 +52,92 @@
*/
public class DiagnosesFragmentController {

private final static String USE_NULL_VALUE = "0";

/**
* Searches for diagnoses with names matching query in the specified 1) diagnosisSets, 2) diagnosisConceptSources and/or diagnosisConceptClasses
* If diagnosisSets or diagnosisConceptSources attributes are missing, default values specided by emrApiProperties are used.
* If '0' is specified for any of diagnosisSets or diagnosisConceptSources attributes, null is used for their corresponding values in the search.
*
* @param context
* @param ui
* @param emrApiProperties
* @param emrConceptService
* @param conceptService
* @param query
* @param diagnosisSetUuids
* @param diagnosisConceptSources
* @param diagnosisConceptClasses
* @param start
* @param size
* @return diagnoses search results
* @throws Exception
*/
public List<SimpleObject> search(UiSessionContext context,
UiUtils ui,
@SpringBean("emrApiProperties") EmrApiProperties emrApiProperties,
@SpringBean("emrConceptService") EmrConceptService emrConceptService,
@SpringBean("conceptService") ConceptService conceptService,
@RequestParam("term") String query,
@RequestParam(value = "diagnosisSets", defaultValue = "") String diagnosisSetUuids,
@RequestParam(value = "diagnosisConceptSources", defaultValue = "") String diagnosisConceptSources,
@RequestParam(value = "diagnosisSets", required = false) String diagnosisSetUuids,
@RequestParam(value = "diagnosisConceptSources", required = false) String diagnosisConceptSources,
@RequestParam(value = "diagnosisConceptClasses", required = false) String diagnosisConceptClasses,
@RequestParam(value = "start", defaultValue = "0") Integer start,
@RequestParam(value = "size", defaultValue = "50") Integer size) throws Exception {

List<ConceptClass> conceptClasses = new ArrayList<ConceptClass>();
if (StringUtils.isNotEmpty(diagnosisConceptClasses)) {
String [] conceptClassNames = diagnosisConceptClasses.split(",");
for (String className : conceptClassNames) {
ConceptClass conceptClass = conceptService.getConceptClassByName(className);
if (conceptClass != null) {
conceptClasses.add(conceptClass);
}
}
}
else {
conceptClasses = null;
}

Collection<Concept> diagnosisSets = new ArrayList<Concept>();
if (StringUtils.isNotEmpty(diagnosisSetUuids)) {
String [] setUuids = diagnosisSetUuids.split(",");
for (String setUuid : setUuids) {
Concept conceptSet = conceptService.getConceptByUuid(setUuid);
if (conceptSet != null) {
diagnosisSets.add(conceptSet);
}
if (USE_NULL_VALUE.equals(diagnosisSetUuids) ) {
diagnosisSets = null;
} else {
String [] setUuids = diagnosisSetUuids.split(",");
for (String setUuid : setUuids) {
Concept conceptSet = conceptService.getConceptByUuid(setUuid);
if (conceptSet != null) {
diagnosisSets.add(conceptSet);
}
}
}
}
else{
else {
diagnosisSets = emrApiProperties.getDiagnosisSets();
}

List<ConceptSource> sources = new ArrayList<ConceptSource>();

if (StringUtils.isNotEmpty(diagnosisConceptSources)) {
String [] sourceNames = diagnosisConceptSources.split(",");
for (String sourceName : sourceNames) {
ConceptSource source = conceptService.getConceptSourceByName(sourceName);
if (source != null) {
sources.add(source);
}
if (USE_NULL_VALUE.equals(diagnosisConceptSources) ) {
sources = null;
} else {
String [] sourceNames = diagnosisConceptSources.split(",");
for (String sourceName : sourceNames) {
ConceptSource source = conceptService.getConceptSourceByName(sourceName);
if (source != null) {
sources.add(source);
}
}
}
}
else{
else {
sources = emrApiProperties.getConceptSourcesForDiagnosisSearch();
}

Locale locale = context.getLocale();

List<ConceptSearchResult> hits = emrConceptService.conceptSearch(query, locale, null, diagnosisSets, sources, null);
List<ConceptSearchResult> hits = emrConceptService.conceptSearch(query, locale, conceptClasses, diagnosisSets, sources, null);
List<SimpleObject> ret = new ArrayList<SimpleObject>();
for (ConceptSearchResult hit : hits) {
ret.add(simplify(hit, ui, locale));
Expand All @@ -110,7 +155,7 @@ public List<SimpleObject> searchNonCoded(UiSessionContext context,
@RequestParam(value = "start", defaultValue = "0") Integer start,
@RequestParam(value = "size", defaultValue = "50") Integer size) throws Exception {

return search(context, ui, emrApiProperties, emrConceptService, conceptService, query, null, null, start, size);
return search(context, ui, emrApiProperties, emrConceptService, conceptService, query, null, null, null, start, size);
}

public FragmentActionResult codeDiagnosis(UiUtils ui,
Expand Down
19 changes: 17 additions & 2 deletions omod/src/main/webapp/fragments/conditionlist/conditions.gsp
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,28 @@
<div class="info-body">
<ul ng-repeat="conditionHistory in conditionHistoryList">
<li class="conditionStatus" ng-init="condition = conditionHistory.conditions[0]"
ng-show="condition.status === 'ACTIVE'">
ng-show="condition.status === 'ACTIVE' && condition.voided==false">
<span ng-style="strikeThrough(condition.voided)">{{condition.concept.name}}</span>
<i class="icon-remove delete-action" title="${ui.message("coreapps.delete")}"
ng-click="removeCondition(condition)" ng-if="condition.voided===false && '${hasModifyConditionsPrivilege}'"></i>
ng-click="conditionConfirmation(condition)" ng-if="condition.voided===false && '${hasModifyConditionsPrivilege}'"></i>
<i class="icon-undo delete-action" title="${ui.message("conditionui.undo")}"
ng-click="undoCondition(condition)" ng-if="condition.voided===true && '${hasModifyConditionsPrivilege}'"></i>
</li>
</ul>
</div>

<div id="remove-condition-dialog" class="dialog" style="display: none; position: absolute; left: 35%; top:30%;">
<div class="dialog-header">
<h3>${ ui.message("coreapps.conditionui.removeCondition") }</h3>
</div>
<div class="dialog-content">
<ul>
<li class="info">
<span id="removeConditionMessage">${ ui.message("coreapps.conditionui.removeCondition.message","")}</span>
</li>
</ul>
<button class="confirm right" type="submit" ng-click="removeCondition()">${ ui.message("general.yes") }</button>
<button class="cancel" ng-click="cancelDeletion()">${ ui.message("general.no") }</button>
</div>
</div>
</div>
Loading