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

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

Return to bug 15219