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