Browse Source
The next and previous links should completely refresh the shelf. For example: [<] [1] [2] [3] [4] [5] [6] [>] Before this patch, the next and previous links were the same as the 1 and 6. With this patch, after clicking on next, we will get: [<] [7] [8] [9] [10] [11] [12] [13] [>] This patch adds a new AJAX script to get the shelf browser block. Test plan: - On a detail biblio page, click on a "Browse shelf" link. - Play with the next and previous links. - Deactivate Javascript (using NoScript for example) and check that you get the same behavior (but the page is reloaded). - Launch the unit tests: prove t/db_dependent/ShelfBrowser.t Signed-off-by: Owen Leonard <oleonard@myacpl.org> Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de> Passes all tests and QA script. Signed-off-by: Galen Charlton <gmc@esilibrary.com>new/bootstrap-opac
Jonathan Druart
11 years ago
committed by
Galen Charlton
7 changed files with 454 additions and 204 deletions
@ -0,0 +1,125 @@ |
|||
[% BLOCK shelfbrowser %] |
|||
[% IF OpenOPACShelfBrowser %] |
|||
<div id="shelfbrowser"> |
|||
<h5 style="text-align: center;"> |
|||
[% IF ( starting_homebranch ) %]Browsing [% starting_homebranch %] Shelves[% END %] |
|||
[% IF ( starting_location ) %], Shelving location: [% starting_location %][% END %] |
|||
[% IF ( starting_ccode ) %], Collection code: [% starting_ccode %][% END %] |
|||
<a style="font-size: 75%;" href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% biblionumber %]" class="close_shelf" >Close shelf browser</a> |
|||
</h5> |
|||
|
|||
<table> |
|||
<tr> |
|||
<td rowspan="2" style="width:20px;"> |
|||
[% IF shelfbrowser_prev_item %] |
|||
<div id="browser_previous"> |
|||
<a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% shelfbrowser_prev_item.biblionumber %]&shelfbrowse_itemnumber=[% shelfbrowser_prev_item.itemnumber %]#shelfbrowser">Previous</a> |
|||
</div> |
|||
[% END %] |
|||
</td> |
|||
|
|||
[% FOREACH item IN shelfbrowser_items %] |
|||
<td> |
|||
<a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% item.biblionumber %]&shelfbrowse_itemnumber=[% item.itemnumber %]#shelfbrowser"> |
|||
[% IF ( OPACLocalCoverImages ) %] |
|||
<div title="[% item.biblionumber |url %]" class="[% item.biblionumber %] thumbnail-shelfbrowser" id="local-thumbnail-shelf-[% item.biblionumber %]"></div> |
|||
[% END %] |
|||
[% IF ( OPACAmazonCoverImages ) %] |
|||
[% IF ( item.browser_normalized_isbn ) %] |
|||
<img border="0" src="http://images.amazon.com/images/P/[% item.browser_normalized_isbn %].01._AA75_PU_PU-5_.jpg" alt="" /> |
|||
[% ELSE %] |
|||
<span class="no-image">No cover image available</span> |
|||
[% END %] |
|||
[% END %] |
|||
|
|||
[% IF ( SyndeticsEnabled ) %] |
|||
[% IF ( SyndeticsCoverImages ) %] |
|||
[% IF ( content_identifier_exists ) %] |
|||
[% IF ( using_https ) %] |
|||
<img border="0" src="https://secure.syndetics.com/index.aspx?isbn=[% item.browser_normalized_isbn %]/SC.GIF&client=[% SyndeticsClientCode %][% IF ( item.browser_normalized_upc ) %]&upc=[% item.browser_normalized_upc %][% END %][% IF ( item.browser_normalized_oclc ) %]&oclc=[% item.browser_normalized_oclc %][% END %]&type=xw10" alt="" /> |
|||
[% ELSE %] |
|||
<img border="0" src="http://www.syndetics.com/index.aspx?isbn=[% item.browser_normalized_isbn %]/SC.GIF&client=[% SyndeticsClientCode %][% IF ( item.browser_normalized_upc ) %]&upc=[% item.browser_normalized_upc %][% END %][% IF ( item.browser_normalized_oclc ) %]&oclc=[% item.browser_normalized_oclc %][% END %]&type=xw10" alt="" /> |
|||
[% END %] |
|||
[% ELSE %] |
|||
<span class="no-image">No cover image available</span> |
|||
[% END %] |
|||
[% END %] |
|||
[% END %] |
|||
|
|||
[% IF ( GoogleJackets ) %] |
|||
[% IF ( item.browser_normalized_isbn ) %] |
|||
<div style="block" title="[% item.biblionumber |url %]" class="[% item.browser_normalized_isbn %]" id="gbs-thumbnail-preview[% loop.count %]"></div> |
|||
[% ELSE %] |
|||
<span class="no-image">No cover image available</span> |
|||
[% END %] |
|||
[% END %] |
|||
[% IF ( BakerTaylorEnabled ) %] |
|||
[% IF ( item.browser_normalized_isbn ) %] |
|||
<img alt="See Baker & Taylor" src="[% BakerTaylorImageURL |html %][% item.browser_normalized_isbn %]" /> |
|||
[% ELSE %] |
|||
<span class="no-image">No cover image available</span> |
|||
[% END %] |
|||
[% END %] |
|||
</a> |
|||
</td> |
|||
[% END %] |
|||
|
|||
<td rowspan="2" style="width:20px;"> |
|||
[% IF shelfbrowser_next_item %] |
|||
<div id="browser_next"> |
|||
<a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% shelfbrowser_prev_item.biblionumber %]&shelfbrowse_itemnumber=[% shelfbrowser_prev_item.itemnumber %]#shelfbrowser">Next</a> |
|||
</div> |
|||
[% END %] |
|||
</td> |
|||
</tr> |
|||
|
|||
<tr> |
|||
[% FOREACH item IN shelfbrowser_items %] |
|||
<td class="top"> |
|||
[% item.itemcallnumber %] |
|||
<a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% item.biblionumber %]&shelfbrowse_itemnumber=[% item.itemnumber %]#shelfbrowser">[% item.title |html %]</a> |
|||
</td> |
|||
[% END %] |
|||
</tr> |
|||
</table> |
|||
</div> |
|||
<script type="text/javascript"> |
|||
$(document).ready(function(){ |
|||
$(".close_shelf").click(function(e){ |
|||
e.preventDefault(); |
|||
$("#shelfbrowser").hide(); |
|||
}); |
|||
[% IF shelfbrowser_prev_item.itemnumber %] |
|||
$("#browser_previous a").click(function(e){ |
|||
e.preventDefault(); |
|||
$.ajax({ |
|||
url: "/cgi-bin/koha/svc/shelfbrowser.pl", |
|||
type: "POST", |
|||
data: { |
|||
"shelfbrowse_itemnumber": [% shelfbrowser_prev_item.itemnumber %] |
|||
}, |
|||
success: function(data){ |
|||
$("#shelfbrowser").replaceWith(data); |
|||
} |
|||
}); |
|||
}); |
|||
[% END %] |
|||
[% IF shelfbrowser_next_item.itemnumber %] |
|||
$("#browser_next a").click(function(e){ |
|||
e.preventDefault(); |
|||
$.ajax({ |
|||
url: "/cgi-bin/koha/svc/shelfbrowser.pl", |
|||
type: "POST", |
|||
data: { |
|||
"shelfbrowse_itemnumber": [% shelfbrowser_next_item.itemnumber %] |
|||
}, |
|||
success: function(data){ |
|||
$("#shelfbrowser").replaceWith(data); |
|||
} |
|||
}); |
|||
}); |
|||
[% END %] |
|||
}); |
|||
</script> |
|||
[% END %] |
|||
[% END %][%# end of shelfbrowser block %] |
@ -0,0 +1,2 @@ |
|||
[% PROCESS 'shelfbrowser.inc' %] |
|||
[% INCLUDE shelfbrowser %] |
@ -0,0 +1,41 @@ |
|||
#!/usr/bin/perl |
|||
|
|||
use Modern::Perl; |
|||
use CGI; |
|||
|
|||
use C4::Auth; |
|||
use C4::Context; |
|||
use C4::Output; |
|||
use C4::ShelfBrowser; |
|||
|
|||
my $cgi = new CGI; |
|||
|
|||
my ( $template, $borrowernumber, $cookie ) = get_template_and_user( |
|||
{ |
|||
template_name => "svc/shelfbrowser.tt", |
|||
query => $cgi, |
|||
type => "opac", |
|||
authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ), |
|||
flagsrequired => { borrow => 1 }, |
|||
} |
|||
); |
|||
|
|||
# Shelf Browser Stuff |
|||
if (C4::Context->preference("OPACShelfBrowser")) { |
|||
my $starting_itemnumber = $cgi->param('shelfbrowse_itemnumber'); |
|||
if (defined($starting_itemnumber)) { |
|||
my $nearby = GetNearbyItems($starting_itemnumber); |
|||
|
|||
$template->param( |
|||
starting_homebranch => $nearby->{starting_homebranch}->{description}, |
|||
starting_location => $nearby->{starting_location}->{description}, |
|||
starting_ccode => $nearby->{starting_ccode}->{description}, |
|||
shelfbrowser_prev_item => $nearby->{prev_item}, |
|||
shelfbrowser_next_item => $nearby->{next_item}, |
|||
shelfbrowser_items => $nearby->{items}, |
|||
OpenOPACShelfBrowser => 1, |
|||
); |
|||
} |
|||
} |
|||
|
|||
print $template->output; |
@ -0,0 +1,212 @@ |
|||
#!/usr/bin/perl |
|||
|
|||
use Modern::Perl; |
|||
use Test::More tests => 74; |
|||
use List::Util qw( shuffle ); |
|||
use MARC::Field; |
|||
use MARC::Record; |
|||
|
|||
use C4::Biblio; |
|||
use C4::Context; |
|||
use C4::Items; |
|||
|
|||
use_ok('C4::ShelfBrowser'); |
|||
|
|||
my $dbh = C4::Context->dbh; |
|||
$dbh->{AutoCommit} = 0; |
|||
$dbh->{RaiseError} = 1; |
|||
|
|||
$dbh->do(q|DELETE FROM reserves|); |
|||
$dbh->do(q|DELETE FROM issues|); |
|||
$dbh->do(q|DELETE FROM items|); |
|||
|
|||
my $cn; |
|||
|
|||
# 100.100 150.100 200.100 210.100 300.000 320.000 400.100 410.100 500.100 510.100 520.100 600.000 610.000 700.100 710.100 720.100 730.100 740.100 750.100 |
|||
my @callnumbers = qw( |
|||
100.100 |
|||
150.100 |
|||
200.100 |
|||
210.100 |
|||
300.000 |
|||
320.000 |
|||
400.100 |
|||
410.100 |
|||
500.100 |
|||
510.100 |
|||
520.100 |
|||
600.000 |
|||
610.000 |
|||
700.100 |
|||
710.100 |
|||
720.100 |
|||
730.100 |
|||
740.100 |
|||
750.100 |
|||
); |
|||
|
|||
my $record = MARC::Record->new(); |
|||
$record->append_fields( |
|||
MARC::Field->new('100', ' ', ' ', a => 'Donald E. Knuth.'), |
|||
MARC::Field->new('245', ' ', ' ', a => 'The art of computer programming'), |
|||
); |
|||
my ( $biblionumber, undef, undef ) = C4::Biblio::AddBiblio($record, ''); |
|||
|
|||
for my $callnumber ( shuffle @callnumbers ) { |
|||
my ( $biblionumber, undef, $itemnumber ) = C4::Items::AddItem({ |
|||
homebranch => 'CPL', |
|||
holdingbranch => 'CPL', |
|||
itemcallnumber => $callnumber, |
|||
}, $biblionumber); |
|||
$cn->{$callnumber} = { |
|||
biblionumber => $biblionumber, |
|||
itemnumber => $itemnumber, |
|||
itemcallnumber => $callnumber, |
|||
} |
|||
} |
|||
|
|||
my $nearby; |
|||
|
|||
$nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'500.100'}{itemnumber} ); |
|||
# We have |
|||
# < 320.000 400.100 410.100 500.100 510.100 520.100 600.000 > |
|||
# 6 7 8 [9] 10 11 12 |
|||
# Clicking on previous, we want a link to 150.100 |
|||
is( $nearby->{prev_item}{itemcallnumber}, '150.100', "Simple case: previous link 1/2" ); |
|||
is( $nearby->{prev_item}{itemnumber}, $cn->{'150.100'}{itemnumber}, "Simple case: previous link 2/2" ); |
|||
# Clicking on next, we want a link to 730.100 |
|||
is( $nearby->{next_item}{itemcallnumber}, '720.100', "Simple case: next link 1/2" ); |
|||
is( $nearby->{next_item}{itemnumber}, $cn->{'720.100'}{itemnumber}, "Simple case: next link 2/2" ); |
|||
|
|||
is( $nearby->{items}[0]{itemcallnumber}, '320.000', "Simple case: item 1"); |
|||
is( $nearby->{items}[1]{itemcallnumber}, '400.100', "Simple case: item 2"); |
|||
is( $nearby->{items}[2]{itemcallnumber}, '410.100', "Simple case: item 3"); |
|||
is( $nearby->{items}[3]{itemcallnumber}, '500.100', "Simple case: item 4"); |
|||
is( $nearby->{items}[4]{itemcallnumber}, '510.100', "Simple case: item 5"); |
|||
is( $nearby->{items}[5]{itemcallnumber}, '520.100', "Simple case: item 6"); |
|||
is( $nearby->{items}[6]{itemcallnumber}, '600.000', "Simple case: item 7"); |
|||
|
|||
$nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'500.100'}{itemnumber}, 2, 3 ); |
|||
# We have |
|||
# < 400.100 410.100 500.100 510.100 520.100 > |
|||
# 7 8 [9] 10 11 |
|||
# Clicking on previous, we want a link to 320.000 |
|||
is( $nearby->{prev_item}{itemcallnumber}, '320.000', "Test gap: previous link 1/2" ); |
|||
is( $nearby->{prev_item}{itemnumber}, $cn->{'320.000'}{itemnumber}, "Test gap: previous link 2/2" ); |
|||
# Clicking on next, we want a link to 600.000 |
|||
is( $nearby->{next_item}{itemcallnumber}, '600.000', "Test gap: next link 1/2" ); |
|||
is( $nearby->{next_item}{itemnumber}, $cn->{'600.000'}{itemnumber}, "Test gap: next link 2/2" ); |
|||
|
|||
is( scalar( @{$nearby->{items}} ), 5, "Test gap: got 5 items" ); |
|||
is( $nearby->{items}[0]{itemcallnumber}, '400.100', "Test gap: item 1"); |
|||
is( $nearby->{items}[1]{itemcallnumber}, '410.100', "Test gap: item 2"); |
|||
is( $nearby->{items}[2]{itemcallnumber}, '500.100', "Test gap: item 3"); |
|||
is( $nearby->{items}[3]{itemcallnumber}, '510.100', "Test gap: item 4"); |
|||
is( $nearby->{items}[4]{itemcallnumber}, '520.100', "Test gap: item 5"); |
|||
|
|||
$nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'300.000'}{itemnumber} ); |
|||
# We have |
|||
# < 150.100 200.100 210.100 300.000 320.000 400.100 410.100 > |
|||
# 2 3 4 [5] 6 7 8 |
|||
# Clicking on previous, we want a link to 100.100 |
|||
is( $nearby->{prev_item}{itemcallnumber}, '100.100', "Test start shelf: previous link 1/2" ); |
|||
is( $nearby->{prev_item}{itemnumber}, $cn->{'100.100'}{itemnumber}, "Test start shelf: previous link 2/2" ); |
|||
# Clicking on next, we want a link to 600.000 |
|||
is( $nearby->{next_item}{itemcallnumber}, '600.000', "Test start shelf: next link 1/2" ); |
|||
is( $nearby->{next_item}{itemnumber}, $cn->{'600.000'}{itemnumber}, "Test start shelf: next link 2/2" ); |
|||
|
|||
is( $nearby->{items}[0]{itemcallnumber}, '150.100', "Test start shelf: item 1"); |
|||
is( $nearby->{items}[1]{itemcallnumber}, '200.100', "Test start shelf: item 2"); |
|||
is( $nearby->{items}[2]{itemcallnumber}, '210.100', "Test start shelf: item 3"); |
|||
is( $nearby->{items}[3]{itemcallnumber}, '300.000', "Test start shelf: item 4"); |
|||
is( $nearby->{items}[4]{itemcallnumber}, '320.000', "Test start shelf: item 5"); |
|||
is( $nearby->{items}[5]{itemcallnumber}, '400.100', "Test start shelf: item 6"); |
|||
is( $nearby->{items}[6]{itemcallnumber}, '410.100', "Test start shelf: item 7"); |
|||
|
|||
|
|||
|
|||
$nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'100.100'}{itemnumber} ); |
|||
# We have |
|||
# 100.100 150.100 200.100 210.100 > |
|||
# [1] 2 3 4 |
|||
# There is no previous link |
|||
is( $nearby->{prev_item}, undef, "Test first item on a shelf: no previous link" ); |
|||
# Clicking on next, we want a link to 410.100 |
|||
is( $nearby->{next_item}{itemcallnumber}, '410.100', "Test first item on a shelf: next link 1/2" ); |
|||
is( $nearby->{next_item}{itemnumber}, $cn->{'410.100'}{itemnumber}, "Test first item on a shelf: next link 2/2" ); |
|||
|
|||
is( scalar( @{$nearby->{items}} ), 4, "Test first item on a shelf: There are 4 items displayed" ); |
|||
is( $nearby->{items}[0]{itemcallnumber}, '100.100', "Test first item on a shelf: item 1"); |
|||
is( $nearby->{items}[1]{itemcallnumber}, '150.100', "Test first item on a shelf: item 2"); |
|||
is( $nearby->{items}[2]{itemcallnumber}, '200.100', "Test first item on a shelf: item 3"); |
|||
is( $nearby->{items}[3]{itemcallnumber}, '210.100', "Test first item on a shelf: item 4"); |
|||
|
|||
|
|||
$nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'150.100'}{itemnumber} ); |
|||
# We have |
|||
# 100.100 150.100 200.100 210.100 300.000 > |
|||
# 1 [2] 3 4 5 |
|||
# There is no previous link |
|||
is( $nearby->{prev_item}, undef, "Test second item on a shelf: no previous link" ); |
|||
# Clicking on next, we want a link to 500.100 |
|||
is( $nearby->{next_item}{itemcallnumber}, '500.100', "Test second item on a shelf: next link 1/2" ); |
|||
is( $nearby->{next_item}{itemnumber}, $cn->{'500.100'}{itemnumber}, "Test second item on a shelf: next link 2/2" ); |
|||
|
|||
is( scalar( @{$nearby->{items}} ), 5, "Test second item on a shelf: got 5 items" ); |
|||
is( $nearby->{items}[0]{itemcallnumber}, '100.100', "Test second item on a shelf: item 1"); |
|||
is( $nearby->{items}[1]{itemcallnumber}, '150.100', "Test second item on a shelf: item 2"); |
|||
is( $nearby->{items}[2]{itemcallnumber}, '200.100', "Test second item on a shelf: item 3"); |
|||
is( $nearby->{items}[3]{itemcallnumber}, '210.100', "Test second item on a shelf: item 4"); |
|||
is( $nearby->{items}[4]{itemcallnumber}, '300.000', "Test second item on a shelf: item 5"); |
|||
|
|||
|
|||
$nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'710.100'}{itemnumber} ); |
|||
# We have |
|||
# < 600.000 610.000 700.100 710.100 720.100 730.100 740.100 > |
|||
# 12 13 14 [15] 16 17 18 |
|||
# Clicking on previous, we want a link to 410.100 |
|||
is( $nearby->{prev_item}{itemcallnumber}, '410.100', "Test end shelf: previous link 1/2" ); |
|||
is( $nearby->{prev_item}{itemnumber}, $cn->{'410.100'}{itemnumber}, "Test end shelf: previous link 2/2" ); |
|||
# Clicking on next, we want a link to 730.100 |
|||
is( $nearby->{next_item}{itemcallnumber}, '750.100', "Test end shelf: next link is a link to the last item 1/2" ); |
|||
is( $nearby->{next_item}{itemnumber}, $cn->{'750.100'}{itemnumber}, "Test end shelf: next link is a link to the last item 2/2" ); |
|||
|
|||
is( $nearby->{items}[0]{itemcallnumber}, '600.000', "Test end shelf: item 1"); |
|||
is( $nearby->{items}[1]{itemcallnumber}, '610.000', "Test end shelf: item 2"); |
|||
is( $nearby->{items}[2]{itemcallnumber}, '700.100', "Test end shelf: item 3"); |
|||
is( $nearby->{items}[3]{itemcallnumber}, '710.100', "Test end shelf: item 4"); |
|||
is( $nearby->{items}[4]{itemcallnumber}, '720.100', "Test end shelf: item 5"); |
|||
is( $nearby->{items}[5]{itemcallnumber}, '730.100', "Test end shelf: item 6"); |
|||
is( $nearby->{items}[6]{itemcallnumber}, '740.100', "Test end shelf: item 7"); |
|||
|
|||
|
|||
$nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'740.100'}{itemnumber} ); |
|||
# We have |
|||
# < 710.100 720.100 730.100 740.100 750.100 |
|||
# 15 16 17 [18] 19 |
|||
# Clicking on previous, we want a link to |
|||
is( $nearby->{prev_item}{itemcallnumber}, '520.100', "Test end of the shelf: previous link 1/2" ); |
|||
is( $nearby->{prev_item}{itemnumber}, $cn->{'520.100'}{itemnumber}, "Test end of the shelf: previous link 2/2" ); |
|||
# No next link |
|||
is( $nearby->{next_item}, undef, "Test end of the shelf: no next link" ); |
|||
|
|||
is( scalar( @{$nearby->{items}} ), 5, "Test end of the shelf: got 5 items" ); |
|||
is( $nearby->{items}[0]{itemcallnumber}, '710.100', "Test end of the shelf: item 1"); |
|||
is( $nearby->{items}[1]{itemcallnumber}, '720.100', "Test end of the shelf: item 2"); |
|||
is( $nearby->{items}[2]{itemcallnumber}, '730.100', "Test end of the shelf: item 3"); |
|||
is( $nearby->{items}[3]{itemcallnumber}, '740.100', "Test end of the shelf: item 4"); |
|||
is( $nearby->{items}[4]{itemcallnumber}, '750.100', "Test end of the shelf: item 5"); |
|||
|
|||
$nearby = C4::ShelfBrowser::GetNearbyItems( $cn->{'750.100'}{itemnumber} ); |
|||
# We have |
|||
# < 720.100 730.100 740.100 750.100 |
|||
# 16 17 18 [19] |
|||
# Clicking on previous, we want a link to |
|||
is( $nearby->{prev_item}{itemcallnumber}, '600.000', "Test last item of the shelf: previous link 1/2" ); |
|||
is( $nearby->{prev_item}{itemnumber}, $cn->{'600.000'}{itemnumber}, "Test last item of the shelf: previous link 2/2" ); |
|||
# No next link |
|||
is( $nearby->{next_item}, undef, "Test end of the shelf: no next link" ); |
|||
|
|||
is( scalar( @{$nearby->{items}} ), 4, "Test last item of the shelf: got 4 items" ); |
|||
|
|||
$dbh->rollback; |
Loading…
Reference in new issue