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.push( {
62 "key": prefilter_split[0],
63 "value": prefilter_split[1]
69 let additional_filters = {
70 "me.backend": function(){
71 let backend = $("#illfilter_backend").val();
72 if (!backend) return "";
73 return { "=": backend }
75 "me.branchcode": function(){
76 let branchcode = $("#illfilter_branchname").val();
77 if (!branchcode) return "";
78 return { "=": branchcode }
80 "me.borrowernumber": function(){
81 let borrowernumber_pre_filter = additional_prefilters.find(e => e.key === 'borrowernumber');
82 if ( additional_prefilters.length == 0 || typeof borrowernumber_pre_filter === undefined) return "";
83 return { "=": borrowernumber_pre_filter["value"] }
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 ( additional_prefilters.length != 0 && !additional_prefilters.find(e => e.key === 'placed')) 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 ( additional_prefilters.length != 0 && !additional_prefilters.find(e => e.key === 'updated')) 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 var ill_requests_table = $("#ill-requests").kohaTable({
183 "url": '/api/v1/ill/requests'
189 'extended_attributes',
194 "stateSave": true, // remember state on page reload
197 "data": "ill_request_id",
200 "render": function( data, type, row, meta ) {
201 return '<a href="/cgi-bin/koha/ill/ill-requests.pl?' +
202 'method=illview&illrequest_id=' +
203 encodeURIComponent(data) +
204 '">' + escape_str(row.id_prefix) + escape_str(data) + '</a>';
208 "data": "", // author
210 "render": function(data, type, row, meta) {
211 return display_extended_attribute(row, 'author');
217 "render": function(data, type, row, meta) {
218 return display_extended_attribute(row, 'title');
222 "data": "", // article_title
224 "render": function(data, type, row, meta) {
225 return display_extended_attribute(row, 'article_title');
231 "render": function(data, type, row, meta) {
232 return display_extended_attribute(row, 'issue');
236 "data": "", // volume
238 "render": function(data, type, row, meta) {
239 return display_extended_attribute(row, 'volume');
245 "render": function(data, type, row, meta) {
246 return display_extended_attribute(row, 'year');
252 "render": function(data, type, row, meta) {
253 return display_extended_attribute(row, 'pages');
259 "render": function(data, type, row, meta) {
260 return display_extended_attribute(row, 'type');
264 "data": "ill_backend_request_id",
266 "render": function(data, type, row, meta) {
267 return escape_str(data);
271 "data": "patron.firstname:patron.surname:patron.cardnumber",
272 "render": function(data, type, row, meta) {
273 return (row.patron) ? $patron_to_html( row.patron, { display_cardnumber: true, url: true } ) : ''; } },
277 "render": function(data, type, row, meta) {
278 if ( data === null ) {
281 return $biblio_to_html(row.biblio, { biblio_id_only: 1, link: 1 });
285 "data": "library.name",
287 "render": function(data, type, row, meta) {
288 return escape_str(data);
294 "render": function(data, type, row, meta) {
295 let status_label = row._strings.status_av ?
296 row._strings.status_av.str ?
297 row._strings.status_av.str :
298 row._strings.status_av.code :
299 row._strings.status.str
300 return escape_str(status_label);
304 "data": "requested_date",
306 "render": function(data, type, row, meta) {
313 "render": function(data, type, row, meta) {
318 "data": "replied_date",
320 "render": function(data, type, row, meta) {
325 "data": "completed_date",
327 "render": function(data, type, row, meta) {
332 "data": "access_url",
334 "render": function(data, type, row, meta) {
335 return escape_str(data);
341 "render": function(data, type, row, meta) {
342 return escape_str(data);
346 "data": "paid_price",
348 "render": function(data, type, row, meta) {
349 return escape_str(data);
353 "data": "comments_count",
356 "render": function(data, type, row, meta) {
357 return escape_str(data);
361 "data": "opac_notes",
363 "render": function(data, type, row, meta) {
364 return escape_str(data);
368 "data": "staff_notes",
370 "render": function(data, type, row, meta) {
371 return escape_str(data);
375 "data": "ill_backend_id",
377 "render": function(data, type, row, meta) {
378 return escape_str(data);
382 "data": "ill_request_id",
385 "render": function( data, type, row, meta ) {
386 return '<a class="btn btn-default btn-sm" ' +
387 'href="/cgi-bin/koha/ill/ill-requests.pl?' +
388 'method=illview&illrequest_id=' +
389 encodeURIComponent(data) +
390 '">' + ill_manage + '</a>';
394 }, table_settings, null, additional_filters);
396 $("#illfilter_form").on('submit', filter);
398 function redrawTable() {
399 let table_dt = ill_requests_table.DataTable();
408 function clearSearch() {
411 "illfilter_branchname",
415 filters.forEach((filter) => {
416 $("#"+filter).val("");
419 //Clear flatpickr date filters
420 $('#illfilter_form > fieldset > ol > li:nth-child(4) > span > a').click();
421 $('#illfilter_form > fieldset > ol > li:nth-child(5) > span > a').click();
422 $('#illfilter_form > fieldset > ol > li:nth-child(6) > span > a').click();
423 $('#illfilter_form > fieldset > ol > li:nth-child(7) > span > a').click();
425 disableStatusFilter();
430 function populateStatusFilter(backend) {
433 url: "/api/v1/ill/backends/"+backend+"/statuses",
434 success: function(statuses){
435 $('#illfilter_status').append(
436 '<option value="">'+ill_all_statuses+'</option>'
438 statuses.sort((a, b) => a.str.localeCompare(b.str)).forEach(function(status) {
439 $('#illfilter_status').append(
440 '<option value="' + status.code +
441 '">' + status.str + '</option>'
448 function populateBackendFilter() {
451 url: "/api/v1/ill/backends",
452 success: function(backends){
453 backends.sort((a, b) => a.ill_backend_id.localeCompare(b.ill_backend_id)).forEach(function(backend) {
454 $('#illfilter_backend').append(
455 '<option value="' + backend.ill_backend_id +
456 '">' + backend.ill_backend_id + '</option>'
463 function disableStatusFilter() {
464 $('#illfilter_status').children().remove();
465 $("#illfilter_status").attr('title', ill_manage_select_backend_first);
466 $('#illfilter_status').prop("disabled", true);
469 function enableStatusFilter() {
470 $('#illfilter_status').children().remove();
471 $("#illfilter_status").attr('title', '');
472 $('#illfilter_status').prop("disabled", false);
475 $('#illfilter_backend').change(function() {
476 var selected_backend = $('#illfilter_backend option:selected').val();
477 if (selected_backend && selected_backend.length > 0) {
478 populateStatusFilter(selected_backend);
479 enableStatusFilter();
481 disableStatusFilter();
485 disableStatusFilter();
486 populateBackendFilter();
489 $('#clear_search').click(function() {