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 // Possible prefilters: borrowernumber, batch_id
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;
66 let batch_id_prefilter = additional_prefilters['batch_id'] || null;
68 let additional_filters = {
69 "me.backend": function(){
70 let backend = $("#illfilter_backend").val();
71 if (!backend) return "";
72 return { "=": backend }
74 "me.branchcode": function(){
75 let branchcode = $("#illfilter_branchname").val();
76 if (!branchcode) return "";
77 return { "=": branchcode }
79 "me.borrowernumber": function(){
80 return borrower_prefilter ? { "=": borrower_prefilter } : "";
82 "me.batch_id": function(){
83 return batch_id_prefilter ? { "=": batch_id_prefilter } : "";
86 let patron = $("#illfilter_patron").val();
87 let status = $("#illfilter_status").val();
89 let patron_sub_or = [];
90 let status_sub_or = [];
91 let subquery_and = [];
93 if (!patron && !status) return "";
96 const patron_search_fields = "me.borrowernumber,patron.cardnumber,patron.firstname,patron.surname";
97 patron_search_fields.split(',').forEach(function(attr){
99 let patron_data = patron;
100 if ( attr != "me.borrowernumber" && attr != "patron.cardnumber") {
102 patron_data = "%" + patron + "%";
105 [attr]:{[operator]: patron_data }
108 subquery_and.push(patron_sub_or);
112 const status_search_fields = "me.status,me.status_av";
113 status_search_fields.split(',').forEach(function(attr){
115 [attr]:{"=": status }
118 subquery_and.push(status_sub_or);
121 filters.push({"-and": subquery_and});
125 "me.placed": function(){
126 if (Object.keys(additional_prefilters).length && borrower_prefilter) return "";
127 let placed_start = $('#illfilter_dateplaced_start').get(0)._flatpickr.selectedDates[0];
128 let placed_end = $('#illfilter_dateplaced_end').get(0)._flatpickr.selectedDates[0];
129 if (!placed_start && !placed_end) return "";
131 ...(placed_start && {">=": placed_start}),
132 ...(placed_end && {"<=": placed_end})
135 "me.updated": function(){
136 if (Object.keys(additional_prefilters).length && borrower_prefilter) return "";
137 let updated_start = $('#illfilter_datemodified_start').get(0)._flatpickr.selectedDates[0];
138 let updated_end = $('#illfilter_datemodified_end').get(0)._flatpickr.selectedDates[0];
139 if (!updated_start && !updated_end) return "";
140 // set selected datetime hours and minutes to the end of the day
141 // to grab any request updated during that day
142 let updated_end_value = new Date(updated_end);
143 updated_end_value.setHours(updated_end_value.getHours()+23);
144 updated_end_value.setMinutes(updated_end_value.getMinutes()+59);
146 ...(updated_start && {">=": updated_start}),
147 ...(updated_end && {"<=": updated_end_value})
151 let keyword = $("#illfilter_keyword").val();
152 if (!keyword) return "";
155 let subquery_and = [];
157 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";
159 search_fields.split(',').forEach(function(attr){
161 [attr]:{"like":"%" + keyword + "%"}
164 subquery_and.push(sub_or);
165 filters.push({"-and": subquery_and});
167 const extended_attributes = "title,type,author,article_title,pages,issue,volume,year";
168 let extended_sub_or = [];
170 extended_sub_or.push({
171 "extended_attributes.type": extended_attributes.split(','),
172 "extended_attributes.value":{"like":"%" + keyword + "%"}
174 subquery_and.push(extended_sub_or);
176 filters.push({"-and": subquery_and});
181 let table_id = "#ill-requests";
183 if (borrower_prefilter) {
184 table_id += "-patron-" + borrower_prefilter;
185 } else if ( batch_id_prefilter ){
186 table_id += "-batch-" + batch_id_prefilter;
189 var ill_requests_table = $(table_id).kohaTable({
191 "url": '/api/v1/ill/requests'
197 'extended_attributes',
203 "order": [[0, 'desc']],
204 "stateSave": true, // remember state on page reload
207 "data": "ill_request_id",
210 "render": function( data, type, row, meta ) {
211 return '<a href="/cgi-bin/koha/ill/ill-requests.pl?' +
212 'method=illview&illrequest_id=' +
213 encodeURIComponent(data) +
214 '">' + escape_str(row.id_prefix) + escape_str(data) + '</a>';
218 "data": "batch.name", // batch
220 "render": function(data, type, row, meta) {
222 '<a href="/cgi-bin/koha/ill/ill-requests.pl?batch_id=' +
231 "data": "", // author
233 "render": function(data, type, row, meta) {
234 return display_extended_attribute(row, 'author');
240 "render": function(data, type, row, meta) {
241 return display_extended_attribute(row, 'title');
245 "data": "", // article_title
247 "render": function(data, type, row, meta) {
248 return display_extended_attribute(row, 'article_title');
254 "render": function(data, type, row, meta) {
255 return display_extended_attribute(row, 'issue');
259 "data": "", // volume
261 "render": function(data, type, row, meta) {
262 return display_extended_attribute(row, 'volume');
268 "render": function(data, type, row, meta) {
269 return display_extended_attribute(row, 'year');
275 "render": function(data, type, row, meta) {
276 return display_extended_attribute(row, 'pages');
282 "render": function(data, type, row, meta) {
283 return display_extended_attribute(row, 'type');
287 "data": "ill_backend_request_id",
289 "render": function(data, type, row, meta) {
290 return escape_str(data);
294 "data": "patron.firstname:patron.surname:patron.cardnumber",
295 "render": function(data, type, row, meta) {
296 return (row.patron) ? $patron_to_html( row.patron, { display_cardnumber: true, url: true } ) : ''; } },
300 "render": function(data, type, row, meta) {
301 if ( data === null ) {
304 return $biblio_to_html(row.biblio, { biblio_id_only: 1, link: 1 });
308 "data": "library.name",
310 "render": function(data, type, row, meta) {
311 return escape_str(data);
317 "render": function(data, type, row, meta) {
318 let status_label = row._strings.status_av ?
319 row._strings.status_av.str ?
320 row._strings.status_av.str :
321 row._strings.status_av.code :
322 row._strings.status.str
323 return escape_str(status_label);
327 "data": "requested_date",
329 "render": function(data, type, row, meta) {
336 "render": function(data, type, row, meta) {
341 "data": "replied_date",
343 "render": function(data, type, row, meta) {
348 "data": "completed_date",
350 "render": function(data, type, row, meta) {
355 "data": "access_url",
357 "render": function(data, type, row, meta) {
358 return '<a target="_blank" href="' + data + '">'
359 + escape_str(data) + '</a>';
365 "render": function(data, type, row, meta) {
366 return escape_str(data);
370 "data": "paid_price",
372 "render": function(data, type, row, meta) {
373 return escape_str(data);
377 "data": "comments_count",
380 "render": function(data, type, row, meta) {
381 return escape_str(data);
385 "data": "opac_notes",
387 "render": function(data, type, row, meta) {
388 return escape_str(data);
392 "data": "staff_notes",
394 "render": function(data, type, row, meta) {
395 return escape_str(data);
399 "data": "ill_backend_id",
401 "render": function(data, type, row, meta) {
402 return escape_str(data);
406 "data": "ill_request_id",
409 "render": function( data, type, row, meta ) {
410 return '<a class="btn btn-default btn-sm" ' +
411 'href="/cgi-bin/koha/ill/ill-requests.pl?' +
412 'method=illview&illrequest_id=' +
413 encodeURIComponent(data) +
414 '">' + ill_manage + '</a>';
418 }, table_settings, null, additional_filters);
420 $("#illfilter_form").on('submit', filter);
422 function redrawTable() {
423 let table_dt = ill_requests_table.DataTable();
432 function clearSearch() {
435 "illfilter_branchname",
439 filters.forEach((filter) => {
440 $("#"+filter).val("");
443 //Clear flatpickr date filters
444 $('#illfilter_form > fieldset > ol > li:nth-child(4) > span > a').click();
445 $('#illfilter_form > fieldset > ol > li:nth-child(5) > span > a').click();
446 $('#illfilter_form > fieldset > ol > li:nth-child(6) > span > a').click();
447 $('#illfilter_form > fieldset > ol > li:nth-child(7) > span > a').click();
449 disableStatusFilter();
454 function populateStatusFilter(backend) {
457 url: "/api/v1/ill/backends/"+backend,
459 'x-koha-embed': 'statuses+strings'
461 success: function(response){
462 let statuses = response.statuses
463 $('#illfilter_status').append(
464 '<option value="">'+ill_all_statuses+'</option>'
466 statuses.sort((a, b) => a.str.localeCompare(b.str)).forEach(function(status) {
467 $('#illfilter_status').append(
468 '<option value="' + status.code +
469 '">' + status.str + '</option>'
476 function populateBackendFilter() {
479 url: "/api/v1/ill/backends",
480 success: function(backends){
481 backends.sort((a, b) => a.ill_backend_id.localeCompare(b.ill_backend_id)).forEach(function(backend) {
482 $('#illfilter_backend').append(
483 '<option value="' + backend.ill_backend_id +
484 '">' + backend.ill_backend_id + '</option>'
491 function disableStatusFilter() {
492 $('#illfilter_status').children().remove();
493 $("#illfilter_status").attr('title', ill_manage_select_backend_first);
494 $('#illfilter_status').prop("disabled", true);
497 function enableStatusFilter() {
498 $('#illfilter_status').children().remove();
499 $("#illfilter_status").attr('title', '');
500 $('#illfilter_status').prop("disabled", false);
503 $('#illfilter_backend').change(function() {
504 var selected_backend = $('#illfilter_backend option:selected').val();
505 if (selected_backend && selected_backend.length > 0) {
506 populateStatusFilter(selected_backend);
507 enableStatusFilter();
509 disableStatusFilter();
513 disableStatusFilter();
514 populateBackendFilter();
517 $('#clear_search').click(function() {