Bug 33117: Adding new PatronAutoCompleteSearchMethod system preference
[koha.git] / koha-tmpl / intranet-tmpl / prog / js / patron-autocomplete.js
1 function patron_autocomplete(node, options) {
2     let link_to;
3     let url_params;
4     let on_select_callback;
5     let leading_wildcard = patronAutoCompleteSearchMethod === 'contains' ? '%' : '';
6     if ( options ) {
7         if ( options['link-to'] ) {
8             link_to = options['link-to'];
9         }
10         if ( options['url-params'] ) {
11             url_params = options['url-params'];
12         }
13         if ( options['on-select-callback'] ) {
14             on_select_callback = options['on-select-callback'];
15         }
16     }
17     return node.autocomplete({
18         source: function( request, response ) {
19             let subquery_and = [];
20             request.term.split(/[\s,]+/)
21                 .filter(function(s){ return s.length })
22                 .forEach(function(pattern,i){
23                     let subquery_or = [];
24                     defaultPatronSearchFields.split(',').forEach(function(field,i){
25                         subquery_or.push(
26                             {["me."+field]: {'like': leading_wildcard + pattern + '%'}}
27                         );
28                     });
29                     subquery_and.push(subquery_or);
30                 });
31             let q = {"-and": subquery_and};
32             let params = {
33                 '_page': 1,
34                 '_per_page': 10,
35                 'q': JSON.stringify(q),
36                 '_order_by': '+me.surname,+me.firstname',
37             };
38             $.ajax({
39                 data: params,
40                 type: 'GET',
41                 url: '/api/v1/patrons',
42                 headers: {
43                     "x-koha-embed": "library"
44                 },
45                 success: function(data) {
46                     return response(data);
47                 },
48                 error: function(e) {
49                     if ( e.state() != 'rejected' ) {
50                         alert( __("An error occurred. Check the logs") );
51                     }
52                     return response();
53                 }
54             });
55         },
56         minLength: 3,
57         select: function( event, ui ) {
58             if ( ui.item.link ) {
59                 window.location.href = ui.item.link;
60             } else if ( on_select_callback ) {
61                 return on_select_callback(event, ui);
62             }
63         },
64         focus: function( event, ui ) {
65             event.preventDefault(); // Don't replace the text field
66         },
67     })
68     .data( "ui-autocomplete" )
69     ._renderItem = function( ul, item ) {
70         if ( link_to ) {
71             item.link = link_to == 'circ'
72                 ? "/cgi-bin/koha/circ/circulation.pl"
73                 : link_to == 'reserve'
74                     ? "/cgi-bin/koha/reserve/request.pl"
75                     : "/cgi-bin/koha/members/moremember.pl";
76             item.link += ( url_params ? '?' + url_params + '&' : "?" ) + 'borrowernumber=' + item.patron_id;
77         } else {
78             item.link = null;
79         }
80
81         var cardnumber = "";
82         if( item.cardnumber != "" ){
83             // Display card number in parentheses if it exists
84             cardnumber = " (" + item.cardnumber + ") ";
85         }
86         if( item.library_id == loggedInLibrary ){
87             loggedInClass = "ac-currentlibrary";
88         } else {
89             loggedInClass = "";
90         }
91         return $( "<li></li>" )
92         .addClass( loggedInClass )
93         .data( "ui-autocomplete-item", item )
94         .append(
95             ""
96             + ( item.link ? "<a href=\"" + item.link + "\">" : "<a>" )
97                 + ( item.surname ? item.surname.escapeHtml() : "" ) + ", "
98                 + ( item.firstname ? item.firstname.escapeHtml() : "" )
99                 + cardnumber.escapeHtml()
100                 + " <small>"
101                     + ( item.date_of_birth
102                         ?   $date(item.date_of_birth)
103                           + "<span class=\"age_years\"> ("
104                           + $get_age(item.date_of_birth)
105                           + " "
106                           + __("years")
107                           + ")</span>,"
108                         : ""
109                     ) + " "
110                     + $format_address(item, { no_line_break: true, include_li: false }) + " "
111                     + ( !singleBranchMode
112                         ?
113                               "<span class=\"ac-library\">"
114                             + item.library.name.escapeHtml()
115                             + "</span>"
116                         : "" )
117                 + "</small>"
118             + "</a>" )
119         .appendTo( ul );
120     };
121 }