| Lines 1-6
          
      
      
        Link Here | 
        
          | 1 | [% USE Koha %] | 1 | [% USE Koha %] | 
            
              |  |  | 2 | [% USE I18N %] | 
        
          | 2 | [% USE Branches %] | 3 | [% USE Branches %] | 
        
          | 3 | [% USE raw %] | 4 | [% USE raw %] | 
            
              |  |  | 5 | [% USE Asset %] | 
        
          | 4 | [% USE To %] | 6 | [% USE To %] | 
        
          | 5 |  | 7 |  | 
        
          | 6 | [% BLOCK patron_search_filters_simple  %] | 8 | [% BLOCK patron_search_filters_simple  %] | 
  
    | Lines 18-29
          
      
      
        Link Here | 
        
          | 18 |             <ol> | 20 |             <ol> | 
        
          | 19 |                 <li> | 21 |                 <li> | 
        
          | 20 |                     <label for="search_patron_filter">Search:</label> | 22 |                     <label for="search_patron_filter">Search:</label> | 
            
              | 21 |                     <div class="hint">Enter patron card number or partial name:</div> |  |  | 
        
          | 22 |                     <input type="text" id="search_patron_filter" value="[% search_filter | html %]" class="focus" /> | 23 |                     <input type="text" id="search_patron_filter" value="[% search_filter | html %]" class="focus" /> | 
        
          | 23 |                 </li> | 24 |                 </li> | 
        
          | 24 |  | 25 |  | 
          
            
              | 25 |                 [% FOR column IN columns %] | 26 |                 [% FOR f IN filters %] | 
            
              | 26 |                     [% SWITCH column %] | 27 |                     [% SWITCH f %] | 
        
          | 27 |                     [% CASE 'branch' %] | 28 |                     [% CASE 'branch' %] | 
        
          | 28 |                         <li> | 29 |                         <li> | 
        
          | 29 |                             <label for="branchcode_filter">Library:</label> | 30 |                             <label for="branchcode_filter">Library:</label> | 
  
    | Lines 47-57
          
      
      
        Link Here | 
        
          | 47 |                                 [% END %] | 48 |                                 [% END %] | 
        
          | 48 |                             </select> | 49 |                             </select> | 
        
          | 49 |                         </li> | 50 |                         </li> | 
            
              |  |  | 51 |                     [% CASE 'search_field' %] | 
            
              | 52 |                         <li> | 
            
              | 53 |                             <label for="searchfieldstype_filter">Search field:</label> | 
            
              | 54 |                             <select name="searchfieldstype" id="searchfieldstype_filter"> | 
            
              | 55 |                                 [% pref_fields = Koha.Preference('DefaultPatronSearchFields').split(',') %] | 
            
              | 56 |                                 [% default_fields = [ 'surname,firstname,othernames,cardnumber,userid', 'surname', 'cardnumber', 'email', 'borrowernumber', 'userid', 'phone', 'address', 'dateofbirth', 'sort1', 'sort2' ] %] | 
            
              | 57 |                                 [% search_options = default_fields.merge(pref_fields).unique %] | 
            
              | 58 |                                 [% FOREACH s_o IN search_options %] | 
            
              | 59 |                                     [% display_name = PROCESS patron_fields name=s_o %] | 
            
              | 60 |                                     [% NEXT IF !display_name %] | 
            
              | 61 |                                     [% IF searchfieldstype == s_o %] | 
            
              | 62 |                                         <option selected="selected" value=[% s_o | html %]>[% display_name | $raw %]</option> | 
            
              | 63 |                                     [% ELSE %] | 
            
              | 64 |                                         <option value=[% s_o | html %]>[% display_name | $raw %]</option> | 
            
              | 65 |                                     [% END %] | 
            
              | 66 |                                 [% END %] | 
            
              | 67 |                             </select> | 
            
              | 68 |                         </li> | 
            
              | 69 |                     [% CASE 'search_type' %] | 
            
              | 70 |                         <li> | 
            
              | 71 |                             <label for="searchtype_filter">Search type:</label> | 
            
              | 72 |                             <select name="searchtype" id="searchtype_filter"> | 
            
              | 73 |                               [% IF searchtype == "start_with" %] | 
            
              | 74 |                                 <option value='start_with' selected="selected">Starts with</option> | 
            
              | 75 |                                 <option value="contain">Contains</option> | 
            
              | 76 |                               [% ELSE %] | 
            
              | 77 |                                 <option value='start_with'>Starts with</option> | 
            
              | 78 |                                 <option value="contain" selected="selected">Contains</option> | 
            
              | 79 |                               [% END %] | 
            
              | 80 |                             </select> | 
            
              | 81 |                         </li> | 
        
          | 50 |                     [% END %] | 82 |                     [% END %] | 
        
          | 51 |                 [% END %] | 83 |                 [% END %] | 
        
          | 52 |             </ol> | 84 |             </ol> | 
        
          | 53 |             <fieldset class="action"> | 85 |             <fieldset class="action"> | 
        
          | 54 |                 <input type="submit" value="Search" /> | 86 |                 <input type="submit" value="Search" /> | 
            
              |  |  | 87 |                 <input type="button" value="Clear" id="clear_search" /> | 
        
          | 55 |             </fieldset> | 88 |             </fieldset> | 
        
          | 56 |         </fieldset> | 89 |         </fieldset> | 
        
          | 57 |     </form> | 90 |     </form> | 
  
    | Lines 78-89
          
      
      
        Link Here | 
        
          | 78 |         [% END %] | 111 |         [% END %] | 
        
          | 79 |     </div> | 112 |     </div> | 
        
          | 80 |  | 113 |  | 
            
              |  |  | 114 |  | 
            
              | 115 |     <h3 style="display: none;">Patrons found for: <span id="searchpattern"></span></h3> | 
            
              | 116 |  | 
        
          | 81 |     <div id="[% table_id | html %]_search_results" style="display:none;"> | 117 |     <div id="[% table_id | html %]_search_results" style="display:none;"> | 
        
          | 82 |  | 118 |  | 
        
          | 83 |         <div id="info" class="dialog message" style="display: none;"></div> | 119 |         <div id="info" class="dialog message" style="display: none;"></div> | 
        
          | 84 |         <div id="error" class="dialog alert" style="display: none;"></div> | 120 |         <div id="error" class="dialog alert" style="display: none;"></div> | 
        
          | 85 |  | 121 |  | 
            
              | 86 |  |  |  | 
        
          | 87 |         <input type="hidden" id="firstletter_filter" value="" /> | 122 |         <input type="hidden" id="firstletter_filter" value="" /> | 
        
          | 88 |         [% IF open_on_row_click %] | 123 |         [% IF open_on_row_click %] | 
        
          | 89 |         <table id="[% table_id | html %]" class="selections-table"> | 124 |         <table id="[% table_id | html %]" class="selections-table"> | 
  
    | Lines 94-99
          
      
      
        Link Here | 
        
          | 94 |                 <tr> | 129 |                 <tr> | 
        
          | 95 |                     [% FOR column IN columns %] | 130 |                     [% FOR column IN columns %] | 
        
          | 96 |                         [% SWITCH column %] | 131 |                         [% SWITCH column %] | 
            
              |  |  | 132 |                             [% CASE 'checkbox' %]<th class="noExport"></th> | 
        
          | 97 |                             [% CASE 'cardnumber' %]<th>Card</th> | 133 |                             [% CASE 'cardnumber' %]<th>Card</th> | 
        
          | 98 |                             [% CASE 'dateofbirth' %]<th>Date of birth</th> | 134 |                             [% CASE 'dateofbirth' %]<th>Date of birth</th> | 
        
          | 99 |                             [% CASE 'name' %]<th>Name</th> | 135 |                             [% CASE 'name' %]<th>Name</th> | 
  
    | Lines 166-182
          
      
      
        Link Here | 
        
          | 166 |     [% INCLUDE 'js-patron-get-age.inc' %] | 202 |     [% INCLUDE 'js-patron-get-age.inc' %] | 
        
          | 167 |     [% INCLUDE 'js-patron-format.inc' %] | 203 |     [% INCLUDE 'js-patron-format.inc' %] | 
        
          | 168 |     [% INCLUDE 'js-patron-format-address.inc' %] | 204 |     [% INCLUDE 'js-patron-format-address.inc' %] | 
            
              |  |  | 205 |     [% IF sticky_header %] | 
            
              | 206 |         [% Asset.js("lib/hc-sticky.js") | $raw %] | 
            
              | 207 |     [% END %] | 
        
          | 169 |  | 208 |  | 
        
          | 170 |     <script> | 209 |     <script> | 
        
          | 171 |         var first_draw = 0; | 210 |         var first_draw = 0; | 
        
          | 172 |         let patrons_table; | 211 |         let patrons_table; | 
            
              |  |  | 212 |         var Sticky; | 
            
              | 213 |         var singleBranchMode = '[% singleBranchMode | html %]'; | 
            
              | 214 |         let logged_in_library_id = "[% Branches.GetLoggedInBranchcode | html %]"; | 
        
          | 173 |  | 215 |  | 
          
            
              | 174 |         $(document).ready(function(){ | 216 |         /* popstate event triggered by forward and back button. Need to refresh search */ | 
            
              |  |  | 217 |         window.addEventListener('popstate', (event) => { | 
            
              | 218 |             getSearchByLocation( false ); | 
            
              | 219 |         }); | 
        
          | 175 |  | 220 |  | 
            
              |  |  | 221 |         $(document).ready(function(){ | 
        
          | 176 |  | 222 |  | 
        
          | 177 |             $("#info").hide(); | 223 |             $("#info").hide(); | 
        
          | 178 |             $("#error").hide(); | 224 |             $("#error").hide(); | 
        
          | 179 |  | 225 |  | 
            
              |  |  | 226 |             // Build the aLengthMenu | 
            
              | 227 |             var aLengthMenu = [ | 
            
              | 228 |                 [% Koha.Preference('PatronsPerPage') | html %], 10, 20, 50, 100, -1 | 
            
              | 229 |             ]; | 
            
              | 230 |             jQuery.unique(aLengthMenu); | 
            
              | 231 |             aLengthMenu.sort(function( a, b ){ | 
            
              | 232 |                 // Put "All" at the end | 
            
              | 233 |                 if ( a == -1 ) { | 
            
              | 234 |                     return 1; | 
            
              | 235 |                 } else if ( b == -1 ) { | 
            
              | 236 |                     return -1; | 
            
              | 237 |                 } | 
            
              | 238 |                 return parseInt(a) < parseInt(b) ? -1 : 1;} | 
            
              | 239 |             ); | 
            
              | 240 |             var aLengthMenuLabel = []; | 
            
              | 241 |             $(aLengthMenu).each(function(){ | 
            
              | 242 |                 if ( this == -1 ) { | 
            
              | 243 |                     // Label for -1 is "All" | 
            
              | 244 |                     aLengthMenuLabel.push(_("All")); | 
            
              | 245 |                 } else { | 
            
              | 246 |                     aLengthMenuLabel.push(this); | 
            
              | 247 |                 } | 
            
              | 248 |             }); | 
            
              | 249 |  | 
        
          | 180 |             let additional_filters = { | 250 |             let additional_filters = { | 
        
          | 181 |                 surname: function(){ | 251 |                 surname: function(){ | 
        
          | 182 |                     let start_with = $("#firstletter_filter").val() | 252 |                     let start_with = $("#firstletter_filter").val() | 
  
    | Lines 186-203
          
      
      
        Link Here | 
        
          | 186 |                 "-and": function(){ | 256 |                 "-and": function(){ | 
        
          | 187 |                     let filter = $("#search_patron_filter").val(); | 257 |                     let filter = $("#search_patron_filter").val(); | 
        
          | 188 |                     if (!filter) return ""; | 258 |                     if (!filter) return ""; | 
          
            
              | 189 |                     [% SET search_fields = Koha.Preference('DefaultPatronSearchFields') || 'surname,firstname,othernames,cardnumber,userid' %] | 259 |  | 
            
              | 190 |                     return [ | 260 |                     let filters = []; | 
            
              | 191 |                         [% FOR search_field IN search_fields.split(',') %] | 261 |                     let search_type = $("#searchtype_filter").val() || "contain"; | 
            
              | 192 |                         {"me.[% search_field | html %]":{"like":"%"+filter+"%"}}, | 262 |                     let search_fields = $("#searchfieldstype_filter").val(); | 
            
              | 193 |                         [% END %] | 263 |                     if ( !search_fields ) { | 
            
              | 194 |                         [% IF Koha.Preference('ExtendedPatronAttributes') && extended_attribute_types %] | 264 |                         search_fields = "[% Koha.Preference('DefaultPatronSearchFields') || 'surname,firstname,othernames,cardnumber,userid' | html %]"; | 
            
              | 195 |                         { | 265 |                     } | 
            
              | 196 |                             "extended_attributes.value": { "like": "%" + filter + "%" }, | 266 |                     search_fields.split(',').forEach(function(e,i){ | 
            
              |  |  | 267 |                         filters.push({["me."+e]:{"like":"%"+filter+(search_type == "contain" ? "%" : "" )}}); | 
            
              | 268 |                     }); | 
            
              | 269 |                     [% IF Koha.Preference('ExtendedPatronAttributes') && extended_attribute_types %] | 
            
              | 270 |                         filters.push({ | 
            
              | 271 |                             "extended_attributes.value": { "like": "%" + filter + (search_type == "contain" ? "%" : "" )}, | 
        
          | 197 |                             "extended_attributes.code": extended_attribute_types | 272 |                             "extended_attributes.code": extended_attribute_types | 
          
            
              | 198 |                         } | 273 |                         }); | 
            
              | 199 |                         [% END %] | 274 |                     [% END %] | 
            
              | 200 |                     ]; | 275 |                     return filters; | 
        
          | 201 |                 } | 276 |                 } | 
        
          | 202 |             }; | 277 |             }; | 
        
          | 203 |             [% UNLESS default_sort_column %] | 278 |             [% UNLESS default_sort_column %] | 
  
    | Lines 223-229
          
      
      
        Link Here | 
        
          | 223 |                         [% IF redirect_if_one_result %] | 298 |                         [% IF redirect_if_one_result %] | 
        
          | 224 |                             // redirect if there is only 1 result. | 299 |                             // redirect if there is only 1 result. | 
        
          | 225 |                             if ( first_draw && json.recordsFiltered == 1 ) { | 300 |                             if ( first_draw && json.recordsFiltered == 1 ) { | 
          
            
              | 226 |                                 document.location.href = '[% redirect_url | url %]&borrowernumber=' + json.data[0].patron_id; | 301 |                                 let url = '[% redirect_url | url %]'.indexOf("?") != -1 | 
            
              |  |  | 302 |                                     ? '[% redirect_url | url %]&borrowernumber=' + json.data[0].patron_id | 
            
              | 303 |                                     : '[% redirect_url | url %]?borrowernumber=' + json.data[0].patron_id; | 
            
              | 304 |                                 document.location.href = url; | 
        
          | 227 |                                 return false; | 305 |                                 return false; | 
        
          | 228 |                             } | 306 |                             } | 
        
          | 229 |                             first_draw = 0; | 307 |                             first_draw = 0; | 
  
    | Lines 231-236
          
      
      
        Link Here | 
        
          | 231 |                         return json.data; | 309 |                         return json.data; | 
        
          | 232 |                     } | 310 |                     } | 
        
          | 233 |                 }, | 311 |                 }, | 
            
              |  |  | 312 |                 [% IF open_on_row_click OR preview_on_name_click %] | 
        
          | 234 |                 "drawCallback": function( settings ) { | 313 |                 "drawCallback": function( settings ) { | 
        
          | 235 |                     var api = this.api(); | 314 |                     var api = this.api(); | 
        
          | 236 |                     var data = api.data(); | 315 |                     var data = api.data(); | 
  
    | Lines 244-255
          
      
      
        Link Here | 
        
          | 244 |                         }).addClass('clickable'); | 323 |                         }).addClass('clickable'); | 
        
          | 245 |                         $(tr).find("a.patron_name").attr('href', url); | 324 |                         $(tr).find("a.patron_name").attr('href', url); | 
        
          | 246 |                     }); | 325 |                     }); | 
          
            
              | 247 |                     [% ELSE %] | 326 |                     [% END %] | 
            
              |  |  | 327 |                     [% IF preview_on_name_click %] | 
        
          | 248 |                     $.each($(this).find("tbody tr"), function(index, tr) { | 328 |                     $.each($(this).find("tbody tr"), function(index, tr) { | 
        
          | 249 |                         $(tr).find("a.patron_name").addClass("patron_preview"); | 329 |                         $(tr).find("a.patron_name").addClass("patron_preview"); | 
        
          | 250 |                     }); | 330 |                     }); | 
        
          | 251 |                     [% END %] | 331 |                     [% END %] | 
        
          | 252 |                 }, | 332 |                 }, | 
            
              |  |  | 333 |                 [% END %] | 
        
          | 253 |                 "iDeferLoading": 0, | 334 |                 "iDeferLoading": 0, | 
        
          | 254 |                 "columns": [ | 335 |                 "columns": [ | 
        
          | 255 |                     [% FOR column IN columns %] | 336 |                     [% FOR column IN columns %] | 
  
    | Lines 259-278
          
      
      
        Link Here | 
        
          | 259 |                         [% SWITCH column %] | 340 |                         [% SWITCH column %] | 
        
          | 260 |                             [% CASE 'checkbox' %] | 341 |                             [% CASE 'checkbox' %] | 
        
          | 261 |                             { | 342 |                             { | 
          
            
              | 262 |                                 "data": "borrowernumber", | 343 |                                 "data": "patron_id", | 
            
              | 263 |                                 "searchable": true, | 344 |                                 "searchable": false, | 
            
              | 264 |                                 "orderable": true, | 345 |                                 "orderable": false, | 
        
          | 265 |                                 "render": function( data, type, row, meta ) { | 346 |                                 "render": function( data, type, row, meta ) { | 
          
            
              | 266 |                                     return "<input type=\"checkbox\" name="data ? escape_str($date(data) + " (" + _("%s years").format($get_age(data)) + ")") : ""; | 347 |                                     return "<label for='check" + data + "' class='content_hidden'>" + _("Select patron") + "</label><input type='checkbox' id='check" + data + "' class='selection' name='borrowernumber' value='" + data + "' />"; | 
            
              | 267 |  |  |  | 
            
              | 268 |                                     return "<label for='check" + data + "' class='content_hidden'>" + _("Select patron") + "</label><input type='checkbox' id='check" + data + "' class='selection' name='borrowernumber' value='" + data + "' />", | 
        
          | 269 |                                 } | 348 |                                 } | 
        
          | 270 |                             } | 349 |                             } | 
        
          | 271 |                             [% CASE 'cardnumber' %] | 350 |                             [% CASE 'cardnumber' %] | 
        
          | 272 |                             { | 351 |                             { | 
        
          | 273 |                                 "data": "cardnumber", | 352 |                                 "data": "cardnumber", | 
        
          | 274 |                                 "searchable": true, | 353 |                                 "searchable": true, | 
          
            
              | 275 |                                 "orderable": true | 354 |                                 "orderable": true, | 
            
              |  |  | 355 |                                 "render": function( data, type, row, meta ) { | 
            
              | 356 |                                     let patron_id = encodeURIComponent(row.patron_id); | 
            
              | 357 |                                     [% IF !open_on_row_click AND CAN_user_circulate_circulate_remaining_permissions %] | 
            
              | 358 |                                         return "<a href=\"/cgi-bin/koha/circ/circulation.pl?borrowernumber=" + patron_id + "\" title=\"[% I18N.t("Check out") | html %]\" class=\"patron_name\" data-borrowernumber=\"" + patron_id + "\" style=\"white-space:nowrap\">" + escape_str(data) + "</a>"; | 
            
              | 359 |                                     [% ELSE %] | 
            
              | 360 |                                         return escape_str(data); | 
            
              | 361 |                                     [% END %] | 
            
              | 362 |                                 } | 
            
              | 363 |  | 
        
          | 276 |                             } | 364 |                             } | 
        
          | 277 |                             [% CASE 'dateofbirth' %] | 365 |                             [% CASE 'dateofbirth' %] | 
        
          | 278 |                             { | 366 |                             { | 
  
    | Lines 340-346
          
      
      
        Link Here | 
        
          | 340 |                                 "orderable": true, | 428 |                                 "orderable": true, | 
        
          | 341 |                                 "render": function( data, type, row, meta ) { | 429 |                                 "render": function( data, type, row, meta ) { | 
        
          | 342 |                                     let patron_id = encodeURIComponent(row.patron_id); | 430 |                                     let patron_id = encodeURIComponent(row.patron_id); | 
            
              |  |  | 431 |                                     [% IF ! open_on_row_click %] | 
        
          | 343 |                                     return "<a href=\"/cgi-bin/koha/members/moremember.pl?borrowernumber=" + patron_id + "\" class=\"patron_name\" data-borrowernumber=\"" + patron_id + "\" style=\"white-space:nowrap\">" + $patron_to_html(row, { invert_name: 1 }) + "</a>"; | 432 |                                     return "<a href=\"/cgi-bin/koha/members/moremember.pl?borrowernumber=" + patron_id + "\" class=\"patron_name\" data-borrowernumber=\"" + patron_id + "\" style=\"white-space:nowrap\">" + $patron_to_html(row, { invert_name: 1 }) + "</a>"; | 
            
              |  |  | 433 |                                     [% ELSE %] | 
            
              | 434 |                                     return $patron_to_html(row, { invert_name: 1 }); | 
            
              | 435 |                                     [% END %] | 
        
          | 344 |                                 } | 436 |                                 } | 
        
          | 345 |                             } | 437 |                             } | 
        
          | 346 |                             [% CASE 'branch' %] | 438 |                             [% CASE 'branch' %] | 
  
    | Lines 349-355
          
      
      
        Link Here | 
        
          | 349 |                                 "searchable": true, | 441 |                                 "searchable": true, | 
        
          | 350 |                                 "orderable": true, | 442 |                                 "orderable": true, | 
        
          | 351 |                                 "render": function( data, type, row, meta ) { | 443 |                                 "render": function( data, type, row, meta ) { | 
          
            
              | 352 |                                     return escape_str(libraries_map[data].branchname); | 444 |                                     let library_name = libraries_map[data].branchname | 
            
              |  |  | 445 |                                     if( !singleBranchMode && data == logged_in_library_id ) { | 
            
              | 446 |                                         return "<span class=\"currentlibrary\">" + escape_str(library_name) + "</span>"; | 
            
              | 447 |                                     } else { | 
            
              | 448 |                                         return escape_str(library_name); | 
            
              | 449 |                                     } | 
        
          | 353 |                                 } | 450 |                                 } | 
        
          | 354 |                             } | 451 |                             } | 
        
          | 355 |                             [% CASE 'category' %] | 452 |                             [% CASE 'category' %] | 
  
    | Lines 426-436
          
      
      
        Link Here | 
        
          | 426 |                                 "data": function( row, type, val, meta ) { | 523 |                                 "data": function( row, type, val, meta ) { | 
        
          | 427 |  | 524 |  | 
        
          | 428 |                                     let patron_id = encodeURIComponent(row.patron_id); | 525 |                                     let patron_id = encodeURIComponent(row.patron_id); | 
          
            
              | 429 |                                     [% IF selection_type == 'select' %] | 526 |                                     let action_node = ""; | 
            
              | 430 |                                         return '<a href="#" class="btn btn-default btn-xs select_user" data-borrowernumber="' + patron_id + '">Select</a><input type="hidden" id="borrower_data' + patron_id + '" name="borrower_data'+ patron_id + '" value=\''+JSON.stringify(row)+'\' />'; | 527 |                                     [% FOR action IN actions %] | 
            
              | 431 |                                     [% ELSE %] | 528 |                                     [% SWITCH action %] | 
            
              | 432 |                                         return '<a href="#" class="btn btn-default btn-xs add_user" data-borrowernumber="' + patron_id + '" data-firstname="' + encodeURIComponent(row.firstname) + '" data-surname="' + encodeURIComponent(row.surname) + '">Add</a><input type="hidden" id="borrower_data' + patron_id + '" name="borrower_data'+ patron_id + '" />'; | 529 |                                     [% CASE 'select' %] | 
            
              |  |  | 530 |                                         action_node += '<a href="#" class="btn btn-default btn-xs select_user" data-borrowernumber="' + patron_id + '">Select</a><input type="hidden" id="borrower_data' + patron_id + '" name="borrower_data'+ patron_id + '" value=\''+JSON.stringify(row)+'\' />'; | 
            
              | 531 |                                     [% CASE 'add' %] | 
            
              | 532 |                                         action_node += '<a href="#" class="btn btn-default btn-xs add_user" data-borrowernumber="' + patron_id + '" data-firstname="' + encodeURIComponent(row.firstname) + '" data-surname="' + encodeURIComponent(row.surname) + '">Add</a><input type="hidden" id="borrower_data' + patron_id + '" name="borrower_data'+ patron_id + '" />'; | 
            
              | 533 |                                     [% CASE 'edit' %] | 
            
              | 534 |                                         action_node += '<a href="/cgi-bin/koha/members/memberentry.pl?op=modify&destination=circ&borrowernumber=' + patron_id + '" class="btn btn-default btn-xs"><i class="fa fa-pencil"></i> Edit</a>'; | 
            
              | 535 |                                     [% CASE 'checkout' %] | 
            
              | 536 |                                         [% IF CAN_user_circulate_circulate_remaining_permissions %] | 
            
              | 537 |                                             action_node += '<a class="btn btn-default btn-xs" href="/cgi-bin/koha/circ/circulation.pl?borrowernumber=' + patron_id + '"><i class="fa fa-barcode"></i> ' + _("Check out") + '</a>'; | 
            
              | 538 |                                         [% END %] | 
            
              | 539 |                                     [% END %] | 
        
          | 433 |                                     [% END %] | 540 |                                     [% END %] | 
            
              |  |  | 541 |                                     return action_node; | 
        
          | 434 |                                 }, | 542 |                                 }, | 
        
          | 435 |                                 "searchable": false, | 543 |                                 "searchable": false, | 
        
          | 436 |                                 "orderable": false | 544 |                                 "orderable": false | 
  
    | Lines 442-455
          
      
      
        Link Here | 
        
          | 442 |                 'embed': [% To.json(embed) | $raw %], | 550 |                 'embed': [% To.json(embed) | $raw %], | 
        
          | 443 |                 "order": [[ [% order_column_index | html %], "asc" ]], | 551 |                 "order": [[ [% order_column_index | html %], "asc" ]], | 
        
          | 444 |                 'bAutoWidth': false, | 552 |                 'bAutoWidth': false, | 
            
              |  |  | 553 |                 'lengthMenu': [aLengthMenu, aLengthMenuLabel], | 
        
          | 445 |                 'sPaginationType': 'full_numbers', | 554 |                 'sPaginationType': 'full_numbers', | 
          
            
              | 446 |                 "iDisplayLength": [% Koha.Preference('PatronsPerPage') | html %], | 555 |                 "pageLength": [% Koha.Preference('PatronsPerPage') | html %], | 
            
              |  |  | 556 |                 [% IF sticky_header %] | 
            
              | 557 |                 "initComplete": function(settings, json) { | 
            
              | 558 |                     Sticky = $("#[% sticky_header | html %]"); | 
            
              | 559 |                     Sticky.hcSticky({ | 
            
              | 560 |                         stickTo: "#[% sticky_to | html %]", | 
            
              | 561 |                         stickyClass: "floating" | 
            
              | 562 |                     }); | 
            
              | 563 |                 }, | 
            
              | 564 |                 [% END %] | 
        
          | 447 |             }, typeof table_settings !== 'undefined' ? table_settings : null, 1, additional_filters); | 565 |             }, typeof table_settings !== 'undefined' ? table_settings : null, 1, additional_filters); | 
        
          | 448 |  | 566 |  | 
        
          | 449 |             $("#patron_search_form").on('submit', filter); | 567 |             $("#patron_search_form").on('submit', filter); | 
        
          | 450 |             $(".filterByLetter").on("click",function(e){ | 568 |             $(".filterByLetter").on("click",function(e){ | 
        
          | 451 |                 e.preventDefault(); | 569 |                 e.preventDefault(); | 
          
            
              | 452 |                 filterByFirstLetterSurname($(this).text()); | 570 |                 filterByFirstLetterSurname($(this).text(), true); | 
        
          | 453 |             }); | 571 |             }); | 
        
          | 454 |             $("body").on("click",".add_user",function(e){ | 572 |             $("body").on("click",".add_user",function(e){ | 
        
          | 455 |                 e.preventDefault(); | 573 |                 e.preventDefault(); | 
  
    | Lines 478-485
          
      
      
        Link Here | 
        
          | 478 |                 $("#patronPreview .modal-body").html("<img src=\"[% interface | html %]/[% theme | html %]/img/spinner-small.gif\" alt=\"\" /> Loading"); | 596 |                 $("#patronPreview .modal-body").html("<img src=\"[% interface | html %]/[% theme | html %]/img/spinner-small.gif\" alt=\"\" /> Loading"); | 
        
          | 479 |             }); | 597 |             }); | 
        
          | 480 |  | 598 |  | 
            
              |  |  | 599 |             $("#clear_search").on("click",function(e){ | 
            
              | 600 |                 e.preventDefault(); | 
            
              | 601 |                 clearFilters(); | 
            
              | 602 |                 $("#searchpattern").parent().hide(); | 
            
              | 603 |             }); | 
            
              | 604 |  | 
            
              | 605 |             if ( $("#search_patron_filter").val().length > 0 ) { | 
            
              | 606 |                 $("#patron_search_form").submit(); | 
            
              | 607 |             } | 
            
              | 608 |  | 
            
              | 609 |             /* Initial page load does not trigger the popstate event, so we explicitly call this */ | 
            
              | 610 |             getSearchByLocation( false ); | 
            
              | 611 |  | 
        
          | 481 |         }); | 612 |         }); | 
        
          | 482 |  | 613 |  | 
            
              |  |  | 614 |         function getSearchByLocation( setstate ){ | 
            
              | 615 |             /* Check to see if the URL contains a search parameter */ | 
            
              | 616 |             if( location.search != ""){ | 
            
              | 617 |                 var params = new URLSearchParams( location.search ); | 
            
              | 618 |                 var firstletter = params.get("firstletter"); | 
            
              | 619 |                 /* Check to see if search is a first letter param */ | 
            
              | 620 |                 if( firstletter ){ | 
            
              | 621 |                     /* Trigger function to return search results by letter */ | 
            
              | 622 |                     filterByFirstLetterSurname( firstletter, setstate ); | 
            
              | 623 |                 } | 
            
              | 624 |             } | 
            
              | 625 |         } | 
            
              | 626 |  | 
            
              | 627 |         function update_search_description(){ | 
            
              | 628 |             var searched = $("#searchfieldstype_filter").find("option:selected").text(); | 
            
              | 629 |             if ( $("#search_patron_filter").val() ) { | 
            
              | 630 |                 if ( $("#searchtype_filter").val() == 'start_with' ) { | 
            
              | 631 |                     searched += _(" starting with "); | 
            
              | 632 |                 } else { | 
            
              | 633 |                     searched += _(" containing "); | 
            
              | 634 |                 } | 
            
              | 635 |                 searched += "'" + $("#search_patron_filter").val() + "'"; | 
            
              | 636 |             } | 
            
              | 637 |             if ( $("#firstletter_filter").val() ) { | 
            
              | 638 |                 searched += _(" begins with ") + "'" + $("#firstletter_filter").val() +"'"; | 
            
              | 639 |             } | 
            
              | 640 |             if ( $("#categorycode_filter").val() ) { | 
            
              | 641 |                 searched += _(" with category ") + "'" + $("#categorycode_filter").find("option:selected").text() + "'"; | 
            
              | 642 |             } | 
            
              | 643 |             if ( $("#branchcode_filter").val() ) { | 
            
              | 644 |                 searched += _(" in library ") + $("#branchcode_filter").find("option:selected").text(); | 
            
              | 645 |             } | 
            
              | 646 |             $("#searchpattern").text(searched); | 
            
              | 647 |             $("#searchpattern").parent().show(); | 
            
              | 648 |         } | 
            
              | 649 |  | 
        
          | 483 |         function filter() { | 650 |         function filter() { | 
        
          | 484 |             $("#firstletter_filter").val(''); | 651 |             $("#firstletter_filter").val(''); | 
        
          | 485 |             $("#[% table_id | html %]_search_results").show(); | 652 |             $("#[% table_id | html %]_search_results").show(); | 
  
    | Lines 500-549
          
      
      
        Link Here | 
        
          | 500 |             table_dt.search(""); | 667 |             table_dt.search(""); | 
        
          | 501 |             first_draw = 1; // Only redirect if we are coming from here | 668 |             first_draw = 1; // Only redirect if we are coming from here | 
        
          | 502 |             table_dt.draw(); | 669 |             table_dt.draw(); | 
            
              |  |  | 670 |             update_search_description(); | 
        
          | 503 |             return false; | 671 |             return false; | 
        
          | 504 |         } | 672 |         } | 
        
          | 505 |  | 673 |  | 
            
              |  |  | 674 |         function clearFilters() { | 
            
              | 675 |             $("#searchfieldstype_filter option:first").prop("selected", true); | 
            
              | 676 |             $("#searchtype_filter option[value='contain']").prop("selected", true); | 
            
              | 677 |             $("#categorycode_filter option:first").prop("selected", true); | 
            
              | 678 |             $("#branchcode_filter option:first").prop("selected", true); | 
            
              | 679 |             $("#firstletter_filter").val(''); | 
            
              | 680 |             $("#search_patron_filter").val(''); | 
            
              | 681 |             /* remove any search string added by firstletter search */ | 
            
              | 682 |             history.pushState( {}, null, window.location.href.split("?" )[0]); | 
            
              | 683 |             $("#[% table_id | html %]_search_results").hide(); | 
            
              | 684 |             update_search_description(); | 
            
              | 685 |         } | 
            
              | 686 |  | 
        
          | 506 |         // User has clicked on a letter | 687 |         // User has clicked on a letter | 
          
            
              | 507 |         function filterByFirstLetterSurname(letter) { | 688 |         function filterByFirstLetterSurname(letter, setstate ) { | 
        
          | 508 |             $("#firstletter_filter").val(letter); | 689 |             $("#firstletter_filter").val(letter); | 
            
              |  |  | 690 |  | 
        
          | 509 |             $("#[% table_id | html %]_search_results").show(); | 691 |             $("#[% table_id | html %]_search_results").show(); | 
            
              |  |  | 692 |  | 
            
              | 693 |             if ( setstate ) { | 
            
              | 694 |                 history.pushState( null, null, "?firstletter=" + letter ); | 
            
              | 695 |             } | 
            
              | 696 |  | 
        
          | 510 |             patrons_table.DataTable().draw(); | 697 |             patrons_table.DataTable().draw(); | 
            
              |  |  | 698 |             update_search_description(); | 
        
          | 511 |         } | 699 |         } | 
        
          | 512 |  | 700 |  | 
        
          | 513 |         // modify parent window owner element | 701 |         // modify parent window owner element | 
          
            
              | 514 |         [% IF selection_type == 'add' %] | 702 |         function add_user(borrowernumber, borrowername) { | 
            
              | 515 |             function add_user(borrowernumber, borrowername) { | 703 |             var p = window.opener; | 
            
              | 516 |                 var p = window.opener; | 704 |             // In one place (serials/routing.tt), the page is reload on every add | 
            
              | 517 |                 // In one place (serials/routing.tt), the page is reload on every add | 705 |             // We have to wait for the page to be there | 
            
              | 518 |                 // We have to wait for the page to be there | 706 |             function wait_for_opener () { | 
            
              | 519 |                 function wait_for_opener () { | 707 |                 if ( ! $(opener.document).find('body').size() ) { | 
            
              | 520 |                     if ( ! $(opener.document).find('body').size() ) { | 708 |                     setTimeout(wait_for_opener, 500); | 
            
              | 521 |                         setTimeout(wait_for_opener, 500); | 709 |                 } else { | 
            
              |  |  | 710 |                     [%# Note that add_user could sent data instead of borrowername too %] | 
            
              | 711 |                     $("#info").hide(); | 
            
              | 712 |                     $("#error").hide(); | 
            
              | 713 |                     if ( p.add_user(borrowernumber, borrowername) < 0 ) { | 
            
              | 714 |                         $("#error").html(_("Patron '%s' is already in the list.").format(borrowername)); | 
            
              | 715 |                         $("#error").show(); | 
        
          | 522 |                     } else { | 716 |                     } else { | 
          
            
              | 523 |                         [%# Note that add_user could sent data instead of borrowername too %] | 717 |                         $("#info").html(_("Patron '%s' added.").format(borrowername)); | 
            
              | 524 |                         $("#info").hide(); | 718 |                         $("#info").show(); | 
            
              | 525 |                         $("#error").hide(); |  |  | 
            
              | 526 |                         if ( p.add_user(borrowernumber, borrowername) < 0 ) { | 
            
              | 527 |                             $("#error").html(_("Patron '%s' is already in the list.").format(borrowername)); | 
            
              | 528 |                             $("#error").show(); | 
            
              | 529 |                         } else { | 
            
              | 530 |                             $("#info").html(_("Patron '%s' added.").format(borrowername)); | 
            
              | 531 |                             $("#info").show(); | 
            
              | 532 |                         } | 
        
          | 533 |                     } | 719 |                     } | 
        
          | 534 |                 } | 720 |                 } | 
            
              | 535 |                 wait_for_opener(); |  |  | 
        
          | 536 |             } | 721 |             } | 
          
            
              | 537 |         [% ELSIF selection_type == 'select' %] | 722 |             wait_for_opener(); | 
            
              | 538 |             function select_user(borrowernumber, data) { | 723 |         } | 
            
              | 539 |                 var p = window.opener; | 724 |         function select_user(borrowernumber, data) { | 
            
              | 540 |                 [%  IF callback %] | 725 |             var p = window.opener; | 
            
              | 541 |                     p.[% callback | html %](borrowernumber, data); | 726 |             [%  IF callback %] | 
            
              | 542 |                 [%  ELSE %] | 727 |                 p.[% callback | html %](borrowernumber, data); | 
            
              | 543 |                     p.select_user(borrowernumber, data); | 728 |             [%  ELSE %] | 
            
              | 544 |                 [%  END %] | 729 |                 p.select_user(borrowernumber, data); | 
            
              | 545 |                 window.close(); | 730 |             [%  END %] | 
            
              | 546 |             } | 731 |             window.close(); | 
            
              | 547 |         [% END %] | 732 |         } | 
        
          | 548 |     </script> | 733 |     </script> | 
        
          | 549 | [% END %] | 734 | [% END %] |