Bugzilla – Attachment 25986 Details for
Bug 11703
Convert checkouts table to ajax datatable
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 11703 - Convert checkouts table to ajax datatable
Bug-11703---Convert-checkouts-table-to-ajax-datata.patch (text/plain), 70.45 KB, created by
Kyle M Hall (khall)
on 2014-03-10 12:24:10 UTC
(
hide
)
Description:
Bug 11703 - Convert checkouts table to ajax datatable
Filename:
MIME Type:
Creator:
Kyle M Hall (khall)
Created:
2014-03-10 12:24:10 UTC
Size:
70.45 KB
patch
obsolete
>From c92cf7173a1e3830215fbfb2d108af60d541a4ec Mon Sep 17 00:00:00 2001 >From: Kyle M Hall <kyle@bywatersolutions.com> >Date: Tue, 4 Feb 2014 12:42:55 -0500 >Subject: [PATCH] Bug 11703 - Convert checkouts table to ajax datatable > >When a patron has many checked out items, circulation.pl can take a very >long time to load ( on the order of minutes in some cases ). This is >primarily due to the processing of the previous checkouts list. If we >convert to this table to a datatable that fetches its data via ajax, we >can make circulation.pl far more responsive. The same should be done >with relative's checkouts as well. > >Test Plan: >1) Apply this patch >2) Observe that the checkouts and relatives' checkouts tables > are now loaded asynchronously >3) Observe and verify the renew and return actions are now > ajax based and function in a manner equivilent to how they > used to. >--- > Koha/Schema/Result/Issue.pm | 32 ++- > api/checkin.pl | 75 +++ > api/checkouts.pl | 137 ++++++ > api/renew.pl | 69 +++ > circ/circulation.pl | 121 +----- > .../intranet-tmpl/prog/en/css/staff-global.css | 2 +- > koha-tmpl/intranet-tmpl/prog/en/js/checkouts.js | 267 +++++++++++ > .../intranet-tmpl/prog/en/js/pages/circulation.js | 156 +++++-- > .../prog/en/modules/circ/circulation.tt | 492 +++++--------------- > 9 files changed, 810 insertions(+), 541 deletions(-) > create mode 100755 api/checkin.pl > create mode 100755 api/checkouts.pl > create mode 100755 api/renew.pl > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/js/checkouts.js > >diff --git a/Koha/Schema/Result/Issue.pm b/Koha/Schema/Result/Issue.pm >index 282c802..e1838b6 100644 >--- a/Koha/Schema/Result/Issue.pm >+++ b/Koha/Schema/Result/Issue.pm >@@ -184,10 +184,34 @@ __PACKAGE__->belongs_to( > # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ZEh31EKBmURMKxDxI+H3EA > > __PACKAGE__->belongs_to( >- "borrower", >- "Koha::Schema::Result::Borrower", >- { borrowernumber => "borrowernumber" }, >- { join_type => "LEFT", on_delete => "CASCADE", on_update => "CASCADE" }, >+ "borrower", >+ "Koha::Schema::Result::Borrower", >+ { borrowernumber => "borrowernumber" }, >+ { join_type => "LEFT", on_delete => "CASCADE", on_update => "CASCADE" }, >+); >+ >+__PACKAGE__->belongs_to( >+ "item", >+ "Koha::Schema::Result::Item", >+ { itemnumber => "itemnumber" }, >+ { >+ is_deferrable => 1, >+ join_type => "LEFT", >+ on_delete => "CASCADE", >+ on_update => "CASCADE", >+ }, >+); >+ >+__PACKAGE__->belongs_to( >+ "branch", >+ "Koha::Schema::Result::Branch", >+ { branchcode => "branchcode" }, >+ { >+ is_deferrable => 1, >+ join_type => "LEFT", >+ on_delete => "CASCADE", >+ on_update => "CASCADE", >+ }, > ); > > 1; >diff --git a/api/checkin.pl b/api/checkin.pl >new file mode 100755 >index 0000000..808b5c4 >--- /dev/null >+++ b/api/checkin.pl >@@ -0,0 +1,75 @@ >+#!/usr/bin/perl >+ >+# Copyright 2014 ByWater Solutions >+# >+# This file is part of Koha. >+# >+# Koha is free software; you can redistribute it and/or modify it under the >+# terms of the GNU General Public License as published by the Free Software >+# Foundation; either version 2 of the License, or (at your option) any later >+# version. >+# >+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY >+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR >+# A PARTICULAR PURPOSE. See the GNU General Public License for more details. >+# >+# You should have received a copy of the GNU General Public License along >+# with Koha; if not, write to the Free Software Foundation, Inc., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+use Modern::Perl; >+ >+use CGI; >+use JSON qw(to_json); >+ >+use C4::Circulation; >+use C4::Items qw(GetBarcodeFromItemnumber); >+use C4::Context; >+use C4::Auth qw(check_cookie_auth); >+ >+use Koha::DateUtils qw(output_pref_due); >+ >+my $input = new CGI; >+ >+my ( $auth_status, $sessionID ) = >+ check_cookie_auth( $input->cookie('CGISESSID'), >+ { circulate => 'circulate_remaining_permissions' } ); >+ >+if ( $auth_status ne "ok" ) { >+ exit 0; >+} >+ >+binmode STDOUT, ":encoding(UTF-8)"; >+print $input->header( -type => 'text/plain', -charset => 'UTF-8' ); >+ >+my $itemnumber = $input->param('itemnumber'); >+my $borrowernumber = $input->param('borrowernumber'); >+my $override_limit = $input->param('override_limit'); >+my $exempt_fine = $input->param('exempt_fine'); >+my $branchcode = $input->param('branchcode') >+ || C4::Context->userenv->{'branch'}; >+ >+my $barcode = GetBarcodeFromItemnumber($itemnumber); >+ >+my $data; >+$data->{itemnumber} = $itemnumber; >+$data->{borrowernumber} = $borrowernumber; >+$data->{branchcode} = $branchcode; >+ >+if ( C4::Context->preference("InProcessingToShelvingCart") ) { >+ my $item = GetItem($itemnumber); >+ if ( $item->{'location'} eq 'PROC' ) { >+ $item->{'location'} = 'CART'; >+ ModItem( $item, $item->{'biblionumber'}, $item->{'itemnumber'} ); >+ } >+} >+ >+if ( C4::Context->preference("ReturnToShelvingCart") ) { >+ my $item = GetItem($itemnumber); >+ $item->{'location'} = 'CART'; >+ ModItem( $item, $item->{'biblionumber'}, $item->{'itemnumber'} ); >+} >+ >+( $data->{returned} ) = AddReturn( $barcode, $branchcode, $exempt_fine ); >+ >+print to_json($data); >diff --git a/api/checkouts.pl b/api/checkouts.pl >new file mode 100755 >index 0000000..4aebab1 >--- /dev/null >+++ b/api/checkouts.pl >@@ -0,0 +1,137 @@ >+#!/usr/bin/perl >+ >+# This software is placed under the gnu General Public License, v2 (http://www.gnu.org/licenses/gpl.html) >+ >+# Copyright 2014 ByWater Solutions >+# >+# This file is part of Koha. >+# >+# Koha is free software; you can redistribute it and/or modify it under the >+# terms of the GNU General Public License as published by the Free Software >+# Foundation; either version 3 of the License, or (at your option) any later >+# version. >+# >+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY >+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR >+# A PARTICULAR PURPOSE. See the GNU General Public License for more details. >+# >+# You should have received a copy of the GNU General Public License along >+# with Koha; if not, write to the Free Software Foundation, Inc., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+use Modern::Perl; >+ >+use CGI; >+use JSON qw(to_json); >+ >+use C4::Auth qw(check_cookie_auth); >+use C4::Biblio qw(GetMarcBiblio GetFrameworkCode GetRecordValue ); >+use C4::Charset; >+use C4::Circulation qw(GetIssuingCharges CanBookBeRenewed GetRenewCount); >+use C4::Context; >+ >+use Koha::Database; >+use Koha::DateUtils; >+ >+my $input = new CGI; >+ >+my ( $auth_status, $sessionID ) = >+ check_cookie_auth( $input->cookie('CGISESSID'), >+ { circulate => 'circulate_remaining_permissions' } ); >+ >+if ( $auth_status ne "ok" ) { >+ exit 0; >+} >+ >+my $schema = Koha::Database->new()->schema(); >+ >+my @sort_columns = qw/date_due title itype issuedate branchcode itemcallnumber/; >+ >+my @borrowernumber = $input->param('borrowernumber'); >+my $offset = $input->param('iDisplayStart'); >+my $results_per_page = $input->param('iDisplayLength'); >+my $sorting_column = $sort_columns[ $input->param('iSortCol_0') ] || 'issuedate'; >+my $sorting_direction = $input->param('sSortDir_0') || 'desc'; >+ >+$results_per_page = undef if ( $results_per_page == -1 ); >+ >+binmode STDOUT, ":encoding(UTF-8)"; >+print $input->header( -type => 'text/plain', -charset => 'UTF-8' ); >+ >+my $checkouts_rs = $schema->resultset('Issue')->search( >+ { borrowernumber => \@borrowernumber }, >+ { >+ prefetch => { 'item' => 'biblio' }, >+ order_by => { "-$sorting_direction" => $sorting_column } >+ } >+); >+ >+my $borrower; >+my @checkouts; >+while ( my $c = $checkouts_rs->next() ) { >+ >+ # No point in fetching this every time if only one borrower >+ $borrower = $c->borrower() >+ if ( !$borrower || @borrowernumber > 1 ); >+ >+ my $borrowernumber = $borrower->borrowernumber(); >+ my $itemnumber = $c->item()->itemnumber(); >+ my $biblionumber = $c->item()->biblionumber(); >+ >+ my ($charge) = >+ GetIssuingCharges( $c->itemnumber()->itemnumber(), $borrowernumber ); >+ >+ my ( $can_renew, $can_renew_error ) = >+ CanBookBeRenewed( $borrowernumber, $itemnumber ); >+ >+ my ( $renewals_count, $renewals_allowed, $renewals_remaining ) = >+ GetRenewCount( $borrowernumber, $itemnumber ); >+ >+ push( >+ @checkouts, >+ { >+ DT_RowId => "$itemnumber-$borrowernumber", >+ title => $c->item()->biblio()->title(), >+ author => $c->item()->biblio()->author(), >+ barcode => $c->item()->barcode(), >+ itemtype => $c->item()->effective_itemtype(), >+ itemnotes => $c->item()->itemnotes(), >+ branchcode => $c->branchcode(), >+ branchname => $c->branch->branchname(), >+ itemcallnumber => $c->item()->itemcallnumber() || q{}, >+ charge => $charge, >+ price => $c->item->replacementprice() || q{}, >+ can_renew => $can_renew, >+ can_renew_error => $can_renew_error, >+ itemnumber => $itemnumber, >+ borrowernumber => $borrowernumber, >+ biblionumber => $biblionumber, >+ issuedate => $c->issuedate(), >+ date_due => $c->date_due(), >+ renewals_count => $renewals_count, >+ renewals_allowed => $renewals_allowed, >+ renewals_remaining => $renewals_remaining, >+ issuedate_formatted => >+ output_pref( dt_from_string( $c->issuedate() ) ), >+ date_due_formatted => >+ output_pref_due( dt_from_string( $c->date_due() ) ), >+ subtitle => GetRecordValue( >+ 'subtitle', GetMarcBiblio($biblionumber), >+ GetFrameworkCode($biblionumber) >+ ), >+ borrower => { >+ surname => $borrower->surname(), >+ firstname => $borrower->firstname(), >+ cardnumber => $borrower->cardnumber(), >+ } >+ } >+ ); >+} >+ >+my $data; >+$data->{'iTotalRecords'} = scalar @checkouts; #FIXME >+$data->{'iTotalDisplayRecords'} = scalar @checkouts; >+$data->{'sEcho'} = $input->param('sEcho') || undef; >+$data->{'aaData'} = \@checkouts; >+ >+print to_json($data); >diff --git a/api/renew.pl b/api/renew.pl >new file mode 100755 >index 0000000..42be2de >--- /dev/null >+++ b/api/renew.pl >@@ -0,0 +1,69 @@ >+#!/usr/bin/perl >+ >+# Copyright 2014 ByWater Solutions >+# >+# This file is part of Koha. >+# >+# Koha is free software; you can redistribute it and/or modify it under the >+# terms of the GNU General Public License as published by the Free Software >+# Foundation; either version 2 of the License, or (at your option) any later >+# version. >+# >+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY >+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR >+# A PARTICULAR PURPOSE. See the GNU General Public License for more details. >+# >+# You should have received a copy of the GNU General Public License along >+# with Koha; if not, write to the Free Software Foundation, Inc., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+use Modern::Perl; >+ >+use CGI; >+use JSON qw(to_json); >+ >+use C4::Circulation; >+use C4::Context; >+use C4::Auth qw(check_cookie_auth); >+ >+use Koha::DateUtils qw(output_pref_due dt_from_string); >+ >+my $input = new CGI; >+ >+my ( $auth_status, $sessionID ) = >+ check_cookie_auth( $input->cookie('CGISESSID'), >+ { circulate => 'circulate_remaining_permissions' } ); >+ >+if ( $auth_status ne "ok" ) { >+ exit 0; >+} >+ >+binmode STDOUT, ":encoding(UTF-8)"; >+print $input->header( -type => 'text/plain', -charset => 'UTF-8' ); >+ >+my $itemnumber = $input->param('itemnumber'); >+my $borrowernumber = $input->param('borrowernumber'); >+my $override_limit = $input->param('override_limit'); >+my $branchcode = $input->param('branchcode') >+ || C4::Context->userenv->{'branch'}; >+my $date_due; >+if ( $input->param('date_due') ) { >+ $date_due = dt_from_string( $input->param('date_due') ); >+ $date_due->set_hour(23); >+ $date_due->set_minute(59); >+} >+ >+my $data; >+$data->{itemnumber} = $itemnumber; >+$data->{borrowernumber} = $borrowernumber; >+$data->{branchcode} = $branchcode; >+ >+( $data->{renew_okay}, $data->{error} ) = >+ CanBookBeRenewed( $borrowernumber, $itemnumber, $override_limit ); >+ >+if ( $data->{renew_okay} ) { >+ $date_due = AddRenewal( $borrowernumber, $itemnumber, $branchcode, $date_due ); >+ $data->{date_due} = output_pref_due( $date_due ); >+} >+ >+print to_json($data); >diff --git a/circ/circulation.pl b/circ/circulation.pl >index 8af776f..e759eb7 100755 >--- a/circ/circulation.pl >+++ b/circ/circulation.pl >@@ -42,6 +42,7 @@ use CGI::Session; > use C4::Members::Attributes qw(GetBorrowerAttributes); > use Koha::Borrower::Debarments qw(GetDebarments); > use Koha::DateUtils; >+use Koha::Database; > > use Date::Calc qw( > Today >@@ -96,14 +97,6 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user ( > > my $branches = GetBranches(); > >-my @failedrenews = $query->param('failedrenew'); # expected to be itemnumbers >-our %renew_failed = (); >-for (@failedrenews) { $renew_failed{$_} = 1; } >- >-my @failedreturns = $query->param('failedreturn'); >-our %return_failed = (); >-for (@failedreturns) { $return_failed{$_} = 1; } >- > my $findborrower = $query->param('findborrower') || q{}; > $findborrower =~ s|,| |g; > my $borrowernumber = $query->param('borrowernumber'); >@@ -355,9 +348,8 @@ if ($barcode) { > } > } > >- # FIXME If the issue is confirmed, we launch another time GetMemberIssuesAndFines, now display the issue count after issue >- my ( $od, $issue, $fines ) = GetMemberIssuesAndFines( $borrowernumber ); >- $template->param( issuecount => $issue ); >+ my ( $od, $issue, $fines ) = GetMemberIssuesAndFines($borrowernumber); >+ $template->param( issuecount => $issue ); > } > > # reload the borrower info for the sake of reseting the flags..... >@@ -457,100 +449,6 @@ if ($borrowernumber) { > $template->param( adultborrower => 1 ) if ( $borrower->{'category_type'} eq 'A' ); > } > >-# make the issued books table. >-my $todaysissues = ''; >-my $previssues = ''; >-our @todaysissues = (); >-our @previousissues = (); >-our @relissues = (); >-our @relprevissues = (); >-my $displayrelissues; >- >-our $totalprice = 0; >- >-sub build_issue_data { >- my $issueslist = shift; >- my $relatives = shift; >- >- # split in 2 arrays for today & previous >- foreach my $it ( @$issueslist ) { >- my $itemtypeinfo = getitemtypeinfo( (C4::Context->preference('item-level_itypes')) ? $it->{'itype'} : $it->{'itemtype'} ); >- >- # set itemtype per item-level_itype syspref - FIXME this is an ugly hack >- $it->{'itemtype'} = ( C4::Context->preference( 'item-level_itypes' ) ) ? $it->{'itype'} : $it->{'itemtype'}; >- >- ($it->{'charge'}, $it->{'itemtype_charge'}) = GetIssuingCharges( >- $it->{'itemnumber'}, $it->{'borrowernumber'} >- ); >- $it->{'charge'} = sprintf("%.2f", $it->{'charge'}); >- my ($can_renew, $can_renew_error) = CanBookBeRenewed( >- $it->{'borrowernumber'},$it->{'itemnumber'} >- ); >- $it->{"renew_error_${can_renew_error}"} = 1 if defined $can_renew_error; >- my $restype = C4::Reserves::GetReserveStatus( $it->{'itemnumber'} ); >- $it->{'can_renew'} = $can_renew; >- $it->{'can_confirm'} = !$can_renew && !$restype; >- $it->{'renew_error'} = ( $restype eq "Waiting" or $restype eq "Reserved" ) ? 1 : 0; >- $it->{'checkoutdate'} = C4::Dates->new($it->{'issuedate'},'iso')->output('syspref'); >- $it->{'issuingbranchname'} = GetBranchName($it->{'branchcode'}); >- >- $totalprice += $it->{'replacementprice'} || 0; >- $it->{'itemtype'} = $itemtypeinfo->{'description'}; >- $it->{'itemtype_image'} = $itemtypeinfo->{'imageurl'}; >- $it->{'dd_sort'} = $it->{'date_due'}; >- $it->{'dd'} = output_pref($it->{'date_due'}); >- $it->{'displaydate_sort'} = $it->{'issuedate'}; >- $it->{'displaydate'} = output_pref($it->{'issuedate'}); >- #$it->{'od'} = ( $it->{'date_due'} lt $todaysdate ) ? 1 : 0 ; >- $it->{'od'} = $it->{'overdue'}; >- $it->{'subtitle'} = GetRecordValue('subtitle', GetMarcBiblio($it->{biblionumber}), GetFrameworkCode($it->{biblionumber})); >- $it->{'renew_failed'} = $renew_failed{$it->{'itemnumber'}}; >- $it->{'return_failed'} = $return_failed{$it->{'barcode'}}; >- >- if ( ( $it->{'issuedate'} && $it->{'issuedate'} gt $todaysdate ) >- || ( $it->{'lastreneweddate'} && $it->{'lastreneweddate'} gt $todaysdate ) ) { >- (!$relatives) ? push @todaysissues, $it : push @relissues, $it; >- } else { >- (!$relatives) ? push @previousissues, $it : push @relprevissues, $it; >- } >- ($it->{'renewcount'},$it->{'renewsallowed'},$it->{'renewsleft'}) = C4::Circulation::GetRenewCount($it->{'borrowernumber'},$it->{'itemnumber'}); #Add renewal count to item data display >- } >-} >- >-if ($borrower) { >- >- # Getting borrower relatives >- my @relborrowernumbers = GetMemberRelatives($borrower->{'borrowernumber'}); >- #push @borrowernumbers, $borrower->{'borrowernumber'}; >- >- # get each issue of the borrower & separate them in todayissues & previous issues >- my $issueslist = GetPendingIssues($borrower->{'borrowernumber'}); >- my $relissueslist = []; >- if ( @relborrowernumbers ) { >- $relissueslist = GetPendingIssues(@relborrowernumbers); >- } >- >- build_issue_data($issueslist, 0); >- build_issue_data($relissueslist, 1); >- >- $displayrelissues = scalar($relissueslist); >- >- if ( C4::Context->preference( "todaysIssuesDefaultSortOrder" ) eq 'asc' ) { >- @todaysissues = sort { $a->{'timestamp'} cmp $b->{'timestamp'} } @todaysissues; >- } >- else { >- @todaysissues = sort { $b->{'timestamp'} cmp $a->{'timestamp'} } @todaysissues; >- } >- >- if ( C4::Context->preference( "previousIssuesDefaultSortOrder" ) eq 'asc' ){ >- @previousissues = sort { $a->{'date_due'} cmp $b->{'date_due'} } @previousissues; >- } >- else { >- @previousissues = sort { $b->{'date_due'} cmp $a->{'date_due'} } @previousissues; >- } >-} >- >- > my @values; > my %labels; > my $CGIselectborrower; >@@ -702,6 +600,11 @@ if (C4::Context->preference('ExtendedPatronAttributes')) { > ); > } > >+my @relatives = GetMemberRelatives( $borrower->{'borrowernumber'} ); >+my $relatives_issues_count = >+ Koha::Database->new()->schema()->resultset('Issue') >+ ->count( { borrowernumber => \@relatives } ); >+ > $template->param( > lib_messages_loop => $lib_messages_loop, > bor_messages_loop => $bor_messages_loop, >@@ -739,13 +642,7 @@ $template->param( > duedatespec => $duedatespec, > message => $message, > CGIselectborrower => $CGIselectborrower, >- totalprice => sprintf('%.2f', $totalprice), > totaldue => sprintf('%.2f', $total), >- todayissues => \@todaysissues, >- previssues => \@previousissues, >- relissues => \@relissues, >- relprevissues => \@relprevissues, >- displayrelissues => $displayrelissues, > inprocess => $inprocess, > memberofinstution => $member_of_institution, > CGIorganisations => $CGIorganisations, >@@ -758,6 +655,8 @@ $template->param( > SuspendHoldsIntranet => C4::Context->preference('SuspendHoldsIntranet'), > AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds'), > RoutingSerials => C4::Context->preference('RoutingSerials'), >+ relatives_issues_count => $relatives_issues_count, >+ relatives_borrowernumbers => \@relatives, > ); > > # save stickyduedate to session >diff --git a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css >index 2a04c35..fcc7319 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css >+++ b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css >@@ -270,7 +270,7 @@ tr.even td, tr.even.highlight td { > border-right : 1px solid #BCBCBC; > } > >-td.od { >+.overdue td.od { > color : #cc0000; > font-weight : bold; > } >diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/checkouts.js b/koha-tmpl/intranet-tmpl/prog/en/js/checkouts.js >new file mode 100644 >index 0000000..c507449 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/js/checkouts.js >@@ -0,0 +1,267 @@ >+$(document).ready(function() { >+ var ymd = $.datepicker.formatDate('yy-mm-dd', new Date()); >+ >+ $("#issues-table").dataTable({ >+ "sDom": "<'row-fluid'<'span6'><'span6'>r>t<'row-fluid'>t", >+ "aaSorting": [], >+ "aoColumns": [ >+ { >+ "mDataProp": function( oObj ) { >+ var today = new Date(); >+ var due = new Date( oObj.date_due ); >+ if ( today > due ) { >+ return "<span class='overdue'>" + oObj.date_due_formatted + "</span>"; >+ } else { >+ return oObj.date_due_formatted; >+ } >+ } >+ }, >+ { >+ "mDataProp": function ( oObj ) { >+ title = "<a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber=" >+ + oObj.biblionumber >+ + "'>" >+ + oObj.title; >+ >+ $.each(oObj.subtitle, function( index, value ) { >+ title += " " + value.subfield; >+ }); >+ >+ title += "</a>"; >+ >+ if ( oObj.author ) { >+ title += " " + _("by") + " " + oObj.author; >+ } >+ >+ if ( oObj.itemnotes ) { >+ var span_class = ""; >+ if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) { >+ span_class = "circ-hlt"; >+ } >+ title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>" >+ } >+ >+ title += " " >+ + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=" >+ + oObj.biblionumber >+ + "&itemnumber=" >+ + oObj.itemnumber >+ + "#" >+ + oObj.itemnumber >+ + "'>" >+ + oObj.barcode >+ + "</a>"; >+ >+ return title; >+ } >+ }, >+ { "mDataProp": "itemtype" }, >+ { "mDataProp": "issuedate" }, >+ { "mDataProp": "branchname" }, >+ { "mDataProp": "itemcallnumber" }, >+ { >+ "bSortable": false, >+ "mDataProp": function ( oObj ) { >+ return parseFloat(oObj.charge).toFixed(2); >+ } >+ }, >+ { >+ "bSortable": false, >+ "mDataProp": "price" }, >+ { >+ "bSortable": false, >+ "mDataProp": function ( oObj ) { >+ var content = ""; >+ var span_style = ""; >+ var span_class = ""; >+ >+ content += "<span style='padding: 0 1em;'>" + oObj.renewals_count + "</span>"; >+ >+ if ( oObj.can_renew ) { >+ // Do nothing >+ } else if ( oObj.can_renew_error == "on_reserve" ) { >+ content += "<span class='renewals-disabled'>" >+ + "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + _("On hold") + "</a>" >+ + "</span>"; >+ >+ span_style = "display: none"; >+ span_class = "renewals-allowed"; >+ } else if ( oObj.can_renew_error == "too_many" ) { >+ content += "<span class='renewals-disabled'>" >+ + _("Not renewable") >+ + "</span>"; >+ >+ span_style = "display: none"; >+ span_class = "renewals-allowed"; >+ } else { >+ content += "<span class='renewals-disabled'>" >+ + oObj.can_renew_error >+ + "</span>"; >+ >+ span_style = "display: none"; >+ span_class = "renewals-allowed"; >+ } >+ >+ content += "<span class='" + span_class + "' style='" + span_style + "'>" >+ + "<input type='checkbox' class='renew' id='renew_" + oObj.itemnumber + "' name='renew' value='" + oObj.itemnumber +"'/>" >+ + "</span>"; >+ >+ if ( oObj.renewals_remaining ) { >+ content += "<span class='renewals'>(" >+ + oObj.renewals_remaining >+ + " " + _("of") + " " >+ + oObj.renewals_allowed + " " >+ + _("renewals remaining") + ")</span>" >+ } >+ >+ >+ return content; >+ } >+ }, >+ { >+ "bSortable": false, >+ "mDataProp": function ( oObj ) { >+ if ( oObj.can_renew_error == "on_reserve" ) { >+ return "<a href='/cgi-bin/koha/reserve/request.pl?biblionumber=" + oObj.biblionumber + "'>" + _("On hold") + "</a>"; >+ } else { >+ return "<input type='checkbox' class='checkin' id='checkin_" + oObj.itemnumber + "' name='checkin' value='" + oObj.itemnumber +"'></input>"; >+ } >+ } >+ }, >+ { >+ "bVisible": exports_enabled ? true : false, >+ "bSortable": false, >+ "mDataProp": function ( oObj ) { >+ return "<input type='checkbox' class='export' id='export_" + oObj.biblionumber + "' name='biblionumbers' value='" + oObj.biblionumber + "' />"; >+ } >+ } >+ ], >+ "fnFooterCallback": function ( nRow, aaData, iStart, iEnd, aiDisplay ) { >+ var total_charge = 0; >+ var total_price = 0; >+ for ( var i=0; i < aaData.length; i++ ) { >+ total_charge += aaData[i]['charge'] * 1; >+ total_price += aaData[i]['price'] * 1; >+ } >+ var nCells = nRow.getElementsByTagName('td'); >+ nCells[1].innerHTML = total_charge.toFixed(2); >+ nCells[2].innerHTML = total_price.toFixed(2); >+ }, >+ "bPaginate": false, >+ "bProcessing": true, >+ "bServerSide": true, >+ "sAjaxSource": '/cgi-bin/koha/api/checkouts.pl', >+ "fnServerData": function ( sSource, aoData, fnCallback ) { >+ aoData.push( { "name": "borrowernumber", "value": borrowernumber } ); >+ >+ $.getJSON( sSource, aoData, function (json) { >+ fnCallback(json) >+ } ); >+ }, >+ }); >+ >+ // Don't load relatives' issues table unless it is clicked on >+ var relativesIssuesTable; >+ $("#relatives-issues-tab").click( function() { >+ if ( ! relativesIssuesTable ) { >+ relativesIssuesTable = $("#relatives-issues-table").dataTable({ >+ "sDom": "<'row-fluid'<'span6'><'span6'>r>t<'row-fluid'>t", >+ "aaSorting": [], >+ "aoColumns": [ >+ { >+ "mDataProp": function( oObj ) { >+ var today = new Date(); >+ var due = new Date( oObj.date_due ); >+ if ( today > due ) { >+ return "<span class='overdue'>" + oObj.date_due_formatted + "</span>"; >+ } else { >+ return oObj.date_due_formatted; >+ } >+ } >+ }, >+ { >+ "mDataProp": function ( oObj ) { >+ title = "<a href='/cgi-bin/koha/catalogue/detail.pl?biblionumber=" >+ + oObj.biblionumber >+ + "'>" >+ + oObj.title; >+ >+ $.each(oObj.subtitle, function( index, value ) { >+ title += " " + value.subfield; >+ }); >+ >+ title += "</a>"; >+ >+ if ( oObj.author ) { >+ title += " " + _("by") + " " + oObj.author; >+ } >+ >+ if ( oObj.itemnotes ) { >+ var span_class = ""; >+ if ( $.datepicker.formatDate('yy-mm-dd', new Date(oObj.issuedate) ) == ymd ) { >+ span_class = "circ-hlt"; >+ } >+ title += " - <span class='" + span_class + "'>" + oObj.itemnotes + "</span>" >+ } >+ >+ title += " " >+ + "<a href='/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=" >+ + oObj.biblionumber >+ + "&itemnumber=" >+ + oObj.itemnumber >+ + "#" >+ + oObj.itemnumber >+ + "'>" >+ + oObj.barcode >+ + "</a>"; >+ >+ return title; >+ } >+ }, >+ { "mDataProp": "itemtype" }, >+ { "mDataProp": "issuedate" }, >+ { "mDataProp": "branchname" }, >+ { "mDataProp": "itemcallnumber" }, >+ { "mDataProp": "charge" }, >+ { "mDataProp": "price" }, >+ { >+ "mDataProp": function( oObj ) { >+ return "<a href='/cgi-bin/koha/members/moremember.pl?borrowernumber=" + oObj.borrowernumber + "'>" >+ + oObj.borrower.firstname + " " + oObj.borrower.surname + " (" + oObj.borrower.cardnumber + ")</a>" >+ } >+ }, >+ ], >+ "bPaginate": false, >+ "bProcessing": true, >+ "bServerSide": true, >+ "sAjaxSource": '/cgi-bin/koha/api/checkouts.pl', >+ "fnServerData": function ( sSource, aoData, fnCallback ) { >+ $.each(relatives_borrowernumbers, function( index, value ) { >+ aoData.push( { "name": "borrowernumber", "value": value } ); >+ }); >+ >+ $.getJSON( sSource, aoData, function (json) { >+ fnCallback(json) >+ } ); >+ }, >+ }); >+ } >+ }); >+ >+ $("#issues-table").on("sort",function() { >+ $("#previous").hide(); // Don't want to see "previous checkouts" header sorted with other rows >+ }); >+ $("#relatives-issues-table").on("sort",function() { >+ $("#relprevious").hide(); // Don't want to see "previous checkouts" header sorted with other rows >+ }); >+ >+ if ( AllowRenewalLimitOverride ) { >+ $( '#override_limit' ).click( function () { >+ if ( this.checked ) { >+ $( '.renewals-allowed' ).show(); $( '.renewals-disabled' ).hide(); >+ } else { >+ $( '.renewals-allowed' ).hide(); $( '.renewals-disabled' ).show(); >+ } >+ } ).attr( 'checked', false ); >+ } >+ }); >diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/pages/circulation.js b/koha-tmpl/intranet-tmpl/prog/en/js/pages/circulation.js >index fe307bf..cfffa2f 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/js/pages/circulation.js >+++ b/koha-tmpl/intranet-tmpl/prog/en/js/pages/circulation.js >@@ -1,57 +1,136 @@ > $(document).ready(function() { >- $('#patronlists').tabs(); >- var allcheckboxes = $(".checkboxed"); >- $("#renew_all").on("click",function(){ >- allcheckboxes.checkCheckboxes(":input[name*=items]"); >- allcheckboxes.unCheckCheckboxes(":input[name*=barcodes]"); >- }); >- $("#CheckAllitems").on("click",function(){ >- allcheckboxes.checkCheckboxes(":input[name*=items]"); >- allcheckboxes.unCheckCheckboxes(":input[name*=barcodes]"); return false; >+ // Handle the select all/none links for checkouts table columns >+ $("#CheckAllRenewals").on("click",function(){ >+ $("#UncheckAllCheckins").click(); >+ $(".renew:visible").attr("checked", "checked" ); >+ return false; > }); >- $("#CheckNoitems").on("click",function(){ >- allcheckboxes.unCheckCheckboxes(":input[name*=items]"); return false; >+ $("#UncheckAllRenewals").on("click",function(){ >+ $(".renew:visible").removeAttr("checked"); >+ return false; > }); >- $("#CheckAllreturns").on("click",function(){ >- allcheckboxes.checkCheckboxes(":input[name*=barcodes]"); >- allcheckboxes.unCheckCheckboxes(":input[name*=items]"); return false; >+ >+ $("#CheckAllCheckins").on("click",function(){ >+ $("#UncheckAllRenewals").click(); >+ $(".checkin:visible").attr("checked", "checked" ); >+ return false; > }); >- $("#CheckNoreturns" ).on("click",function(){ >- allcheckboxes.unCheckCheckboxes(":input[name*=barcodes]"); return false; >+ $("#UncheckAllCheckins").on("click",function(){ >+ $(".checkin:visible").removeAttr("checked"); >+ return false; > }); > >- $("#CheckAllexports").on("click",function(){ >- allcheckboxes.checkCheckboxes(":input[name*=biblionumbers]"); >+ $("#CheckAllExports").on("click",function(){ >+ $(".export:visible").attr("checked", "checked" ); > return false; > }); >- $("#CheckNoexports").on("click",function(){ >- allcheckboxes.unCheckCheckboxes(":input[name*=biblionumbers]"); >+ $("#UncheckAllExports").on("click",function(){ >+ $(".export:visible").removeAttr("checked"); > return false; > }); > >- $("#relrenew_all").on("click",function(){ >- allcheckboxes.checkCheckboxes(":input[name*=items]"); >- allcheckboxes.unCheckCheckboxes(":input[name*=barcodes]"); >- }); >- $("#relCheckAllitems").on("click",function(){ >- allcheckboxes.checkCheckboxes(":input[name*=items]"); >- allcheckboxes.unCheckCheckboxes(":input[name*=barcodes]"); return false; >+ // Don't allow both return and renew checkboxes to be checked >+ $(document).on("change", '.renew', function(){ >+ if ( $(this).is(":checked") ) { >+ $( "#checkin_" + $(this).val() ).removeAttr("checked"); >+ } > }); >- $("#relCheckNoitems").on("click",function(){ >- allcheckboxes.unCheckCheckboxes(":input[name*=items]"); return false; >+ $(document).on("change", '.checkin', function(){ >+ if ( $(this).is(":checked") ) { >+ $( "#renew_" + $(this).val() ).removeAttr("checked"); >+ } > }); >- $("#relCheckAllreturns").on("click",function(){ >- allcheckboxes.checkCheckboxes(":input[name*=barcodes]"); >- allcheckboxes.unCheckCheckboxes(":input[name*=items]"); return false; >+ >+ // Handle renewals >+ $("#RenewCheckinChecked").on("click",function(){ >+ $(".checkin:checked:visible").each(function() { >+ itemnumber = $(this).val(); >+ >+ $(this).replaceWith("<img id='checkin_" + itemnumber + "' src='" + interface + "/" + theme + "/img/loading-small.gif' />"); >+ >+ params = { >+ itemnumber: itemnumber, >+ borrowernumber: borrowernumber, >+ branchcode: branchcode, >+ exempt_fine: $("#exemptfine").is(':checked') >+ }; >+ >+ $.post( "/cgi-bin/koha/api/checkin.pl", params, function( data ) { >+ id = "#checkin_" + data.itemnumber; >+ >+ content = ""; >+ if ( data.returned ) { >+ content = _("Returned"); >+ } else { >+ content = _("Unable to return"); >+ } >+ >+ $(id).replaceWith( content ); >+ }, "json") >+ }); >+ >+ $(".renew:checked:visible").each(function() { >+ var override_limit = $("#override_limit").is(':checked') ? 1 : 0; >+ >+ var itemnumber = $(this).val(); >+ >+ $(this).replaceWith("<img id='renew_" + itemnumber + "' src='" + interface + "/" + theme + "/img/loading-small.gif' />"); >+ >+ var params = { >+ itemnumber: itemnumber, >+ borrowernumber: borrowernumber, >+ branchcode: branchcode, >+ override_limit: override_limit, >+ date_due: $("#newduedate").val() >+ }; >+ >+ $.post( "/cgi-bin/koha/api/renew.pl", params, function( data ) { >+ var id = "#renew_" + data.itemnumber; >+ >+ var content = ""; >+ if ( data.renew_okay ) { >+ content = _("Renewed, due: ") + data.date_due; >+ } else { >+ content = _("Renew failed: "); >+ if ( data.error == "no_checkout" ) { >+ content += _("not checked out"); >+ } else if ( data.error == "too_many" ) { >+ content += _("too many renewals"); >+ } else if ( data.error == "on_reserve" ) { >+ content += _("on reserve"); >+ } else if ( data.error ) { >+ content += data.error; >+ } else { >+ content += _("reason unknown"); >+ } >+ } >+ >+ $(id).replaceWith( content ); >+ }, "json") >+ }); >+ >+ // Prevent form submit >+ return false; > }); >- $("#relCheckNoreturns").on("click",function(){ >- allcheckboxes.unCheckCheckboxes(":input[name*=barcodes]"); return false; >+ >+ $("#RenewAll").on("click",function(){ >+ $("#CheckAllRenewals").click(); >+ $("#UncheckAllCheckins").click(); >+ $("#RenewCheckinChecked").click(); >+ >+ // Prevent form submit >+ return false; > }); >+ >+ $('#patronlists').tabs(); >+ > $("#messages ul").after("<a href=\"#\" id=\"addmessage\">"+MSG_ADD_MESSAGE+"</a>"); >+ > $("#borrower_messages .cancel").on("click",function(){ > $("#add_message_form").hide(); > $("#addmessage").show(); > }); >+ > $("#addmessage").on("click",function(){ > $(this).hide(); > $("#add_message_form").show(); >@@ -76,8 +155,9 @@ $(document).ready(function() { > export_checkouts(export_format); > return false; > }); >+ > // Clicking the table cell checks the checkbox inside it >- $("td").on("click",function(e){ >+ $(document).on("click", 'td', function(e){ > if(e.target.tagName.toLowerCase() == 'td'){ > $(this).find("input:checkbox:visible").each( function() { > $(this).click(); >@@ -107,13 +187,9 @@ function export_checkouts(format) { > } else if (format == 'iso2709') { > $("#dont_export_item").val(1); > } >- document.issues.action="/cgi-bin/koha/tools/export.pl"; >+ > document.getElementById("export_format").value = format; > document.issues.submit(); >- >- /* Reset form action to its initial value */ >- document.issues.action="/cgi-bin/koha/reserve/renewscript.pl"; >- > } > > function validate1(date) { >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt >index e667bc3..ce041ed 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt >@@ -13,88 +13,45 @@ > </title> > [% INCLUDE 'doc-head-close.inc' %] > [% INCLUDE 'calendar.inc' %] >-[% IF ( UseTablesortForCirc ) %]<link rel="stylesheet" type="text/css" href="[% themelang %]/css/datatables.css" /> >+<link rel="stylesheet" type="text/css" href="[% themelang %]/css/datatables.css" /> > <script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.dataTables.min.js"></script> > [% INCLUDE 'datatables-strings.inc' %] >-<script type="text/javascript" src="[% themelang %]/js/datatables.js"></script>[% END %] >+<!-- <script type="text/javascript" src="[% themelang %]/js/datatables.js"></script> --> > <script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.checkboxes.min.js"></script> > <script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery-ui-timepicker-addon.min.js"></script> > [% INCLUDE 'timepicker.inc' %] > <script type="text/javascript" src="[% themelang %]/js/pages/circulation.js"></script> >+<script type="text/javascript" src="[% themelang %]/js/checkouts.js"></script> > <script type="text/javascript"> > //<![CDATA[ >+/* Set some variable needed in circulation.js */ >+var interface = "[% interface %]"; >+var theme = "[% theme %]"; >+var borrowernumber = "[% borrowernumber %]"; >+var branchcode = "[% branch %]"; >+var exports_enabled = "[% exports_enabled %]"; >+var AllowRenewalLimitOverride = [% CAN_user_circulate_override_renewals && AllowRenewalLimitOverride %]; >+var relatives_borrowernumbers = new Array(); >+[% FOREACH b IN relatives_borrowernumbers %] >+ relatives_borrowernumbers.push("[% b %]"); >+[% END %] >+ > var MSG_ADD_MESSAGE = _("Add a new message"); > var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export"); > [% IF ( UseTablesortForCirc && dateformat == 'metric' ) %]dt_add_type_uk_date();[% END %] > [% IF ( borrowernumber ) %]if($.cookie("holdfor") != [% borrowernumber %]){ $.cookie("holdfor",null, { path: "/", expires: 0 }); }[% ELSE %]$.cookie("holdfor",null, { path: "/", expires: 0 });[% END %] > [% UNLESS ( borrowernumber ) %][% UNLESS ( CGIselectborrower ) %]window.onload=function(){ $('#findborrower').focus(); };[% END %][% END %] >- $(document).ready(function() { >- $('#patronlists').tabs([% IF ( UseTablesortForCirc ) %]{ >- // Correct table sizing for tables hidden in tabs >- // http://www.datatables.net/examples/api/tabs_and_scrolling.html >- "show": function(event, ui) { >- var oTable = $('div.dataTables_wrapper>table', ui.panel).dataTable(); >- if ( oTable.length > 0 ) { >- oTable.fnAdjustColumnSizing(); >- } >- } >- }[% END %]); >- [% IF ( UseTablesortForCirc ) %] >- $("#issuest").dataTable($.extend(true, {}, dataTablesDefaults, { >- "sDom": 't', >- "aaSorting": [], >- "aoColumnDefs": [ >- { "aTargets": [ -1, -2[% IF ( exports_enabled ) %], -3[% END %] ], "bSortable": false, "bSearchable": false } >- ], >- "aoColumns": [ >- { "sType": "title-string" },{ "sType": "html" },null,{ "sType": "title-string" },null,null,null,null,null,null[% IF ( exports_enabled ) %],null[% END %] >- ], >- "bPaginate": false >- })); >- >- $("#relissuest").dataTable($.extend(true, {}, dataTablesDefaults, { >- "sDom": 't', >- "aaSorting": [], >- "aoColumns": [ >- { "sType": "title-string" },{ "sType": "html" },null,{ "sType": "title-string" },null,null,null,null,{ "sType": "html" } >- ], >- "bPaginate": false >- })); >- >- $("#issuest").on("sort",function() { >- $("#previous").hide(); // Don't want to see "previous checkouts" header sorted with other rows >- }); >- $("#relissuest").on("sort",function() { >- $("#relprevious").hide(); // Don't want to see "previous checkouts" header sorted with other rows >- }); >- [% END %] >- [% IF ( AllowRenewalLimitOverride ) %] >- $( '#override_limit' ).click( function () { >- if ( this.checked ) { >- $( '.renewals-allowed' ).show(); $( '.renewals-disabled' ).hide(); >- } else { >- $( '.renewals-allowed' ).hide(); $( '.renewals-disabled' ).show(); >- } >- } ).attr( 'checked', false ); >- [% END %][% IF !( CircAutoPrintQuickSlip == 'clear' ) %] >+ >+$(document).ready(function() { >+ [% IF !( CircAutoPrintQuickSlip == 'clear' ) %] > // listen submit to trigger qslip on empty checkout > $('#mainform').bind('submit',function() { >- if ($('#barcode').val() == '') { >- return printx_window( '[% CircAutoPrintQuickSlip %]' ); } >- });[% END %] >- >- [% IF ( CAN_user_circulate_override_renewals ) %] >- [% IF ( AllowRenewalLimitOverride ) %] >- $( '#override_limit' ).click( function () { >- if ( this.checked ) { >- $( '.renewals-allowed' ).show(); $( '.renewals-disabled' ).hide(); >- } else { >- $( '.renewals-allowed' ).hide(); $( '.renewals-disabled' ).show(); >- } >- } ).attr( 'checked', false ); >- [% END %] >+ if ($('#barcode').val() == '') { >+ return printx_window( '[% CircAutoPrintQuickSlip %]' ); >+ } >+ }); > [% END %] >- }); >+}); > //]]> > </script> > </head> >@@ -516,7 +473,7 @@ No patron matched <span class="ex">[% message %]</span> > [% ELSE %] > <input type="text" name="barcode" id="barcode" class="barcode focus" size="14" /> > [% END %] >- <input type="submit" value="Check Out" /> >+ <button type="submit" class="btn"><i class="icon-barcode"></i> Check out</button> > > [% IF ( SpecifyDueDate ) %]<div class="date-select"> > <div class="hint">Specify due date [% INCLUDE 'date-format.inc' %]: </div> >@@ -528,7 +485,7 @@ No patron matched <span class="ex">[% message %]</span> > [% ELSE %] > <input type="checkbox" id="stickyduedate" onclick="this.form.barcode.focus();" name="stickyduedate" /> > [% END %] >- <input type="button" class="action" id="cleardate" value="Clear" name="cleardate" onclick="this.checked = false; this.form.duedatespec.value = ''; this.form.stickyduedate.checked = false; this.form.barcode.focus(); return false;" /> >+ <button class="btn btn-small action" id="cleardate" name="cleardate" onclick="this.checked = false; this.form.duedatespec.value = ''; this.form.stickyduedate.checked = false; this.form.barcode.focus(); return false;" ><i class="icon-remove-circle"></i> Clear</button> > </div>[% END %] > <input type="hidden" name="borrowernumber" id="borrowernumber" value="[% borrowernumber %]" /> > <input type="hidden" name="branch" value="[% branch %]" /> >@@ -687,346 +644,111 @@ No patron matched <span class="ex">[% message %]</span> > <div class="yui-g"><div id="patronlists" class="toptabs"> > > <ul> >-<li> [% IF ( issuecount ) %] >+ <li> >+ [% IF ( issuecount ) %] > <a href="#checkouts">[% issuecount %] Checkout(s)</a> >- [% ELSE %] >+ [% ELSE %] > <a href="#checkouts">0 Checkouts</a> >- [% END %]</li> >-[% IF ( displayrelissues ) %] >-<li><a href="#relissues">Relatives' checkouts</a></li> >-[% END %] >-<li>[% IF ( countreserv ) %] >+ [% END %] >+ </li> >+ >+ [% IF relatives_issues_count %] >+ <li><a id="relatives-issues-tab" href="#relatives-issues">Relatives' checkouts</a></li> >+ [% END %] >+ >+ <li> >+ [% IF ( countreserv ) %] > <a href="#reserves">[% countreserv %] Hold(s)</a> >- [% ELSE %] >+ [% ELSE %] > <a href="#reserves">0 Holds</a> >- [% END %]</li> >- <li><a id="debarments-tab-link" href="#reldebarments">[% debarments.size %] Restrictions</a></li> >+ [% END %] >+ </li> > >+ <li><a id="debarments-tab-link" href="#reldebarments">[% debarments.size %] Restrictions</a></li> > </ul> > > <!-- SUMMARY : TODAY & PREVIOUS ISSUES --> > <div id="checkouts"> > [% IF ( issuecount ) %] >- <form name="issues" action="/cgi-bin/koha/reserve/renewscript.pl" method="post" class="checkboxed"> >- <input type="hidden" value="circ" name="destination" /> >- <input type="hidden" name="cardnumber" value="[% cardnumber %]" /> >- <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" /> >- <input type="hidden" name="branch" value="[% branch %]" /> >- <table id="issuest"> >- <thead><tr> >- <th scope="col">Due date</th> >- <th scope="col">Title</th> >- <th scope="col">Item type</th> >- <th scope="col">Checked out on</th> >- <th scope="col">Checked out from</th> >- <th scope="col">Call no</th> >- <th scope="col">Charge</th> >- <th scope="col">Price</th> >- <th scope="col">Renew <p class="column-tool"><a href="#" id="CheckAllitems">select all</a> | <a href="#" id="CheckNoitems">none</a></p></th> >- <th scope="col">Check in <p class="column-tool"><a href="#" id="CheckAllreturns">select all</a> | <a href="#" id="CheckNoreturns">none</a></p></th> >- [% IF ( exports_enabled ) %] >- <th scope="col">Export <p class="column-tool"><a href="#" id="CheckAllexports">select all</a> | <a href="#" id="CheckNoexports">none</a></p></th> >- [% END %] >- </tr></thead> >-[% IF ( todayissues ) %] >-[% INCLUDE 'checkouts-table-footer.inc' %] >- <tbody> >- >- [% FOREACH todayissue IN todayissues %] >- [% IF ( loop.odd ) %] >- <tr> >- [% ELSE %] >- <tr class="highlight"> >- [% END %] >- [% IF ( todayissue.od ) %]<td class="od">[% ELSE %]<td>[% END %] >- <span title="[% todayissue.dd_sort %]">[% todayissue.dd %]</span> >- >- [% IF ( todayissue.itemlost ) %] >- <span class="lost">[% AuthorisedValues.GetByCode( 'LOST', todayissue.itemlost ) %]</span> >- [% END %] >- [% IF ( todayissue.damaged ) %] >- <span class="dmg">[% AuthorisedValues.GetByCode( 'DAMAGED', todayissue.damaged ) %]</span> >- [% END %] >- </td> >- <td><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% todayissue.biblionumber %]&type=intra"><strong>[% todayissue.title |html %][% FOREACH subtitl IN todayissue.subtitle %] [% subtitl.subfield %][% END %]</strong></a>[% IF ( todayissue.author ) %], by [% todayissue.author %][% END %][% IF ( todayissue.itemnotes ) %]- <span class="circ-hlt">[% todayissue.itemnotes %]</span>[% END %] <a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=[% todayissue.biblionumber %]&itemnumber=[% todayissue.itemnumber %]#item[% todayissue.itemnumber %]">[% todayissue.barcode %]</a></td> >- <td>[% UNLESS ( noItemTypeImages ) %] [% IF ( todayissue.itemtype_image ) %]<img src="[% todayissue.itemtype_image %]" alt="" />[% END %][% END %][% todayissue.itemtype %]</td> >- <td><span title="[% todayissue.displaydate_sort %]">[% todayissue.checkoutdate %]</span></td> >- [% IF ( todayissue.multiple_borrowers ) %]<td>[% todayissue.firstname %] [% todayissue.surname %]</td>[% END %] >- <td>[% todayissue.issuingbranchname %]</td> >- <td>[% todayissue.itemcallnumber %]</td> >- <td>[% todayissue.charge %]</td> >- <td>[% todayissue.replacementprice %]</td> >- [% IF ( todayissue.renew_failed ) %] >- <td class="problem">Renewal failed</td> >- [% ELSE %] >- <td><span style="padding: 0 1em;">[% IF ( todayissue.renewals ) %][% todayissue.renewals %][% ELSE %]0[% END %]</span> >- [% IF ( todayissue.can_renew ) %] >- <input type="checkbox" name="all_items[]" value="[% todayissue.itemnumber %]" checked="checked" style="display: none;" /> >- [% IF ( todayissue.od ) %] >- <input type="checkbox" class="radio" name="items[]" value="[% todayissue.itemnumber %]" checked="checked" /> >- [% ELSE %] >- <input type="checkbox" class="radio" name="items[]" value="[% todayissue.itemnumber %]" /> >- [% END %] >- [% IF todayissue.renewsallowed && todayissue.renewsleft %] >- <span class="renewals">([% todayissue.renewsleft %] of [% todayissue.renewsallowed %] renewals remaining)</span> >- [% END %] >- [% ELSE %] >- [% IF ( todayissue.can_confirm ) %]<span class="renewals-allowed" style="display: none"> >- <input type="checkbox" name="all_items[]" value="[% todayissue.itemnumber %]" checked="checked" style="display: none;" /> >- [% IF ( todayissue.od ) %] >- <input type="checkbox" class="radio" name="items[]" value="[% todayissue.itemnumber %]" checked="checked" /> >- [% ELSE %] >- <input type="checkbox" class="radio" name="items[]" value="[% todayissue.itemnumber %]" /> >- [% END %] >- </span> >- [% IF todayissue.renewsallowed && todayissue.renewsleft %] >- <span class="renewals">([% todayissue.renewsleft %] of [% todayissue.renewsallowed %] renewals remaining)</span> >- [% END %] >- <span class="renewals-disabled"> >- [% END %] >- [% IF ( todayissue.renew_error_on_reserve ) %] >- <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% todayissue.biblionumber %]">On hold</a> >- [% END %] >- [% IF ( todayissue.renew_error_too_many ) %] >- Not renewable >+ <form name="issues" action="/cgi-bin/koha/tools/export.pl" method="post" class="checkboxed"> >+ <table id="issues-table"> >+ <thead> >+ <tr> >+ <th scope="col">Due date</th> >+ <th scope="col">Title</th> >+ <th scope="col">Item type</th> >+ <th scope="col">Checked out on</th> >+ <th scope="col">Checked out from</th> >+ <th scope="col">Call no</th> >+ <th scope="col">Charge</th> >+ <th scope="col">Price</th> >+ <th scope="col">Renew <p class="column-tool"><a href="#" id="CheckAllRenewals">select all</a> | <a href="#" id="UncheckAllRenewals">none</a></p></th> >+ <th scope="col">Check in <p class="column-tool"><a href="#" id="CheckAllCheckins">select all</a> | <a href="#" id="UncheckAllCheckins">none</a></p></th> >+ <th scope="col">Export <p class="column-tool"><a href="#" id="CheckAllExports">select all</a> | <a href="#" id="UncheckAllExports">none</a></p></th> >+ </tr> >+ </thead> >+ [% INCLUDE 'checkouts-table-footer.inc' %] >+ </table> >+ >+ [% IF ( issuecount ) %] >+ <fieldset class="action"> >+ [% IF ( CAN_user_circulate_override_renewals ) %] >+ [% IF ( AllowRenewalLimitOverride ) %] >+ <label for="override_limit">Override renewal limit:</label> >+ <input type="checkbox" name="override_limit" id="override_limit" value="1" /> >+ [% END %] > [% END %] >- [% IF ( todayissue.can_confirm ) %] >- </span> >- [% END %] >- [% END %] >- </td> >- [% END %] >- [% IF ( todayissue.return_failed ) %] >- <td class="problem">Checkin failed</td> >- [% ELSE %] >- [% IF ( todayissue.renew_error_on_reserve ) %] >- <td><a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% todayissue.biblionumber %]">On hold</a> >- <input type="checkbox" name="all_barcodes[]" value="[% todayissue.barcode %]" checked="checked" style="display: none;" /> >- </td> >- [% ELSE %] >- <td><input type="checkbox" class="radio" name="barcodes[]" value="[% todayissue.barcode %]" /> >- <input type="checkbox" name="all_barcodes[]" value="[% todayissue.barcode %]" checked="checked" style="display: none;" /> >- </td> >- [% END %] >- [% END %] >- [% IF ( exports_enabled ) %] >- <td style="text-align:center;"> >- <input type="checkbox" id="export_[% todayissue.biblionumber %]" name="biblionumbers" value="[% todayissue.biblionumber %]" /> >- <input type="checkbox" name="itemnumbers" value="[% todayissue.itemnumber %]" style="visibility:hidden;" /> >- </td> >- [% END %] >- </tr> >- [% END %] <!-- /loop todayissues --> >- <!-- /if todayissues -->[% END %] >- >-[% IF ( previssues ) %] >- [% UNLESS ( todayissues ) %] >- [% INCLUDE 'checkouts-table-footer.inc' %] >- <tbody> >- [% END %] >- [% IF ( UseTablesortForCirc ) %]<tr id="previous"><th><span title="">Previous checkouts</span></th><th></th><th></th><th><span title=""></span></th><th></th><th></th><th></th><th></th><th></th><th></th>[% IF ( exports_enabled ) %]<th></th>[% END %]</tr>[% ELSE %]<tr id="previous">[% IF ( exports_enabled ) %]<th colspan="11">[% ELSE %]<th colspan="10">[% END %]Previous checkouts</th></tr>[% END %] >- [% FOREACH previssue IN previssues %] >- [% IF ( loop.odd ) %] >- <tr> >- [% ELSE %] >- <tr class="highlight"> >- [% END %] >- [% IF ( previssue.od ) %]<td class="od">[% ELSE %]<td>[% END %] >- <span title="[% previssue.dd_sort %]">[% previssue.dd %]</span> >+ <button class="btn" id="RenewCheckinChecked"><i class="icon-check"></i> Renew or return checked items</button> >+ <button class="btn" id="RenewAll"><i class="icon-book"></i> Renew all</button> >+ </fieldset> > >- [% IF ( previssue.itemlost ) %] >- <span class="lost">[% AuthorisedValues.GetByCode( 'LOST', previssue.itemlost ) %]</span> >- [% END %] >- [% IF ( previssue.damaged ) %] >- <span class="dmg">[% AuthorisedValues.GetByCode( 'DAMAGED', previssue.damaged ) %]</span> >- [% END %] >- </td> >- <td><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% previssue.biblionumber %]&type=intra"><strong>[% previssue.title |html %][% FOREACH subtitl IN previssue.subtitle %] [% subtitl.subfield %][% END %]</strong></a>[% IF ( previssue.author ) %], by [% previssue.author %][% END %] [% IF ( previssue.itemnotes ) %]- [% previssue.itemnotes %][% END %] <a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=[% previssue.biblionumber %]&itemnumber=[% previssue.itemnumber %]#item[% previssue.itemnumber %]">[% previssue.barcode %]</a></td> >- <td> >- [% previssue.itemtype %] >- </td> >- <td><span title="[% previssue.displaydate_sort %]">[% previssue.displaydate %]</span></td> >- [% IF ( previssue.multiple_borrowers ) %]<td>[% previssue.firstname %] [% previssue.surname %]</td>[% END %] >- <td>[% previssue.issuingbranchname %]</td> >- <td>[% previssue.itemcallnumber %]</td> >- <td>[% previssue.charge %]</td> >- <td>[% previssue.replacementprice %]</td> >- [% IF ( previssue.renew_failed ) %] >- <td class="problem">Renewal failed</td> >- [% ELSE %] >- <td><span style="padding: 0 1em;">[% IF ( previssue.renewals ) %][% previssue.renewals %][% ELSE %]0[% END %]</span> >- [% IF ( previssue.can_renew ) %] >- <input type="checkbox" name="all_items[]" value="[% previssue.itemnumber %]" checked="checked" style="display: none;" /> >- [% IF ( previssue.od ) %] >- <input type="checkbox" class="radio" name="items[]" value="[% previssue.itemnumber %]" checked="checked" /> >- [% ELSE %] >- <input type="checkbox" class="radio" name="items[]" value="[% previssue.itemnumber %]" /> >- [% END %] >- [% IF previssue.renewsallowed && previssue.renewsleft %] >- <span class="renewals">([% previssue.renewsleft %] of [% previssue.renewsallowed %] renewals remaining)</span> >- [% END %] >- [% ELSE %] >- [% IF ( previssue.can_confirm ) %]<span class="renewals-allowed" style="display: none"> >- <input type="checkbox" name="all_items[]" value="[% previssue.itemnumber %]" checked="checked" style="display: none;" /> >- [% IF ( previssue.od ) %] >- <input type="checkbox" class="radio" name="items[]" value="[% previssue.itemnumber %]" checked="checked" /> >- [% ELSE %] >- <input type="checkbox" class="radio" name="items[]" value="[% previssue.itemnumber %]" /> >- [% END %] >- </span> >- [% IF previssue.renewsallowed && previssue.renewsleft %] >- <span class="renewals">([% previssue.renewsleft %] of [% previssue.renewsallowed %] renewals remaining)</span> >- [% END %] >- <span class="renewals-disabled"> >- [% END %] >- [% IF ( previssue.renew_error_on_reserve ) %] >- <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% previssue.biblionumber %]">On hold</a> >- [% END %] >- [% IF ( previssue.renew_error_too_many ) %] >- Not renewable >- [% END %] >- [% IF ( previssue.can_confirm ) %] >- </span> >- [% END %] >- [% END %] >- </td> >- [% END %] >- [% IF ( previssue.return_failed ) %] >- <td class="problem">Check-in failed</td> >- [% ELSE %] >- [% IF ( previssue.renew_error_on_reserve ) %] >- <td><a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% previssue.biblionumber %]">On hold</a> >- <input type="checkbox" name="all_barcodes[]" value="[% previssue.barcode %]" checked="checked" style="display: none;" /> >- </td> >- [% ELSE %] >- <td><input type="checkbox" class="radio" name="barcodes[]" value="[% previssue.barcode %]" /> >- <input type="checkbox" name="all_barcodes[]" value="[% previssue.barcode %]" checked="checked" style="display: none;" /> >- </td> >+ [% IF ( exports_enabled ) %] >+ <fieldset> >+ <label for="export_formats"><b>Export checkouts using format:</b></label> >+ <select name="export_formats" id="export_formats"> >+ <option value="iso2709_995">ISO2709 with items</option> >+ <option value="iso2709">ISO2709 without items</option> >+ [% IF ( export_with_csv_profile ) %] >+ <option value="csv">CSV</option> >+ [% END %] >+ </select> >+ >+ <label for="export_remove_fields">Don't export fields:</label> <input type="text" id="export_remove_fields" name="export_remove_fields" value="[% export_remove_fields %]" title="Use for iso2709 exports" /> >+ <input type="hidden" name="op" value="export" /> >+ <input type="hidden" id="export_format" name="format" value="iso2709" /> >+ <input type="hidden" id="dont_export_item" name="dont_export_item" value="0" /> >+ <input type="hidden" id="record_type" name="record_type" value="bibs" /> >+ <button class="btn btn-small" id="export_submit"><i class="icon-download-alt"></i> Export</button> >+ </fieldset> > [% END %] > [% END %] >- [% IF ( exports_enabled ) %] >- <td style="text-align:center;"> >- <input type="checkbox" id="export_[% previssue.biblionumber %]" name="biblionumbers" value="[% previssue.biblionumber %]" /> >- <input type="checkbox" name="itemnumbers" value="[% previssue.itemnumber %]" style="visibility:hidden;" /> >- </td> >- [% END %] >- </tr> >- <!-- /loop previssues -->[% END %] >-<!--/if previssues -->[% END %] >- </tbody> >- </table> >- [% IF ( issuecount ) %] >- <fieldset class="action"> >- [% IF ( CAN_user_circulate_override_renewals ) %] >- [% IF ( AllowRenewalLimitOverride ) %] >- <label for="override_limit">Override renewal limit:</label> >- <input type="checkbox" name="override_limit" id="override_limit" value="1" /> >- [% END %] >- [% END %] >- <input type="submit" name="renew_checked" value="Renew or Return checked items" /> >- <input type="submit" id="renew_all" name="renew_all" value="Renew all" /> >- </fieldset> >- [% IF ( exports_enabled ) %] >- <fieldset> >- <label for="export_formats"><b>Export checkouts using format:</b></label> >- <select name="export_formats" id="export_formats"> >- <option value="iso2709_995">ISO2709 with items</option> >- <option value="iso2709">ISO2709 without items</option> >- [% IF ( export_with_csv_profile ) %] >- <option value="csv">CSV</option> >- [% END %] >- >- </select> >- <label for="export_remove_fields">Don't export fields:</label> <input type="text" id="export_remove_fields" name="export_remove_fields" value="[% export_remove_fields %]" title="Use for iso2709 exports" /> >- <input type="hidden" name="op" value="export" /> >- <input type="hidden" id="export_format" name="format" value="iso2709" /> >- <input type="hidden" id="dont_export_item" name="dont_export_item" value="0" /> >- <input type="hidden" id="record_type" name="record_type" value="bibs" /> >- <input type="button" id="export_submit" value="Export" /> >- </fieldset> >- [% END %] >- [% END %] > </form> > [% ELSE %] >-<p>Patron has nothing checked out.</p> >+ <p>Patron has nothing checked out.</p> > [% END %] > > </div> > > >-[% IF ( displayrelissues ) %] >-<div id="relissues"> >- <table id="relissuest"> >- <thead> >- <tr> >- <th scope="col">Due date</th> >- <th scope="col">Title</th> >- <th scope="col">Item type</th> >- <th scope="col">Checked out on</th> >- <th scope="col">Checked out from</th> >- <th scope="col">Call no</th> >- <th scope="col">Charge</th> >- <th scope="col">Price</th> >- <th scope="col">Patron</th> >- </tr> >- </thead> >-[% IF ( relissues ) %] <tbody> >- >- [% FOREACH relissue IN relissues %] >- [% IF ( loop.odd ) %] >- <tr> >- [% ELSE %] >- <tr class="highlight"> >- [% END %] >- [% IF ( relissue.overdue ) %]<td class="od">[% ELSE %]<td>[% END %] >- <span title="[% relissue.dd_sort %]">[% relissue.dd %]</span></td> >- >- [% IF ( relissue.itemlost ) %] >- <span class="lost">[% AuthorisedValues.GetByCode( 'LOST', relissue.itemlost ) %]</span> >- [% END %] >- [% IF ( relissue.damaged ) %] >- <span class="dmg">[% AuthorisedValues.GetByCode( 'DAMAGED', relissue.damaged ) %]</span> >- [% END %] >- </td> >- <td><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% relissue.biblionumber %]&type=intra"><strong>[% relissue.title |html %][% FOREACH subtitl IN relissue.subtitle %] [% subtitl.subfield %][% END %]</strong></a>[% IF ( relissue.author ) %], by [% relissue.author %][% END %][% IF ( relissue.itemnotes ) %]- <span class="circ-hlt">[% relissue.itemnotes %]</span>[% END %] <a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=[% relissue.biblionumber %]&itemnumber=[% relissue.itemnumber %]#item[% relissue.itemnumber %]">[% relissue.barcode %]</a></td> >- <td>[% UNLESS ( noItemTypeImages ) %] [% IF ( relissue.itemtype_image ) %]<img src="[% relissue.itemtype_image %]" alt="" />[% END %][% END %][% relissue.itemtype %]</td> >- <td><span title="[% relissue.displaydate_sort %]">[% relissue.displaydate %]</span></td> >- <td>[% relissue.issuingbranchname %]</td> >- <td>[% relissue.itemcallnumber %]</td> >- <td>[% relissue.charge %]</td> >- <td>[% relissue.replacementprice %]</td><td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% relissue.borrowernumber %]">[% relissue.firstname %] [% relissue.surname %] ([% relissue.cardnumber %])</a></td> >- </tr> >- [% END %] <!-- /loop relissues --> >- <!-- /if relissues -->[% END %] >-[% IF ( relprevissues ) %] >- [% IF ( UseTablesortForCirc ) %]<tr id="relprevious"><th><span title="">Previous checkouts</span></th><th></th><th></th><th><span title=""></span></th><th></th><th></th><th></th><th></th><th></th></tr>[% ELSE %]<tr id="relprevious"><th colspan="9">Previous checkouts</th></tr>[% END %] >- [% FOREACH relprevissue IN relprevissues %] >- [% IF ( loop.odd ) %] >- <tr> >- [% ELSE %] >- <tr class="highlight"> >- [% END %] >- [% IF ( relprevissue.overdue ) %]<td class="od">[% ELSE %]<td>[% END %] >- <span title="[% relprevissue.dd_sort %]">[% relprevissue.dd %]</span> >- </td> >- <td><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% relprevissue.biblionumber %]&type=intra"><strong>[% relprevissue.title |html %][% FOREACH subtitl IN relprevissue.subtitle %] [% subtitl.subfield %][% END %]</strong></a>[% IF ( relprevissue.author ) %], by [% relprevissue.author %][% END %] [% IF ( relprevissue.itemnotes ) %]- [% relprevissue.itemnotes %][% END %] <a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=[% relprevissue.biblionumber %]&itemnumber=[% relprevissue.itemnumber %]#item[% relprevissue.itemnumber %]">[% relprevissue.barcode %]</a></td> >- <td>[% UNLESS noItemTypeImages %][% IF relprevissue.itemtype_image %]<img src="[% relprevissue.itemtype_image %]" alt="" />[% END %][% END %][% relprevissue.itemtype %]</td> >- <td><span title="[% relprevissue.displaydate_sort %]">[% relprevissue.displaydate %]</span></td> >- <td>[% relprevissue.issuingbranchname %]</td> >- <td>[% relprevissue.itemcallnumber %]</td> >- [% IF ( relprevissue.multiple_borrowers ) %]<td>[% relprevissue.firstname %] [% relprevissue.surname %]</td>[% END %] >- <td>[% relprevissue.charge %]</td> >- <td>[% relprevissue.replacementprice %]</td> >- <td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% relprevissue.borrowernumber %]">[% relprevissue.firstname %] [% relprevissue.surname %] ([% relprevissue.cardnumber %])</a></td> >- >- </tr> >- <!-- /loop relprevissue -->[% END %] >-<!--/if relprevissues -->[% END %] >- </tbody> >+[% IF ( relatives_issues_count ) %] >+<div id="relatives-issues"> >+ <table id="relatives-issues-table"> >+ <thead> >+ <tr> >+ <th scope="col">Due date</th> >+ <th scope="col">Title</th> >+ <th scope="col">Item type</th> >+ <th scope="col">Checked out on</th> >+ <th scope="col">Checked out from</th> >+ <th scope="col">Call no</th> >+ <th scope="col">Charge</th> >+ <th scope="col">Price</th> >+ <th scope="col">Patron</th> >+ </tr> >+ </thead> > </table> >- > </div> >-[% END %]<!-- end displayrelissues --> >+[% END %] > > [% INCLUDE borrower_debarments.inc %] > >-- >1.7.2.5
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 11703
:
25105
|
25110
|
25111
|
25213
|
25217
|
25218
|
25220
|
25221
|
25261
|
25262
|
25263
|
25264
|
25271
|
25272
|
25289
|
25290
|
25292
|
25390
|
25391
|
25986
|
25987
|
25988
|
25989
|
25990
|
25991
|
25992
|
25993
|
25994
|
25995
|
25996
|
25997
|
25998
|
25999
|
26081
|
26085
|
26115
|
26131
|
26158
|
26160
|
26241
|
26986
|
26990
|
26991
|
27102
|
27241
|
27338
|
27339
|
27340
|
27341
|
27342
|
27349
|
27350
|
27353
|
27354
|
27356
|
27548
|
27610
|
27717
|
27718
|
27745
|
27746
|
27750
|
27751
|
28025
|
28026
|
28027
|
28028
|
28029
|
29195
|
29196
|
29197
|
29198
|
29199
|
29279
|
29280
|
29281
|
29282
|
29283
|
29284
|
29419
|
29420
|
29432
|
29433
|
29434
|
29438
|
29439
|
29440
|
29444
|
29445
|
29446
|
29447
|
29448
|
29449
|
29450
|
29451
|
29452
|
29453
|
29454
|
29472
|
29473
|
29474
|
29475
|
29476
|
29477
|
29478
|
29479
|
29480
|
29493
|
30228