Bug 12778 - Regression: Item lost status doesn't show in list of checkouts
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / js / checkouts.js
1 $(document).ready(function() {
2     $.ajaxSetup ({ cache: false });
3
4     // Handle the select all/none links for checkouts table columns
5     $("#CheckAllRenewals").on("click",function(){
6         $("#UncheckAllCheckins").click();
7         $(".renew:visible").attr("checked", "checked" );
8         return false;
9     });
10     $("#UncheckAllRenewals").on("click",function(){
11         $(".renew:visible").removeAttr("checked");
12         return false;
13     });
14
15     $("#CheckAllCheckins").on("click",function(){
16         $("#UncheckAllRenewals").click();
17         $(".checkin:visible").attr("checked", "checked" );
18         return false;
19     });
20     $("#UncheckAllCheckins").on("click",function(){
21         $(".checkin:visible").removeAttr("checked");
22         return false;
23     });
24
25     // Don't allow both return and renew checkboxes to be checked
26     $(document).on("change", '.renew', function(){
27         if ( $(this).is(":checked") ) {
28             $( "#checkin_" + $(this).val() ).removeAttr("checked");
29         }
30     });
31     $(document).on("change", '.checkin', function(){
32         if ( $(this).is(":checked") ) {
33             $( "#renew_" + $(this).val() ).removeAttr("checked");
34         }
35     });
36
37     // Clicking the table cell checks the checkbox inside it
38     $(document).on("click", 'td', function(e){
39         if(e.target.tagName.toLowerCase() == 'td'){
40           $(this).find("input:checkbox:visible").each( function() {
41             $(this).click();
42           });
43         }
44     });
45
46     // Handle renewals and returns
47     $("#RenewCheckinChecked").on("click",function(){
48         $(".checkin:checked:visible").each(function() {
49             itemnumber = $(this).val();
50
51             $(this).replaceWith("<img id='checkin_" + itemnumber + "' src='" + interface + "/" + theme + "/img/loading-small.gif' />");
52
53             params = {
54                 itemnumber:     itemnumber,
55                 borrowernumber: borrowernumber,
56                 branchcode:     branchcode,
57                 exempt_fine:    $("#exemptfine").is(':checked')
58             };
59
60             $.post( "/cgi-bin/koha/svc/checkin", params, function( data ) {
61                 id = "#checkin_" + data.itemnumber;
62
63                 content = "";
64                 if ( data.returned ) {
65                     content = CIRCULATION_RETURNED;
66                 } else {
67                     content = CIRCULATION_NOT_RETURNED;
68                 }
69
70                 $(id).replaceWith( content );
71             }, "json")
72         });
73
74         $(".renew:checked:visible").each(function() {
75             var override_limit = $("#override_limit").is(':checked') ? 1 : 0;
76
77             var itemnumber = $(this).val();
78
79             $(this).parent().parent().replaceWith("<img id='renew_" + itemnumber + "' src='" + interface + "/" + theme + "/img/loading-small.gif' />");
80
81             var params = {
82                 itemnumber:     itemnumber,
83                 borrowernumber: borrowernumber,
84                 branchcode:     branchcode,
85                 override_limit: override_limit,
86                 date_due:       $("#newduedate").val()
87             };
88
89             $.post( "/cgi-bin/koha/svc/renew", params, function( data ) {
90                 var id = "#renew_" + data.itemnumber;
91
92                 var content = "";
93                 if ( data.renew_okay ) {
94                     content = CIRCULATION_RENEWED_DUE + " " + data.date_due;
95                 } else {
96                     content = CIRCULATION_RENEW_FAILED + " ";
97                     if ( data.error == "no_checkout" ) {
98                         content += NOT_CHECKED_OUT;
99                     } else if ( data.error == "too_many" ) {
100                         content += TOO_MANY_RENEWALS;
101                     } else if ( data.error == "on_reserve" ) {
102                         content += ON_RESERVE;
103                     } else if ( data.error ) {
104                         content += data.error;
105                     } else {
106                         content += REASON_UNKNOWN;
107                     }
108                 }
109
110                 $(id).replaceWith( content );
111             }, "json")
112         });
113
114         // Prevent form submit
115         return false;
116     });
117
118     $("#RenewAll").on("click",function(){
119         $("#CheckAllRenewals").click();
120         $("#UncheckAllCheckins").click();
121         $("#RenewCheckinChecked").click();
122
123         // Prevent form submit
124         return false;
125     });
126
127     var ymd = $.datepicker.formatDate('yy-mm-dd', new Date());
128
129     $('#issues-table').hide();
130     $('#issues-table-actions').hide();
131     $('#issues-table-load-immediately').change(function(){
132         if ( this.checked && typeof issuesTable === 'undefined') {
133             $('#issues-table-load-now-button').click();
134         }
135     });
136     $('#issues-table-load-now-button').click(function(){
137         LoadIssuesTable();
138         return false;
139     });
140
141     if ( $.cookie("issues-table-load-immediately-" + script) == "true" ) {
142         LoadIssuesTable();
143         $('#issues-table-load-immediately').prop('checked', true);
144     }
145     $('#issues-table-load-immediately').on( "change", function(){
146         $.cookie("issues-table-load-immediately-" + script, $(this).is(':checked'));
147     });
148
149     function LoadIssuesTable() {
150         $('#issues-table-loading-message').hide();
151         $('#issues-table').show();
152         $('#issues-table-actions').show();
153
154         issuesTable = $("#issues-table").dataTable({
155             "oLanguage": {
156                 "sEmptyTable" : MSG_DT_LOADING_RECORDS,
157             },
158             "bAutoWidth": false,
159             "sDom": "rt",
160             "aoColumns": [
161                 {
162                     "mDataProp": function( oObj ) {
163                         if ( oObj.issued_today ) {
164                             return "1" + oObj.timestamp;
165                         } else {
166                             return "0" + oObj.date_due;
167                         }
168                     }
169                 },
170                 {
171                     "mDataProp": function( oObj ) {
172                         if ( oObj.issued_today ) {
173                             return "<strong>" + TODAYS_CHECKOUTS + "</strong>";
174                         } else {
175                             return "<strong>" + PREVIOUS_CHECKOUTS + "</strong>";
176                         }
177                     }
178                 },
179                 {
180                     "mDataProp": "date_due",
181                     "bVisible": false,
182                 },
183                 {
184                     "iDataSort": 1, // Sort on hidden unformatted date due column
185                     "mDataProp": function( oObj ) {
186                         var due = oObj.date_due_formatted;
187
188                         if ( oObj.date_due_overdue ) {
189                             due = "<span class='overdue'>" + due + "</span>";
190                         }
191
192                         if ( oObj.lost ) {
193                             due += "<span class='lost'>" + oObj.lost + "</span>";
194                         }
195
196                         if ( oObj.damaged ) {
197                             due += "<span class='dmg'>" + oObj.damaged + "</span>";
198                         }
199
200                         return due;
201                     }
202                 },
203                 {
204                     "mDataProp": function ( oObj ) {
205                         title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
206                               + oObj.biblionumber
207                               + "'>"
208                               + oObj.title;
209
210                         $.each(oObj.subtitle, function( index, value ) {
211                                   title += " " + value.subfield;
212                         });
213
214                         title += "</a></span>";
215
216                         if ( oObj.author ) {
217                             title += " " + BY.replace( "_AUTHOR_",  " " + oObj.author );
218                         }
219
220                         if ( oObj.itemnotes ) {
221                             var span_class = "";
222                             if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
223                                 span_class = "circ-hlt";
224                             }
225                             title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
226                         }
227
228                         var onsite_checkout = '';
229                         if ( oObj.onsite_checkout == 1 ) {
230                             onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
231                         }
232
233                         title += " "
234                               + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
235                               + oObj.biblionumber
236                               + "&itemnumber="
237                               + oObj.itemnumber
238                               + "#"
239                               + oObj.itemnumber
240                               + "'>"
241                               + oObj.barcode
242                               + "</a>"
243                               + onsite_checkout;
244
245                         return title;
246                     }
247                 },
248                 { "mDataProp": "itemtype" },
249                 { "mDataProp": "issuedate_formatted" },
250                 { "mDataProp": "branchname" },
251                 { "mDataProp": "itemcallnumber" },
252                 {
253                     "mDataProp": function ( oObj ) {
254                         if ( ! oObj.charge ) oObj.charge = 0;
255                         return parseFloat(oObj.charge).toFixed(2);
256                     }
257                 },
258                 {
259                     "mDataProp": function ( oObj ) {
260                         if ( ! oObj.price ) oObj.price = 0;
261                         return parseFloat(oObj.price).toFixed(2);
262                     }
263                 },
264                 {
265                     "bSortable": false,
266                     "mDataProp": function ( oObj ) {
267                         var content = "";
268                         var span_style = "";
269                         var span_class = "";
270
271                         content += "<span>";
272                         content += "<span style='padding: 0 1em;'>" + oObj.renewals_count + "</span>";
273
274                         if ( oObj.can_renew ) {
275                             // Do nothing
276                         } else if ( oObj.can_renew_error == "on_reserve" ) {
277                             content += "<span class='renewals-disabled'>"
278                                     + "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>"
279                                     + "</span>";
280
281                             span_style = "display: none";
282                             span_class = "renewals-allowed";
283                         } else if ( oObj.can_renew_error == "too_many" ) {
284                             content += "<span class='renewals-disabled'>"
285                                     + NOT_RENEWABLE
286                                     + "</span>";
287
288                             span_style = "display: none";
289                             span_class = "renewals-allowed";
290                         } else if ( oObj.can_renew_error == "too_soon" ) {
291                             content += "<span class='renewals-disabled'>"
292                                     + NOT_RENEWABLE_TOO_SOON.format( oObj.can_renew_date )
293                                     + "</span>";
294
295                             span_style = "display: none";
296                             span_class = "renewals-allowed";
297                         } else if ( oObj.can_renew_error == "auto_too_soon" ) {
298                             content += "<span class='renewals-disabled'>"
299                                     + NOT_RENEWABLE_AUTO_TOO_SOON
300                                     + "</span>";
301
302                             span_style = "display: none";
303                             span_class = "renewals-allowed";
304                         } else if ( oObj.can_renew_error == "auto_renew" ) {
305                             content += "<span class='renewals-disabled'>"
306                                     + NOT_RENEWABLE_AUTO_RENEW
307                                     + "</span>";
308
309                             span_style = "display: none";
310                             span_class = "renewals-allowed";
311                         } else {
312                             content += "<span class='renewals-disabled'>"
313                                     + oObj.can_renew_error
314                                     + "</span>";
315
316                             span_style = "display: none";
317                             span_class = "renewals-allowed";
318                         }
319
320                         if ( oObj.renewals_remaining && oObj.onsite_checkout == 0 ) {
321                             content += "<span class='" + span_class + "' style='" + span_style + "'>"
322                                     +  "<input type='checkbox' class='renew' id='renew_" + oObj.itemnumber + "' name='renew' value='" + oObj.itemnumber +"'/>"
323                                     +  "</span>";
324
325                             content += "<span class='renewals'>("
326                                     + RENEWALS_REMAINING.format( oObj.renewals_remaining, oObj.renewals_allowed )
327                                     + ")</span>";
328                         }
329
330                         content += "</span>";
331
332                         return content;
333                     }
334                 },
335                 {
336                     "bSortable": false,
337                     "mDataProp": function ( oObj ) {
338                         if ( oObj.can_renew_error == "on_reserve" ) {
339                             return "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>";
340                         } else {
341                             return "<input type='checkbox' class='checkin' id='checkin_" + oObj.itemnumber + "' name='checkin' value='" + oObj.itemnumber +"'></input>";
342                         }
343                     }
344                 },
345                 {
346                     "bVisible": exports_enabled ? true : false,
347                     "bSortable": false,
348                     "mDataProp": function ( oObj ) {
349                         return "<input type='checkbox' class='export' id='export_" + oObj.biblionumber + "' name='biblionumbers' value='" + oObj.biblionumber + "' />";
350                     }
351                 }
352             ],
353             "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
354                 var total_charge = 0;
355                 var total_price = 0;
356                 for ( var i=0; i < aaData.length; i++ ) {
357                     total_charge += aaData[i]['charge'] * 1;
358                     total_price  += aaData[i]['price'] * 1;
359                 }
360                 var nCells = nRow.getElementsByTagName('td');
361                 nCells[1].innerHTML = total_charge.toFixed(2);
362                 nCells[2].innerHTML = total_price.toFixed(2);
363             },
364             "bPaginate": false,
365             "bProcessing": true,
366             "bServerSide": false,
367             "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
368             "fnServerData": function ( sSource, aoData, fnCallback ) {
369                 aoData.push( { "name": "borrowernumber", "value": borrowernumber } );
370
371                 $.getJSON( sSource, aoData, function (json) {
372                     fnCallback(json)
373                 } );
374             },
375             "fnInitComplete": function(oSettings) {
376                 // Disable rowGrouping plugin after first use
377                 // so any sorting on the table doesn't use it
378                 var oSettings = issuesTable.fnSettings();
379
380                 for (f = 0; f < oSettings.aoDrawCallback.length; f++) {
381                     if (oSettings.aoDrawCallback[f].sName == 'fnRowGrouping') {
382                         oSettings.aoDrawCallback.splice(f, 1);
383                         break;
384                     }
385                 }
386
387                 oSettings.aaSortingFixed = null;
388             },
389         }).rowGrouping(
390             {
391                 iGroupingColumnIndex: 1,
392                 iGroupingOrderByColumnIndex: 0,
393                 sGroupingColumnSortDirection: "desc"
394             }
395         );
396
397         if ( $("#issues-table").length ) {
398             $("#issues-table_processing").position({
399                 of: $( "#issues-table" ),
400                 collision: "none"
401             });
402         }
403     }
404
405     // Don't load relatives' issues table unless it is clicked on
406     var relativesIssuesTable;
407     $("#relatives-issues-tab").click( function() {
408         if ( ! relativesIssuesTable ) {
409             relativesIssuesTable = $("#relatives-issues-table").dataTable({
410                 "bAutoWidth": false,
411                 "sDom": "rt",
412                 "aaSorting": [],
413                 "aoColumns": [
414                     {
415                         "mDataProp": "date_due",
416                         "bVisible": false,
417                     },
418                     {
419                         "iDataSort": 1, // Sort on hidden unformatted date due column
420                         "mDataProp": function( oObj ) {
421                             var today = new Date();
422                             var due = new Date( oObj.date_due );
423                             if ( today > due ) {
424                                 return "<span class='overdue'>" + oObj.date_due_formatted + "</span>";
425                             } else {
426                                 return oObj.date_due_formatted;
427                             }
428                         }
429                     },
430                     {
431                         "mDataProp": function ( oObj ) {
432                             title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
433                                   + oObj.biblionumber
434                                   + "'>"
435                                   + oObj.title;
436
437                             $.each(oObj.subtitle, function( index, value ) {
438                                       title += " " + value.subfield;
439                             });
440
441                             title += "</a></span>";
442
443                             if ( oObj.author ) {
444                                 title += " " + BY + " " + oObj.author;
445                             }
446
447                             if ( oObj.itemnotes ) {
448                                 var span_class = "";
449                                 if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
450                                     span_class = "circ-hlt";
451                                 }
452                                 title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
453                             }
454
455                             var onsite_checkout = '';
456                             if ( oObj.onsite_checkout == 1 ) {
457                                 onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
458                             }
459
460                             title += " "
461                                   + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
462                                   + oObj.biblionumber
463                                   + "&itemnumber="
464                                   + oObj.itemnumber
465                                   + "#"
466                                   + oObj.itemnumber
467                                   + "'>"
468                                   + oObj.barcode
469                                   + "</a>"
470                                   + onsite_checkout;
471
472                             return title;
473                         }
474                     },
475                     { "mDataProp": "itemtype" },
476                     { "mDataProp": "issuedate_formatted" },
477                     { "mDataProp": "branchname" },
478                     { "mDataProp": "itemcallnumber" },
479                     {
480                         "mDataProp": function ( oObj ) {
481                             if ( ! oObj.charge ) oObj.charge = 0;
482                             return parseFloat(oObj.charge).toFixed(2);
483                         }
484                     },
485                     {
486                         "mDataProp": function ( oObj ) {
487                             if ( ! oObj.price ) oObj.price = 0;
488                             return parseFloat(oObj.price).toFixed(2);
489                         }
490                     },
491                     {
492                         "mDataProp": function( oObj ) {
493                             return "<a href='/cgi-bin/koha/members/moremember.pl?borrowernumber=" + oObj.borrowernumber + "'>"
494                                  + oObj.borrower.firstname + " " + oObj.borrower.surname + " (" + oObj.borrower.cardnumber + ")</a>"
495                         }
496                     },
497                 ],
498                 "bPaginate": false,
499                 "bProcessing": true,
500                 "bServerSide": false,
501                 "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
502                 "fnServerData": function ( sSource, aoData, fnCallback ) {
503                     $.each(relatives_borrowernumbers, function( index, value ) {
504                         aoData.push( { "name": "borrowernumber", "value": value } );
505                     });
506
507                     $.getJSON( sSource, aoData, function (json) {
508                         fnCallback(json)
509                     } );
510                 },
511             });
512         }
513     });
514
515     if ( $("#relatives-issues-table").length ) {
516         $("#relatives-issues-table_processing").position({
517             of: $( "#relatives-issues-table" ),
518             collision: "none"
519         });
520     }
521
522     if ( AllowRenewalLimitOverride ) {
523         $( '#override_limit' ).click( function () {
524             if ( this.checked ) {
525                 $( '.renewals-allowed' ).show(); $( '.renewals-disabled' ).hide();
526             } else {
527                 $( '.renewals-allowed' ).hide(); $( '.renewals-disabled' ).show();
528             }
529         } ).attr( 'checked', false );
530     }
531  });