Pedro Amorim
4d2df9876d
Make sure requests table is unique when visiting patron ILL history so the table state is not shared unintentionally Reproduce: 1) Have a borrower with >20 ILL requests in their history 2) Visit cgi-bin/koha/members/ill-requests.pl?borrowernumber=<borrowernumber> 3) On the table, click page 2 4) Visit a different borrower with <20 ILL requests 5) Verify that no requests are shown, this is because the table is using page 2 from step 3) 6) Go back to original borrower, click table page 1 7) Now go back to 2nd borrower, verify is now showing page 1 correctly Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de> Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
498 lines
18 KiB
JavaScript
498 lines
18 KiB
JavaScript
$(document).ready(function() {
|
|
// Display the modal containing request supplier metadata
|
|
$('#ill-request-display-log').on('click', function(e) {
|
|
e.preventDefault();
|
|
$('#requestLog').modal({show:true});
|
|
});
|
|
|
|
// Toggle request attributes in Illview
|
|
$('#toggle_requestattributes').on('click', function(e) {
|
|
e.preventDefault();
|
|
$('#requestattributes').toggleClass('content_hidden');
|
|
});
|
|
|
|
// Toggle new comment form in Illview
|
|
$('#toggle_addcomment').on('click', function(e) {
|
|
e.preventDefault();
|
|
$('#addcomment').toggleClass('content_hidden');
|
|
});
|
|
|
|
// Filter partner list
|
|
// Record the list of all options
|
|
var ill_partner_options = $('#partners > option');
|
|
$('#partner_filter').keyup(function() {
|
|
var needle = $('#partner_filter').val();
|
|
var regex = new RegExp(needle, 'i');
|
|
var filtered = [];
|
|
ill_partner_options.each(function() {
|
|
if (
|
|
needle.length == 0 ||
|
|
$(this).is(':selected') ||
|
|
$(this).text().match(regex)
|
|
) {
|
|
filtered.push($(this));
|
|
}
|
|
});
|
|
$('#partners').empty().append(filtered);
|
|
});
|
|
|
|
// Display the modal containing request supplier metadata
|
|
$('#ill-request-display-metadata').on('click', function(e) {
|
|
e.preventDefault();
|
|
$('#dataPreview').modal({show:true});
|
|
});
|
|
|
|
function display_extended_attribute(row, type) {
|
|
var arr = $.grep(row.extended_attributes, ( x => x.type === type ));
|
|
if (arr.length > 0) {
|
|
return escape_str(arr[0].value);
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
// At the moment, the only prefilter possible is borrowernumber
|
|
// see ill/ill-requests.pl and members/ill-requests.pl
|
|
let additional_prefilters = {};
|
|
if(prefilters){
|
|
let prefilters_array = prefilters.split("&");
|
|
prefilters_array.forEach((prefilter) => {
|
|
let prefilter_split = prefilter.split("=");
|
|
additional_prefilters[prefilter_split[0]] = prefilter_split[1]
|
|
});
|
|
}
|
|
|
|
let borrower_prefilter = additional_prefilters['borrowernumber'] || null;
|
|
|
|
let additional_filters = {
|
|
"me.backend": function(){
|
|
let backend = $("#illfilter_backend").val();
|
|
if (!backend) return "";
|
|
return { "=": backend }
|
|
},
|
|
"me.branchcode": function(){
|
|
let branchcode = $("#illfilter_branchname").val();
|
|
if (!branchcode) return "";
|
|
return { "=": branchcode }
|
|
},
|
|
"me.borrowernumber": function(){
|
|
return borrower_prefilter ? { "=": borrower_prefilter } : "";
|
|
},
|
|
"-or": function(){
|
|
let patron = $("#illfilter_patron").val();
|
|
let status = $("#illfilter_status").val();
|
|
let filters = [];
|
|
let patron_sub_or = [];
|
|
let status_sub_or = [];
|
|
let subquery_and = [];
|
|
|
|
if (!patron && !status) return "";
|
|
|
|
if(patron){
|
|
const patron_search_fields = "me.borrowernumber,patron.cardnumber,patron.firstname,patron.surname";
|
|
patron_search_fields.split(',').forEach(function(attr){
|
|
let operator = "=";
|
|
let patron_data = patron;
|
|
if ( attr != "me.borrowernumber" && attr != "patron.cardnumber") {
|
|
operator = "like";
|
|
patron_data = "%" + patron + "%";
|
|
}
|
|
patron_sub_or.push({
|
|
[attr]:{[operator]: patron_data }
|
|
});
|
|
});
|
|
subquery_and.push(patron_sub_or);
|
|
}
|
|
|
|
if(status){
|
|
const status_search_fields = "me.status,me.status_av";
|
|
status_search_fields.split(',').forEach(function(attr){
|
|
status_sub_or.push({
|
|
[attr]:{"=": status }
|
|
});
|
|
});
|
|
subquery_and.push(status_sub_or);
|
|
}
|
|
|
|
filters.push({"-and": subquery_and});
|
|
|
|
return filters;
|
|
},
|
|
"me.placed": function(){
|
|
if ( Object.keys(additional_prefilters).length ) return "";
|
|
let placed_start = $('#illfilter_dateplaced_start').get(0)._flatpickr.selectedDates[0];
|
|
let placed_end = $('#illfilter_dateplaced_end').get(0)._flatpickr.selectedDates[0];
|
|
if (!placed_start && !placed_end) return "";
|
|
return {
|
|
...(placed_start && {">=": placed_start}),
|
|
...(placed_end && {"<=": placed_end})
|
|
}
|
|
},
|
|
"me.updated": function(){
|
|
if (Object.keys(additional_prefilters).length) return "";
|
|
let updated_start = $('#illfilter_datemodified_start').get(0)._flatpickr.selectedDates[0];
|
|
let updated_end = $('#illfilter_datemodified_end').get(0)._flatpickr.selectedDates[0];
|
|
if (!updated_start && !updated_end) return "";
|
|
// set selected datetime hours and minutes to the end of the day
|
|
// to grab any request updated during that day
|
|
let updated_end_value = new Date(updated_end);
|
|
updated_end_value.setHours(updated_end_value.getHours()+23);
|
|
updated_end_value.setMinutes(updated_end_value.getMinutes()+59);
|
|
return {
|
|
...(updated_start && {">=": updated_start}),
|
|
...(updated_end && {"<=": updated_end_value})
|
|
}
|
|
},
|
|
"-and": function(){
|
|
let keyword = $("#illfilter_keyword").val();
|
|
if (!keyword) return "";
|
|
|
|
let filters = [];
|
|
let subquery_and = [];
|
|
|
|
const search_fields = "me.illrequest_id,me.borrowernumber,me.biblio_id,me.due_date,me.branchcode,library.name,me.status,me.status_alias,me.placed,me.replied,me.updated,me.completed,me.medium,me.accessurl,me.cost,me.price_paid,me.notesopac,me.notesstaff,me.orderid,me.backend,patron.firstname,patron.surname";
|
|
let sub_or = [];
|
|
search_fields.split(',').forEach(function(attr){
|
|
sub_or.push({
|
|
[attr]:{"like":"%" + keyword + "%"}
|
|
});
|
|
});
|
|
subquery_and.push(sub_or);
|
|
filters.push({"-and": subquery_and});
|
|
|
|
const extended_attributes = "title,type,author,article_title,pages,issue,volume,year";
|
|
let extended_sub_or = [];
|
|
subquery_and = [];
|
|
extended_sub_or.push({
|
|
"extended_attributes.type": extended_attributes.split(','),
|
|
"extended_attributes.value":{"like":"%" + keyword + "%"}
|
|
});
|
|
subquery_and.push(extended_sub_or);
|
|
|
|
filters.push({"-and": subquery_and});
|
|
return filters;
|
|
}
|
|
};
|
|
|
|
let table_id = "#ill-requests";
|
|
if (borrower_prefilter) {
|
|
table_id += "-patron-" + borrower_prefilter;
|
|
}
|
|
|
|
var ill_requests_table = $(table_id).kohaTable({
|
|
"ajax": {
|
|
"url": '/api/v1/ill/requests'
|
|
},
|
|
"embed": [
|
|
'+strings',
|
|
'biblio',
|
|
'comments+count',
|
|
'extended_attributes',
|
|
'library',
|
|
'id_prefix',
|
|
'patron'
|
|
],
|
|
"stateSave": true, // remember state on page reload
|
|
"columns": [
|
|
{
|
|
"data": "ill_request_id",
|
|
"searchable": true,
|
|
"orderable": true,
|
|
"render": function( data, type, row, meta ) {
|
|
return '<a href="/cgi-bin/koha/ill/ill-requests.pl?' +
|
|
'method=illview&illrequest_id=' +
|
|
encodeURIComponent(data) +
|
|
'">' + escape_str(row.id_prefix) + escape_str(data) + '</a>';
|
|
}
|
|
},
|
|
{
|
|
"data": "", // author
|
|
"orderable": false,
|
|
"render": function(data, type, row, meta) {
|
|
return display_extended_attribute(row, 'author');
|
|
}
|
|
},
|
|
{
|
|
"data": "", // title
|
|
"orderable": false,
|
|
"render": function(data, type, row, meta) {
|
|
return display_extended_attribute(row, 'title');
|
|
}
|
|
},
|
|
{
|
|
"data": "", // article_title
|
|
"orderable": false,
|
|
"render": function(data, type, row, meta) {
|
|
return display_extended_attribute(row, 'article_title');
|
|
}
|
|
},
|
|
{
|
|
"data": "", // issue
|
|
"orderable": false,
|
|
"render": function(data, type, row, meta) {
|
|
return display_extended_attribute(row, 'issue');
|
|
}
|
|
},
|
|
{
|
|
"data": "", // volume
|
|
"orderable": false,
|
|
"render": function(data, type, row, meta) {
|
|
return display_extended_attribute(row, 'volume');
|
|
}
|
|
},
|
|
{
|
|
"data": "", // year
|
|
"orderable": false,
|
|
"render": function(data, type, row, meta) {
|
|
return display_extended_attribute(row, 'year');
|
|
}
|
|
},
|
|
{
|
|
"data": "", // pages
|
|
"orderable": false,
|
|
"render": function(data, type, row, meta) {
|
|
return display_extended_attribute(row, 'pages');
|
|
}
|
|
},
|
|
{
|
|
"data": "", // type
|
|
"orderable": false,
|
|
"render": function(data, type, row, meta) {
|
|
return display_extended_attribute(row, 'type');
|
|
}
|
|
},
|
|
{
|
|
"data": "ill_backend_request_id",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return escape_str(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "patron.firstname:patron.surname:patron.cardnumber",
|
|
"render": function(data, type, row, meta) {
|
|
return (row.patron) ? $patron_to_html( row.patron, { display_cardnumber: true, url: true } ) : ''; } },
|
|
{
|
|
"data": "biblio_id",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
if ( data === null ) {
|
|
return "";
|
|
}
|
|
return $biblio_to_html(row.biblio, { biblio_id_only: 1, link: 1 });
|
|
}
|
|
},
|
|
{
|
|
"data": "library.name",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return escape_str(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "status",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
let status_label = row._strings.status_av ?
|
|
row._strings.status_av.str ?
|
|
row._strings.status_av.str :
|
|
row._strings.status_av.code :
|
|
row._strings.status.str
|
|
return escape_str(status_label);
|
|
}
|
|
},
|
|
{
|
|
"data": "requested_date",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return $date(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "timestamp",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return $date(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "replied_date",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return $date(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "completed_date",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return $date(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "access_url",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return escape_str(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "cost",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return escape_str(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "paid_price",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return escape_str(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "comments_count",
|
|
"orderable": true,
|
|
"searchable": false,
|
|
"render": function(data, type, row, meta) {
|
|
return escape_str(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "opac_notes",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return escape_str(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "staff_notes",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return escape_str(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "ill_backend_id",
|
|
"orderable": true,
|
|
"render": function(data, type, row, meta) {
|
|
return escape_str(data);
|
|
}
|
|
},
|
|
{
|
|
"data": "ill_request_id",
|
|
"orderable": false,
|
|
"searchable": false,
|
|
"render": function( data, type, row, meta ) {
|
|
return '<a class="btn btn-default btn-sm" ' +
|
|
'href="/cgi-bin/koha/ill/ill-requests.pl?' +
|
|
'method=illview&illrequest_id=' +
|
|
encodeURIComponent(data) +
|
|
'">' + ill_manage + '</a>';
|
|
}
|
|
}
|
|
]
|
|
}, table_settings, null, additional_filters);
|
|
|
|
$("#illfilter_form").on('submit', filter);
|
|
|
|
function redrawTable() {
|
|
let table_dt = ill_requests_table.DataTable();
|
|
table_dt.draw();
|
|
}
|
|
|
|
function filter() {
|
|
redrawTable();
|
|
return false;
|
|
}
|
|
|
|
function clearSearch() {
|
|
let filters = [
|
|
"illfilter_backend",
|
|
"illfilter_branchname",
|
|
"illfilter_patron",
|
|
"illfilter_keyword",
|
|
];
|
|
filters.forEach((filter) => {
|
|
$("#"+filter).val("");
|
|
});
|
|
|
|
//Clear flatpickr date filters
|
|
$('#illfilter_form > fieldset > ol > li:nth-child(4) > span > a').click();
|
|
$('#illfilter_form > fieldset > ol > li:nth-child(5) > span > a').click();
|
|
$('#illfilter_form > fieldset > ol > li:nth-child(6) > span > a').click();
|
|
$('#illfilter_form > fieldset > ol > li:nth-child(7) > span > a').click();
|
|
|
|
disableStatusFilter();
|
|
|
|
redrawTable();
|
|
}
|
|
|
|
function populateStatusFilter(backend) {
|
|
$.ajax({
|
|
type: "GET",
|
|
url: "/api/v1/ill/backends/"+backend,
|
|
headers: {
|
|
'x-koha-embed': 'statuses+strings'
|
|
},
|
|
success: function(response){
|
|
let statuses = response.statuses
|
|
$('#illfilter_status').append(
|
|
'<option value="">'+ill_all_statuses+'</option>'
|
|
);
|
|
statuses.sort((a, b) => a.str.localeCompare(b.str)).forEach(function(status) {
|
|
$('#illfilter_status').append(
|
|
'<option value="' + status.code +
|
|
'">' + status.str + '</option>'
|
|
);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function populateBackendFilter() {
|
|
$.ajax({
|
|
type: "GET",
|
|
url: "/api/v1/ill/backends",
|
|
success: function(backends){
|
|
backends.sort((a, b) => a.ill_backend_id.localeCompare(b.ill_backend_id)).forEach(function(backend) {
|
|
$('#illfilter_backend').append(
|
|
'<option value="' + backend.ill_backend_id +
|
|
'">' + backend.ill_backend_id + '</option>'
|
|
);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function disableStatusFilter() {
|
|
$('#illfilter_status').children().remove();
|
|
$("#illfilter_status").attr('title', ill_manage_select_backend_first);
|
|
$('#illfilter_status').prop("disabled", true);
|
|
}
|
|
|
|
function enableStatusFilter() {
|
|
$('#illfilter_status').children().remove();
|
|
$("#illfilter_status").attr('title', '');
|
|
$('#illfilter_status').prop("disabled", false);
|
|
}
|
|
|
|
$('#illfilter_backend').change(function() {
|
|
var selected_backend = $('#illfilter_backend option:selected').val();
|
|
if (selected_backend && selected_backend.length > 0) {
|
|
populateStatusFilter(selected_backend);
|
|
enableStatusFilter();
|
|
} else {
|
|
disableStatusFilter();
|
|
}
|
|
});
|
|
|
|
disableStatusFilter();
|
|
populateBackendFilter();
|
|
|
|
// Clear all filters
|
|
$('#clear_search').click(function() {
|
|
clearSearch();
|
|
});
|
|
|
|
});
|