Bug 13024 [QA Followup] - Add nonpublic note to relatives' checkouts
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / js / checkouts.js
blob9dae4d801281ede1e11b273499a5cfe0a144c24d
1 $(document).ready(function() {
2     $.ajaxSetup ({ cache: false });
4     var barcodefield = $("#barcode");
6     // Handle the select all/none links for checkouts table columns
7     $("#CheckAllRenewals").on("click",function(){
8         $("#UncheckAllCheckins").click();
9         $(".renew:visible").attr("checked", "checked" );
10         return false;
11     });
12     $("#UncheckAllRenewals").on("click",function(){
13         $(".renew:visible").removeAttr("checked");
14         return false;
15     });
17     $("#CheckAllCheckins").on("click",function(){
18         $("#UncheckAllRenewals").click();
19         $(".checkin:visible").attr("checked", "checked" );
20         return false;
21     });
22     $("#UncheckAllCheckins").on("click",function(){
23         $(".checkin:visible").removeAttr("checked");
24         return false;
25     });
27     // Don't allow both return and renew checkboxes to be checked
28     $(document).on("change", '.renew', function(){
29         if ( $(this).is(":checked") ) {
30             $( "#checkin_" + $(this).val() ).removeAttr("checked");
31         }
32     });
33     $(document).on("change", '.checkin', function(){
34         if ( $(this).is(":checked") ) {
35             $( "#renew_" + $(this).val() ).removeAttr("checked");
36         }
37     });
39     // Clicking the table cell checks the checkbox inside it
40     $(document).on("click", 'td', function(e){
41         if(e.target.tagName.toLowerCase() == 'td'){
42           $(this).find("input:checkbox:visible").each( function() {
43             $(this).click();
44           });
45         }
46     });
48     // Handle renewals and returns
49     $("#RenewCheckinChecked").on("click",function(){
50         $(".checkin:checked:visible").each(function() {
51             itemnumber = $(this).val();
53             $(this).replaceWith("<img id='checkin_" + itemnumber + "' src='" + interface + "/" + theme + "/img/loading-small.gif' />");
55             params = {
56                 itemnumber:     itemnumber,
57                 borrowernumber: borrowernumber,
58                 branchcode:     branchcode,
59                 exempt_fine:    $("#exemptfine").is(':checked')
60             };
62             $.post( "/cgi-bin/koha/svc/checkin", params, function( data ) {
63                 id = "#checkin_" + data.itemnumber;
65                 content = "";
66                 if ( data.returned ) {
67                     content = CIRCULATION_RETURNED;
68                     $(id).parent().parent().addClass('ok');
69                     $('#date_due_' + data.itemnumber).html(CIRCULATION_RETURNED);
70                 } else {
71                     content = CIRCULATION_NOT_RETURNED;
72                     $(id).parent().parent().addClass('warn');
73                 }
75                 $(id).replaceWith( content );
76             }, "json")
77         });
79         $(".renew:checked:visible").each(function() {
80             var override_limit = $("#override_limit").is(':checked') ? 1 : 0;
82             var itemnumber = $(this).val();
84             $(this).parent().parent().replaceWith("<img id='renew_" + itemnumber + "' src='" + interface + "/" + theme + "/img/loading-small.gif' />");
86             var params = {
87                 itemnumber:     itemnumber,
88                 borrowernumber: borrowernumber,
89                 branchcode:     branchcode,
90                 override_limit: override_limit,
91                 date_due:       $("#newduedate").val()
92             };
94             $.post( "/cgi-bin/koha/svc/renew", params, function( data ) {
95                 var id = "#renew_" + data.itemnumber;
97                 var content = "";
98                 if ( data.renew_okay ) {
99                     content = CIRCULATION_RENEWED_DUE + " " + data.date_due;
100                     $('#date_due_' + data.itemnumber).replaceWith( data.date_due );
101                 } else {
102                     content = CIRCULATION_RENEW_FAILED + " ";
103                     if ( data.error == "no_checkout" ) {
104                         content += NOT_CHECKED_OUT;
105                     } else if ( data.error == "too_many" ) {
106                         content += TOO_MANY_RENEWALS;
107                     } else if ( data.error == "on_reserve" ) {
108                         content += ON_RESERVE;
109                     } else if ( data.error == "restriction" ) {
110                         content += NOT_RENEWABLE_RESTRICTION;
111                     } else if ( data.error == "overdue" ) {
112                         content += NOT_RENEWABLE_OVERDUE;
113                     } else if ( data.error ) {
114                         content += data.error;
115                     } else {
116                         content += REASON_UNKNOWN;
117                     }
118                 }
120                 $(id).replaceWith( content );
121             }, "json")
122         });
124         // Refocus on barcode field if it exists
125         if ( $("#barcode").length ) {
126             $("#barcode").focus();
127         }
129         // Prevent form submit
130         return false;
131     });
133     $("#RenewAll").on("click",function(){
134         $("#CheckAllRenewals").click();
135         $("#UncheckAllCheckins").click();
136         $("#RenewCheckinChecked").click();
138         // Prevent form submit
139         return false;
140     });
142     var ymd = $.datepicker.formatDate('yy-mm-dd', new Date());
144     $('#issues-table').hide();
145     $('#issues-table-actions').hide();
146     $('#issues-table-load-immediately').change(function(){
147         if ( this.checked && typeof issuesTable === 'undefined') {
148             $('#issues-table-load-now-button').click();
149         }
150         barcodefield.focus();
151     });
152     $('#issues-table-load-now-button').click(function(){
153         LoadIssuesTable();
154         barcodefield.focus();
155         return false;
156     });
158     if ( $.cookie("issues-table-load-immediately-" + script) == "true" ) {
159         LoadIssuesTable();
160         $('#issues-table-load-immediately').prop('checked', true);
161     }
162     $('#issues-table-load-immediately').on( "change", function(){
163         $.cookie("issues-table-load-immediately-" + script, $(this).is(':checked'), { expires: 365 });
164     });
166     function LoadIssuesTable() {
167         $('#issues-table-loading-message').hide();
168         $('#issues-table').show();
169         $('#issues-table-actions').show();
171         issuesTable = KohaTable("#issues-table", {
172             "oLanguage": {
173                 "sEmptyTable" : MSG_DT_LOADING_RECORDS,
174                 "sProcessing": MSG_DT_LOADING_RECORDS,
175             },
176             "bAutoWidth": false,
177             "sDom": 'C<"clearfix">rt',
178             "aoColumns": [
179                 {
180                     "mDataProp": function( oObj ) {
181                         return oObj.sort_order;
182                     }
183                 },
184                 {
185                     "mDataProp": function( oObj ) {
186                         if ( oObj.issued_today ) {
187                             return "<strong>" + TODAYS_CHECKOUTS + "</strong>";
188                         } else {
189                             return "<strong>" + PREVIOUS_CHECKOUTS + "</strong>";
190                         }
191                     }
192                 },
193                 {
194                     "mDataProp": "date_due",
195                     "bVisible": false,
196                 },
197                 {
198                     "iDataSort": 2, // Sort on hidden unformatted date due column
199                     "mDataProp": function( oObj ) {
200                         var due = oObj.date_due_formatted;
202                         if ( oObj.date_due_overdue ) {
203                             due = "<span class='overdue'>" + due + "</span>";
204                         }
206                         if ( oObj.lost ) {
207                             due += "<span class='lost'>" + oObj.lost + "</span>";
208                         }
210                         if ( oObj.damaged ) {
211                             due += "<span class='dmg'>" + oObj.damaged + "</span>";
212                         }
214                         due = "<span id='date_due_" + oObj.itemnumber + "' class='date_due'>" + due + "</span>";
216                         return due;
217                     }
218                 },
219                 {
220                     "mDataProp": function ( oObj ) {
221                         title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
222                               + oObj.biblionumber
223                               + "'>"
224                               + oObj.title;
226                         $.each(oObj.subtitle, function( index, value ) {
227                                   title += " " + value.subfield;
228                         });
230                         title += "</a></span>";
232                         if ( oObj.author ) {
233                             title += " " + BY.replace( "_AUTHOR_",  " " + oObj.author );
234                         }
236                         if ( oObj.itemnotes ) {
237                             var span_class = "";
238                             if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
239                                 span_class = "circ-hlt";
240                             }
241                             title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
242                         }
244                         if ( oObj.itemnotes_nonpublic ) {
245                             var span_class = "";
246                             if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
247                                 span_class = "circ-hlt";
248                             }
249                             title += " - <span class='" + span_class + "'>" + oObj.itemnotes_nonpublic + "</span>"
250                         }
252                         var onsite_checkout = '';
253                         if ( oObj.onsite_checkout == 1 ) {
254                             onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
255                         }
257                         title += " "
258                               + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
259                               + oObj.biblionumber
260                               + "&itemnumber="
261                               + oObj.itemnumber
262                               + "#"
263                               + oObj.itemnumber
264                               + "'>"
265                               + oObj.barcode
266                               + "</a>"
267                               + onsite_checkout;
269                         return title;
270                     },
271                     "sType": "anti-the"
272                 },
273                 { "mDataProp": "itemtype_description" },
274                 { "mDataProp": "location" },
275                 { "mDataProp": "issuedate_formatted" },
276                 { "mDataProp": "branchname" },
277                 { "mDataProp": "itemcallnumber" },
278                 {
279                     "mDataProp": function ( oObj ) {
280                         if ( ! oObj.charge ) oObj.charge = 0;
281                         return parseFloat(oObj.charge).toFixed(2);
282                     }
283                 },
284                 {
285                     "mDataProp": function ( oObj ) {
286                         if ( ! oObj.fine ) oObj.fine = 0;
287                         return parseFloat(oObj.fine).toFixed(2);
288                     }
289                 },
290                 {
291                     "mDataProp": function ( oObj ) {
292                         if ( ! oObj.price ) oObj.price = 0;
293                         return parseFloat(oObj.price).toFixed(2);
294                     }
295                 },
296                 {
297                     "bSortable": false,
298                     "mDataProp": function ( oObj ) {
299                         var content = "";
300                         var span_style = "";
301                         var span_class = "";
303                         content += "<span>";
304                         content += "<span style='padding: 0 1em;'>" + oObj.renewals_count + "</span>";
306                         if ( oObj.can_renew ) {
307                             // Do nothing
308                         } else if ( oObj.can_renew_error == "on_reserve" ) {
309                             content += "<span class='renewals-disabled-no-override'>"
310                                     + "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>"
311                                     + "</span>";
313                             span_style = "display: none";
314                             span_class = "renewals-allowed";
315                         } else if ( oObj.can_renew_error == "too_many" ) {
316                             content += "<span class='renewals-disabled'>"
317                                     + NOT_RENEWABLE
318                                     + "</span>";
320                             span_style = "display: none";
321                             span_class = "renewals-allowed";
322                         } else if ( oObj.can_renew_error == "restriction" ) {
323                             content += "<span class='renewals-disabled'>"
324                                     + NOT_RENEWABLE_RESTRICTION
325                                     + "</span>";
327                             span_style = "display: none";
328                             span_class = "renewals-allowed";
329                         } else if ( oObj.can_renew_error == "overdue" ) {
330                             content += "<span class='renewals-disabled'>"
331                                     + NOT_RENEWABLE_OVERDUE
332                                     + "</span>";
334                             span_style = "display: none";
335                             span_class = "renewals-allowed";
336                         } else if ( oObj.can_renew_error == "too_soon" ) {
337                             content += "<span class='renewals-disabled'>"
338                                     + NOT_RENEWABLE_TOO_SOON.format( oObj.can_renew_date )
339                                     + "</span>";
341                             span_style = "display: none";
342                             span_class = "renewals-allowed";
343                         } else if ( oObj.can_renew_error == "auto_too_soon" ) {
344                             content += "<span class='renewals-disabled'>"
345                                     + NOT_RENEWABLE_AUTO_TOO_SOON
346                                     + "</span>";
348                             span_style = "display: none";
349                             span_class = "renewals-allowed";
350                         } else if ( oObj.can_renew_error == "auto_renew" ) {
351                             content += "<span class='renewals-disabled'>"
352                                     + NOT_RENEWABLE_AUTO_RENEW
353                                     + "</span>";
355                             span_style = "display: none";
356                             span_class = "renewals-allowed";
357                         } else if ( oObj.can_renew_error == "onsite_checkout" ) {
358                             // Don't display something if it's an onsite checkout
359                         } else {
360                             content += "<span class='renewals-disabled'>"
361                                     + oObj.can_renew_error
362                                     + "</span>";
364                             span_style = "display: none";
365                             span_class = "renewals-allowed";
366                         }
368                         var can_force_renew = ( oObj.onsite_checkout == 0 ) && ( oObj.can_renew_error != "on_reserve" );
369                         var can_renew = ( oObj.renewals_remaining > 0  && !oObj.can_renew_error );
370                         if ( can_renew || can_force_renew ) {
371                             content += "<span class='" + span_class + "' style='" + span_style + "'>"
372                                     +  "<input type='checkbox' ";
373                             if ( oObj.date_due_overdue && can_renew ) {
374                                 content += "checked='checked' ";
375                             }
376                             content += "class='renew' id='renew_" + oObj.itemnumber + "' name='renew' value='" + oObj.itemnumber +"'/>"
377                                     +  "</span>";
379                             content += "<span class='renewals'>("
380                                     + RENEWALS_REMAINING.format( oObj.renewals_remaining, oObj.renewals_allowed )
381                                     + ")</span>";
382                         }
384                         content += "</span>";
386                         return content;
387                     }
388                 },
389                 {
390                     "bSortable": false,
391                     "mDataProp": function ( oObj ) {
392                         if ( oObj.can_renew_error == "on_reserve" ) {
393                             return "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>";
394                         } else {
395                             return "<input type='checkbox' class='checkin' id='checkin_" + oObj.itemnumber + "' name='checkin' value='" + oObj.itemnumber +"'></input>";
396                         }
397                     }
398                 },
399                 {
400                     "bVisible": exports_enabled ? true : false,
401                     "bSortable": false,
402                     "mDataProp": function ( oObj ) {
403                         var s = "<input type='checkbox' name='itemnumbers' value='" + oObj.itemnumber + "' style='visibility:hidden;' />";
405                         s += "<input type='checkbox' class='export' id='export_" + oObj.biblionumber + "' name='biblionumbers' value='" + oObj.biblionumber + "' />";
406                         return s;
407                     }
408                 }
409             ],
410             "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
411                 var total_charge = 0;
412                 var total_fine  = 0;
413                 var total_price = 0;
414                 for ( var i=0; i < aaData.length; i++ ) {
415                     total_charge += aaData[i]['charge'] * 1;
416                     total_fine += aaData[i]['fine'] * 1;
417                     total_price  += aaData[i]['price'] * 1;
418                 }
419                 $("#totaldue").html(total_charge.toFixed(2));
420                 $("#totalfine").html(total_fine.toFixed(2));
421                 $("#totalprice").html(total_price.toFixed(2));
422             },
423             "bPaginate": false,
424             "bProcessing": true,
425             "bServerSide": false,
426             "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
427             "fnServerData": function ( sSource, aoData, fnCallback ) {
428                 aoData.push( { "name": "borrowernumber", "value": borrowernumber } );
430                 $.getJSON( sSource, aoData, function (json) {
431                     fnCallback(json)
432                 } );
433             },
434             "fnInitComplete": function(oSettings) {
435                 // Disable rowGrouping plugin after first use
436                 // so any sorting on the table doesn't use it
437                 var oSettings = issuesTable.fnSettings();
439                 for (f = 0; f < oSettings.aoDrawCallback.length; f++) {
440                     if (oSettings.aoDrawCallback[f].sName == 'fnRowGrouping') {
441                         oSettings.aoDrawCallback.splice(f, 1);
442                         break;
443                     }
444                 }
446                 oSettings.aaSortingFixed = null;
447             },
448         }, columns_settings).rowGrouping(
449             {
450                 iGroupingColumnIndex: 1,
451                 iGroupingOrderByColumnIndex: 0,
452                 sGroupingColumnSortDirection: "asc"
453             }
454         );
456         if ( $("#issues-table").length ) {
457             $("#issues-table_processing").position({
458                 of: $( "#issues-table" ),
459                 collision: "none"
460             });
461         }
462     }
464     // Don't load relatives' issues table unless it is clicked on
465     var relativesIssuesTable;
466     $("#relatives-issues-tab").click( function() {
467         if ( ! relativesIssuesTable ) {
468             relativesIssuesTable = $("#relatives-issues-table").dataTable({
469                 "bAutoWidth": false,
470                 "sDom": "rt",
471                 "aaSorting": [],
472                 "aoColumns": [
473                     {
474                         "mDataProp": "date_due",
475                         "bVisible": false,
476                     },
477                     {
478                         "iDataSort": 1, // Sort on hidden unformatted date due column
479                         "mDataProp": function( oObj ) {
480                             var today = new Date();
481                             var due = new Date( oObj.date_due );
482                             if ( today > due ) {
483                                 return "<span class='overdue'>" + oObj.date_due_formatted + "</span>";
484                             } else {
485                                 return oObj.date_due_formatted;
486                             }
487                         }
488                     },
489                     {
490                         "mDataProp": function ( oObj ) {
491                             title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
492                                   + oObj.biblionumber
493                                   + "'>"
494                                   + oObj.title;
496                             $.each(oObj.subtitle, function( index, value ) {
497                                       title += " " + value.subfield;
498                             });
500                             title += "</a></span>";
502                             if ( oObj.author ) {
503                                 title += " " + BY.replace( "_AUTHOR_", " " + oObj.author );
504                             }
506                             if ( oObj.itemnotes ) {
507                                 var span_class = "";
508                                 if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
509                                     span_class = "circ-hlt";
510                                 }
511                                 title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
512                             }
514                             if ( oObj.itemnotes_nonpublic ) {
515                                 var span_class = "";
516                                 if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
517                                     span_class = "circ-hlt";
518                                 }
519                                 title += " - <span class='" + span_class + "'>" + oObj.itemnotes_nonpublic + "</span>"
520                             }
522                             var onsite_checkout = '';
523                             if ( oObj.onsite_checkout == 1 ) {
524                                 onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
525                             }
527                             title += " "
528                                   + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
529                                   + oObj.biblionumber
530                                   + "&itemnumber="
531                                   + oObj.itemnumber
532                                   + "#"
533                                   + oObj.itemnumber
534                                   + "'>"
535                                   + oObj.barcode
536                                   + "</a>"
537                                   + onsite_checkout;
539                             return title;
540                         },
541                         "sType": "anti-the"
542                     },
543                     { "mDataProp": "itemtype" },
544                     { "mDataProp": "location" },
545                     { "mDataProp": "issuedate_formatted" },
546                     { "mDataProp": "branchname" },
547                     { "mDataProp": "itemcallnumber" },
548                     {
549                         "mDataProp": function ( oObj ) {
550                             if ( ! oObj.charge ) oObj.charge = 0;
551                             return parseFloat(oObj.charge).toFixed(2);
552                         }
553                     },
554                     {
555                         "mDataProp": function ( oObj ) {
556                             if ( ! oObj.fine ) oObj.fine = 0;
557                             return parseFloat(oObj.fine).toFixed(2);
558                         }
559                     },
560                     {
561                         "mDataProp": function ( oObj ) {
562                             if ( ! oObj.price ) oObj.price = 0;
563                             return parseFloat(oObj.price).toFixed(2);
564                         }
565                     },
566                     {
567                         "mDataProp": function( oObj ) {
568                             return "<a href='/cgi-bin/koha/members/moremember.pl?borrowernumber=" + oObj.borrowernumber + "'>"
569                                  + oObj.borrower.firstname + " " + oObj.borrower.surname + " (" + oObj.borrower.cardnumber + ")</a>"
570                         }
571                     },
572                 ],
573                 "bPaginate": false,
574                 "bProcessing": true,
575                 "bServerSide": false,
576                 "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
577                 "fnServerData": function ( sSource, aoData, fnCallback ) {
578                     $.each(relatives_borrowernumbers, function( index, value ) {
579                         aoData.push( { "name": "borrowernumber", "value": value } );
580                     });
582                     $.getJSON( sSource, aoData, function (json) {
583                         fnCallback(json)
584                     } );
585                 },
586             });
587         }
588     });
590     if ( $("#relatives-issues-table").length ) {
591         $("#relatives-issues-table_processing").position({
592             of: $( "#relatives-issues-table" ),
593             collision: "none"
594         });
595     }
597     if ( AllowRenewalLimitOverride ) {
598         $( '#override_limit' ).click( function () {
599             if ( this.checked ) {
600                 $( '.renewals-allowed' ).show(); $( '.renewals-disabled' ).hide();
601             } else {
602                 $( '.renewals-allowed' ).hide(); $( '.renewals-disabled' ).show();
603             }
604         } ).attr( 'checked', false );
605     }
606  });