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