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 "stateSave": true, // remember state on page reload
198 "data": "ill_request_id",
201 "render": function( data, type, row, meta ) {
202 return '<a href="/cgi-bin/koha/ill/ill-requests.pl?' +
203 'method=illview&illrequest_id=' +
204 encodeURIComponent(data) +
205 '">' + escape_str(row.id_prefix) + escape_str(data) + '</a>';
209 "data": "", // author
211 "render": function(data, type, row, meta) {
212 return display_extended_attribute(row, 'author');
218 "render": function(data, type, row, meta) {
219 return display_extended_attribute(row, 'title');
223 "data": "", // article_title
225 "render": function(data, type, row, meta) {
226 return display_extended_attribute(row, 'article_title');
232 "render": function(data, type, row, meta) {
233 return display_extended_attribute(row, 'issue');
237 "data": "", // volume
239 "render": function(data, type, row, meta) {
240 return display_extended_attribute(row, 'volume');
246 "render": function(data, type, row, meta) {
247 return display_extended_attribute(row, 'year');
253 "render": function(data, type, row, meta) {
254 return display_extended_attribute(row, 'pages');
260 "render": function(data, type, row, meta) {
261 return display_extended_attribute(row, 'type');
265 "data": "ill_backend_request_id",
267 "render": function(data, type, row, meta) {
268 return escape_str(data);
272 "data": "patron.firstname:patron.surname:patron.cardnumber",
273 "render": function(data, type, row, meta) {
274 return (row.patron) ? $patron_to_html( row.patron, { display_cardnumber: true, url: true } ) : ''; } },
278 "render": function(data, type, row, meta) {
279 if ( data === null ) {
282 return $biblio_to_html(row.biblio, { biblio_id_only: 1, link: 1 });
286 "data": "library.name",
288 "render": function(data, type, row, meta) {
289 return escape_str(data);
295 "render": function(data, type, row, meta) {
296 let status_label = row._strings.status_av ?
297 row._strings.status_av.str ?
298 row._strings.status_av.str :
299 row._strings.status_av.code :
300 row._strings.status.str
301 return escape_str(status_label);
305 "data": "requested_date",
307 "render": function(data, type, row, meta) {
314 "render": function(data, type, row, meta) {
319 "data": "replied_date",
321 "render": function(data, type, row, meta) {
326 "data": "completed_date",
328 "render": function(data, type, row, meta) {
333 "data": "access_url",
335 "render": function(data, type, row, meta) {
336 return escape_str(data);
342 "render": function(data, type, row, meta) {
343 return escape_str(data);
347 "data": "paid_price",
349 "render": function(data, type, row, meta) {
350 return escape_str(data);
354 "data": "comments_count",
357 "render": function(data, type, row, meta) {
358 return escape_str(data);
362 "data": "opac_notes",
364 "render": function(data, type, row, meta) {
365 return escape_str(data);
369 "data": "staff_notes",
371 "render": function(data, type, row, meta) {
372 return escape_str(data);
376 "data": "ill_backend_id",
378 "render": function(data, type, row, meta) {
379 return escape_str(data);
383 "data": "ill_request_id",
386 "render": function( data, type, row, meta ) {
387 return '<a class="btn btn-default btn-sm" ' +
388 'href="/cgi-bin/koha/ill/ill-requests.pl?' +
389 'method=illview&illrequest_id=' +
390 encodeURIComponent(data) +
391 '">' + ill_manage + '</a>';
395 }, table_settings, null, additional_filters);
397 $("#illfilter_form").on('submit', filter);
399 function redrawTable() {
400 let table_dt = ill_requests_table.DataTable();
409 function clearSearch() {
412 "illfilter_branchname",
416 filters.forEach((filter) => {
417 $("#"+filter).val("");
420 //Clear flatpickr date filters
421 $('#illfilter_form > fieldset > ol > li:nth-child(4) > span > a').click();
422 $('#illfilter_form > fieldset > ol > li:nth-child(5) > span > a').click();
423 $('#illfilter_form > fieldset > ol > li:nth-child(6) > span > a').click();
424 $('#illfilter_form > fieldset > ol > li:nth-child(7) > span > a').click();
426 disableStatusFilter();
431 function populateStatusFilter(backend) {
434 url: "/api/v1/ill/backends/"+backend,
436 'x-koha-embed': 'statuses+strings'
438 success: function(response){
439 let statuses = response.statuses
440 $('#illfilter_status').append(
441 '<option value="">'+ill_all_statuses+'</option>'
443 statuses.sort((a, b) => a.str.localeCompare(b.str)).forEach(function(status) {
444 $('#illfilter_status').append(
445 '<option value="' + status.code +
446 '">' + status.str + '</option>'
453 function populateBackendFilter() {
456 url: "/api/v1/ill/backends",
457 success: function(backends){
458 backends.sort((a, b) => a.ill_backend_id.localeCompare(b.ill_backend_id)).forEach(function(backend) {
459 $('#illfilter_backend').append(
460 '<option value="' + backend.ill_backend_id +
461 '">' + backend.ill_backend_id + '</option>'
468 function disableStatusFilter() {
469 $('#illfilter_status').children().remove();
470 $("#illfilter_status").attr('title', ill_manage_select_backend_first);
471 $('#illfilter_status').prop("disabled", true);
474 function enableStatusFilter() {
475 $('#illfilter_status').children().remove();
476 $("#illfilter_status").attr('title', '');
477 $('#illfilter_status').prop("disabled", false);
480 $('#illfilter_backend').change(function() {
481 var selected_backend = $('#illfilter_backend option:selected').val();
482 if (selected_backend && selected_backend.length > 0) {
483 populateStatusFilter(selected_backend);
484 enableStatusFilter();
486 disableStatusFilter();
490 disableStatusFilter();
491 populateBackendFilter();
494 $('#clear_search').click(function() {