1 of 48

Redesigning Coverflow:

Enhancing the User Experience

Barbara Glassford Johnson

Technical Services Manager

Bedford Public Library, Texas

KohaCon22

Lawrence, Kansas

September 21, 2022

2 of 48

Bedford Public Library

3 of 48

Former OPAC Display

4 of 48

Former OPAC Display Issues

  • Third-party widget
  • Dated looking
  • Limited number of collections
  • Automated scrolling
  • Manual updates
  • Buggy
  • Responsive display not great
  • Not free

5 of 48

Typical Coverflow Display

6 of 48

Coverflow Issues

  • Dated looking
  • Not aesthetically pleasing (at least to us)
  • Scrolling or carousel-type display
  • Desire to display more titles all at once

7 of 48

Goals for New OPAC Display

  • Gallery display
  • Contemporary look and feel
  • Highlight new titles, special collections
  • Increase patron discovery
  • Increase circulation
  • Easy to maintain
  • Efficiency - runs off reports that automatically update the covers
  • Totally responsive
  • No additional cost

8 of 48

Gallery Display - OPAC

9 of 48

Gallery Display - OPAC

10 of 48

Gallery Display – iPad landscape

11 of 48

Gallery Display – iPad portrait

12 of 48

Gallery Display – phone

13 of 48

Components

  • Reports
  • Coverflow plugin
  • OpacMainUserBlock
  • OpacUserCSS
  • OpacUserJS

14 of 48

Reports

15 of 48

Reports

  • Create one or more public reports
  • Required fields - biblionumber, isbn and title
  • Number of covers to display
  • Sorting – can be random or by most recently added
  • A separate report is needed for each coverflow

16 of 48

Basic coverflow report

SELECT * FROM (

SELECT b.biblionumber, SUBSTRING_INDEX(m.isbn, ' ', 1) AS isbn, b.title, dateaccessioned

FROM items i

LEFT JOIN biblioitems m USING (biblioitemnumber)

LEFT JOIN biblio b ON (i.biblionumber=b.biblionumber)

WHERE m.isbn IS NOT NULL AND m.isbn != '' AND 'cover' != ''

HAVING isbn != ""

LIMIT 24 /*limits the number of covers in the gallery*/

) covers

GROUP BY biblionumber /*prevents displaying duplicate covers for same bib*/

ORDER BY rand() /*displays covers in random order*/

17 of 48

Customized coverflow report

Add some elements to the WHERE statement

  • Location - permanent_location IN ('FN’)
  • Status - notforloan != '-2’
  • Date - DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= i.dateaccessioned
  • Bibs without cover images - b.biblionumber != 234838

18 of 48

Titles without cover images

19 of 48

Final coverflow report

SELECT * FROM (

SELECT b.biblionumber, SUBSTRING_INDEX(m.isbn, ' ', 1) AS isbn, b.title, dateaccessioned

FROM items i

LEFT JOIN biblioitems m USING (biblioitemnumber)

LEFT JOIN biblio b ON (i.biblionumber=b.biblionumber)

WHERE b.biblionumber != 234838 AND b.biblionumber != 234006 /*removes any bibs that don't have a cover image*/

AND permanent_location IN ('FN') /*specifies the location code for the gallery */

AND notforloan != '-2' /*removes any bibs that are still in 'in processing' status*/

AND DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= i.dateaccessioned /*specifies number of days*/

AND m.isbn IS NOT NULL AND m.isbn != '' AND 'cover' != ''

HAVING isbn != ""

LIMIT 24 /*limits the number of covers in the gallery*/

) covers

GROUP BY biblionumber /*prevents displaying duplicate covers for same bib*/

ORDER BY rand() /*displays covers in random order*/

20 of 48

Report number for coverflow plugin

Remember me!

21 of 48

Coverflow Plugin

22 of 48

Configure the Coverflow Plugin

  • Get there Admininistration > Manage plugins > Coverflow plugin

23 of 48

Configure the Coverflow Plugin

24 of 48

Coverflow Plugin - Mapping

Report number

25 of 48

OpacMainUserBlock

26 of 48

OpacMainUserBlock

27 of 48

28 of 48

OpacMainUserBlock

<div class="container-fluid">

<div class="row justify-content-center">

<div class="col col-xl-7 col-lg-8 col-md-9">

<div class="tab-content" id="myTabContent">

29 of 48

OpacMainUserBlock – Main Tabs

<ul class="nav nav-tabs" id="category_list" role="tablist">

<li class="nav-item active">

<a class="nav-link active" id="adult-tab" data-toggle="tab" href="#adult" role="tab" aria-controls="adult" aria-selected="true">New Adult Books</a>

</li>

<li class="nav-item">

<a class="nav-link" id="teen-tab" data-toggle="tab" href="#teen" role="tab" aria-controls="teen" aria-selected="false">New Teen Books</a>

</li>

30 of 48

OpacMainUserBlock – Subtab 1

<div class="tab-content">

<div id="adult" class="tab-pane fade active show">

<ul class="nav nav-tabs" id="myTab1" role="tablist">

<li class="nav-item waves-effect waves-light"><a class="nav-link active" id="nav-Fiction-tab" data-toggle="tab" href="#nav-Fiction" role="tab" aria-controls="nav-Fiction" aria-selected="true">Fiction</a></li>

<li class="nav-item waves-effect waves-light"><a class="nav-link" id="nav-Mystery-tab" data-toggle="tab" href="#nav-Mystery" role="tab" aria-controls="nav-Mystery" aria-selected="false">Mystery</a></li>

31 of 48

OpacMainUserBlock – Subtab 2

<div id="teen" class="tab-pane">

<ul class="nav nav-tabs" id="myTab2" role="tablist">

<li class="nav-item waves-effect waves-light"><a class="nav-link show active" id="nav-Young-tab" data-toggle="tab" href="#nav-Young" role="tab" aria-controls="nav-Young" aria-selected="true">Young Adult Fiction</a></li>

<li class="nav-item waves-effect waves-light"><a class="nav-link" id="nav-Graphic-tab" data-toggle="tab" href="#nav-Graphic" role="tab" aria-controls="nav-Graphic" aria-selected="false">Graphic Novels</a></li>

</ul>

</div>

32 of 48

Coverflow Content

<div class="container-fluid">

<div class="row justify-content-center">

<div class="col col-xl-7 col-lg-8 col-md-9">

<div class="tab-content" id="myTabContent">

<div class="tab-pane fade active show" id="nav-Fiction" role="tabpanel" aria-labelledby="nav-Fiction-tab">

<div id="cf_fiction" class="CFInnerPanel">

</div>

</div>

<div class="tab-pane fade" id="nav-Mystery" role="tabpanel" aria-labelledby="nav-Mystery-tab">

<div id="cf_mystery" class="CFInnerPanel">

</div>

</div>

33 of 48

OpacUserCSS

34 of 48

OpacMainUserBlock CSS

/*expand content/coverflow widget to span width of screen*/

.col-lg-7 {

-ms-flex: 0 0 58.333%;

flex: 0 0 100%;

max-width: 100% !important;

}

35 of 48

Coverflow Images

/*set the size & margins for each cover*/

.flipster__item img {

width: 155px;

height: 225px;

margin: 20px 10px;

transform: none;

border: 2px solid transparent;

background-color: transparent;

}

36 of 48

Coverflow Images

Currently selected image

37 of 48

Coverflow Images

/*add blue border to covers on hover*/

.flipster__item img:hover {

border: 2px outset #4775d1;

box-shadow: 0px 0px 2px 2px #4775d1;

}

38 of 48

Main Tabs

#category_list {

width: auto;

margin-left: auto;

margin-right: auto;

display: flex;

flex-direction: row;

flex-wrap: wrap;

align-content: stretch;

justify-content: center;

font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;

}

39 of 48

Main Tabs

#category_list > li > a {

border-right: 5px solid white !important;

background-color: #2c79b7;

font-size: 20px;

font-weight: 500;

color: white;

padding: 10px 15px 10px 15px;

margin-top: 10px;

text-decoration: none;

line-height: 50px;

}

40 of 48

Main Tabs CSS

/*set background-color for main tabs*/

#category_list > li.nav-item > a.active,

#category_list > li.nav-item > a.show,

#category_list > li > a.active {

background-color: #1b517c !important;

}

41 of 48

Subtabs

#myTab, #myTab1, #myTab2, #myTab3 {

width: auto;

margin-left: auto;

margin-right: auto;

font-size: 18px;

line-height: 18px;

display: flex;

flex-direction: row;

flex-wrap: wrap;

align-content: stretch;

justify-content: center;

}

42 of 48

Subtabs

/*remove border from subtabs*/

.nav-tabs {

border: none;

}

/*make font on subtabs white*/

.nav-tabs .nav-link {

color: white !important;

border: none;

border-top-left-radius: 0rem;

border-top-right-radius: 0rem;

}

43 of 48

Subtabs

/* WIDTH ABOVE 1200 PIXELS */

/*set width of subtabs on larger screens*/

@media only screen and (min-width: 1025px) and (orientation: landscape) {

#myTab, #myTab1, #myTab2, #myTab3 {

width: 60% !important;

}

}

44 of 48

OpacUserJS

45 of 48

Coverflow Navigation

$( document ).ajaxComplete(function() {

$('.flipster__item__content a').click( function(e) {

e.preventDefault();

let my_bibnum = $(this).attr('href').split('biblionumber=');

getBibInfo(my_bibnum[1]);

$('#moredetails').attr('href' , '/cgi-bin/koha/opac-detail.pl?biblionumber=' + my_bibnum[1]);

$('#placehold').attr('href' , '/cgi-bin/koha/opac-reserve.pl?biblionumber=' + my_bibnum[1]);

$('#card-image').html( $(this).find('img').clone() );

});

});

$('#close, .close').click( function() {

$('.modal-title').text('No title available');

$('.card-title').text('No description available');

});

}

46 of 48

Things we’d like to see

  • Display cover images from other sources, such as Syndetics and Baker & Taylor
  • Display local cover images that we’ve uploaded
  • Prevent display of titles that have no cover images
  • Be able to use a report that can use subject headings
  • Ability to use a url to get the covers – it would use the ISBNs that is found on the page
  • Add a ‘Save & continue’ button to coverflow plugin
  • Increase height of the coverflow plugin configuration box

47 of 48

Coverflow Resources

48 of 48

Thanks

Barbara Glassford Johnson

barbara.johnson@bedfordtx.gov

OPAC - https://bedfordtx.bywatersolutions.com/