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