Skip to content

Commit

Permalink
GSoC 2019: Patient search criteria module
Browse files Browse the repository at this point in the history
  • Loading branch information
Reyano132 committed Aug 23, 2019
1 parent 9e384c1 commit b1c6877
Show file tree
Hide file tree
Showing 4 changed files with 323 additions and 4 deletions.
23 changes: 23 additions & 0 deletions omod/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,15 @@
<gem.path>${basedir}/.rubygems</gem.path>
</properties>

<!-- Repository for patient search criteria -->
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>


<dependencies>

<!--
Expand Down Expand Up @@ -255,6 +264,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 @@ -93,6 +93,29 @@

<form method="get" id="patient-search-form" onsubmit="return false">
<input type="text" id="patient-search" placeholder="${ ui.message("coreapps.findPatient.search.placeholder") }" autocomplete="off" <% if (doInitialSearch) { %>value="${doInitialSearch}"<% } %>/><i id="patient-search-clear-button" class="small icon-remove-sign"></i>
<select id="patient-gender-search">
<option value="" selected>${ ui.message("coreapps.gender") }</option>
<option value="M">${ ui.message("coreapps.gender.M") }</option>
<option value="F">${ ui.message("coreapps.gender.F") }</option>
</select>
<input type="checkbox" id="getAgeAndBirthdateFilter" >Search with age or birthdate<br>

<div id="patient-search-age-birthdate" style="display:none">
<input type="radio" name ="patient-age-birthdate" value="patient-age"> Search by range of age
<br>
<input type="radio" name ="patient-age-birthdate" value="patient-birthdate"> Search by birthdate

<p id="patient-age-range-search" style="display:none">
<label>Range of Age</label>
From:<input type="text" id="patient-age-range-from" placeholder="From" maxlength="2" style="min-width: 5px" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
To:<input type="text" id="patient-age-range-to" placeholder="To" maxlength="2"
style="min-width: 5px" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
</p>

<p id="patient-birthdate-search" style="display:none">
Birthdate:<input type="date" id="patient-birthdate" style="min-width: 5px"/>
</p>
</div>
<% if(patientSearchExtensions){
patientSearchExtensions.each {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ function PatientSearchWidget(configuration){
var highlightedMouseRowIndex;
var searchDelayTimer;
var requestCount = 0;
var searchUrl = '/' + OPENMRS_CONTEXT_PATH + '/ws/rest/v1/patient';
var searchUrl = '/' + OPENMRS_CONTEXT_PATH + '/ws/rest/v1/patientsearch/patient';
var initialData = [];
var initialPatientData = [];
var initialPatientUuids = [];
Expand Down Expand Up @@ -140,7 +140,52 @@ function PatientSearchWidget(configuration){
searchOnIdentifierAndName(query, currRequestCount);
}
else {
searchOnExactIdentifierMatchThenIdentifierAndName(query, currRequestCount, autoSelectIfExactIdentifierMatch);
var gender_search=jq('#patient-gender-search').val();
var from_search=jq('#patient-age-range-from').val();
var to_search=jq('#patient-age-range-to').val();
var date_search;
if(jq('#patient-birthdate').val()!=''){
console.log('birth '+jq('#patient-birthdate').val());
date_search =new Date(jq('#patient-birthdate').val());
date_search.setHours(0);
date_search.setMinutes(0);
}


if(query==''){
if(gender_search!='' && from_search=='' && to_search=='' && jq('#patient-birthdate').val()==''){
searchOnGender(gender_search,currRequestCount);
} else if(gender_search=='' && from_search!='' && to_search !='' && jq('#patient-birthdate').val()==''){
searchOnRangeOfAge(from_search,to_search,currRequestCount);
}else if(gender_search=='' && jq('#patient-birthdate').val()!=''){
searchOnBirthdate(date_search.getTime(),currRequestCount);
}else if(gender_search!='' && from_search!='' && to_search!=''){
searchOnGenderAndRangeOfAge(gender_search,from_search,to_search,currRequestCount);
}else if(gender_search!='' && jq('#patient-birthdate').val()!=''){
searchOnGenderAndBirthdate(gender_search,date_search.getTime(),currRequestCount);
}else{
updateSearchResults();
}

}
else{
if(gender_search!=''){
if( from_search=='' && to_search=='' && jq('#patient-birthdate').val()==''){
searchOnIdentifierAndNameAndGender(query,gender_search,currRequestCount);
}else if(from_search!='' && to_search !=''){
searchOnIdentifierAndNameAndGenderAndRangeOfAge(query,gender_search,from_search,to_search,currRequestCount);
}else{
searchOnIdentifierAndNameAndGenderAndBirthdate(query,gender_search,date_search.getTime(),currRequestCount);
}
}else if(from_search!='' && to_search !=''){
searchOnIdentifierAndNameAndRangeOfAge(query,from_search,to_search,currRequestCount);
}else if(jq('#patient-birthdate').val()!=''){
searchOnIdentifierAndNameAndBirthdate(query,date_search.getTime(),currRequestCount);
}else{
searchOnExactIdentifierMatchThenIdentifierAndName(query, currRequestCount, autoSelectIfExactIdentifierMatch);
}
}

}
}

Expand Down Expand Up @@ -210,6 +255,136 @@ function PatientSearchWidget(configuration){
});
}

var searchOnIdentifierAndNameAndGender = function(query,gender_search,currRequestCount) {
emr.getJSON(searchUrl, {q: query, gender: gender_search, v: customRep })
.done(function(data) {
//late ajax responses should be ignored not to overwrite the latest
if(data && (!currRequestCount || currRequestCount >= requestCount)){
updateSearchResults(data.results);
}
})
.fail(function (jqXHR) {
failSearch();
});
}

var searchOnIdentifierAndNameAndRangeOfAge = function(query,from_search,to_search,currRequestCount) {
emr.getJSON(searchUrl, {q: query, from: from_search, to: to_search, v: customRep })
.done(function(data) {
//late ajax responses should be ignored not to overwrite the latest
if(data && (!currRequestCount || currRequestCount >= requestCount)){
updateSearchResults(data.results);
}
})
.fail(function (jqXHR) {
failSearch();
});
}

var searchOnIdentifierAndNameAndBirthdate = function(query,birthdate_search,currRequestCount) {
emr.getJSON(searchUrl, {q: query, birthdate: birthdate_search, v: customRep })
.done(function(data) {
//late ajax responses should be ignored not to overwrite the latest
if(data && (!currRequestCount || currRequestCount >= requestCount)){
updateSearchResults(data.results);
}
})
.fail(function (jqXHR) {
failSearch();
});
}

var searchOnIdentifierAndNameAndGenderAndRangeOfAge = function(query,gender_search,from_search,to_search,currRequestCount) {
emr.getJSON(searchUrl, {q: query, gender: gender_search, from: from_search, to: to_search, v: customRep })
.done(function(data) {
//late ajax responses should be ignored not to overwrite the latest
if(data && (!currRequestCount || currRequestCount >= requestCount)){
updateSearchResults(data.results);
}
})
.fail(function (jqXHR) {
failSearch();
});
}

var searchOnIdentifierAndNameAndGenderAndBirthdate = function(query,gender_search,birthdate_search,currRequestCount) {
emr.getJSON(searchUrl, {q: query, gender: gender_search, birthdate: birthdate_search, v: customRep })
.done(function(data) {
//late ajax responses should be ignored not to overwrite the latest
if(data && (!currRequestCount || currRequestCount >= requestCount)){
updateSearchResults(data.results);
}
})
.fail(function (jqXHR) {
failSearch();
});
}

var searchOnGenderAndRangeOfAge = function(gender_search,from_search,to_search,currRequestCount) {
emr.getJSON(searchUrl, {gender: gender_search, from: from_search, to: to_search, v: customRep })
.done(function(data) {
//late ajax responses should be ignored not to overwrite the latest
if(data && (!currRequestCount || currRequestCount >= requestCount)){
updateSearchResults(data.results);
}
})
.fail(function (jqXHR) {
failSearch();
});
}

var searchOnGenderAndBirthdate = function(gender_search,birthdate_search,currRequestCount) {
emr.getJSON(searchUrl, {gender: gender_search,birthdate: birthdate_search, v: customRep })
.done(function(data) {
//late ajax responses should be ignored not to overwrite the latest
if(data && (!currRequestCount || currRequestCount >= requestCount)){
updateSearchResults(data.results);
}
})
.fail(function (jqXHR) {
failSearch();
});
}

var searchOnGender = function(gender_search,currRequestCount) {
emr.getJSON(searchUrl, {gender: gender_search, v: customRep })
.done(function(data) {
//late ajax responses should be ignored not to overwrite the latest
if(data && (!currRequestCount || currRequestCount >= requestCount)){
updateSearchResults(data.results);
}
})
.fail(function (jqXHR) {
failSearch();
});
}

var searchOnRangeOfAge = function(from_search,to_search,currRequestCount) {
emr.getJSON(searchUrl, {from: from_search, to: to_search, v: customRep })
.done(function(data) {
//late ajax responses should be ignored not to overwrite the latest
if(data && (!currRequestCount || currRequestCount >= requestCount)){
updateSearchResults(data.results);
}
})
.fail(function (jqXHR) {
failSearch();
});
}

var searchOnBirthdate = function(birthdate_search,currRequestCount) {
emr.getJSON(searchUrl, {birthdate: birthdate_search, v: customRep })
.done(function(data) {
//late ajax responses should be ignored not to overwrite the latest
if(data && (!currRequestCount || currRequestCount >= requestCount)){
updateSearchResults(data.results);
}
})
.fail(function (jqXHR) {
failSearch();
});
}

var failSearch = function() {
performingSearch = false;
if (!currRequestCount || currRequestCount >= requestCount) {
Expand Down Expand Up @@ -244,6 +419,47 @@ function PatientSearchWidget(configuration){
}
this.reset = reset;

//Add age range and birthdate search

jq('#getAgeAndBirthdateFilter').click(function (event) {
if(this.checked){
jq('#patient-search-age-birthdate').css('display','block');
}else{
jq('#patient-search-age-birthdate').css('display','none');
jq( '#patient-age' ).prop( 'checked', false );
jq( '#patient-birthdate' ).prop( 'checked', false );
jq('#patient-age-range-from').val('');
jq('#patient-age-range-to').val('');
jq('input[type=date]').each( function resetDate(){
this.value = this.defaultValue;
} );
}
})


$("input[name='patient-age-birthdate']").change(function(){
var ageOrBirthdate= $("input[name='patient-age-birthdate']:checked").val()
if(ageOrBirthdate=="patient-age"){
jq('#patient-birthdate-search').css('display','none');
jq('#patient-age-range-search').css('display','block');
jq('input[type=date]').each( function resetDate(){
this.value = this.defaultValue;
} );
}
if(ageOrBirthdate=="patient-birthdate"){
jq('#patient-age-range-search').css('display','none');
jq('#patient-birthdate-search').css('display','block');
jq('#patient-age-range-from').val('');
jq('#patient-age-range-to').val('');
}
});

//for date type support to browsers
if ( jq('[type="date"]').prop('type') != 'date' ) {
jq('[type="date"]').datepicker();
}


var updateSearchResults = function(results){
var dataRows = [];
if(results){
Expand Down Expand Up @@ -595,6 +811,39 @@ function PatientSearchWidget(configuration){
clearSearch();
});

var searchByPatientSearchCriteria = function(){
cancelAnyExistingSearch();
var text=jq.trim(input.val());
var currentCount = ++requestCount;
var effectiveSearchDelay = config.searchDelayShort;
window.setTimeout(function(){
if(text=='' || text.length <= config.minSearchCharacters){
doSearch('', currentCount);
}else{
doSearch(text, currentCount);
}
}, effectiveSearchDelay);

}

jq('select').change( function(){
searchByPatientSearchCriteria();
});

jq('input[type="date"]').change(function(){
searchByPatientSearchCriteria();
});


jq('#patient-age-range-from').keyup(function(){
searchByPatientSearchCriteria();
});

jq('#patient-age-range-to').keyup(function(){
searchByPatientSearchCriteria();
});


input.keyup(function(event) {
var kc = event.keyCode;
//ignore enter(because it was handled already onkeydown), keyboard navigation and control keys
Expand Down
Loading

0 comments on commit b1c6877

Please sign in to comment.