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 462-467 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
462
('SelfCheckTimeout','120','','Define the number of seconds before the Web-based Self Checkout times out a patron','Integer'),
462
('SelfCheckTimeout','120','','Define the number of seconds before the Web-based Self Checkout times out a patron','Integer'),
463
('SeparateHoldings','0',NULL,'Separate current branch holdings from other holdings','YesNo'),
463
('SeparateHoldings','0',NULL,'Separate current branch holdings from other holdings','YesNo'),
464
('SeparateHoldingsBranch','homebranch','homebranch|holdingbranch','Branch used to separate holdings','Choice'),
464
('SeparateHoldingsBranch','homebranch','homebranch|holdingbranch','Branch used to separate holdings','Choice'),
465
('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'),
465
('SessionRestrictionByIP','1','Check for change in remote IP address for session security. Disable only when remote IP address changes frequently.','','YesNo'),
466
('SessionRestrictionByIP','1','Check for change in remote IP address for session security. Disable only when remote IP address changes frequently.','','YesNo'),
466
('SessionStorage','mysql','mysql|Pg|tmp','Use database or a temporary file for storing session data','Choice'),
467
('SessionStorage','mysql','mysql|Pg|tmp','Use database or a temporary file for storing session data','Choice'),
467
('ShelfBrowserUsesCcode','1','0','Use the item collection code when finding items for the shelf browser.','YesNo'),
468
('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 46-51 Circulation: Link Here
46
                  desc: latest to earliest
46
                  desc: latest to earliest
47
            - due date.
47
            - due date.
48
        -
48
        -
49
            - pref: ServerSideCheckoutsTables
50
              choices:
51
                  yes: Enable
52
                  no: Do not enable
53
            - server-side processing on checkouts tables. It can improve performance when there is a big number of checkouts to display.
54
        -
49
            - pref: SpecifyDueDate
55
            - pref: SpecifyDueDate
50
              choices:
56
              choices:
51
                  yes: Allow
57
                  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 (-352 / +357 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 = "text-muted";
81
            title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
82
        }
83
84
        if ( oObj.itemnotes_nonpublic ) {
85
            var span_class = "text-danger";
86
            if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
87
                span_class = "circ-hlt";
88
            }
89
            title += " - <span class='" + span_class + "'>" + oObj.itemnotes_nonpublic + "</span>"
90
        }
91
92
        var onsite_checkout = '';
93
        if ( oObj.onsite_checkout == 1 ) {
94
            onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
95
        }
96
97
        title += " "
98
              + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
99
              + oObj.biblionumber
100
              + "&itemnumber="
101
              + oObj.itemnumber
102
              + "#"
103
              + oObj.itemnumber
104
              + "'>"
105
              + oObj.barcode
106
              + "</a>"
107
              + onsite_checkout;
108
109
        return title;
110
    },
111
    itemtype: function (oData, sType, oObj) {
112
        return oObj.itemtype_description;
113
    },
114
    issuedate: function (oData, sType, oObj) {
115
        return oObj.issuedate_formatted;
116
    },
117
    branch: function (oData, sType, oObj) {
118
        return oObj.branchname;
119
    },
120
    charge: function (oData, sType, oObj) {
121
        if (!oObj.charge) oObj.charge = 0;
122
        return '<span style="text-align: right; display: block;">' + parseFloat(oObj.charge).toFixed(2) + '<span>';
123
    },
124
    fine: function (oData, sType, oObj) {
125
        if (!oObj.fine) oObj.fine = 0;
126
        return '<span style="text-align: right; display: block;">' + parseFloat(oObj.fine).toFixed(2)  + '<span>';
127
    },
128
    price: function (oData, sType, oObj) {
129
        if (!oObj.price) oObj.price = 0;
130
        return parseFloat(oObj.price).toFixed(2);
131
    },
132
    renew: function (oData, sType, oObj) {
133
        var content = "";
134
        var span_style = "";
135
        var span_class = "";
136
137
        content += "<span>";
138
        content += "<span style='padding: 0 1em;'>" + oObj.renewals_count + "</span>";
139
140
        if ( oObj.can_renew ) {
141
            // Do nothing
142
        } else if ( oObj.can_renew_error == "on_reserve" ) {
143
            content += "<span class='renewals-disabled-no-override'>"
144
                    + "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>"
145
                    + "</span>";
146
147
            span_style = "display: none";
148
            span_class = "renewals-allowed";
149
        } else if ( oObj.can_renew_error == "too_many" ) {
150
            content += "<span class='renewals-disabled'>"
151
                    + NOT_RENEWABLE
152
                    + "</span>";
153
154
            span_style = "display: none";
155
            span_class = "renewals-allowed";
156
        } else if ( oObj.can_renew_error == "restriction" ) {
157
            content += "<span class='renewals-disabled'>"
158
                    + NOT_RENEWABLE_RESTRICTION
159
                    + "</span>";
160
161
            span_style = "display: none";
162
            span_class = "renewals-allowed";
163
        } else if ( oObj.can_renew_error == "overdue" ) {
164
            content += "<span class='renewals-disabled'>"
165
                    + NOT_RENEWABLE_OVERDUE
166
                    + "</span>";
167
168
            span_style = "display: none";
169
            span_class = "renewals-allowed";
170
        } else if ( oObj.can_renew_error == "too_soon" ) {
171
            content += "<span class='renewals-disabled'>"
172
                    + NOT_RENEWABLE_TOO_SOON.format( oObj.can_renew_date )
173
                    + "</span>";
174
175
            span_style = "display: none";
176
            span_class = "renewals-allowed";
177
        } else if ( oObj.can_renew_error == "auto_too_soon" ) {
178
            content += "<span class='renewals-disabled'>"
179
                    + NOT_RENEWABLE_AUTO_TOO_SOON
180
                    + "</span>";
181
182
            span_style = "display: none";
183
            span_class = "renewals-allowed";
184
        } else if ( oObj.can_renew_error == "auto_too_late" ) {
185
            content += "<span class='renewals-disabled'>"
186
                    + NOT_RENEWABLE_AUTO_TOO_LATE
187
                    + "</span>";
188
189
            span_style = "display: none";
190
            span_class = "renewals-allowed";
191
        } else if ( oObj.can_renew_error == "auto_renew" ) {
192
            content += "<span class='renewals-disabled'>"
193
                    + NOT_RENEWABLE_AUTO_RENEW
194
                    + "</span>";
195
196
            span_style = "display: none";
197
            span_class = "renewals-allowed";
198
        } else if ( oObj.can_renew_error == "onsite_checkout" ) {
199
            // Don't display something if it's an onsite checkout
200
        } else {
201
            content += "<span class='renewals-disabled'>"
202
                    + oObj.can_renew_error
203
                    + "</span>";
204
205
            span_style = "display: none";
206
            span_class = "renewals-allowed";
207
        }
208
209
        var can_force_renew = ( oObj.onsite_checkout == 0 ) && ( oObj.can_renew_error != "on_reserve" );
210
        var can_renew = ( oObj.renewals_remaining > 0  && !oObj.can_renew_error );
211
        if ( can_renew || can_force_renew ) {
212
            content += "<span class='" + span_class + "' style='" + span_style + "'>"
213
                    +  "<input type='checkbox' ";
214
            if ( oObj.date_due_overdue && can_renew ) {
215
                content += "checked='checked' ";
216
            }
217
            content += "class='renew' id='renew_" + oObj.itemnumber + "' name='renew' value='" + oObj.itemnumber +"'/>"
218
                    +  "</span>";
219
220
            content += "<span class='renewals'>("
221
                    + RENEWALS_REMAINING.format( oObj.renewals_remaining, oObj.renewals_allowed )
222
                    + ")</span>";
223
        }
224
225
        content += "</span>";
226
227
        return content;
228
    },
229
    checkin: function (oData, sType, oObj) {
230
        if (oObj.can_renew_error == "on_reserve") {
231
            return "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>";
232
        } else {
233
            return "<input type='checkbox' class='checkin' id='checkin_" + oObj.itemnumber + "' name='checkin' value='" + oObj.itemnumber +"'></input>";
234
        }
235
    },
236
    export: function (oData, sType, oObj) {
237
        var s = "<input type='checkbox' name='itemnumbers' value='" + oObj.itemnumber + "' style='visibility:hidden;' />";
238
239
        s += "<input type='checkbox' class='export' id='export_" + oObj.biblionumber + "' name='biblionumbers' value='" + oObj.biblionumber + "' />";
240
        return s;
241
    },
242
    patron: function (oData, sType, oObj) {
243
        return "<a href='/cgi-bin/koha/members/moremember.pl?borrowernumber=" + oObj.borrowernumber + "'>"
244
             + oObj.borrower.firstname + " " + oObj.borrower.surname + " (" + oObj.borrower.cardnumber + ")</a>"
245
    }
246
};
247
1
$(document).ready(function() {
248
$(document).ready(function() {
2
    $.ajaxSetup ({ cache: false });
249
    $.ajaxSetup ({ cache: false });
3
250
Lines 139-146 $(document).ready(function() { Link Here
139
        return false;
386
        return false;
140
    });
387
    });
141
388
142
    var ymd = $.datepicker.formatDate('yy-mm-dd', new Date());
143
144
    $('#issues-table').hide();
389
    $('#issues-table').hide();
145
    $('#issues-table-actions').hide();
390
    $('#issues-table-actions').hide();
146
    $('#issues-table-load-immediately').change(function(){
391
    $('#issues-table-load-immediately').change(function(){
Lines 174-189 $(document).ready(function() { Link Here
174
                "sProcessing": MSG_DT_LOADING_RECORDS,
419
                "sProcessing": MSG_DT_LOADING_RECORDS,
175
            },
420
            },
176
            "bAutoWidth": false,
421
            "bAutoWidth": false,
177
            "dom": 'B<"clearfix">rt',
422
            "bProcessing": true,
423
            "bServerSide": ServerSideCheckoutsTables,
424
            "sAjaxSource": "/cgi-bin/koha/svc/checkouts",
425
            "fnServerParams": function (aoData) {
426
                aoData.push({ "name": "borrowernumber", "value": borrowernumber });
427
            },
428
            "bPaginate": true,
429
            "sPaginationType": "four_button",
430
            "dom": 'B<"clearfix"><"top pager"ilp>rt',
431
            "aaSorting": [],
178
            "aoColumns": [
432
            "aoColumns": [
179
                {
433
                {
180
                    "mDataProp": function( oObj ) {
434
                    "mData": "issued_today",
181
                        return oObj.sort_order;
435
                    "mRender": mRenders.groupOrder
182
                    }
183
                },
436
                },
184
                {
437
                {
185
                    "mDataProp": function( oObj ) {
438
                    "mData": function (oObj) {
186
                        if ( oObj.issued_today ) {
439
                        if (oObj.issued_today) {
187
                            return "<strong>" + TODAYS_CHECKOUTS + "</strong>";
440
                            return "<strong>" + TODAYS_CHECKOUTS + "</strong>";
188
                        } else {
441
                        } else {
189
                            return "<strong>" + PREVIOUS_CHECKOUTS + "</strong>";
442
                            return "<strong>" + PREVIOUS_CHECKOUTS + "</strong>";
Lines 191-419 $(document).ready(function() { Link Here
191
                    }
444
                    }
192
                },
445
                },
193
                {
446
                {
194
                    "mDataProp": "date_due",
447
                    "mData": "date_due",
195
                    "bVisible": false,
448
                    "mRender": mRenders.dateDueFormatted
196
                },
449
                },
197
                {
450
                {
198
                    "iDataSort": 2, // Sort on hidden unformatted date due column
451
                    "mData": "title",
199
                    "mDataProp": function( oObj ) {
452
                    "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
                },
453
                },
220
                {
454
                {
221
                    "mDataProp": function ( oObj ) {
455
                    "mData": "itemtype",
222
                        title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
456
                    "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 = "text-muted";
243
                            title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
244
                        }
245
246
                        if ( oObj.itemnotes_nonpublic ) {
247
                            var span_class = "text-danger";
248
                            title += " - <span class='" + span_class + "'>" + oObj.itemnotes_nonpublic + "</span>"
249
                        }
250
251
                        var onsite_checkout = '';
252
                        if ( oObj.onsite_checkout == 1 ) {
253
                            onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
254
                        }
255
256
                        title += " "
257
                              + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
258
                              + oObj.biblionumber
259
                              + "&itemnumber="
260
                              + oObj.itemnumber
261
                              + "#"
262
                              + oObj.itemnumber
263
                              + "'>"
264
                              + oObj.barcode
265
                              + "</a>"
266
                              + onsite_checkout;
267
268
                        return title;
269
                    },
270
                    "sType": "anti-the"
271
                },
457
                },
272
                { "mDataProp": "itemtype_description" },
458
                { "mData": "location" },
273
                { "mDataProp": "location" },
459
                { "mData": "homebranch" },
274
                { "mDataProp": "homebranch" },
275
                { "mDataProp": "issuedate_formatted" },
276
                { "mDataProp": "branchname" },
277
                { "mDataProp": "itemcallnumber" },
278
                {
460
                {
279
                    "mDataProp": function ( oObj ) {
461
                    "mData": "issuedate",
280
                        if ( ! oObj.charge ) oObj.charge = 0;
462
                    "mRender": mRenders.issuedate
281
                        return '<span style="text-align: right; display: block;">' + parseFloat(oObj.charge).toFixed(2) + '<span>';
282
                    }
283
                },
463
                },
284
                {
464
                {
285
                    "mDataProp": function ( oObj ) {
465
                    "mData": "branchcode",
286
                        if ( ! oObj.fine ) oObj.fine = 0;
466
                    "mRender": mRenders.branch
287
                        return '<span style="text-align: right; display: block;">' + parseFloat(oObj.fine).toFixed(2)  + '<span>';
288
                    }
289
                },
467
                },
468
                { "mData": "itemcallnumber" },
290
                {
469
                {
291
                    "mDataProp": function ( oObj ) {
470
                    "mData": "charge",
292
                        if ( ! oObj.price ) oObj.price = 0;
471
                    "mRender": mRenders.charge,
293
                        return '<span style="text-align: right; display: block;">' + parseFloat(oObj.price).toFixed(2) + '<span>';
472
                    "bSortable": ServerSideCheckoutsTables ? false : true
294
                    }
473
                },
474
                {
475
                    "mData": "fine",
476
                    "mRender": mRenders.fine,
477
                    "bSortable": ServerSideCheckoutsTables ? false : true
478
                },
479
                {
480
                    "mData": "replacementprice",
481
                    "mRender": mRenders.price,
482
                    "bSortable": ServerSideCheckoutsTables ? false : true
295
                },
483
                },
296
                {
484
                {
297
                    "bSortable": false,
298
                    "bVisible": AllowCirculate ? true : false,
485
                    "bVisible": AllowCirculate ? true : false,
299
                    "mDataProp": function ( oObj ) {
486
                    "mRender": mRenders.renew,
300
                        var content = "";
487
                    "bSortable": false
301
                        var span_style = "";
302
                        var span_class = "";
303
304
                        content += "<span>";
305
                        content += "<span style='padding: 0 1em;'>" + oObj.renewals_count + "</span>";
306
307
                        if ( oObj.can_renew ) {
308
                            // Do nothing
309
                        } else if ( oObj.can_renew_error == "on_reserve" ) {
310
                            content += "<span class='renewals-disabled-no-override'>"
311
                                    + "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>"
312
                                    + "</span>";
313
314
                            span_style = "display: none";
315
                            span_class = "renewals-allowed";
316
                        } else if ( oObj.can_renew_error == "too_many" ) {
317
                            content += "<span class='renewals-disabled'>"
318
                                    + NOT_RENEWABLE
319
                                    + "</span>";
320
321
                            span_style = "display: none";
322
                            span_class = "renewals-allowed";
323
                        } else if ( oObj.can_renew_error == "restriction" ) {
324
                            content += "<span class='renewals-disabled'>"
325
                                    + NOT_RENEWABLE_RESTRICTION
326
                                    + "</span>";
327
328
                            span_style = "display: none";
329
                            span_class = "renewals-allowed";
330
                        } else if ( oObj.can_renew_error == "overdue" ) {
331
                            content += "<span class='renewals-disabled'>"
332
                                    + NOT_RENEWABLE_OVERDUE
333
                                    + "</span>";
334
335
                            span_style = "display: none";
336
                            span_class = "renewals-allowed";
337
                        } else if ( oObj.can_renew_error == "too_soon" ) {
338
                            content += "<span class='renewals-disabled'>"
339
                                    + NOT_RENEWABLE_TOO_SOON.format( oObj.can_renew_date )
340
                                    + "</span>";
341
342
                            span_style = "display: none";
343
                            span_class = "renewals-allowed";
344
                        } else if ( oObj.can_renew_error == "auto_too_soon" ) {
345
                            content += "<span class='renewals-disabled'>"
346
                                    + NOT_RENEWABLE_AUTO_TOO_SOON
347
                                    + "</span>";
348
349
                            span_style = "display: none";
350
                            span_class = "renewals-allowed";
351
                        } else if ( oObj.can_renew_error == "auto_too_late" ) {
352
                            content += "<span class='renewals-disabled'>"
353
                                    + NOT_RENEWABLE_AUTO_TOO_LATE
354
                                    + "</span>";
355
356
                            span_style = "display: none";
357
                            span_class = "renewals-allowed";
358
                        } else if ( oObj.can_renew_error == "auto_renew" ) {
359
                            content += "<span class='renewals-disabled'>"
360
                                    + NOT_RENEWABLE_AUTO_RENEW
361
                                    + "</span>";
362
363
                            span_style = "display: none";
364
                            span_class = "renewals-allowed";
365
                        } else if ( oObj.can_renew_error == "onsite_checkout" ) {
366
                            // Don't display something if it's an onsite checkout
367
                        } else {
368
                            content += "<span class='renewals-disabled'>"
369
                                    + oObj.can_renew_error
370
                                    + "</span>";
371
372
                            span_style = "display: none";
373
                            span_class = "renewals-allowed";
374
                        }
375
376
                        var can_force_renew = ( oObj.onsite_checkout == 0 ) && ( oObj.can_renew_error != "on_reserve" );
377
                        var can_renew = ( oObj.renewals_remaining > 0  && !oObj.can_renew_error );
378
                        if ( can_renew || can_force_renew ) {
379
                            content += "<span class='" + span_class + "' style='" + span_style + "'>"
380
                                    +  "<input type='checkbox' ";
381
                            if ( oObj.date_due_overdue && can_renew ) {
382
                                content += "checked='checked' ";
383
                            }
384
                            content += "class='renew' id='renew_" + oObj.itemnumber + "' name='renew' value='" + oObj.itemnumber +"'/>"
385
                                    +  "</span>";
386
387
                            content += "<span class='renewals'>("
388
                                    + RENEWALS_REMAINING.format( oObj.renewals_remaining, oObj.renewals_allowed )
389
                                    + ")</span>";
390
                        }
391
392
                        content += "</span>";
393
394
                        return content;
395
                    }
396
                },
488
                },
397
                {
489
                {
398
                    "bSortable": false,
399
                    "bVisible": AllowCirculate ? true : false,
490
                    "bVisible": AllowCirculate ? true : false,
400
                    "mDataProp": function ( oObj ) {
491
                    "mRender": mRenders.checkin,
401
                        if ( oObj.can_renew_error == "on_reserve" ) {
492
                    "bSortable": false
402
                            return "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + ON_HOLD + "</a>";
403
                        } else {
404
                            return "<input type='checkbox' class='checkin' id='checkin_" + oObj.itemnumber + "' name='checkin' value='" + oObj.itemnumber +"'></input>";
405
                        }
406
                    }
407
                },
493
                },
408
                {
494
                {
409
                    "bVisible": exports_enabled ? true : false,
495
                    "bVisible": exports_enabled ? true : false,
410
                    "bSortable": false,
496
                    "bSortable": false,
411
                    "mDataProp": function ( oObj ) {
497
                    "mRender": mRenders.export
412
                        var s = "<input type='checkbox' name='itemnumbers' value='" + oObj.itemnumber + "' style='visibility:hidden;' />";
413
414
                        s += "<input type='checkbox' class='export' id='export_" + oObj.biblionumber + "' name='biblionumbers' value='" + oObj.biblionumber + "' />";
415
                        return s;
416
                    }
417
                }
498
                }
418
            ],
499
            ],
419
            "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
500
            "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
Lines 428-466 $(document).ready(function() { Link Here
428
                $("#totaldue").html(total_charge.toFixed(2));
509
                $("#totaldue").html(total_charge.toFixed(2));
429
                $("#totalfine").html(total_fine.toFixed(2));
510
                $("#totalfine").html(total_fine.toFixed(2));
430
                $("#totalprice").html(total_price.toFixed(2));
511
                $("#totalprice").html(total_price.toFixed(2));
431
            },
432
            "bPaginate": false,
433
            "bProcessing": true,
434
            "bServerSide": false,
435
            "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
436
            "fnServerData": function ( sSource, aoData, fnCallback ) {
437
                aoData.push( { "name": "borrowernumber", "value": borrowernumber } );
438
439
                $.getJSON( sSource, aoData, function (json) {
440
                    fnCallback(json)
441
                } );
442
            },
443
            "fnInitComplete": function(oSettings) {
444
                // Disable rowGrouping plugin after first use
445
                // so any sorting on the table doesn't use it
446
                var oSettings = issuesTable.fnSettings();
447
448
                for (f = 0; f < oSettings.aoDrawCallback.length; f++) {
449
                    if (oSettings.aoDrawCallback[f].sName == 'fnRowGrouping') {
450
                        oSettings.aoDrawCallback.splice(f, 1);
451
                        break;
452
                    }
453
                }
454
455
                oSettings.aaSortingFixed = null;
456
            },
457
        }, columns_settings).rowGrouping(
458
            {
459
                iGroupingColumnIndex: 1,
460
                iGroupingOrderByColumnIndex: 0,
461
                sGroupingColumnSortDirection: "asc"
462
            }
512
            }
463
        );
513
        }, columns_settings);
514
515
        enableGrouping(issuesTable);
516
517
        var groupingSwitch = $('<input type="checkbox">')
518
          .attr('id', 'issues-table-row-grouping-switch')
519
          .attr('checked', 'checked')
520
          .css('vertical-align', 'middle')
521
          .change(function() {
522
              if ($(this).is(':checked')) {
523
                  enableGrouping(issuesTable);
524
              } else {
525
                  disableGrouping(issuesTable);
526
              }
527
          });
528
        $('<div></div>')
529
          .css('float', 'left')
530
          .css('padding', '0.3em 0.5em')
531
          .css('line-height', '1.9em')
532
          .append(groupingSwitch)
533
          .append('&nbsp;')
534
          .append('<label for="issues-table-row-grouping-switch">' + GROUP_TODAYS_CHECKOUTS + '</label>')
535
          .appendTo('#issues-table_wrapper .top.pager');
464
536
465
        if ( $("#issues-table").length ) {
537
        if ( $("#issues-table").length ) {
466
            $("#issues-table_processing").position({
538
            $("#issues-table_processing").position({
Lines 474-602 $(document).ready(function() { Link Here
474
    var relativesIssuesTable;
546
    var relativesIssuesTable;
475
    $("#relatives-issues-tab").click( function() {
547
    $("#relatives-issues-tab").click( function() {
476
        if ( ! relativesIssuesTable ) {
548
        if ( ! relativesIssuesTable ) {
477
            relativesIssuesTable = $("#relatives-issues-table").dataTable({
549
            relativesIssuesTable = KohaTable("#relatives-issues-table", {
478
                "bAutoWidth": false,
550
                "bAutoWidth": false,
479
                "sDom": "rt",
551
                "sDom": 'C<"top pager"ilp>rt',
480
                "aaSorting": [],
552
                "aaSorting": [[4, "desc"]],
553
                "bProcessing": true,
554
                "bServerSide": ServerSideCheckoutsTables,
555
                "sAjaxSource": "/cgi-bin/koha/svc/checkouts",
556
                "fnServerParams": function (aoData) {
557
                    for (i in relatives_borrowernumbers) {
558
                        var borrowernumber = relatives_borrowernumbers[i];
559
                        aoData.push({ "name": "borrowernumber", "value": borrowernumber });
560
                    }
561
                },
562
                "bPaginate": true,
563
                "sPaginationType": "four_button",
481
                "aoColumns": [
564
                "aoColumns": [
482
                    {
565
                    {
483
                        "mDataProp": "date_due",
566
                        "mData": "date_due",
484
                        "bVisible": false,
567
                        "mRender": mRenders.dateDueFormatted
485
                    },
568
                    },
486
                    {
569
                    {
487
                        "iDataSort": 1, // Sort on hidden unformatted date due column
570
                        "mData": "title",
488
                        "mDataProp": function( oObj ) {
571
                        "mRender": mRenders.title,
489
                            var today = new Date();
490
                            var due = new Date( oObj.date_due );
491
                            if ( today > due ) {
492
                                return "<span class='overdue'>" + oObj.date_due_formatted + "</span>";
493
                            } else {
494
                                return oObj.date_due_formatted;
495
                            }
496
                        }
497
                    },
572
                    },
573
                    { "mData": "itemtype" },
574
                    { "mData": "location" },
498
                    {
575
                    {
499
                        "mDataProp": function ( oObj ) {
576
                        "mData": "issuedate",
500
                            title = "<span class='strong'><a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber="
577
                        "mRender": mRenders.issuedate
501
                                  + oObj.biblionumber
502
                                  + "'>"
503
                                  + oObj.title;
504
505
                            $.each(oObj.subtitle, function( index, value ) {
506
                                      title += " " + value.subfield;
507
                            });
508
509
                            if ( oObj.enumchron ) {
510
                                title += " (" + oObj.enumchron + ")";
511
                            }
512
513
                            title += "</a></span>";
514
515
                            if ( oObj.author ) {
516
                                title += " " + BY.replace( "_AUTHOR_", " " + oObj.author );
517
                            }
518
519
                            if ( oObj.itemnotes ) {
520
                                var span_class = "";
521
                                if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
522
                                    span_class = "circ-hlt";
523
                                }
524
                                title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>"
525
                            }
526
527
                            if ( oObj.itemnotes_nonpublic ) {
528
                                var span_class = "";
529
                                if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) {
530
                                    span_class = "circ-hlt";
531
                                }
532
                                title += " - <span class='" + span_class + "'>" + oObj.itemnotes_nonpublic + "</span>"
533
                            }
534
535
                            var onsite_checkout = '';
536
                            if ( oObj.onsite_checkout == 1 ) {
537
                                onsite_checkout += " <span class='onsite_checkout'>(" + INHOUSE_USE + ")</span>";
538
                            }
539
540
                            title += " "
541
                                  + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber="
542
                                  + oObj.biblionumber
543
                                  + "&itemnumber="
544
                                  + oObj.itemnumber
545
                                  + "#"
546
                                  + oObj.itemnumber
547
                                  + "'>"
548
                                  + oObj.barcode
549
                                  + "</a>"
550
                                  + onsite_checkout;
551
552
                            return title;
553
                        },
554
                        "sType": "anti-the"
555
                    },
578
                    },
556
                    { "mDataProp": "itemtype" },
579
                    { "mData": "branchname" },
557
                    { "mDataProp": "location" },
580
                    { "mData": "itemcallnumber" },
558
                    { "mDataProp": "issuedate_formatted" },
559
                    { "mDataProp": "branchname" },
560
                    { "mDataProp": "itemcallnumber" },
561
                    {
581
                    {
562
                        "mDataProp": function ( oObj ) {
582
                        "mData": "charge",
563
                            if ( ! oObj.charge ) oObj.charge = 0;
583
                        "mRender": mRenders.charge,
564
                            return parseFloat(oObj.charge).toFixed(2);
584
                        "bSortable": ServerSideCheckoutsTables ? false : true
565
                        }
566
                    },
585
                    },
567
                    {
586
                    {
568
                        "mDataProp": function ( oObj ) {
587
                        "mData": "fine",
569
                            if ( ! oObj.fine ) oObj.fine = 0;
588
                        "mRender": mRenders.fine,
570
                            return parseFloat(oObj.fine).toFixed(2);
589
                        "bSortable": ServerSideCheckoutsTables ? false : true
571
                        }
572
                    },
590
                    },
573
                    {
591
                    {
574
                        "mDataProp": function ( oObj ) {
592
                        "mData": "replacementprice",
575
                            if ( ! oObj.price ) oObj.price = 0;
593
                        "mRender": mRenders.price,
576
                            return parseFloat(oObj.price).toFixed(2);
594
                        "bSortable": ServerSideCheckoutsTables ? false : true
577
                        }
578
                    },
595
                    },
579
                    {
596
                    {
580
                        "mDataProp": function( oObj ) {
597
                        "mData": "borrowernumber",
581
                            return "<a href='/cgi-bin/koha/members/moremember.pl?borrowernumber=" + oObj.borrowernumber + "'>"
598
                        "mRender": mRenders.patron,
582
                                 + oObj.borrower.firstname + " " + oObj.borrower.surname + " (" + oObj.borrower.cardnumber + ")</a>"
599
                        "bSortable": ServerSideCheckoutsTables ? false : true
583
                        }
600
                    }
584
                    },
601
                ]
585
                ],
602
            }, relatives_columns_settings);
586
                "bPaginate": false,
587
                "bProcessing": true,
588
                "bServerSide": false,
589
                "sAjaxSource": '/cgi-bin/koha/svc/checkouts',
590
                "fnServerData": function ( sSource, aoData, fnCallback ) {
591
                    $.each(relatives_borrowernumbers, function( index, value ) {
592
                        aoData.push( { "name": "borrowernumber", "value": value } );
593
                    });
594
595
                    $.getJSON( sSource, aoData, function (json) {
596
                        fnCallback(json)
597
                    } );
598
                },
599
            });
600
        }
603
        }
601
    });
604
    });
602
605
Lines 616-619 $(document).ready(function() { Link Here
616
            }
619
            }
617
        } ).prop('checked', false);
620
        } ).prop('checked', false);
618
    }
621
    }
619
 });
622
});
623
624
})(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