Koha/koha-tmpl/opac-tmpl/bootstrap/js/ill-availability.js
Andrew Isherwood 567557117a Bug 27170: Fix bug fix
<sigh> This commit fixes the incorrect bug fix from the previous commit

Signed-off-by: Holly Cooper <hc@interleaf.ie>
Signed-off-by: Barry Cannon <bc@interleaf.ie>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
2021-09-21 20:22:57 +02:00

196 lines
7.5 KiB
JavaScript

$(document).ready(function() {
var getLinks = function(row) {
if (!row.links || row.links.length === 0) {
return false;
}
return row.links.map(function(link) {
return '<a href="' + link.url + '" target="_blank">' +
link.text +
'</a>';
});
};
window.doSearch = function() {
// In case the source doesn't supply data required for DT to calculate
// pagination, we need to do it ourselves
var ownPagination = false;
var directionSet = false;
var start = 0;
var forward = true; // true == forward, false == backwards
// Arbitrary starting value, it will be corrected by the first
// page of results
var pageSize = 20;
var tableTmpl = {
ajax: {
cache: true, // Prevent DT appending a "_" cache param
},
columns: [
// defaultContent prevents DT from choking if
// the API response doesn't return a column
{
title: 'Source',
data: 'source',
defaultContent: ''
},
{
data: 'title',
defaultContent: ''
},
{
data: 'author',
defaultContent: ''
},
{
data: 'isbn',
defaultContent: ''
},
{
data: 'issn',
defaultContent: ''
},
{
data: 'date',
defaultContent: ''
}
]
};
// render functions don't get copied across when we make a dereferenced
// copy of them, so we have to reattach them once we have a copy
// Here we store them
var renders = {
title: function(data, type, row) {
var links = getLinks(row);
if (links) {
return row.title + ' - ' + links.join(', ');
} else if (row.url) {
return '<a href="' + row.url + '" target="_blank">' +
row.title +
'</a>';
} else {
return row.title;
}
},
source: function(data, type, row) {
return row.opac_url ?
'<a href="'+row.opac_url+'" target="_blank">'+row.source+'</a>' :
row.source;
}
};
services.forEach(function(service) {
// Create a deferenced copy of our table definition object
var tableDef = JSON.parse(JSON.stringify(tableTmpl));
// Iterate the table's columns array and add render functions
// as necessary
tableDef.columns.forEach(function(column) {
if (renders[column.data]) {
column.render = renders[column.data];
}
});
tableDef.ajax.dataSrc = function(data) {
var results = data.results.search_results;
// The source appears to be returning it's own pagination
// data
if (
data.hasOwnProperty('recordsFiltered') ||
data.hasOwnProperty('recordsTotal')
) {
return results;
}
// Set up our own pagination values based on what we just
// got back
ownPagination = true;
directionSet = false;
pageSize = results.length;
// These values are completely arbitrary, but they enable
// us to display pagination links
data.recordsFiltered = 5000,
data.recordsTotal = 5000;
return results;
};
tableDef.ajax.data = function(data) {
// Datatables sends a bunch of superfluous params
// that we don't want to litter our API schema
// with, so just remove them from the request
if (data.hasOwnProperty('columns')) {
delete data.columns;
}
if (data.hasOwnProperty('draw')) {
delete data.draw;
}
if (data.hasOwnProperty('order')) {
delete data.order;
}
if (data.hasOwnProperty('search')) {
delete data.search;
}
// If we're handling our own pagination, set the properties
// that DT will send in the request
if (ownPagination) {
start = forward ? start + pageSize : start - pageSize;
data.start = start;
data['length'] = pageSize;
}
// We may need to restrict the service IDs being queries, this
// needs to be handled in the plugin's API module
var restrict = $('#service_id_restrict').
attr('data-service_id_restrict_ids');
if (restrict && restrict.length > 0) {
data.restrict = restrict;
}
};
// Add any datatables config options passed from the service
// to the table definition
tableDef.ajax.url = service.endpoint + metadata;
if (service.hasOwnProperty('datatablesConfig')) {
var conf = service.datatablesConfig;
for (var key in conf) {
// The config from the service definition comes from a Perl
// hashref, therefore can't contain true/false, so we
// special case it
if (conf.hasOwnProperty(key)) {
if (conf[key] == 'false') {
// Special case false values
tableDef[key] = false;
} else if (conf[key] == 'true') {
// Special case true values
tableDef[key] = true;
} else {
// Copy the property value
tableDef[key] = conf[key];
}
}
}
}
// Create event watchers for the "next" and "previous" pagination
// links, this enables us to set the direction the next request is
// going in when we're doing our own pagination. We use "hover"
// because the click event is caught after the request has been
// sent
tableDef.drawCallback = function() {
$('.paginate_button.next:not(.disabled)',
this.api().table().container()
).on('hover', function() {
forward = true;
directionSet = true;
});
$('.paginate_button.previous:not(.disabled)',
this.api().table().container()
).on('hover', function() {
forward = false;
directionSet = true;
});
}
// Initialise the table
$('#'+service.id ).dataTable(
$.extend(true, {}, dataTablesDefaults, tableDef)
);
});
}
});