1 $(document).ready(function() {
2 // Display the modal containing request supplier metadata
3 $('#ill-request-display-log').on('click', function(e) {
5 $('#requestLog').modal({show:true});
8 // Toggle request attributes in Illview
9 $('#toggle_requestattributes').on('click', function(e) {
11 $('#requestattributes').toggleClass('content_hidden');
14 // Toggle new comment form in Illview
15 $('#toggle_addcomment').on('click', function(e) {
17 $('#addcomment').toggleClass('content_hidden');
20 // Filter partner list
21 // Record the list of all options
22 var ill_partner_options = $('#partners > option');
23 $('#partner_filter').keyup(function() {
24 var needle = $('#partner_filter').val();
25 var regex = new RegExp(needle, 'i');
27 ill_partner_options.each(function() {
30 $(this).is(':selected') ||
31 $(this).text().match(regex)
33 filtered.push($(this));
36 $('#partners').empty().append(filtered);
39 // Display the modal containing request supplier metadata
40 $('#ill-request-display-metadata').on('click', function(e) {
42 $('#dataPreview').modal({show:true});
45 function display_extended_attribute(row, type) {
46 var arr = $.grep(row.extended_attributes, ( x => x.type === type ));
48 return escape_str(arr[0].value);
54 // At the moment, the only prefilter possible is borrowernumber
55 // see ill/ill-requests.pl and members/ill-requests.pl
56 let additional_prefilters = {};
58 let prefilters_array = prefilters.split("&");
59 prefilters_array.forEach((prefilter) => {
60 let prefilter_split = prefilter.split("=");
61 additional_prefilters[prefilter_split[0]] = prefilter_split[1]
65 let borrower_prefilter = additional_prefilters['borrowernumber'] || null;
67 let additional_filters = {
68 "me.backend": function(){
69 let backend = $("#illfilter_backend").val();
70 if (!backend) return "";
71 return { "=": backend }
73 "me.branchcode": function(){
74 let branchcode = $("#illfilter_branchname").val();
75 if (!branchcode) return "";
76 return { "=": branchcode }
78 "me.borrowernumber": function(){
79 return borrower_prefilter ? { "=": borrower_prefilter } : "";
82 let patron = $("#illfilter_patron").val();
83 let status = $("#illfilter_status").val();
85 let patron_sub_or = [];
86 let status_sub_or = [];
87 let subquery_and = [];
89 if (!patron && !status) return "";
92 const patron_search_fields = "me.borrowernumber,patron.cardnumber,patron.firstname,patron.surname";
93 patron_search_fields.split(',').forEach(function(attr){
95 let patron_data = patron;
96 if ( attr != "me.borrowernumber" && attr != "patron.cardnumber") {
98 patron_data = "%" + patron + "%";
101 [attr]:{[operator]: patron_data }
104 subquery_and.push(patron_sub_or);
108 const status_search_fields = "me.status,me.status_av";
109 status_search_fields.split(',').forEach(function(attr){
111 [attr]:{"=": status }
114 subquery_and.push(status_sub_or);
117 filters.push({"-and": subquery_and});
121 "me.placed": function(){
122 if ( Object.keys(additional_prefilters).length ) return "";
123 let placed_start = $('#illfilter_dateplaced_start').get(0)._flatpickr.selectedDates[0];
124 let placed_end = $('#illfilter_dateplaced_end').get(0)._flatpickr.selectedDates[0];
125 if (!placed_start && !placed_end) return "";
127 ...(placed_start && {">=": placed_start}),
128 ...(placed_end && {"<=": placed_end})
131 "me.updated": function(){
132 if (Object.keys(additional_prefilters).length) return "";
133 let updated_start = $('#illfilter_datemodified_start').get(0)._flatpickr.selectedDates[0];
134 let updated_end = $('#illfilter_datemodified_end').get(0)._flatpickr.selectedDates[0];
135 if (!updated_start && !updated_end) return "";
136 // set selected datetime hours and minutes to the end of the day
137 // to grab any request updated during that day
138 let updated_end_value = new Date(updated_end);
139 updated_end_value.setHours(updated_end_value.getHours()+23);
140 updated_end_value.setMinutes(updated_end_value.getMinutes()+59);
142 ...(updated_start && {">=": updated_start}),
143 ...(updated_end && {"<=": updated_end_value})
147 let keyword = $("#illfilter_keyword").val();
148 if (!keyword) return "";
151 let subquery_and = [];
153 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";
155 search_fields.split(',').forEach(function(attr){
157 [attr]:{"like":"%" + keyword + "%"}
160 subquery_and.push(sub_or);
161 filters.push({"-and": subquery_and});
163 const extended_attributes = "title,type,author,article_title,pages,issue,volume,year";
164 let extended_sub_or = [];
166 extended_sub_or.push({
167 "extended_attributes.type": extended_attributes.split(','),
168 "extended_attributes.value":{"like":"%" + keyword + "%"}
170 subquery_and.push(extended_sub_or);
172 filters.push({"-and": subquery_and});
177 let table_id = "#ill-requests";
178 if (borrower_prefilter) {
179 table_id += "-patron-" + borrower_prefilter;
182 var ill_requests_table = $(table_id).kohaTable({
184 "url": '/api/v1/ill/requests'
190 'extended_attributes',
195 "order": [[0, 'desc']],
196 "stateSave": true, // remember state on page reload
199 "data": "ill_request_id",
202 "render": function( data, type, row, meta ) {
203 return '<a href="/cgi-bin/koha/ill/ill-requests.pl?' +
204 'method=illview&illrequest_id=' +
205 encodeURIComponent(data) +
206 '">' + escape_str(row.id_prefix) + escape_str(data) + '</a>';
210 "data": "", // author
212 "render": function(data, type, row, meta) {
213 return display_extended_attribute(row, 'author');
219 "render": function(data, type, row, meta) {
220 return display_extended_attribute(row, 'title');
224 "data": "", // article_title
226 "render": function(data, type, row, meta) {
227 return display_extended_attribute(row, 'article_title');
233 "render": function(data, type, row, meta) {
234 return display_extended_attribute(row, 'issue');
238 "data": "", // volume
240 "render": function(data, type, row, meta) {
241 return display_extended_attribute(row, 'volume');
247 "render": function(data, type, row, meta) {
248 return display_extended_attribute(row, 'year');
254 "render": function(data, type, row, meta) {
255 return display_extended_attribute(row, 'pages');
261 "render": function(data, type, row, meta) {
262 return display_extended_attribute(row, 'type');
266 "data": "ill_backend_request_id",
268 "render": function(data, type, row, meta) {
269 return escape_str(data);
273 "data": "patron.firstname:patron.surname:patron.cardnumber",
274 "render": function(data, type, row, meta) {
275 return (row.patron) ? $patron_to_html( row.patron, { display_cardnumber: true, url: true } ) : ''; } },
279 "render": function(data, type, row, meta) {
280 if ( data === null ) {
283 return $biblio_to_html(row.biblio, { biblio_id_only: 1, link: 1 });
287 "data": "library.name",
289 "render": function(data, type, row, meta) {
290 return escape_str(data);
296 "render": function(data, type, row, meta) {
297 let status_label = row._strings.status_av ?
298 row._strings.status_av.str ?
299 row._strings.status_av.str :
300 row._strings.status_av.code :
301 row._strings.status.str
302 return escape_str(status_label);
306 "data": "requested_date",
308 "render": function(data, type, row, meta) {
315 "render": function(data, type, row, meta) {
320 "data": "replied_date",
322 "render": function(data, type, row, meta) {
327 "data": "completed_date",
329 "render": function(data, type, row, meta) {
334 "data": "access_url",
336 "render": function(data, type, row, meta) {
337 return '<a target="_blank" href="' + data + '">'
338 + escape_str(data) + '</a>';
344 "render": function(data, type, row, meta) {
345 return escape_str(data);
349 "data": "paid_price",
351 "render": function(data, type, row, meta) {
352 return escape_str(data);
356 "data": "comments_count",
359 "render": function(data, type, row, meta) {
360 return escape_str(data);
364 "data": "opac_notes",
366 "render": function(data, type, row, meta) {
367 return escape_str(data);
371 "data": "staff_notes",
373 "render": function(data, type, row, meta) {
374 return escape_str(data);
378 "data": "ill_backend_id",
380 "render": function(data, type, row, meta) {
381 return escape_str(data);
385 "data": "ill_request_id",
388 "render": function( data, type, row, meta ) {
389 return '<a class="btn btn-default btn-sm" ' +
390 'href="/cgi-bin/koha/ill/ill-requests.pl?' +
391 'method=illview&illrequest_id=' +
392 encodeURIComponent(data) +
393 '">' + ill_manage + '</a>';
397 }, table_settings, null, additional_filters);
399 $("#illfilter_form").on('submit', filter);
401 function redrawTable() {
402 let table_dt = ill_requests_table.DataTable();
411 function clearSearch() {
414 "illfilter_branchname",
418 filters.forEach((filter) => {
419 $("#"+filter).val("");
422 //Clear flatpickr date filters
423 $('#illfilter_form > fieldset > ol > li:nth-child(4) > span > a').click();
424 $('#illfilter_form > fieldset > ol > li:nth-child(5) > span > a').click();
425 $('#illfilter_form > fieldset > ol > li:nth-child(6) > span > a').click();
426 $('#illfilter_form > fieldset > ol > li:nth-child(7) > span > a').click();
428 disableStatusFilter();
433 function populateStatusFilter(backend) {
436 url: "/api/v1/ill/backends/"+backend,
438 'x-koha-embed': 'statuses+strings'
440 success: function(response){
441 let statuses = response.statuses
442 $('#illfilter_status').append(
443 '<option value="">'+ill_all_statuses+'</option>'
445 statuses.sort((a, b) => a.str.localeCompare(b.str)).forEach(function(status) {
446 $('#illfilter_status').append(
447 '<option value="' + status.code +
448 '">' + status.str + '</option>'
455 function populateBackendFilter() {
458 url: "/api/v1/ill/backends",
459 success: function(backends){
460 backends.sort((a, b) => a.ill_backend_id.localeCompare(b.ill_backend_id)).forEach(function(backend) {
461 $('#illfilter_backend').append(
462 '<option value="' + backend.ill_backend_id +
463 '">' + backend.ill_backend_id + '</option>'
470 function disableStatusFilter() {
471 $('#illfilter_status').children().remove();
472 $("#illfilter_status").attr('title', ill_manage_select_backend_first);
473 $('#illfilter_status').prop("disabled", true);
476 function enableStatusFilter() {
477 $('#illfilter_status').children().remove();
478 $("#illfilter_status").attr('title', '');
479 $('#illfilter_status').prop("disabled", false);
482 $('#illfilter_backend').change(function() {
483 var selected_backend = $('#illfilter_backend option:selected').val();
484 if (selected_backend && selected_backend.length > 0) {
485 populateStatusFilter(selected_backend);
486 enableStatusFilter();
488 disableStatusFilter();
492 disableStatusFilter();
493 populateBackendFilter();
496 $('#clear_search').click(function() {