@@ -, +, @@ - adds a switch to turn off and on row grouping (today's checkouts vs previous checkouts) (on by default) - adds a global filter text input on all tables - adds "column settings" for relatives' checkouts tables - factorize some code that was duplicated across the two DataTables configurations (mDataProp) --- admin/columns_settings.yml | 61 ++ .../prog/en/includes/checkouts-table-footer.inc | 2 +- .../prog/en/includes/checkouts-table.inc | 1 + .../prog/en/includes/datatables-strings.inc | 1 + .../intranet-tmpl/prog/en/includes/datatables.inc | 20 +- .../intranet-tmpl/prog/en/includes/strings.inc | 1 + koha-tmpl/intranet-tmpl/prog/en/js/checkouts.js | 662 ++++++++++----------- koha-tmpl/intranet-tmpl/prog/en/js/datatables.js | 1 + .../prog/en/modules/circ/circulation.tt | 1 + .../prog/en/modules/members/moremember.tt | 1 + svc/checkouts | 66 +- 11 files changed, 423 insertions(+), 394 deletions(-) --- a/admin/columns_settings.yml +++ a/admin/columns_settings.yml @@ -231,6 +231,34 @@ modules: columnname: export cannot_be_toggled: 1 cannot_be_modified: 1 + relatives-issues-table: + - + columnname: due_date_unformatted + cannot_be_toggled: 1 + cannot_be_modified: 1 + is_hidden: 1 + - + columnname: due_date + - + columnname: title + - + columnname: item_type + - + columnname: location + - + columnname: checkout_on + - + columnname: checkout_from + - + columnname: callno + - + columnname: charge + - + columnname: fine + - + columnname: price + - + columnname: patron reports: lostitems: @@ -273,6 +301,11 @@ modules: cannot_be_modified: 1 is_hidden: 1 - + columnname: group_order + cannot_be_toggled: 1 + cannot_be_modified: 1 + is_hidden: 1 + - columnname: todays_or_previous_checkouts cannot_be_toggled: 1 cannot_be_modified: 1 @@ -314,3 +347,31 @@ modules: columnname: export cannot_be_toggled: 1 cannot_be_modified: 1 + relatives-issues-table: + - + columnname: due_date_unformatted + cannot_be_toggled: 1 + cannot_be_modified: 1 + is_hidden: 1 + - + columnname: due_date + - + columnname: title + - + columnname: item_type + - + columnname: location + - + columnname: checkout_on + - + columnname: checkout_from + - + columnname: callno + - + columnname: charge + - + columnname: fine + - + columnname: price + - + columnname: patron --- a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc @@ -1,6 +1,6 @@ - Totals: + Totals: [% totaldue %] [% finetotal %] [% totalprice %] --- a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table.inc @@ -11,6 +11,7 @@     +   Due date Due date Title --- a/koha-tmpl/intranet-tmpl/prog/en/includes/datatables-strings.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/datatables-strings.inc @@ -6,6 +6,7 @@ var MSG_DT_PREVIOUS = _("Previous"); var MSG_DT_EMPTY_TABLE = _("No data available in table"); var MSG_DT_INFO = _("Showing _START_ to _END_ of _TOTAL_"); + var MSG_DT_INFO_SIMPLE = _("Entries shown: _TOTAL_"); var MSG_DT_INFO_EMPTY = _("No entries to show"); var MSG_DT_INFO_FILTERED = _("(filtered from _MAX_ total entries)"); var MSG_DT_LENGTH_MENU = _("Show _MENU_ entries"); --- a/koha-tmpl/intranet-tmpl/prog/en/includes/datatables.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/datatables.inc @@ -1,22 +1,4 @@ [% INCLUDE 'format_price.inc' %] - +[% INCLUDE 'datatables-strings.inc' %] --- a/koha-tmpl/intranet-tmpl/prog/en/includes/strings.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/strings.inc @@ -30,5 +30,6 @@ var NO = _("No"); var YES = _("Yes"); var INHOUSE_USE = _("On-site checkout"); + var GROUP_TODAYS_CHECKOUTS = _("Group today's checkouts"); //]]> --- a/koha-tmpl/intranet-tmpl/prog/en/js/checkouts.js +++ a/koha-tmpl/intranet-tmpl/prog/en/js/checkouts.js @@ -1,3 +1,278 @@ +(function($) { + +var ymd = $.datepicker.formatDate('yy-mm-dd', new Date()); + +function enableGrouping(datatable) { + datatable.rowGrouping({ + iGroupingColumnIndex: 2, + iGroupingOrderByColumnIndex: 1, + sGroupingColumnSortDirection: "asc" + }); +} + +function disableGrouping(datatable) { + var oSettings = datatable.fnSettings(); + for (f = 0; f < oSettings.aoDrawCallback.length; f++) { + if (oSettings.aoDrawCallback[f].sName == 'fnRowGrouping') { + oSettings.aoDrawCallback.splice(f, 1); + datatable.fnDraw(); + break; + } + } +} + +function loadTableData(datatable, borrowernumbers, offset, count) { + offset = offset ? offset : 0; + count = count ? count : 100; + + var args = { + "borrowernumber": borrowernumbers, + "offset": offset, + "count": count + }; + + $.ajax({ + dataType: "json", + traditional: true, + url: '/cgi-bin/koha/svc/checkouts', + data: args, + success: function(data) { + if (data.length) { + datatable.fnAddData(data); + } + + if (data.length < count) { + var oSettings = datatable.fnSettings(); + oSettings.bDataFullyLoaded = true; + + // We need to redraw to update the info text + datatable.fnDraw(); + } else { + loadTableData(datatable, borrowernumbers, offset + count, count); + } + } + }); +} + +function dtSimpleInfoCallback (oSettings, iStart, iEnd, iMax, iTotal, sPre) { + var sInfo; + var oLanguage = oSettings.oLanguage; + + if (iTotal > 0) { + sInfo = oLanguage.sInfoSimple.replace('_TOTAL_', iTotal); + } else { + sInfo = oLanguage.sInfoEmpty; + } + + if (iMax > iTotal) { + sInfo += ' ' + oLanguage.sInfoFiltered.replace('_MAX_', iMax); + } + + if (!oSettings.bDataFullyLoaded) { + sInfo += ' (' + oLanguage.sLoadingRecords + ')'; + } + + return sInfo; +} + +var mDataProps = { + groupOrder: function( oObj ) { + if ( oObj.issued_today ) { + return "0"; + } else { + return "1"; + } + }, + groupName: function( oObj ) { + if ( oObj.issued_today ) { + return "" + TODAYS_CHECKOUTS + ""; + } else { + return "" + PREVIOUS_CHECKOUTS + ""; + } + }, + dateDueFormatted: function( oObj ) { + var due = oObj.date_due_formatted; + + if ( oObj.date_due_overdue ) { + due = "" + due + ""; + } + + if ( oObj.lost ) { + due += "" + oObj.lost + ""; + } + + if ( oObj.damaged ) { + due += "" + oObj.damaged + ""; + } + + due = "" + due + ""; + + return due; + }, + title: function ( oObj ) { + var title = "" + + oObj.title; + + $.each(oObj.subtitle, function( index, value ) { + title += " " + value.subfield; + }); + + title += ""; + + if ( oObj.author ) { + title += " " + BY.replace( "_AUTHOR_", " " + oObj.author ); + } + + if ( oObj.itemnotes ) { + var span_class = ""; + if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) { + span_class = "circ-hlt"; + } + title += " - " + oObj.itemnotes + "" + } + + var onsite_checkout = ''; + if ( oObj.onsite_checkout == 1 ) { + onsite_checkout += " (" + INHOUSE_USE + ")"; + } + + title += " " + + "" + + oObj.barcode + + "" + + onsite_checkout; + + return title; + }, + charge: function ( oObj ) { + if ( ! oObj.charge ) oObj.charge = 0; + return parseFloat(oObj.charge).toFixed(2); + }, + fine: function ( oObj ) { + if ( ! oObj.fine ) oObj.fine = 0; + return parseFloat(oObj.fine).toFixed(2); + }, + price: function ( oObj ) { + if ( ! oObj.price ) oObj.price = 0; + return parseFloat(oObj.price).toFixed(2); + }, + renew: function ( oObj ) { + var content = ""; + var span_style = ""; + var span_class = ""; + + content += ""; + content += "" + oObj.renewals_count + ""; + + if ( oObj.can_renew ) { + // Do nothing + } else if ( oObj.can_renew_error == "on_reserve" ) { + content += "" + + "" + ON_HOLD + "" + + ""; + + span_style = "display: none"; + span_class = "renewals-allowed"; + } else if ( oObj.can_renew_error == "too_many" ) { + content += "" + + NOT_RENEWABLE + + ""; + + span_style = "display: none"; + span_class = "renewals-allowed"; + } else if ( oObj.can_renew_error == "restriction" ) { + content += "" + + NOT_RENEWABLE_RESTRICTION + + ""; + + span_style = "display: none"; + span_class = "renewals-allowed"; + } else if ( oObj.can_renew_error == "overdue" ) { + content += "" + + NOT_RENEWABLE_OVERDUE + + ""; + + span_style = "display: none"; + span_class = "renewals-allowed"; + } else if ( oObj.can_renew_error == "too_soon" ) { + content += "" + + NOT_RENEWABLE_TOO_SOON.format( oObj.can_renew_date ) + + ""; + + span_style = "display: none"; + span_class = "renewals-allowed"; + } else if ( oObj.can_renew_error == "auto_too_soon" ) { + content += "" + + NOT_RENEWABLE_AUTO_TOO_SOON + + ""; + + span_style = "display: none"; + span_class = "renewals-allowed"; + } else if ( oObj.can_renew_error == "auto_renew" ) { + content += "" + + NOT_RENEWABLE_AUTO_RENEW + + ""; + + span_style = "display: none"; + span_class = "renewals-allowed"; + } else if ( oObj.can_renew_error == "onsite_checkout" ) { + // Don't display something if it's an onsite checkout + } else { + content += "" + + oObj.can_renew_error + + ""; + + span_style = "display: none"; + span_class = "renewals-allowed"; + } + + var can_force_renew = ( oObj.onsite_checkout == 0 ) && ( oObj.can_renew_error != "on_reserve" ); + var can_renew = ( oObj.renewals_remaining > 0 && !oObj.can_renew_error ); + if ( can_renew || can_force_renew ) { + content += "" + + "" + + ""; + + content += "(" + + RENEWALS_REMAINING.format( oObj.renewals_remaining, oObj.renewals_allowed ) + + ")"; + } + + content += ""; + + return content; + }, + checkin: function ( oObj ) { + if ( oObj.can_renew_error == "on_reserve" ) { + return "" + ON_HOLD + ""; + } else { + return ""; + } + }, + export: function ( oObj ) { + var s = ""; + + s += ""; + return s; + }, + patron: function( oObj ) { + return "" + + oObj.borrower.firstname + " " + oObj.borrower.surname + " (" + oObj.borrower.cardnumber + ")" + } +}; + $(document).ready(function() { $.ajaxSetup ({ cache: false }); @@ -139,8 +414,6 @@ $(document).ready(function() { return false; }); - var ymd = $.datepicker.formatDate('yy-mm-dd', new Date()); - $('#issues-table').hide(); $('#issues-table-actions').hide(); $('#issues-table-load-immediately').change(function(){ @@ -174,92 +447,19 @@ $(document).ready(function() { "sProcessing": MSG_DT_LOADING_RECORDS, }, "bAutoWidth": false, - "sDom": 'C<"clearfix">rt', + "bPaginate": false, + "sDom": 'C<"top pager"if>rt', "aoColumns": [ - { - "mDataProp": function( oObj ) { - return oObj.sort_order; - } - }, - { - "mDataProp": function( oObj ) { - if ( oObj.issued_today ) { - return "" + TODAYS_CHECKOUTS + ""; - } else { - return "" + PREVIOUS_CHECKOUTS + ""; - } - } - }, - { - "mDataProp": "date_due", - "bVisible": false, - }, + { "mDataProp": "sort_order" }, + { "mDataProp": mDataProps.groupOrder }, + { "mDataProp": mDataProps.groupName }, + { "mDataProp": "date_due" }, { "iDataSort": 2, // Sort on hidden unformatted date due column - "mDataProp": function( oObj ) { - var due = oObj.date_due_formatted; - - if ( oObj.date_due_overdue ) { - due = "" + due + ""; - } - - if ( oObj.lost ) { - due += "" + oObj.lost + ""; - } - - if ( oObj.damaged ) { - due += "" + oObj.damaged + ""; - } - - due = "" + due + ""; - - return due; - } + "mDataProp": mDataProps.dateDueFormatted }, { - "mDataProp": function ( oObj ) { - title = "" - + oObj.title; - - $.each(oObj.subtitle, function( index, value ) { - title += " " + value.subfield; - }); - - title += ""; - - if ( oObj.author ) { - title += " " + BY.replace( "_AUTHOR_", " " + oObj.author ); - } - - if ( oObj.itemnotes ) { - var span_class = ""; - if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) { - span_class = "circ-hlt"; - } - title += " - " + oObj.itemnotes + "" - } - - var onsite_checkout = ''; - if ( oObj.onsite_checkout == 1 ) { - onsite_checkout += " (" + INHOUSE_USE + ")"; - } - - title += " " - + "" - + oObj.barcode - + "" - + onsite_checkout; - - return title; - }, + "mDataProp": mDataProps.title, "sType": "anti-the" }, { "mDataProp": "itemtype_description" }, @@ -267,136 +467,21 @@ $(document).ready(function() { { "mDataProp": "issuedate_formatted" }, { "mDataProp": "branchname" }, { "mDataProp": "itemcallnumber" }, - { - "mDataProp": function ( oObj ) { - if ( ! oObj.charge ) oObj.charge = 0; - return parseFloat(oObj.charge).toFixed(2); - } - }, - { - "mDataProp": function ( oObj ) { - if ( ! oObj.fine ) oObj.fine = 0; - return parseFloat(oObj.fine).toFixed(2); - } - }, - { - "mDataProp": function ( oObj ) { - if ( ! oObj.price ) oObj.price = 0; - return parseFloat(oObj.price).toFixed(2); - } - }, + { "mDataProp": mDataProps.charge }, + { "mDataProp": mDataProps.fine }, + { "mDataProp": mDataProps.price }, { "bSortable": false, - "mDataProp": function ( oObj ) { - var content = ""; - var span_style = ""; - var span_class = ""; - - content += ""; - content += "" + oObj.renewals_count + ""; - - if ( oObj.can_renew ) { - // Do nothing - } else if ( oObj.can_renew_error == "on_reserve" ) { - content += "" - + "" + ON_HOLD + "" - + ""; - - span_style = "display: none"; - span_class = "renewals-allowed"; - } else if ( oObj.can_renew_error == "too_many" ) { - content += "" - + NOT_RENEWABLE - + ""; - - span_style = "display: none"; - span_class = "renewals-allowed"; - } else if ( oObj.can_renew_error == "restriction" ) { - content += "" - + NOT_RENEWABLE_RESTRICTION - + ""; - - span_style = "display: none"; - span_class = "renewals-allowed"; - } else if ( oObj.can_renew_error == "overdue" ) { - content += "" - + NOT_RENEWABLE_OVERDUE - + ""; - - span_style = "display: none"; - span_class = "renewals-allowed"; - } else if ( oObj.can_renew_error == "too_soon" ) { - content += "" - + NOT_RENEWABLE_TOO_SOON.format( oObj.can_renew_date ) - + ""; - - span_style = "display: none"; - span_class = "renewals-allowed"; - } else if ( oObj.can_renew_error == "auto_too_soon" ) { - content += "" - + NOT_RENEWABLE_AUTO_TOO_SOON - + ""; - - span_style = "display: none"; - span_class = "renewals-allowed"; - } else if ( oObj.can_renew_error == "auto_renew" ) { - content += "" - + NOT_RENEWABLE_AUTO_RENEW - + ""; - - span_style = "display: none"; - span_class = "renewals-allowed"; - } else if ( oObj.can_renew_error == "onsite_checkout" ) { - // Don't display something if it's an onsite checkout - } else { - content += "" - + oObj.can_renew_error - + ""; - - span_style = "display: none"; - span_class = "renewals-allowed"; - } - - var can_force_renew = ( oObj.onsite_checkout == 0 ) && ( oObj.can_renew_error != "on_reserve" ); - var can_renew = ( oObj.renewals_remaining > 0 && !oObj.can_renew_error ); - if ( can_renew || can_force_renew ) { - content += "" - + "" - + ""; - - content += "(" - + RENEWALS_REMAINING.format( oObj.renewals_remaining, oObj.renewals_allowed ) - + ")"; - } - - content += ""; - - return content; - } + "mDataProp": mDataProps.renew }, { "bSortable": false, - "mDataProp": function ( oObj ) { - if ( oObj.can_renew_error == "on_reserve" ) { - return "" + ON_HOLD + ""; - } else { - return ""; - } - } + "mDataProp": mDataProps.checkin }, { "bVisible": exports_enabled ? true : false, "bSortable": false, - "mDataProp": function ( oObj ) { - var s = ""; - - s += ""; - return s; - } + "mDataProp": mDataProps.checkin } ], "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) { @@ -412,38 +497,32 @@ $(document).ready(function() { $("#totalfine").html(total_fine.toFixed(2)); $("#totalprice").html(total_price.toFixed(2)); }, - "bPaginate": false, - "bProcessing": true, - "bServerSide": false, - "sAjaxSource": '/cgi-bin/koha/svc/checkouts', - "fnServerData": function ( sSource, aoData, fnCallback ) { - aoData.push( { "name": "borrowernumber", "value": borrowernumber } ); - - $.getJSON( sSource, aoData, function (json) { - fnCallback(json) - } ); - }, - "fnInitComplete": function(oSettings) { - // Disable rowGrouping plugin after first use - // so any sorting on the table doesn't use it - var oSettings = issuesTable.fnSettings(); - - for (f = 0; f < oSettings.aoDrawCallback.length; f++) { - if (oSettings.aoDrawCallback[f].sName == 'fnRowGrouping') { - oSettings.aoDrawCallback.splice(f, 1); - break; - } - } + "fnInfoCallback": dtSimpleInfoCallback + }, columns_settings); + + enableGrouping(issuesTable); + + var groupingSwitch = $('') + .attr('id', 'issues-table-row-grouping-switch') + .attr('checked', 'checked') + .css('vertical-align', 'middle') + .change(function() { + if ($(this).is(':checked')) { + enableGrouping(issuesTable); + } else { + disableGrouping(issuesTable); + } + }); + $('
') + .css('float', 'left') + .css('padding', '0.3em 0.5em') + .css('line-height', '1.9em') + .append(groupingSwitch) + .append(' ') + .append('') + .appendTo('#issues-table_wrapper .top.pager'); - oSettings.aaSortingFixed = null; - }, - }, columns_settings).rowGrouping( - { - iGroupingColumnIndex: 1, - iGroupingOrderByColumnIndex: 0, - sGroupingColumnSortDirection: "asc" - } - ); + loadTableData(issuesTable, borrowernumber); if ( $("#issues-table").length ) { $("#issues-table_processing").position({ @@ -457,71 +536,19 @@ $(document).ready(function() { var relativesIssuesTable; $("#relatives-issues-tab").click( function() { if ( ! relativesIssuesTable ) { - relativesIssuesTable = $("#relatives-issues-table").dataTable({ + relativesIssuesTable = KohaTable("#relatives-issues-table", { "bAutoWidth": false, - "sDom": "rt", + "sDom": 'C<"top pager"if>rt', "aaSorting": [], + "bPaginate": false, "aoColumns": [ - { - "mDataProp": "date_due", - "bVisible": false, - }, + { "mDataProp": "date_due" }, { "iDataSort": 1, // Sort on hidden unformatted date due column - "mDataProp": function( oObj ) { - var today = new Date(); - var due = new Date( oObj.date_due ); - if ( today > due ) { - return "" + oObj.date_due_formatted + ""; - } else { - return oObj.date_due_formatted; - } - } + "mDataProp": mDataProps.dateDueFormatted }, { - "mDataProp": function ( oObj ) { - title = "" - + oObj.title; - - $.each(oObj.subtitle, function( index, value ) { - title += " " + value.subfield; - }); - - title += ""; - - if ( oObj.author ) { - title += " " + BY.replace( "_AUTHOR_", " " + oObj.author ); - } - - if ( oObj.itemnotes ) { - var span_class = ""; - if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) { - span_class = "circ-hlt"; - } - title += " - " + oObj.itemnotes + "" - } - - var onsite_checkout = ''; - if ( oObj.onsite_checkout == 1 ) { - onsite_checkout += " (" + INHOUSE_USE + ")"; - } - - title += " " - + "" - + oObj.barcode - + "" - + onsite_checkout; - - return title; - }, + "mDataProp": mDataProps.title, "sType": "anti-the" }, { "mDataProp": "itemtype" }, @@ -529,45 +556,14 @@ $(document).ready(function() { { "mDataProp": "issuedate_formatted" }, { "mDataProp": "branchname" }, { "mDataProp": "itemcallnumber" }, - { - "mDataProp": function ( oObj ) { - if ( ! oObj.charge ) oObj.charge = 0; - return parseFloat(oObj.charge).toFixed(2); - } - }, - { - "mDataProp": function ( oObj ) { - if ( ! oObj.fine ) oObj.fine = 0; - return parseFloat(oObj.fine).toFixed(2); - } - }, - { - "mDataProp": function ( oObj ) { - if ( ! oObj.price ) oObj.price = 0; - return parseFloat(oObj.price).toFixed(2); - } - }, - { - "mDataProp": function( oObj ) { - return "" - + oObj.borrower.firstname + " " + oObj.borrower.surname + " (" + oObj.borrower.cardnumber + ")" - } - }, + { "mDataProp": mDataProps.charge }, + { "mDataProp": mDataProps.fine }, + { "mDataProp": mDataProps.price }, + { "mDataProp": mDataProps.patron } ], - "bPaginate": false, - "bProcessing": true, - "bServerSide": false, - "sAjaxSource": '/cgi-bin/koha/svc/checkouts', - "fnServerData": function ( sSource, aoData, fnCallback ) { - $.each(relatives_borrowernumbers, function( index, value ) { - aoData.push( { "name": "borrowernumber", "value": value } ); - }); - - $.getJSON( sSource, aoData, function (json) { - fnCallback(json) - } ); - }, - }); + "fnInfoCallback": dtSimpleInfoCallback + }, relatives_columns_settings); + loadTableData(relativesIssuesTable, relatives_borrowernumbers); } }); @@ -587,4 +583,6 @@ $(document).ready(function() { } } ).attr( 'checked', false ); } - }); +}); + +})(jQuery); --- a/koha-tmpl/intranet-tmpl/prog/en/js/datatables.js +++ a/koha-tmpl/intranet-tmpl/prog/en/js/datatables.js @@ -15,6 +15,7 @@ var dataTablesDefaults = { }, "sEmptyTable" : window.MSG_DT_EMPTY_TABLE || "No data available in table", "sInfo" : window.MSG_DT_INFO || "Showing _START_ to _END_ of _TOTAL_ entries", + "sInfoSimple" : window.MSG_DT_INFO_SIMPLE || "Entries shown: _TOTAL_", "sInfoEmpty" : window.MSG_DT_INFO_EMPTY || "No entries to show", "sInfoFiltered" : window.MSG_DT_INFO_FILTERED || "(filtered from _MAX_ total entries)", "sLengthMenu" : window.MSG_DT_LENGTH_MENU || "Show _MENU_ entries", --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -48,6 +48,7 @@ var MSG_ADD_MESSAGE = _("Add a new message"); var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export"); columns_settings = [% ColumnsSettings.GetColumns( 'circ', 'circulation', 'issues-table', 'json' ) %] +relatives_columns_settings = [% ColumnsSettings.GetColumns( 'circ', 'circulation', 'relatives-issues-table', 'json' ) %] [% IF ( borrowernumber ) %] if($.cookie("holdfor") != [% borrowernumber %]){ --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt @@ -44,6 +44,7 @@ var MSG_ADD_MESSAGE = _("Add a new message"); var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export"); columns_settings = [% ColumnsSettings.GetColumns( 'members', 'moremember', 'issues-table', 'json' ) %] +relatives_columns_settings = [% ColumnsSettings.GetColumns( 'members', 'moremember', 'relatives-issues-table', 'json' ) %] $(document).ready(function() { $('#finesholdsissues').tabs({ --- a/svc/checkouts +++ a/svc/checkouts @@ -42,22 +42,9 @@ if ( $auth_status ne "ok" ) { exit 0; } -my @sort_columns = qw/date_due title itype issuedate branchcode itemcallnumber/; - my @borrowernumber = $input->param('borrowernumber'); -my $offset = $input->param('iDisplayStart'); -my $results_per_page = $input->param('iDisplayLength') || -1; - -my $sorting_column = $input->param('iSortCol_0') || q{}; -$sorting_column = ( $sorting_column && $sort_columns[$sorting_column] ) ? $sort_columns[$sorting_column] : 'issuedate'; - -my $sorting_direction = $input->param('sSortDir_0') || q{}; -$sorting_direction = $sorting_direction eq 'asc' ? 'asc' : 'desc'; - -$results_per_page = undef if ( $results_per_page == -1 ); - -binmode STDOUT, ":encoding(UTF-8)"; -print $input->header( -type => 'text/plain', -charset => 'UTF-8' ); +my $offset = $input->param('offset') || 0; +my $count = $input->param('count') || 10; my @parameters; my $sql = ' @@ -112,7 +99,9 @@ else { } push( @parameters, @borrowernumber ); -$sql .= " ORDER BY $sorting_column $sorting_direction "; +$sql .= " ORDER BY date_due DESC"; +$sql .= " LIMIT ?,?"; +push @parameters, $offset, $count; my $dbh = C4::Context->dbh(); my $sth = $dbh->prepare($sql); @@ -120,8 +109,7 @@ $sth->execute(@parameters); my $item_level_itypes = C4::Context->preference('item-level_itypes'); -my @checkouts_today; -my @checkouts_previous; +my @checkouts; while ( my $c = $sth->fetchrow_hashref() ) { my ($charge) = GetIssuingCharges( $c->{itemnumber}, $c->{borrowernumber} ); my $fine = GetFine( $c->{itemnumber}, $c->{borrowernumber} ); @@ -198,33 +186,27 @@ while ( my $c = $sth->fetchrow_hashref() ) { issued_today => !$c->{not_issued_today}, }; - if ( $c->{not_issued_today} ) { - push( @checkouts_previous, $checkout ); - } - else { - push( @checkouts_today, $checkout ); - } + push @checkouts, $checkout; } +my $todaysIssuesDefaultSortOrder = + C4::Context->preference('todaysIssuesDefaultSortOrder'); +my $previousIssuesDefaultSortOrder = + C4::Context->preference('previousIssuesDefaultSortOrder'); -@checkouts_today = sort { $a->{timestamp} cmp $b->{timestamp} } @checkouts_today; -@checkouts_today = reverse(@checkouts_today) - unless ( C4::Context->preference('todaysIssuesDefaultSortOrder') eq 'desc' ); - -@checkouts_previous = sort { $a->{date_due} cmp $b->{date_due} } @checkouts_previous; -@checkouts_previous = reverse(@checkouts_previous) - if ( C4::Context->preference('previousIssuesDefaultSortOrder') eq 'desc' ); - -my @checkouts = ( @checkouts_today, @checkouts_previous ); - -my $i = 1; -map { $_->{sort_order} = $i++ } @checkouts; +my $i = $offset + 1; +foreach my $c (@checkouts) { + my $sort_order = $i++; + if ($c->{issued_today} && $todaysIssuesDefaultSortOrder eq 'asc') { + $sort_order = - $sort_order; + } elsif (!$c->{issued_today} && $previousIssuesDefaultSortOrder eq 'asc') { + $sort_order = - $sort_order; + } -my $data; -$data->{'iTotalRecords'} = scalar @checkouts; -$data->{'iTotalDisplayRecords'} = scalar @checkouts; -$data->{'sEcho'} = $input->param('sEcho') || undef; -$data->{'aaData'} = \@checkouts; + $c->{sort_order} = $sort_order; +} -print to_json($data); +binmode STDOUT, ":encoding(UTF-8)"; +print $input->header( -type => 'application/json', -charset => 'UTF-8' ); +print to_json(\@checkouts); --