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