Koha/koha-tmpl/intranet-tmpl/prog/js/patron-autocomplete.js
Pedro Amorim c93e7167f6
Bug 34083: Add searching for full term on patron auto-complete
To reproduce, on k-t-d:
1) Create a new patron of category 'School'
2) Enter 'Middle school high school' on the mandatory 'Name' field and put something in 'Card number:'
3) Visit patron lists at /cgi-bin/koha/patron_lists/lists.pl and click 'New patron list'
4) Put something in 'Name:' and click 'Save'
5) On the 'Patron search' input, enter 'middle school high school' slowly and observe the auto-complete behaviour
6) Notice how after you start typing the second word, the auto complete results vanish.
7) Apply patch, repeat plan and verify it now works as expected.

Signed-off-by: Sam Lau <samalau@gmail.com>
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
(cherry picked from commit a8e9b25d8e)
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
2023-07-17 15:34:16 +01:00

134 lines
4.9 KiB
JavaScript

function patron_autocomplete(node, options) {
let link_to;
let url_params;
let on_select_callback;
let leading_wildcard = defaultPatronSearchMethod === 'contains' ? '%' : '';
if ( options ) {
if ( options['link-to'] ) {
link_to = options['link-to'];
}
if ( options['url-params'] ) {
url_params = options['url-params'];
}
if ( options['on-select-callback'] ) {
on_select_callback = options['on-select-callback'];
}
}
return node.autocomplete({
source: function( request, response ) {
let q = []
// Add each pattern in search term for each search field
let pattern_subquery_and = [];
request.term.split(/[\s,]+/)
.filter(function(s){ return s.length })
.forEach(function(pattern,i){
let pattern_subquery_or = [];
defaultPatronSearchFields.split(',').forEach(function(field,i){
pattern_subquery_or.push(
{ ["me." + field]: { 'like': leading_wildcard + pattern + '%' } }
);
});
pattern_subquery_and.push(pattern_subquery_or);
});
q.push({ "-and": pattern_subquery_and });
// Add full search term for each search field
let term_subquery_or = [];
defaultPatronSearchFields.split(',').forEach(function (field, i) {
term_subquery_or.push(
{ ["me." + field]: { 'like': leading_wildcard + request.term + '%' } }
);
});
q.push({ "-or": term_subquery_or });
let params = {
'_page': 1,
'_per_page': 10,
'q': JSON.stringify(q),
'_order_by': '+me.surname,+me.firstname',
};
$.ajax({
data: params,
type: 'GET',
url: '/api/v1/patrons',
headers: {
"x-koha-embed": "library"
},
success: function(data) {
return response(data);
},
error: function(e) {
if ( e.state() != 'rejected' ) {
alert( __("An error occurred. Check the logs") );
}
return response();
}
});
},
minLength: 3,
select: function( event, ui ) {
if ( ui.item.link ) {
window.location.href = ui.item.link;
} else if ( on_select_callback ) {
return on_select_callback(event, ui);
}
},
focus: function( event, ui ) {
event.preventDefault(); // Don't replace the text field
},
})
.data( "ui-autocomplete" )
._renderItem = function( ul, item ) {
if ( link_to ) {
item.link = link_to == 'circ'
? "/cgi-bin/koha/circ/circulation.pl"
: link_to == 'reserve'
? "/cgi-bin/koha/reserve/request.pl"
: "/cgi-bin/koha/members/moremember.pl";
item.link += ( url_params ? '?' + url_params + '&' : "?" ) + 'borrowernumber=' + item.patron_id;
} else {
item.link = null;
}
var cardnumber = "";
if( item.cardnumber != "" ){
// Display card number in parentheses if it exists
cardnumber = " (" + item.cardnumber + ") ";
}
if( item.library_id == loggedInLibrary ){
loggedInClass = "ac-currentlibrary";
} else {
loggedInClass = "";
}
return $( "<li></li>" )
.addClass( loggedInClass )
.data( "ui-autocomplete-item", item )
.append(
""
+ ( item.link ? "<a href=\"" + item.link + "\">" : "<a>" )
+ ( item.surname ? item.surname.escapeHtml() : "" ) + ", "
+ ( item.firstname ? item.firstname.escapeHtml() : "" )
+ cardnumber.escapeHtml()
+ " <small>"
+ ( item.date_of_birth
? $date(item.date_of_birth)
+ "<span class=\"age_years\"> ("
+ $get_age(item.date_of_birth)
+ " "
+ __("years")
+ ")</span>,"
: ""
) + " "
+ $format_address(item, { no_line_break: true, include_li: false }) + " "
+ ( !singleBranchMode
?
"<span class=\"ac-library\">"
+ item.library.name.escapeHtml()
+ "</span>"
: "" )
+ "</small>"
+ "</a>" )
.appendTo( ul );
};
}