Koha/koha-tmpl/intranet-tmpl/js/browser.js
Jonathan Druart c9a7b6742b Bug 19290: Browse selected bibliographic records - Staff interface
This patch adds the same feature as bug 10858 for the OPAC interface:
after a search, librarians will be able to browse selected results.
The results can be selected from several pages.
By extension it is possible to add results from several pages to a list
or the cart.

When at least one result is selected, a new "Browse selected records" button
becomes usable and change the behaviour of the existing browser.

The whole feature can be turned off with the pref BrowseResultSelection.

Test plan:
- Launch a search (on the staff interface)
- Check some biblios
- Go on another page
- Check some biblios
- Come back to a page you already check results and confirm that they are
still checked
- Click on the "Browse selected records" button
- Check that you are able to browse results you had checked.

You can also:
- add them to the cart
- add them to a list

QA note: the browsers at the OPAC and the one at the staff interface are completely different
That's why the code is not mimicking what has been done on bug 10858.
The behaviour must stay the same anyway.

Signed-off-by: Séverine QUEUNE <severine.queune@bulac.fr>

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
2018-02-19 16:13:30 -03:00

125 lines
6.3 KiB
JavaScript

if ( KOHA === undefined ) var KOHA = {};
KOHA.browser = function (searchid, biblionumber) {
var me = this;
if (!searchid) {
// We are generating a clean numeric datetime representation so we can easily compare them using the default javascript lexigraphic sorter.
searchid = 'scs_' + (new Date()).getTime(); // scs for Staff Client Search
}
me.searchid = searchid;
var searches_stored = sessionStorage.getItem('searches');
var current_search;
var searches = {};
if ( searches_stored ) {
searches = JSON.parse(searches_stored);
current_search = searches[me.searchid];
// Remove old entries
var searchids = Object.keys(searches);
var nb_searches = searchids.length;
if ( nb_searches > 20 ) { // No need to keep more than 20 searches
searchids = searchids.sort();
for ( var i = 0 ; i < nb_searches - 20 ; i++ ) {
delete searches[searchids[i]];
}
}
}
var browseRecords = function (movement) {
var newSearchPos = me.curPos + movement;
if (newSearchPos > current_search.results.length - 1) {
window.location = '/cgi-bin/koha/catalogue/search.pl?' + decodeURIComponent(current_search.query) + '&limit=' + decodeURIComponent(current_search.limit) + '&sort=' + current_search.sort + '&gotoPage=detail.pl&gotoNumber=first&searchid=' + me.searchid + '&offset=' + newSearchPos;
} else if (newSearchPos < 0) {
window.location = '/cgi-bin/koha/catalogue/search.pl?' + decodeURIComponent(current_search.query) + '&limit=' + decodeURIComponent(current_search.limit) + '&sort=' + current_search.sort + '&gotoPage=detail.pl&gotoNumber=last&searchid=' + me.searchid + '&offset=' + (me.offset - current_search.pagelen);
} else {
window.location = window.location.href.replace('biblionumber=' + biblionumber, 'biblionumber=' + current_search.results[newSearchPos]);
}
}
me.create = function (offset, query, limit, sort, newresults, total) {
if (current_search) {
if (offset === current_search.offset - newresults.length) {
current_search.results = newresults.concat(current_search.results);
} else if (searchOffset = current_search.offset + newresults.length) {
current_search.results = current_search.results.concat(newresults);
} else {
delete current_search;
}
}
if (!current_search) {
current_search = { offset: offset,
query: query,
limit: limit,
sort: sort,
pagelen: newresults.length,
results: newresults,
total: total,
searchid: searchid
};
}
searches[me.searchid] = current_search;
sessionStorage.setItem('searches', JSON.stringify(searches));
$(document).ready(function () {
//FIXME It's not a good idea to modify the click events
$('#searchresults table tr a[href*="detail.pl"]').on('click', function (ev) {
ev.preventDefault();
});
$('#searchresults table tr a[href*="detail.pl"]').on('mousedown', function (ev) {
if ( ev.which == 2 || ev.which == 1 && ev.ctrlKey ) {
// Middle click or ctrl + click
ev.preventDefault();
var newwindow = window.open( $(this).attr('href') + '&searchid=' + me.searchid, '_blank' )
newwindow.blur();
window.focus();
} else if ( ev.which == 1 ) {
// Left click
ev.preventDefault();
window.location = $(this).attr('href') + '&searchid=' + me.searchid;
}
});
});
};
me.show = function () {
if (current_search) {
me.curPos = $.inArray(biblionumber, current_search.results);
me.offset = Math.floor((current_search.offset + me.curPos - 1) / current_search.pagelen) * current_search.pagelen;
$(document).ready(function () {
if (me.curPos > -1) {
var searchURL = '/cgi-bin/koha/catalogue/search.pl?' + decodeURIComponent(current_search.query) + '&limit=' + decodeURIComponent(current_search.limit) + '&sort=' + current_search.sort + '&searchid=' + me.searchid + '&offset=' + me.offset;
var prevbutton;
var nextbutton;
if (me.curPos === 0 && current_search.offset === 1) {
prevbutton = '<span id="browse-previous" class="browse-button">« ' + BROWSER_PREVIOUS + '</span>';
} else {
prevbutton = '<a href="#" id="browse-previous" class="browse-button">« ' + BROWSER_PREVIOUS + '</a>';
}
if (current_search.offset + me.curPos == current_search.total) {
nextbutton = '<span id="browse-next" class="browse-button">' + BROWSER_NEXT + ' »</span>';
} else {
nextbutton = '<a href="#" id="browse-next" class="browse-button">' + BROWSER_NEXT + ' »</a>';
}
$('#menu').before('<div class="browse-controls"><div class="browse-controls-inner"><div class="browse-label"><a href="' + searchURL + '" id="browse-return-to-results" class="browse-button searchwithcontext">' + BROWSER_RETURN_TO_SEARCH + '</a></div><div class="browse-prev-next">' + prevbutton + nextbutton + '</div></div></div>');
$('a#browse-previous').click(function (ev) {
ev.preventDefault();
browseRecords(-1);
});
$('a#browse-next').click(function (ev) {
ev.preventDefault();
browseRecords(1);
});
$('a[href*="biblionumber="]').not('a[target="_blank"]').click(function (ev) {
ev.preventDefault();
window.location = $(this).attr('href') + '&searchid=' + me.searchid;
});
$('form[name="f"]').append('<input type="hidden" name="searchid" value="' + me.searchid + '"></input>');
}
});
}
};
return me;
};