View | Details | Raw Unified | Return to bug 15219
Collapse All | Expand All

(-)a/admin/columns_settings.yml (-12 / +48 lines)
Lines 208-214 modules: Link Here
208
    moremember:
208
    moremember:
209
      issues-table:
209
      issues-table:
210
        -
210
        -
211
          columnname: sort_order
211
          columnname: group_order
212
          cannot_be_toggled: 1
212
          cannot_be_toggled: 1
213
          cannot_be_modified: 1
213
          cannot_be_modified: 1
214
          is_hidden: 1
214
          is_hidden: 1
Lines 218-228 modules: Link Here
218
          cannot_be_modified: 1
218
          cannot_be_modified: 1
219
          is_hidden: 1
219
          is_hidden: 1
220
        -
220
        -
221
          columnname: due_date_unformatted
222
          cannot_be_toggled: 1
223
          cannot_be_modified: 1
224
          is_hidden: 1
225
        -
226
          columnname: due_date
221
          columnname: due_date
227
        -
222
        -
228
          columnname: title
223
          columnname: title
Lines 256-261 modules: Link Here
256
          columnname: export
251
          columnname: export
257
          cannot_be_toggled: 1
252
          cannot_be_toggled: 1
258
          cannot_be_modified: 1
253
          cannot_be_modified: 1
254
      relatives-issues-table:
255
        -
256
          columnname: due_date
257
        -
258
          columnname: title
259
        -
260
          columnname: item_type
261
        -
262
          columnname: location
263
        -
264
          columnname: checkout_on
265
        -
266
          columnname: checkout_from
267
        -
268
          columnname: callno
269
        -
270
          columnname: charge
271
        -
272
          columnname: fine
273
        -
274
          columnname: price
275
        -
276
          columnname: patron
259
277
260
  reports:
278
  reports:
261
    lostitems:
279
    lostitems:
Lines 293-299 modules: Link Here
293
    circulation:
311
    circulation:
294
      issues-table:
312
      issues-table:
295
        -
313
        -
296
          columnname: sort_order
314
          columnname: group_order
297
          cannot_be_toggled: 1
315
          cannot_be_toggled: 1
298
          cannot_be_modified: 1
316
          cannot_be_modified: 1
299
          is_hidden: 1
317
          is_hidden: 1
Lines 303-313 modules: Link Here
303
          cannot_be_modified: 1
321
          cannot_be_modified: 1
304
          is_hidden: 1
322
          is_hidden: 1
305
        -
323
        -
306
          columnname: due_date_unformatted
307
          cannot_be_toggled: 1
308
          cannot_be_modified: 1
309
          is_hidden: 1
310
        -
311
          columnname: due_date
324
          columnname: due_date
312
        -
325
        -
313
          columnname: title
326
          columnname: title
Lines 341-346 modules: Link Here
341
          columnname: export
354
          columnname: export
342
          cannot_be_toggled: 1
355
          cannot_be_toggled: 1
343
          cannot_be_modified: 1
356
          cannot_be_modified: 1
357
      relatives-issues-table:
358
        -
359
          columnname: due_date
360
        -
361
          columnname: title
362
        -
363
          columnname: item_type
364
        -
365
          columnname: location
366
        -
367
          columnname: checkout_on
368
        -
369
          columnname: checkout_from
370
        -
371
          columnname: callno
372
        -
373
          columnname: charge
374
        -
375
          columnname: fine
376
        -
377
          columnname: price
378
        -
379
          columnname: patron
344
380
345
    returns:
381
    returns:
346
      checkedintable:
382
      checkedintable:
(-)a/installer/data/mysql/atomicupdate/bug_15219.sql (+2 lines)
Line 0 Link Here
1
INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
2
VALUES ('ServerSideCheckoutsTables','0',NULL,'If enabled, use the "server-side processing" feature for checkouts tables. Can improve performance when there is a big number of checkouts to display.','YesNo');
(-)a/installer/data/mysql/sysprefs.sql (+1 lines)
Lines 456-461 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
456
('SelfCheckTimeout','120','','Define the number of seconds before the Web-based Self Checkout times out a patron','Integer'),
456
('SelfCheckTimeout','120','','Define the number of seconds before the Web-based Self Checkout times out a patron','Integer'),
457
('SeparateHoldings','0',NULL,'Separate current branch holdings from other holdings','YesNo'),
457
('SeparateHoldings','0',NULL,'Separate current branch holdings from other holdings','YesNo'),
458
('SeparateHoldingsBranch','homebranch','homebranch|holdingbranch','Branch used to separate holdings','Choice'),
458
('SeparateHoldingsBranch','homebranch','homebranch|holdingbranch','Branch used to separate holdings','Choice'),
459
('ServerSideCheckoutsTables','0',NULL,'If enabled, use the "server-side processing" feature for checkouts tables. Can improve performance when there is a big number of checkouts per patron.','YesNo'),
459
('SessionRestrictionByIP','1','Check for change in remote IP address for session security. Disable only when remote IP address changes frequently.','','YesNo'),
460
('SessionRestrictionByIP','1','Check for change in remote IP address for session security. Disable only when remote IP address changes frequently.','','YesNo'),
460
('SessionStorage','mysql','mysql|Pg|tmp','Use database or a temporary file for storing session data','Choice'),
461
('SessionStorage','mysql','mysql|Pg|tmp','Use database or a temporary file for storing session data','Choice'),
461
('ShelfBrowserUsesCcode','1','0','Use the item collection code when finding items for the shelf browser.','YesNo'),
462
('ShelfBrowserUsesCcode','1','0','Use the item collection code when finding items for the shelf browser.','YesNo'),
(-)a/koha-tmpl/intranet-tmpl/lib/jquery/plugins/jquery.dataTables.rowGrouping.js (-5 / +5 lines)
Lines 608-622 Link Here
608
608
609
                      }
609
                      }
610
610
611
            oTable.fnSetColumnVis(properties.iGroupingColumnIndex, !properties.bHideGroupingColumn);
611
            oTable.fnSetColumnVis(properties.iGroupingColumnIndex, !properties.bHideGroupingColumn, false);
612
            if (properties.bCustomColumnOrdering) {
612
            if (properties.bCustomColumnOrdering) {
613
                oTable.fnSetColumnVis(properties.iGroupingOrderByColumnIndex, !properties.bHideGroupingOrderByColumn);
613
                oTable.fnSetColumnVis(properties.iGroupingOrderByColumnIndex, !properties.bHideGroupingOrderByColumn, false);
614
            }
614
            }
615
            if (properties.iGroupingColumnIndex2 != -1) {
615
            if (properties.iGroupingColumnIndex2 != -1) {
616
                oTable.fnSetColumnVis(properties.iGroupingColumnIndex2, !properties.bHideGroupingColumn2);
616
                oTable.fnSetColumnVis(properties.iGroupingColumnIndex2, !properties.bHideGroupingColumn2, false);
617
            }
617
            }
618
            if (properties.bCustomColumnOrdering2) {
618
            if (properties.bCustomColumnOrdering2) {
619
                oTable.fnSetColumnVis(properties.iGroupingOrderByColumnIndex2, !properties.bHideGroupingOrderByColumn2);
619
                oTable.fnSetColumnVis(properties.iGroupingOrderByColumnIndex2, !properties.bHideGroupingOrderByColumn2, false);
620
            }
620
            }
621
            oTable.fnSettings().aoDrawCallback.push({
621
            oTable.fnSettings().aoDrawCallback.push({
622
                "fn": _fnDrawCallBackWithGrouping,
622
                "fn": _fnDrawCallBackWithGrouping,
Lines 687-690 Link Here
687
687
688
        });
688
        });
689
    };
689
    };
690
})(jQuery);
690
})(jQuery);
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc (-1 / +1 lines)
Lines 1-6 Link Here
1
<tfoot>
1
<tfoot>
2
	<tr>
2
	<tr>
3
        <td colspan="11" style="text-align: right; font-weight:bold;">Totals:</td>
3
        <td colspan="10" style="text-align: right; font-weight:bold;">Totals:</td>
4
        <td id="totaldue" style="text-align: right;">[% totaldue %]</td>
4
        <td id="totaldue" style="text-align: right;">[% totaldue %]</td>
5
        <td id="totalfine" style="text-align: right;">[% finetotal %]</td>
5
        <td id="totalfine" style="text-align: right;">[% finetotal %]</td>
6
        <td id="totalprice" style="text-align: right;">[% totalprice %]</td>
6
        <td id="totalprice" style="text-align: right;">[% totalprice %]</td>
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table.inc (-1 lines)
Lines 13-19 Link Here
13
                        <th scope="col">&nbsp;</th>
13
                        <th scope="col">&nbsp;</th>
14
                        <th scope="col">&nbsp;</th>
14
                        <th scope="col">&nbsp;</th>
15
                        <th scope="col">Due date</th>
15
                        <th scope="col">Due date</th>
16
                        <th scope="col">Due date</th>
17
                        <th scope="col">Title</th>
16
                        <th scope="col">Title</th>
18
                        <th scope="col">Item type</th>
17
                        <th scope="col">Item type</th>
19
                        <th scope="col">Location</th>
18
                        <th scope="col">Location</th>
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts.js.inc (+24 lines)
Line 0 Link Here
1
[% USE Koha %]
2
3
<script>
4
  [% IF Koha.Preference('ServerSideCheckoutsTables') %]
5
    var ServerSideCheckoutsTables = true;
6
  [% ELSE %]
7
    var ServerSideCheckoutsTables = false;
8
  [% END %]
9
  var AllowCirculate = [% (CAN_user_circulate_circulate_remaining_permissions)? 1 : 0 %];
10
  var AllowRenewalLimitOverride = [% (CAN_user_circulate_override_renewals && Koha.Preference('AllowRenewalLimitOverride'))? 1 : 0 %];
11
12
  var MSG_DT_LOADING_RECORDS = _("Loading... you may continue scanning.");
13
14
  var borrowernumber = "[% borrowernumber %]";
15
  var relatives_borrowernumbers = new Array();
16
  [% FOREACH b IN relatives_borrowernumbers %]
17
    relatives_borrowernumbers.push("[% b %]");
18
  [% END %]
19
20
  var columns_settings = [% ColumnsSettings.GetColumns( 'circ', 'circulation', 'issues-table', 'json' ) %];
21
  var relatives_columns_settings = [% ColumnsSettings.GetColumns( 'circ', 'circulation', 'relatives-issues-table', 'json' ) %];
22
</script>
23
24
<script type="text/javascript" src="[% interface %]/[% theme %]/js/checkouts.js"></script>
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/columns_settings.inc (-1 / +1 lines)
Lines 28-34 function KohaTable(selector, dt_parameters, columns_settings) { Link Here
28
    var table = $(selector).dataTable($.extend(true, {}, dataTablesDefaults, dt_parameters));
28
    var table = $(selector).dataTable($.extend(true, {}, dataTablesDefaults, dt_parameters));
29
29
30
    $(hidden_ids).each(function(index, value) {
30
    $(hidden_ids).each(function(index, value) {
31
        table.fnSetColumnVis( value, false );
31
        table.fnSetColumnVis( value, false, false );
32
    });
32
    });
33
33
34
    return table;
34
    return table;
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/strings.inc (+1 lines)
Lines 41-45 Link Here
41
    var SUSPEND_HOLD_ERROR_NOT_FOUND = _("Unable to suspend hold, hold not found");
41
    var SUSPEND_HOLD_ERROR_NOT_FOUND = _("Unable to suspend hold, hold not found");
42
    var RESUME_HOLD_ERROR_NOT_FOUND = _("Unable to resume, hold not found");
42
    var RESUME_HOLD_ERROR_NOT_FOUND = _("Unable to resume, hold not found");
43
    var CURRENT = _(" (current) ");
43
    var CURRENT = _(" (current) ");
44
    var GROUP_TODAYS_CHECKOUTS = _("Group today's checkouts");
44
//]]>
45
//]]>
45
</script>
46
</script>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref (+6 lines)
Lines 40-45 Circulation: Link Here
40
                  desc: latest to earliest
40
                  desc: latest to earliest
41
            - due date.
41
            - due date.
42
        -
42
        -
43
            - pref: ServerSideCheckoutsTables
44
              choices:
45
                  yes: Enable
46
                  no: Do not enable
47
            - server-side processing on checkouts tables. It can improve performance when there is a big number of checkouts to display.
48
        -
43
            - pref: SpecifyDueDate
49
            - pref: SpecifyDueDate
44
              choices:
50
              choices:
45
                  yes: Allow
51
                  yes: Allow
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt (-12 / +1 lines)
Lines 28-57 Link Here
28
[% INCLUDE 'timepicker.inc' %]
28
[% INCLUDE 'timepicker.inc' %]
29
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.dataTables.rowGrouping.js"></script>
29
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.dataTables.rowGrouping.js"></script>
30
<script type="text/javascript" src="[% interface %]/[% theme %]/js/pages/circulation.js"></script>
30
<script type="text/javascript" src="[% interface %]/[% theme %]/js/pages/circulation.js"></script>
31
<script type="text/javascript" src="[% interface %]/[% theme %]/js/checkouts.js"></script>
31
[% INCLUDE 'checkouts.js.inc' %]
32
<script type="text/javascript" src="[% interface %]/[% theme %]/js/holds.js"></script>
32
<script type="text/javascript" src="[% interface %]/[% theme %]/js/holds.js"></script>
33
<script type="text/javascript">
33
<script type="text/javascript">
34
//<![CDATA[
34
//<![CDATA[
35
/* Set some variable needed in circulation.js */
35
/* Set some variable needed in circulation.js */
36
var MSG_DT_LOADING_RECORDS = _("Loading... you may continue scanning.");
37
var interface = "[% interface %]";
36
var interface = "[% interface %]";
38
var theme = "[% theme %]";
37
var theme = "[% theme %]";
39
var borrowernumber = "[% borrowernumber %]";
40
var branchcode = "[% branch %]";
38
var branchcode = "[% branch %]";
41
var exports_enabled = "[% exports_enabled %]";
39
var exports_enabled = "[% exports_enabled %]";
42
var AllowRenewalLimitOverride = [% (CAN_user_circulate_override_renewals && Koha.Preference('AllowRenewalLimitOverride') )? 1: 0 %];
43
var AllowCirculate = [% (CAN_user_circulate_circulate_remaining_permissions)? 1 : 0 %];
44
var script = "circulation";
40
var script = "circulation";
45
var relatives_borrowernumbers = new Array();
46
[% FOREACH b IN relatives_borrowernumbers %]
47
    relatives_borrowernumbers.push("[% b %]");
48
[% END %]
49
41
50
var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export");
42
var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export");
51
var MSG_CONFIRM_DELETE_MESSAGE = _("Are you sure you want to delete this message? This cannot be undone.");
43
var MSG_CONFIRM_DELETE_MESSAGE = _("Are you sure you want to delete this message? This cannot be undone.");
52
44
53
columns_settings = [% ColumnsSettings.GetColumns( 'circ', 'circulation', 'issues-table', 'json' ) %]
54
55
[% IF borrowernumber and borrower %]
45
[% IF borrowernumber and borrower %]
56
    if($.cookie("holdfor") != [% borrowernumber %]){
46
    if($.cookie("holdfor") != [% borrowernumber %]){
57
        $.removeCookie("holdfor", { path: '/' });
47
        $.removeCookie("holdfor", { path: '/' });
Lines 921-927 No patron matched <span class="ex">[% message | html %]</span> Link Here
921
        <table id="relatives-issues-table">
911
        <table id="relatives-issues-table">
922
            <thead>
912
            <thead>
923
                <tr>
913
                <tr>
924
                    <th scope="col">Due date (unformatted, hidden)</th>
925
                    <th scope="col">Due date</th>
914
                    <th scope="col">Due date</th>
926
                    <th scope="col">Title</th>
915
                    <th scope="col">Title</th>
927
                    <th scope="col">Item type</th>
916
                    <th scope="col">Item type</th>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt (-11 / +1 lines)
Lines 25-52 Link Here
25
[% INCLUDE 'timepicker.inc' %]
25
[% INCLUDE 'timepicker.inc' %]
26
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.dataTables.rowGrouping.js"></script>
26
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.dataTables.rowGrouping.js"></script>
27
<script type="text/javascript" src="[% interface %]/[% theme %]/js/pages/circulation.js"></script>
27
<script type="text/javascript" src="[% interface %]/[% theme %]/js/pages/circulation.js"></script>
28
<script type="text/javascript" src="[% interface %]/[% theme %]/js/checkouts.js"></script>
28
[% INCLUDE 'checkouts.js.inc' %]
29
<script type="text/javascript" src="[% interface %]/[% theme %]/js/holds.js"></script>
29
<script type="text/javascript" src="[% interface %]/[% theme %]/js/holds.js"></script>
30
<script type="text/JavaScript">
30
<script type="text/JavaScript">
31
//<![CDATA[
31
//<![CDATA[
32
/* Set some variable needed in circulation.js */
32
/* Set some variable needed in circulation.js */
33
var interface = "[% interface %]";
33
var interface = "[% interface %]";
34
var theme = "[% theme %]";
34
var theme = "[% theme %]";
35
var borrowernumber = "[% borrowernumber %]";
36
var branchcode = "[% Branches.GetLoggedInBranchcode() %]";
35
var branchcode = "[% Branches.GetLoggedInBranchcode() %]";
37
var exports_enabled = "[% exports_enabled %]";
36
var exports_enabled = "[% exports_enabled %]";
38
var AllowCirculate = [% (CAN_user_circulate_circulate_remaining_permissions)? 1 : 0 %]
39
var AllowRenewalLimitOverride = [% (CAN_user_circulate_override_renewals && Koha.Preference('AllowRenewalLimitOverride') )? 1: 0 %];
40
var script = "moremember";
37
var script = "moremember";
41
var relatives_borrowernumbers = new Array();
42
[% FOREACH b IN relatives_borrowernumbers %]
43
    relatives_borrowernumbers.push("[% b %]");
44
[% END %]
45
38
46
var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export");
39
var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export");
47
40
48
columns_settings = [% ColumnsSettings.GetColumns( 'members', 'moremember', 'issues-table', 'json' ) %]
49
50
$(document).ready(function() {
41
$(document).ready(function() {
51
    $('#finesholdsissues').tabs({
42
    $('#finesholdsissues').tabs({
52
        // Correct table sizing for tables hidden in tabs
43
        // Correct table sizing for tables hidden in tabs
Lines 528-534 function validate1(date) { Link Here
528
        <table id="relatives-issues-table" style="width: 100% !Important;">
519
        <table id="relatives-issues-table" style="width: 100% !Important;">
529
            <thead>
520
            <thead>
530
                <tr>
521
                <tr>
531
                    <th scope="col">Due date hidden not formatted</th>
532
                    <th scope="col">Due date</th>
522
                    <th scope="col">Due date</th>
533
                    <th scope="col">Title</th>
523
                    <th scope="col">Title</th>
534
                    <th scope="col">Item type</th>
524
                    <th scope="col">Item type</th>
(-)a/koha-tmpl/intranet-tmpl/prog/js/checkouts.js (-358 / +360 lines)
Lines 1-3 Link Here
1
(function($) {
2
3
var ymd = $.datepicker.formatDate('yy-mm-dd', new Date());
4
5
function enableGrouping(datatable) {
6
    datatable.rowGrouping({
7
        iGroupingColumnIndex: 1,
8
        iGroupingOrderByColumnIndex: 0,
9
        sGroupingColumnSortDirection: "desc"
10
    });
11
}
12
13
function disableGrouping(datatable) {
14
    var oSettings = datatable.fnSettings();
15
    for (f = 0; f < oSettings.aoDrawCallback.length; f++) {
16
        if (oSettings.aoDrawCallback[f].sName == 'fnRowGrouping') {
17
            oSettings.aoDrawCallback.splice(f, 1);
18
            oSettings.aaSortingFixed = null;
19
            datatable.fnDraw();
20
            break;
21
        }
22
    }
23
}
24
25
var mRenders = {
26
    groupOrder: function (oData, sType, oObj) {
27
        if ( oObj.issued_today ) {
28
            return "1";
29
        } else {
30
            return "0";
31
        }
32
    },
33
    groupName: function (oData, sType, oObj) {
34
        if (oObj.issued_today) {
35
            return "<strong>" + TODAYS_CHECKOUTS + "</strong>";
36
        } else {
37
            return "<strong>" + PREVIOUS_CHECKOUTS + "</strong>";
38
        }
39
    },
40
    dateDueFormatted: function (oData, sType, oObj) {
41
        var due = oObj.date_due_formatted;
42
43
        if ( oObj.date_due_overdue ) {
44
            due = "<span class='overdue'>" + due + "</span>";
45
        }
46
47
        due = "<span id='date_due_" + oObj.itemnumber + "' class='date_due'>" + due + "</span>";
48
49
        if ( oObj.lost ) {
50
            due += "<span class='lost'>" + oObj.lost + "</span>";
51
        }
52
53
        if ( oObj.damaged ) {
54
            due += "<span class='dmg'>" + oObj.damaged + "</span>";
55
        }
56
57
        return due;
58
    },
59
    title: function (oData, sType, oObj) {
60
        var title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
61
              + oObj.biblionumber
62
              + "'>"
63
              + oObj.title;
64
65
        $.each(oObj.subtitle, function( index, value ) {
66
                  title += " " + value.subfield;
67
        });
68
69
        if ( oObj.enumchron ) {
70
            title += " (" + oObj.enumchron + ")";
71
        }
72
73
        title += "</a></span>";
74
75
        if ( oObj.author ) {
76
            title += " " + BY.replace( "_AUTHOR_",  " " + oObj.author );
77
        }
78
79
        if ( oObj.itemnotes ) {
80
            var span_class = "";
81
            if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
82
                span_class = "circ-hlt";
83
            }
84
            title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
85
        }
86
87
        if ( oObj.itemnotes_nonpublic ) {
88
            var span_class = "";
89
            if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
90
                span_class = "circ-hlt";
91
            }
92
            title += " - <span class='" + span_class + "'>" + oObj.itemnotes_nonpublic + "</span>"
93
        }
94
95
        var onsite_checkout = '';
96
        if ( oObj.onsite_checkout == 1 ) {
97
            onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
98
        }
99
100
        title += " "
101
              + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
102
              + oObj.biblionumber
103
              + "&itemnumber="
104
              + oObj.itemnumber
105
              + "#"
106
              + oObj.itemnumber
107
              + "'>"
108
              + oObj.barcode
109
              + "</a>"
110
              + onsite_checkout;
111
112
        return title;
113
    },
114
    itemtype: function (oData, sType, oObj) {
115
        return oObj.itemtype_description;
116
    },
117
    issuedate: function (oData, sType, oObj) {
118
        return oObj.issuedate_formatted;
119
    },
120
    branch: function (oData, sType, oObj) {
121
        return oObj.branchname;
122
    },
123
    charge: function (oData, sType, oObj) {
124
        if (!oObj.charge) oObj.charge = 0;
125
        return '<span style="text-align: right; display: block;">' + parseFloat(oObj.charge).toFixed(2) + '<span>';
126
    },
127
    fine: function (oData, sType, oObj) {
128
        if (!oObj.fine) oObj.fine = 0;
129
        return '<span style="text-align: right; display: block;">' + parseFloat(oObj.fine).toFixed(2)  + '<span>';
130
    },
131
    price: function (oData, sType, oObj) {
132
        if (!oObj.price) oObj.price = 0;
133
        return parseFloat(oObj.price).toFixed(2);
134
    },
135
    renew: function (oData, sType, oObj) {
136
        var content = "";
137
        var span_style = "";
138
        var span_class = "";
139
140
        content += "<span>";
141
        content += "<span style='padding: 0 1em;'>" + oObj.renewals_count + "</span>";
142
143
        if ( oObj.can_renew ) {
144
            // Do nothing
145
        } else if ( oObj.can_renew_error == "on_reserve" ) {
146
            content += "<span class='renewals-disabled-no-override'>"
147
                    + "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>"
148
                    + "</span>";
149
150
            span_style = "display: none";
151
            span_class = "renewals-allowed";
152
        } else if ( oObj.can_renew_error == "too_many" ) {
153
            content += "<span class='renewals-disabled'>"
154
                    + NOT_RENEWABLE
155
                    + "</span>";
156
157
            span_style = "display: none";
158
            span_class = "renewals-allowed";
159
        } else if ( oObj.can_renew_error == "restriction" ) {
160
            content += "<span class='renewals-disabled'>"
161
                    + NOT_RENEWABLE_RESTRICTION
162
                    + "</span>";
163
164
            span_style = "display: none";
165
            span_class = "renewals-allowed";
166
        } else if ( oObj.can_renew_error == "overdue" ) {
167
            content += "<span class='renewals-disabled'>"
168
                    + NOT_RENEWABLE_OVERDUE
169
                    + "</span>";
170
171
            span_style = "display: none";
172
            span_class = "renewals-allowed";
173
        } else if ( oObj.can_renew_error == "too_soon" ) {
174
            content += "<span class='renewals-disabled'>"
175
                    + NOT_RENEWABLE_TOO_SOON.format( oObj.can_renew_date )
176
                    + "</span>";
177
178
            span_style = "display: none";
179
            span_class = "renewals-allowed";
180
        } else if ( oObj.can_renew_error == "auto_too_soon" ) {
181
            content += "<span class='renewals-disabled'>"
182
                    + NOT_RENEWABLE_AUTO_TOO_SOON
183
                    + "</span>";
184
185
            span_style = "display: none";
186
            span_class = "renewals-allowed";
187
        } else if ( oObj.can_renew_error == "auto_too_late" ) {
188
            content += "<span class='renewals-disabled'>"
189
                    + NOT_RENEWABLE_AUTO_TOO_LATE
190
                    + "</span>";
191
192
            span_style = "display: none";
193
            span_class = "renewals-allowed";
194
        } else if ( oObj.can_renew_error == "auto_renew" ) {
195
            content += "<span class='renewals-disabled'>"
196
                    + NOT_RENEWABLE_AUTO_RENEW
197
                    + "</span>";
198
199
            span_style = "display: none";
200
            span_class = "renewals-allowed";
201
        } else if ( oObj.can_renew_error == "onsite_checkout" ) {
202
            // Don't display something if it's an onsite checkout
203
        } else {
204
            content += "<span class='renewals-disabled'>"
205
                    + oObj.can_renew_error
206
                    + "</span>";
207
208
            span_style = "display: none";
209
            span_class = "renewals-allowed";
210
        }
211
212
        var can_force_renew = ( oObj.onsite_checkout == 0 ) && ( oObj.can_renew_error != "on_reserve" );
213
        var can_renew = ( oObj.renewals_remaining > 0  && !oObj.can_renew_error );
214
        if ( can_renew || can_force_renew ) {
215
            content += "<span class='" + span_class + "' style='" + span_style + "'>"
216
                    +  "<input type='checkbox' ";
217
            if ( oObj.date_due_overdue && can_renew ) {
218
                content += "checked='checked' ";
219
            }
220
            content += "class='renew' id='renew_" + oObj.itemnumber + "' name='renew' value='" + oObj.itemnumber +"'/>"
221
                    +  "</span>";
222
223
            content += "<span class='renewals'>("
224
                    + RENEWALS_REMAINING.format( oObj.renewals_remaining, oObj.renewals_allowed )
225
                    + ")</span>";
226
        }
227
228
        content += "</span>";
229
230
        return content;
231
    },
232
    checkin: function (oData, sType, oObj) {
233
        if (oObj.can_renew_error == "on_reserve") {
234
            return "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>";
235
        } else {
236
            return "<input type='checkbox' class='checkin' id='checkin_" + oObj.itemnumber + "' name='checkin' value='" + oObj.itemnumber +"'></input>";
237
        }
238
    },
239
    export: function (oData, sType, oObj) {
240
        var s = "<input type='checkbox' name='itemnumbers' value='" + oObj.itemnumber + "' style='visibility:hidden;' />";
241
242
        s += "<input type='checkbox' class='export' id='export_" + oObj.biblionumber + "' name='biblionumbers' value='" + oObj.biblionumber + "' />";
243
        return s;
244
    },
245
    patron: function (oData, sType, oObj) {
246
        return "<a href='/cgi-bin/koha/members/moremember.pl?borrowernumber=" + oObj.borrowernumber + "'>"
247
             + oObj.borrower.firstname + " " + oObj.borrower.surname + " (" + oObj.borrower.cardnumber + ")</a>"
248
    }
249
};
250
1
$(document).ready(function() {
251
$(document).ready(function() {
2
    $.ajaxSetup ({ cache: false });
252
    $.ajaxSetup ({ cache: false });
3
253
Lines 139-146 $(document).ready(function() { Link Here
139
        return false;
389
        return false;
140
    });
390
    });
141
391
142
    var ymd = $.datepicker.formatDate('yy-mm-dd', new Date());
143
144
    $('#issues-table').hide();
392
    $('#issues-table').hide();
145
    $('#issues-table-actions').hide();
393
    $('#issues-table-actions').hide();
146
    $('#issues-table-load-immediately').change(function(){
394
    $('#issues-table-load-immediately').change(function(){
Lines 174-189 $(document).ready(function() { Link Here
174
                "sProcessing": MSG_DT_LOADING_RECORDS,
422
                "sProcessing": MSG_DT_LOADING_RECORDS,
175
            },
423
            },
176
            "bAutoWidth": false,
424
            "bAutoWidth": false,
177
            "dom": 'B<"clearfix">rt',
425
            "bProcessing": true,
426
            "bServerSide": ServerSideCheckoutsTables,
427
            "sAjaxSource": "/cgi-bin/koha/svc/checkouts",
428
            "fnServerParams": function (aoData) {
429
                aoData.push({ "name": "borrowernumber", "value": borrowernumber });
430
            },
431
            "bPaginate": true,
432
            "sPaginationType": "four_button",
433
            "dom": 'B<"clearfix"><"top pager"ilp>rt',
434
            "aaSorting": [],
178
            "aoColumns": [
435
            "aoColumns": [
179
                {
436
                {
180
                    "mDataProp": function( oObj ) {
437
                    "mData": "issued_today",
181
                        return oObj.sort_order;
438
                    "mRender": mRenders.groupOrder
182
                    }
183
                },
439
                },
184
                {
440
                {
185
                    "mDataProp": function( oObj ) {
441
                    "mData": function (oObj) {
186
                        if ( oObj.issued_today ) {
442
                        if (oObj.issued_today) {
187
                            return "<strong>" + TODAYS_CHECKOUTS + "</strong>";
443
                            return "<strong>" + TODAYS_CHECKOUTS + "</strong>";
188
                        } else {
444
                        } else {
189
                            return "<strong>" + PREVIOUS_CHECKOUTS + "</strong>";
445
                            return "<strong>" + PREVIOUS_CHECKOUTS + "</strong>";
Lines 191-425 $(document).ready(function() { Link Here
191
                    }
447
                    }
192
                },
448
                },
193
                {
449
                {
194
                    "mDataProp": "date_due",
450
                    "mData": "date_due",
195
                    "bVisible": false,
451
                    "mRender": mRenders.dateDueFormatted
196
                },
452
                },
197
                {
453
                {
198
                    "iDataSort": 2, // Sort on hidden unformatted date due column
454
                    "mData": "title",
199
                    "mDataProp": function( oObj ) {
455
                    "mRender": mRenders.title
200
                        var due = oObj.date_due_formatted;
201
202
                        if ( oObj.date_due_overdue ) {
203
                            due = "<span class='overdue'>" + due + "</span>";
204
                        }
205
206
                        due = "<span id='date_due_" + oObj.itemnumber + "' class='date_due'>" + due + "</span>";
207
208
                        if ( oObj.lost ) {
209
                            due += "<span class='lost'>" + oObj.lost + "</span>";
210
                        }
211
212
                        if ( oObj.damaged ) {
213
                            due += "<span class='dmg'>" + oObj.damaged + "</span>";
214
                        }
215
216
217
                        return due;
218
                    }
219
                },
456
                },
220
                {
457
                {
221
                    "mDataProp": function ( oObj ) {
458
                    "mData": "itemtype",
222
                        title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
459
                    "mRender": mRenders.itemtype
223
                              + oObj.biblionumber
224
                              + "'>"
225
                              + oObj.title;
226
227
                        $.each(oObj.subtitle, function( index, value ) {
228
                                  title += " " + value.subfield;
229
                        });
230
231
                        if ( oObj.enumchron ) {
232
                            title += " (" + oObj.enumchron + ")";
233
                        }
234
235
                        title += "</a></span>";
236
237
                        if ( oObj.author ) {
238
                            title += " " + BY.replace( "_AUTHOR_",  " " + oObj.author );
239
                        }
240
241
                        if ( oObj.itemnotes ) {
242
                            var span_class = "";
243
                            if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
244
                                span_class = "circ-hlt";
245
                            }
246
                            title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
247
                        }
248
249
                        if ( oObj.itemnotes_nonpublic ) {
250
                            var span_class = "";
251
                            if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
252
                                span_class = "circ-hlt";
253
                            }
254
                            title += " - <span class='" + span_class + "'>" + oObj.itemnotes_nonpublic + "</span>"
255
                        }
256
257
                        var onsite_checkout = '';
258
                        if ( oObj.onsite_checkout == 1 ) {
259
                            onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
260
                        }
261
262
                        title += " "
263
                              + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
264
                              + oObj.biblionumber
265
                              + "&itemnumber="
266
                              + oObj.itemnumber
267
                              + "#"
268
                              + oObj.itemnumber
269
                              + "'>"
270
                              + oObj.barcode
271
                              + "</a>"
272
                              + onsite_checkout;
273
274
                        return title;
275
                    },
276
                    "sType": "anti-the"
277
                },
460
                },
278
                { "mDataProp": "itemtype_description" },
461
                { "mData": "location" },
279
                { "mDataProp": "location" },
462
                { "mData": "homebranch" },
280
                { "mDataProp": "homebranch" },
281
                { "mDataProp": "issuedate_formatted" },
282
                { "mDataProp": "branchname" },
283
                { "mDataProp": "itemcallnumber" },
284
                {
463
                {
285
                    "mDataProp": function ( oObj ) {
464
                    "mData": "issuedate",
286
                        if ( ! oObj.charge ) oObj.charge = 0;
465
                    "mRender": mRenders.issuedate
287
                        return '<span style="text-align: right; display: block;">' + parseFloat(oObj.charge).toFixed(2) + '<span>';
288
                    }
289
                },
466
                },
290
                {
467
                {
291
                    "mDataProp": function ( oObj ) {
468
                    "mData": "branchcode",
292
                        if ( ! oObj.fine ) oObj.fine = 0;
469
                    "mRender": mRenders.branch
293
                        return '<span style="text-align: right; display: block;">' + parseFloat(oObj.fine).toFixed(2)  + '<span>';
294
                    }
295
                },
470
                },
471
                { "mData": "itemcallnumber" },
296
                {
472
                {
297
                    "mDataProp": function ( oObj ) {
473
                    "mData": "charge",
298
                        if ( ! oObj.price ) oObj.price = 0;
474
                    "mRender": mRenders.charge,
299
                        return '<span style="text-align: right; display: block;">' + parseFloat(oObj.price).toFixed(2) + '<span>';
475
                    "bSortable": ServerSideCheckoutsTables ? false : true
300
                    }
476
                },
477
                {
478
                    "mData": "fine",
479
                    "mRender": mRenders.fine,
480
                    "bSortable": ServerSideCheckoutsTables ? false : true
481
                },
482
                {
483
                    "mData": "replacementprice",
484
                    "mRender": mRenders.price,
485
                    "bSortable": ServerSideCheckoutsTables ? false : true
301
                },
486
                },
302
                {
487
                {
303
                    "bSortable": false,
304
                    "bVisible": AllowCirculate ? true : false,
488
                    "bVisible": AllowCirculate ? true : false,
305
                    "mDataProp": function ( oObj ) {
489
                    "mRender": mRenders.renew,
306
                        var content = "";
490
                    "bSortable": false
307
                        var span_style = "";
308
                        var span_class = "";
309
310
                        content += "<span>";
311
                        content += "<span style='padding: 0 1em;'>" + oObj.renewals_count + "</span>";
312
313
                        if ( oObj.can_renew ) {
314
                            // Do nothing
315
                        } else if ( oObj.can_renew_error == "on_reserve" ) {
316
                            content += "<span class='renewals-disabled-no-override'>"
317
                                    + "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>"
318
                                    + "</span>";
319
320
                            span_style = "display: none";
321
                            span_class = "renewals-allowed";
322
                        } else if ( oObj.can_renew_error == "too_many" ) {
323
                            content += "<span class='renewals-disabled'>"
324
                                    + NOT_RENEWABLE
325
                                    + "</span>";
326
327
                            span_style = "display: none";
328
                            span_class = "renewals-allowed";
329
                        } else if ( oObj.can_renew_error == "restriction" ) {
330
                            content += "<span class='renewals-disabled'>"
331
                                    + NOT_RENEWABLE_RESTRICTION
332
                                    + "</span>";
333
334
                            span_style = "display: none";
335
                            span_class = "renewals-allowed";
336
                        } else if ( oObj.can_renew_error == "overdue" ) {
337
                            content += "<span class='renewals-disabled'>"
338
                                    + NOT_RENEWABLE_OVERDUE
339
                                    + "</span>";
340
341
                            span_style = "display: none";
342
                            span_class = "renewals-allowed";
343
                        } else if ( oObj.can_renew_error == "too_soon" ) {
344
                            content += "<span class='renewals-disabled'>"
345
                                    + NOT_RENEWABLE_TOO_SOON.format( oObj.can_renew_date )
346
                                    + "</span>";
347
348
                            span_style = "display: none";
349
                            span_class = "renewals-allowed";
350
                        } else if ( oObj.can_renew_error == "auto_too_soon" ) {
351
                            content += "<span class='renewals-disabled'>"
352
                                    + NOT_RENEWABLE_AUTO_TOO_SOON
353
                                    + "</span>";
354
355
                            span_style = "display: none";
356
                            span_class = "renewals-allowed";
357
                        } else if ( oObj.can_renew_error == "auto_too_late" ) {
358
                            content += "<span class='renewals-disabled'>"
359
                                    + NOT_RENEWABLE_AUTO_TOO_LATE
360
                                    + "</span>";
361
362
                            span_style = "display: none";
363
                            span_class = "renewals-allowed";
364
                        } else if ( oObj.can_renew_error == "auto_renew" ) {
365
                            content += "<span class='renewals-disabled'>"
366
                                    + NOT_RENEWABLE_AUTO_RENEW
367
                                    + "</span>";
368
369
                            span_style = "display: none";
370
                            span_class = "renewals-allowed";
371
                        } else if ( oObj.can_renew_error == "onsite_checkout" ) {
372
                            // Don't display something if it's an onsite checkout
373
                        } else {
374
                            content += "<span class='renewals-disabled'>"
375
                                    + oObj.can_renew_error
376
                                    + "</span>";
377
378
                            span_style = "display: none";
379
                            span_class = "renewals-allowed";
380
                        }
381
382
                        var can_force_renew = ( oObj.onsite_checkout == 0 ) && ( oObj.can_renew_error != "on_reserve" );
383
                        var can_renew = ( oObj.renewals_remaining > 0  && !oObj.can_renew_error );
384
                        if ( can_renew || can_force_renew ) {
385
                            content += "<span class='" + span_class + "' style='" + span_style + "'>"
386
                                    +  "<input type='checkbox' ";
387
                            if ( oObj.date_due_overdue && can_renew ) {
388
                                content += "checked='checked' ";
389
                            }
390
                            content += "class='renew' id='renew_" + oObj.itemnumber + "' name='renew' value='" + oObj.itemnumber +"'/>"
391
                                    +  "</span>";
392
393
                            content += "<span class='renewals'>("
394
                                    + RENEWALS_REMAINING.format( oObj.renewals_remaining, oObj.renewals_allowed )
395
                                    + ")</span>";
396
                        }
397
398
                        content += "</span>";
399
400
                        return content;
401
                    }
402
                },
491
                },
403
                {
492
                {
404
                    "bSortable": false,
405
                    "bVisible": AllowCirculate ? true : false,
493
                    "bVisible": AllowCirculate ? true : false,
406
                    "mDataProp": function ( oObj ) {
494
                    "mRender": mRenders.checkin,
407
                        if ( oObj.can_renew_error == "on_reserve" ) {
495
                    "bSortable": false
408
                            return "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>";
409
                        } else {
410
                            return "<input type='checkbox' class='checkin' id='checkin_" + oObj.itemnumber + "' name='checkin' value='" + oObj.itemnumber +"'></input>";
411
                        }
412
                    }
413
                },
496
                },
414
                {
497
                {
415
                    "bVisible": exports_enabled ? true : false,
498
                    "bVisible": exports_enabled ? true : false,
416
                    "bSortable": false,
499
                    "bSortable": false,
417
                    "mDataProp": function ( oObj ) {
500
                    "mRender": mRenders.export
418
                        var s = "<input type='checkbox' name='itemnumbers' value='" + oObj.itemnumber + "' style='visibility:hidden;' />";
419
420
                        s += "<input type='checkbox' class='export' id='export_" + oObj.biblionumber + "' name='biblionumbers' value='" + oObj.biblionumber + "' />";
421
                        return s;
422
                    }
423
                }
501
                }
424
            ],
502
            ],
425
            "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
503
            "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
Lines 434-472 $(document).ready(function() { Link Here
434
                $("#totaldue").html(total_charge.toFixed(2));
512
                $("#totaldue").html(total_charge.toFixed(2));
435
                $("#totalfine").html(total_fine.toFixed(2));
513
                $("#totalfine").html(total_fine.toFixed(2));
436
                $("#totalprice").html(total_price.toFixed(2));
514
                $("#totalprice").html(total_price.toFixed(2));
437
            },
438
            "bPaginate": false,
439
            "bProcessing": true,
440
            "bServerSide": false,
441
            "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
442
            "fnServerData": function ( sSource, aoData, fnCallback ) {
443
                aoData.push( { "name": "borrowernumber", "value": borrowernumber } );
444
445
                $.getJSON( sSource, aoData, function (json) {
446
                    fnCallback(json)
447
                } );
448
            },
449
            "fnInitComplete": function(oSettings) {
450
                // Disable rowGrouping plugin after first use
451
                // so any sorting on the table doesn't use it
452
                var oSettings = issuesTable.fnSettings();
453
454
                for (f = 0; f < oSettings.aoDrawCallback.length; f++) {
455
                    if (oSettings.aoDrawCallback[f].sName == 'fnRowGrouping') {
456
                        oSettings.aoDrawCallback.splice(f, 1);
457
                        break;
458
                    }
459
                }
460
461
                oSettings.aaSortingFixed = null;
462
            },
463
        }, columns_settings).rowGrouping(
464
            {
465
                iGroupingColumnIndex: 1,
466
                iGroupingOrderByColumnIndex: 0,
467
                sGroupingColumnSortDirection: "asc"
468
            }
515
            }
469
        );
516
        }, columns_settings);
517
518
        enableGrouping(issuesTable);
519
520
        var groupingSwitch = $('<input type="checkbox">')
521
          .attr('id', 'issues-table-row-grouping-switch')
522
          .attr('checked', 'checked')
523
          .css('vertical-align', 'middle')
524
          .change(function() {
525
              if ($(this).is(':checked')) {
526
                  enableGrouping(issuesTable);
527
              } else {
528
                  disableGrouping(issuesTable);
529
              }
530
          });
531
        $('<div></div>')
532
          .css('float', 'left')
533
          .css('padding', '0.3em 0.5em')
534
          .css('line-height', '1.9em')
535
          .append(groupingSwitch)
536
          .append('&nbsp;')
537
          .append('<label for="issues-table-row-grouping-switch">' + GROUP_TODAYS_CHECKOUTS + '</label>')
538
          .appendTo('#issues-table_wrapper .top.pager');
470
539
471
        if ( $("#issues-table").length ) {
540
        if ( $("#issues-table").length ) {
472
            $("#issues-table_processing").position({
541
            $("#issues-table_processing").position({
Lines 480-608 $(document).ready(function() { Link Here
480
    var relativesIssuesTable;
549
    var relativesIssuesTable;
481
    $("#relatives-issues-tab").click( function() {
550
    $("#relatives-issues-tab").click( function() {
482
        if ( ! relativesIssuesTable ) {
551
        if ( ! relativesIssuesTable ) {
483
            relativesIssuesTable = $("#relatives-issues-table").dataTable({
552
            relativesIssuesTable = KohaTable("#relatives-issues-table", {
484
                "bAutoWidth": false,
553
                "bAutoWidth": false,
485
                "sDom": "rt",
554
                "sDom": 'C<"top pager"ilp>rt',
486
                "aaSorting": [],
555
                "aaSorting": [[4, "desc"]],
556
                "bProcessing": true,
557
                "bServerSide": ServerSideCheckoutsTables,
558
                "sAjaxSource": "/cgi-bin/koha/svc/checkouts",
559
                "fnServerParams": function (aoData) {
560
                    for (i in relatives_borrowernumbers) {
561
                        var borrowernumber = relatives_borrowernumbers[i];
562
                        aoData.push({ "name": "borrowernumber", "value": borrowernumber });
563
                    }
564
                },
565
                "bPaginate": true,
566
                "sPaginationType": "four_button",
487
                "aoColumns": [
567
                "aoColumns": [
488
                    {
568
                    {
489
                        "mDataProp": "date_due",
569
                        "mData": "date_due",
490
                        "bVisible": false,
570
                        "mRender": mRenders.dateDueFormatted
491
                    },
571
                    },
492
                    {
572
                    {
493
                        "iDataSort": 1, // Sort on hidden unformatted date due column
573
                        "mData": "title",
494
                        "mDataProp": function( oObj ) {
574
                        "mRender": mRenders.title,
495
                            var today = new Date();
496
                            var due = new Date( oObj.date_due );
497
                            if ( today > due ) {
498
                                return "<span class='overdue'>" + oObj.date_due_formatted + "</span>";
499
                            } else {
500
                                return oObj.date_due_formatted;
501
                            }
502
                        }
503
                    },
575
                    },
576
                    { "mData": "itemtype" },
577
                    { "mData": "location" },
504
                    {
578
                    {
505
                        "mDataProp": function ( oObj ) {
579
                        "mData": "issuedate",
506
                            title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
580
                        "mRender": mRenders.issuedate
507
                                  + oObj.biblionumber
508
                                  + "'>"
509
                                  + oObj.title;
510
511
                            $.each(oObj.subtitle, function( index, value ) {
512
                                      title += " " + value.subfield;
513
                            });
514
515
                            if ( oObj.enumchron ) {
516
                                title += " (" + oObj.enumchron + ")";
517
                            }
518
519
                            title += "</a></span>";
520
521
                            if ( oObj.author ) {
522
                                title += " " + BY.replace( "_AUTHOR_", " " + oObj.author );
523
                            }
524
525
                            if ( oObj.itemnotes ) {
526
                                var span_class = "";
527
                                if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
528
                                    span_class = "circ-hlt";
529
                                }
530
                                title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
531
                            }
532
533
                            if ( oObj.itemnotes_nonpublic ) {
534
                                var span_class = "";
535
                                if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
536
                                    span_class = "circ-hlt";
537
                                }
538
                                title += " - <span class='" + span_class + "'>" + oObj.itemnotes_nonpublic + "</span>"
539
                            }
540
541
                            var onsite_checkout = '';
542
                            if ( oObj.onsite_checkout == 1 ) {
543
                                onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
544
                            }
545
546
                            title += " "
547
                                  + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
548
                                  + oObj.biblionumber
549
                                  + "&itemnumber="
550
                                  + oObj.itemnumber
551
                                  + "#"
552
                                  + oObj.itemnumber
553
                                  + "'>"
554
                                  + oObj.barcode
555
                                  + "</a>"
556
                                  + onsite_checkout;
557
558
                            return title;
559
                        },
560
                        "sType": "anti-the"
561
                    },
581
                    },
562
                    { "mDataProp": "itemtype" },
582
                    { "mData": "branchname" },
563
                    { "mDataProp": "location" },
583
                    { "mData": "itemcallnumber" },
564
                    { "mDataProp": "issuedate_formatted" },
565
                    { "mDataProp": "branchname" },
566
                    { "mDataProp": "itemcallnumber" },
567
                    {
584
                    {
568
                        "mDataProp": function ( oObj ) {
585
                        "mData": "charge",
569
                            if ( ! oObj.charge ) oObj.charge = 0;
586
                        "mRender": mRenders.charge,
570
                            return parseFloat(oObj.charge).toFixed(2);
587
                        "bSortable": ServerSideCheckoutsTables ? false : true
571
                        }
572
                    },
588
                    },
573
                    {
589
                    {
574
                        "mDataProp": function ( oObj ) {
590
                        "mData": "fine",
575
                            if ( ! oObj.fine ) oObj.fine = 0;
591
                        "mRender": mRenders.fine,
576
                            return parseFloat(oObj.fine).toFixed(2);
592
                        "bSortable": ServerSideCheckoutsTables ? false : true
577
                        }
578
                    },
593
                    },
579
                    {
594
                    {
580
                        "mDataProp": function ( oObj ) {
595
                        "mData": "replacementprice",
581
                            if ( ! oObj.price ) oObj.price = 0;
596
                        "mRender": mRenders.price,
582
                            return parseFloat(oObj.price).toFixed(2);
597
                        "bSortable": ServerSideCheckoutsTables ? false : true
583
                        }
584
                    },
598
                    },
585
                    {
599
                    {
586
                        "mDataProp": function( oObj ) {
600
                        "mData": "borrowernumber",
587
                            return "<a href='/cgi-bin/koha/members/moremember.pl?borrowernumber=" + oObj.borrowernumber + "'>"
601
                        "mRender": mRenders.patron,
588
                                 + oObj.borrower.firstname + " " + oObj.borrower.surname + " (" + oObj.borrower.cardnumber + ")</a>"
602
                        "bSortable": ServerSideCheckoutsTables ? false : true
589
                        }
603
                    }
590
                    },
604
                ]
591
                ],
605
            }, relatives_columns_settings);
592
                "bPaginate": false,
593
                "bProcessing": true,
594
                "bServerSide": false,
595
                "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
596
                "fnServerData": function ( sSource, aoData, fnCallback ) {
597
                    $.each(relatives_borrowernumbers, function( index, value ) {
598
                        aoData.push( { "name": "borrowernumber", "value": value } );
599
                    });
600
601
                    $.getJSON( sSource, aoData, function (json) {
602
                        fnCallback(json)
603
                    } );
604
                },
605
            });
606
        }
606
        }
607
    });
607
    });
608
608
Lines 622-625 $(document).ready(function() { Link Here
622
            }
622
            }
623
        } ).prop('checked', false);
623
        } ).prop('checked', false);
624
    }
624
    }
625
 });
625
});
626
627
})(jQuery);
(-)a/svc/checkouts (-54 / +55 lines)
Lines 17-24 Link Here
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
19
20
use strict;
20
use Modern::Perl;
21
use warnings;
22
21
23
use CGI;
22
use CGI;
24
use JSON qw(to_json);
23
use JSON qw(to_json);
Lines 28-33 use C4::Biblio qw(GetMarcBiblio GetFrameworkCode GetRecordValue ); Link Here
28
use C4::Circulation qw(GetIssuingCharges CanBookBeRenewed GetRenewCount GetSoonestRenewDate);
27
use C4::Circulation qw(GetIssuingCharges CanBookBeRenewed GetRenewCount GetSoonestRenewDate);
29
use C4::Overdues qw(GetFine);
28
use C4::Overdues qw(GetFine);
30
use C4::Context;
29
use C4::Context;
30
use C4::Utils::DataTables;
31
31
32
use Koha::AuthorisedValues;
32
use Koha::AuthorisedValues;
33
use Koha::DateUtils;
33
use Koha::DateUtils;
Lines 45-70 unless (haspermission($userid, { circulate => 'circulate_remaining_permissions' Link Here
45
    exit 0;
45
    exit 0;
46
}
46
}
47
47
48
my @sort_columns = qw/date_due title itype issuedate branchcode itemcallnumber/;
49
50
my @borrowernumber   = $input->multi_param('borrowernumber');
48
my @borrowernumber   = $input->multi_param('borrowernumber');
51
my $offset           = $input->param('iDisplayStart');
49
my $offset = $input->param('iDisplayStart');
52
my $results_per_page = $input->param('iDisplayLength') || -1;
50
my $count = $input->param('iDisplayLength');
53
51
54
my $sorting_column = $input->param('iSortCol_0') || q{};
52
my %params = dt_get_params($input);
55
$sorting_column = ( $sorting_column && $sort_columns[$sorting_column] ) ? $sort_columns[$sorting_column] : 'issuedate';
53
my $orderby = dt_build_orderby(\%params);
56
54
57
my $sorting_direction = $input->param('sSortDir_0') || q{};
55
my $todaysIssuesDefaultSortOrder =
58
$sorting_direction = $sorting_direction eq 'asc' ? 'asc' : 'desc';
56
  C4::Context->preference('todaysIssuesDefaultSortOrder');
59
57
my $previousIssuesDefaultSortOrder =
60
$results_per_page = undef if ( $results_per_page == -1 );
58
  C4::Context->preference('previousIssuesDefaultSortOrder');
61
59
62
binmode STDOUT, ":encoding(UTF-8)";
60
# Default sort when user hasn't clicked on a column header yet.
63
print $input->header( -type => 'text/plain', -charset => 'UTF-8' );
61
# When row grouping is enabled, DataTables ask to sort on issued_today column,
62
# so we need to treat this case the same as the "no sorting" case
63
if (!$orderby || $orderby =~ m/ORDER BY issued_today desc\s*$/) {
64
    $orderby = qq{
65
        ORDER BY
66
        issued_today DESC,
67
        CASE WHEN issued_today = 0 THEN date_due END $previousIssuesDefaultSortOrder,
68
        CASE WHEN issued_today != 0 THEN date_due END $todaysIssuesDefaultSortOrder
69
    };
70
}
64
71
65
my @parameters;
72
my @parameters;
66
my $sql = '
73
my $sql = '
67
    SELECT
74
    SELECT SQL_CALC_FOUND_ROWS
68
        issuedate,
75
        issuedate,
69
        date_due,
76
        date_due,
70
        date_due < now() as date_due_overdue,
77
        date_due < now() as date_due_overdue,
Lines 100-106 my $sql = ' Link Here
100
        location,
107
        location,
101
        items.enumchron,
108
        items.enumchron,
102
109
103
        DATEDIFF( issuedate, CURRENT_DATE() ) AS not_issued_today
110
        DATEDIFF( issuedate, CURRENT_DATE() ) = 0 AS issued_today
104
    FROM issues
111
    FROM issues
105
        LEFT JOIN items USING ( itemnumber )
112
        LEFT JOIN items USING ( itemnumber )
106
        LEFT JOIN biblio USING ( biblionumber )
113
        LEFT JOIN biblio USING ( biblionumber )
Lines 108-134 my $sql = ' Link Here
108
        LEFT JOIN borrowers USING ( borrowernumber )
115
        LEFT JOIN borrowers USING ( borrowernumber )
109
        LEFT JOIN branches ON ( issues.branchcode = branches.branchcode )
116
        LEFT JOIN branches ON ( issues.branchcode = branches.branchcode )
110
        LEFT JOIN branches branches2 ON ( items.homebranch = branches2.branchcode )
117
        LEFT JOIN branches branches2 ON ( items.homebranch = branches2.branchcode )
111
    WHERE borrowernumber
118
    WHERE
112
';
119
';
113
120
121
my $borrowernumber_sql = 'borrowernumber';
114
if ( @borrowernumber == 1 ) {
122
if ( @borrowernumber == 1 ) {
115
    $sql .= '= ?';
123
    $borrowernumber_sql .= ' = ?';
116
}
124
} else {
117
else {
125
    $borrowernumber_sql .= ' IN (' . join( ',', ('?') x @borrowernumber ) . ') ';
118
    $sql .= ' IN (' . join( ',', ('?') x @borrowernumber ) . ') ';
119
}
126
}
127
$sql .= $borrowernumber_sql;
120
push( @parameters, @borrowernumber );
128
push( @parameters, @borrowernumber );
121
129
122
$sql .= " ORDER BY $sorting_column $sorting_direction ";
130
$sql .= " $orderby";
131
132
if ($count && $count > 0) {
133
    $sql .= " LIMIT ?,?";
134
    push @parameters, $offset, $count;
135
}
123
136
124
my $dbh = C4::Context->dbh();
137
my $dbh = C4::Context->dbh();
125
my $sth = $dbh->prepare($sql);
138
my $sth = $dbh->prepare($sql);
126
$sth->execute(@parameters);
139
$sth->execute(@parameters);
140
my ($iTotalDisplayRecords) = $dbh->selectrow_array('SELECT FOUND_ROWS()');
127
141
128
my $item_level_itypes = C4::Context->preference('item-level_itypes');
142
my $item_level_itypes = C4::Context->preference('item-level_itypes');
129
143
130
my @checkouts_today;
144
my @checkouts;
131
my @checkouts_previous;
132
while ( my $c = $sth->fetchrow_hashref() ) {
145
while ( my $c = $sth->fetchrow_hashref() ) {
133
    my ($charge) = GetIssuingCharges( $c->{itemnumber}, $c->{borrowernumber} );
146
    my ($charge) = GetIssuingCharges( $c->{itemnumber}, $c->{borrowernumber} );
134
    my $fine = GetFine( $c->{itemnumber}, $c->{borrowernumber} );
147
    my $fine = GetFine( $c->{itemnumber}, $c->{borrowernumber} );
Lines 217-252 while ( my $c = $sth->fetchrow_hashref() ) { Link Here
217
            firstname  => $c->{firstname},
230
            firstname  => $c->{firstname},
218
            cardnumber => $c->{cardnumber},
231
            cardnumber => $c->{cardnumber},
219
        },
232
        },
220
        issued_today => !$c->{not_issued_today},
233
        issued_today => $c->{issued_today} ? JSON::true : JSON::false,
221
    };
234
    };
222
235
223
    if ( $c->{not_issued_today} ) {
236
    push @checkouts, $checkout;
224
        push( @checkouts_previous, $checkout );
225
    }
226
    else {
227
        push( @checkouts_today, $checkout );
228
    }
229
}
237
}
230
238
239
binmode STDOUT, ":encoding(UTF-8)";
240
print $input->header( -type => 'application/json', -charset => 'UTF-8' );
231
241
232
@checkouts_today = sort { $a->{timestamp} cmp $b->{timestamp} } @checkouts_today;
242
my $sEcho = $input->param('sEcho');
233
@checkouts_today = reverse(@checkouts_today)
243
my ($iTotalRecords) = $dbh->selectrow_array(
234
  unless ( C4::Context->preference('todaysIssuesDefaultSortOrder') eq 'desc' );
244
    "SELECT COUNT(*) FROM issues WHERE $borrowernumber_sql", undef,
235
245
    @borrowernumber);
236
@checkouts_previous = sort { $a->{date_due} cmp $b->{date_due} } @checkouts_previous;
237
@checkouts_previous = reverse(@checkouts_previous)
238
  if ( C4::Context->preference('previousIssuesDefaultSortOrder') eq 'desc' );
239
240
my @checkouts = ( @checkouts_today, @checkouts_previous );
241
242
my $i = 1;
243
map { $_->{sort_order} = $i++ } @checkouts;
244
245
246
246
my $data;
247
my $response = {
247
$data->{'iTotalRecords'}        = scalar @checkouts;
248
    iTotalRecords => $iTotalRecords,
248
$data->{'iTotalDisplayRecords'} = scalar @checkouts;
249
    iTotalDisplayRecords => $iTotalDisplayRecords,
249
$data->{'sEcho'}                = $input->param('sEcho') || undef;
250
    sEcho => $sEcho,
250
$data->{'aaData'}               = \@checkouts;
251
    aaData => \@checkouts,
252
};
251
253
252
print to_json($data);
254
print to_json($response);
253
- 

Return to bug 15219