Jonathan Druart
51dbb84a78
Staff side, when a search a done and a result clicked, a browser appears on the left, to navigate between the different results. We use sessionStorage to know the list of biblionumber from the result. As sessionStorage is only for the current tab, we do some ugly things, to catch the click events, then open the new tab, attach it to the current window, and put the focus back on the result list. We really should not do that, and let the user decide what they want to do with their clicks! To do so, let use the correct storage, localStorage, and have the results shared between the windows. We may need to clear that at some point, isn't it? Test plan: Launch a search, click result (left or middle), confirm you see the browser and that the window/tab opened like any other websites (depending on your web browser settings). Signed-off-by: Owen Leonard <oleonard@myacpl.org> Signed-off-by: Nick Clemens <nick@bywatersolutions.com> Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
113 lines
5.9 KiB
JavaScript
113 lines
5.9 KiB
JavaScript
/* global BROWSER_PREVIOUS BROWSER_NEXT BROWSER_RETURN_TO_SEARCH */
|
|
|
|
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 = localStorage.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_by=' + 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_by=' + 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;
|
|
localStorage.setItem('searches', JSON.stringify(searches));
|
|
$(document).ready(function () {
|
|
$('#searchresults table tr a[href*="/detail.pl"]').each(function(){
|
|
$(this).attr('href', $(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_by=' + 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" title="' + BROWSER_PREVIOUS + '"><i class="fa fa-arrow-left"></i></span>';
|
|
} else {
|
|
prevbutton = '<a href="#" id="browse-previous" class="browse-button" title="' + BROWSER_PREVIOUS + '"><i class="fa fa-arrow-left"></i></a>';
|
|
}
|
|
if (current_search.offset + me.curPos == current_search.total) {
|
|
nextbutton = '<span id="browse-next" class="browse-button" title="' + BROWSER_NEXT + '"><i class="fa fa-arrow-right"></i></span>';
|
|
} else {
|
|
nextbutton = '<a href="#" id="browse-next" class="browse-button" title="' + BROWSER_NEXT + '"><i class="fa fa-arrow-right"></i></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="searchwithcontext"><i class="fa fa-list"></i> ' + 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;
|
|
};
|