Bug 33786: ILL requests table id
[koha.git] / koha-tmpl / intranet-tmpl / prog / js / ill-list-table.js
1 $(document).ready(function() {
2     // Display the modal containing request supplier metadata
3     $('#ill-request-display-log').on('click', function(e) {
4         e.preventDefault();
5         $('#requestLog').modal({show:true});
6     });
7
8     // Toggle request attributes in Illview
9     $('#toggle_requestattributes').on('click', function(e) {
10         e.preventDefault();
11         $('#requestattributes').toggleClass('content_hidden');
12     });
13
14     // Toggle new comment form in Illview
15     $('#toggle_addcomment').on('click', function(e) {
16         e.preventDefault();
17         $('#addcomment').toggleClass('content_hidden');
18     });
19
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');
26         var filtered = [];
27         ill_partner_options.each(function() {
28             if (
29                 needle.length == 0 ||
30                 $(this).is(':selected') ||
31                 $(this).text().match(regex)
32             ) {
33                 filtered.push($(this));
34             }
35         });
36         $('#partners').empty().append(filtered);
37     });
38
39     // Display the modal containing request supplier metadata
40     $('#ill-request-display-metadata').on('click', function(e) {
41         e.preventDefault();
42         $('#dataPreview').modal({show:true});
43     });
44
45     function display_extended_attribute(row, type) {
46         var arr = $.grep(row.extended_attributes, ( x => x.type === type ));
47         if (arr.length > 0) {
48             return escape_str(arr[0].value);
49         }
50
51         return '';
52     }
53
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 = {};
57     if(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]
62         });
63     }
64
65     let borrower_prefilter = additional_prefilters['borrowernumber'] || null;
66
67     let additional_filters = {
68         "me.backend": function(){
69             let backend = $("#illfilter_backend").val();
70             if (!backend) return "";
71             return { "=": backend  }
72         },
73         "me.branchcode": function(){
74             let branchcode = $("#illfilter_branchname").val();
75             if (!branchcode) return "";
76             return { "=": branchcode }
77         },
78         "me.borrowernumber": function(){
79             return borrower_prefilter ? { "=": borrower_prefilter } : "";
80         },
81         "-or": function(){
82             let patron = $("#illfilter_patron").val();
83             let status = $("#illfilter_status").val();
84             let filters = [];
85             let patron_sub_or = [];
86             let status_sub_or = [];
87             let subquery_and = [];
88
89             if (!patron && !status) return "";
90
91             if(patron){
92                 const patron_search_fields = "me.borrowernumber,patron.cardnumber,patron.firstname,patron.surname";
93                 patron_search_fields.split(',').forEach(function(attr){
94                     let operator = "=";
95                     let patron_data = patron;
96                     if ( attr != "me.borrowernumber" && attr != "patron.cardnumber") {
97                         operator = "like";
98                         patron_data = "%" + patron + "%";
99                     }
100                     patron_sub_or.push({
101                         [attr]:{[operator]: patron_data }
102                     });
103                 });
104                 subquery_and.push(patron_sub_or);
105             }
106
107             if(status){
108                 const status_search_fields = "me.status,me.status_av";
109                 status_search_fields.split(',').forEach(function(attr){
110                     status_sub_or.push({
111                         [attr]:{"=": status }
112                     });
113                 });
114                 subquery_and.push(status_sub_or);
115             }
116
117             filters.push({"-and": subquery_and});
118
119             return filters;
120         },
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 "";
126             return {
127                 ...(placed_start && {">=": placed_start}),
128                 ...(placed_end && {"<=": placed_end})
129             }
130         },
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);
141             return {
142                 ...(updated_start && {">=": updated_start}),
143                 ...(updated_end && {"<=": updated_end_value})
144             }
145         },
146         "-and": function(){
147             let keyword = $("#illfilter_keyword").val();
148             if (!keyword) return "";
149
150             let filters = [];
151             let subquery_and = [];
152
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";
154             let sub_or = [];
155             search_fields.split(',').forEach(function(attr){
156                 sub_or.push({
157                         [attr]:{"like":"%" + keyword + "%"}
158                 });
159             });
160             subquery_and.push(sub_or);
161             filters.push({"-and": subquery_and});
162
163             const extended_attributes = "title,type,author,article_title,pages,issue,volume,year";
164             let extended_sub_or = [];
165             subquery_and = [];
166             extended_sub_or.push({
167                 "extended_attributes.type": extended_attributes.split(','),
168                 "extended_attributes.value":{"like":"%" + keyword + "%"}
169             });
170             subquery_and.push(extended_sub_or);
171
172             filters.push({"-and": subquery_and});
173             return filters;
174         }
175     };
176
177     let table_id = "#ill-requests";
178     if (borrower_prefilter) {
179         table_id += "-patron-" + borrower_prefilter;
180     }
181
182     var ill_requests_table = $(table_id).kohaTable({
183         "ajax": {
184             "url": '/api/v1/ill/requests'
185         },
186         "embed": [
187             '+strings',
188             'biblio',
189             'comments+count',
190             'extended_attributes',
191             'library',
192             'id_prefix',
193             'patron'
194         ],
195         "stateSave": true, // remember state on page reload
196         "columns": [
197             {
198                 "data": "ill_request_id",
199                 "searchable": true,
200                 "orderable": true,
201                 "render": function( data, type, row, meta ) {
202                     return '<a href="/cgi-bin/koha/ill/ill-requests.pl?' +
203                             'method=illview&amp;illrequest_id=' +
204                             encodeURIComponent(data) +
205                             '">' + escape_str(row.id_prefix) + escape_str(data) + '</a>';
206                 }
207             },
208             {
209                 "data": "", // author
210                 "orderable": false,
211                 "render": function(data, type, row, meta) {
212                     return display_extended_attribute(row, 'author');
213                 }
214             },
215             {
216                 "data": "", // title
217                 "orderable": false,
218                 "render": function(data, type, row, meta) {
219                     return display_extended_attribute(row, 'title');
220                 }
221             },
222             {
223                 "data": "", // article_title
224                 "orderable": false,
225                 "render": function(data, type, row, meta) {
226                     return display_extended_attribute(row, 'article_title');
227                 }
228             },
229             {
230                 "data": "", // issue
231                 "orderable": false,
232                 "render": function(data, type, row, meta) {
233                     return display_extended_attribute(row, 'issue');
234                 }
235             },
236             {
237                 "data": "", // volume
238                 "orderable": false,
239                 "render": function(data, type, row, meta) {
240                     return display_extended_attribute(row, 'volume');
241                 }
242             },
243             {
244                 "data": "",  // year
245                 "orderable": false,
246                 "render": function(data, type, row, meta) {
247                     return display_extended_attribute(row, 'year');
248                 }
249             },
250             {
251                 "data": "", // pages
252                 "orderable": false,
253                 "render": function(data, type, row, meta) {
254                     return display_extended_attribute(row, 'pages');
255                 }
256             },
257             {
258                 "data": "", // type
259                 "orderable": false,
260                 "render": function(data, type, row, meta) {
261                     return display_extended_attribute(row, 'type');
262                 }
263             },
264             {
265                 "data": "ill_backend_request_id",
266                 "orderable": true,
267                 "render": function(data, type, row, meta) {
268                     return escape_str(data);
269                 }
270             },
271             {
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 } ) : ''; }                    },
275             {
276                 "data": "biblio_id",
277                 "orderable": true,
278                 "render": function(data, type, row, meta) {
279                     if ( data === null ) {
280                         return "";
281                     }
282                     return $biblio_to_html(row.biblio, { biblio_id_only: 1, link: 1 });
283                 }
284             },
285             {
286                 "data": "library.name",
287                 "orderable": true,
288                 "render": function(data, type, row, meta) {
289                     return escape_str(data);
290                 }
291             },
292             {
293                 "data": "status",
294                 "orderable": true,
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);
302                 }
303             },
304             {
305                 "data": "requested_date",
306                 "orderable": true,
307                 "render": function(data, type, row, meta) {
308                     return $date(data);
309                 }
310             },
311             {
312                 "data": "timestamp",
313                 "orderable": true,
314                 "render": function(data, type, row, meta) {
315                     return $date(data);
316                 }
317             },
318             {
319                 "data": "replied_date",
320                 "orderable": true,
321                 "render": function(data, type, row, meta) {
322                     return $date(data);
323                 }
324             },
325             {
326                 "data": "completed_date",
327                 "orderable": true,
328                 "render": function(data, type, row, meta) {
329                     return $date(data);
330                 }
331             },
332             {
333                 "data": "access_url",
334                 "orderable": true,
335                 "render": function(data, type, row, meta) {
336                     return escape_str(data);
337                 }
338             },
339             {
340                 "data": "cost",
341                 "orderable": true,
342                 "render": function(data, type, row, meta) {
343                     return escape_str(data);
344                 }
345             },
346             {
347                 "data": "paid_price",
348                 "orderable": true,
349                 "render": function(data, type, row, meta) {
350                     return escape_str(data);
351                 }
352             },
353             {
354                 "data": "comments_count",
355                 "orderable": true,
356                 "searchable": false,
357                 "render": function(data, type, row, meta) {
358                     return escape_str(data);
359                 }
360             },
361             {
362                 "data": "opac_notes",
363                 "orderable": true,
364                 "render": function(data, type, row, meta) {
365                     return escape_str(data);
366                 }
367             },
368             {
369                 "data": "staff_notes",
370                 "orderable": true,
371                 "render": function(data, type, row, meta) {
372                     return escape_str(data);
373                 }
374             },
375             {
376                 "data": "ill_backend_id",
377                 "orderable": true,
378                 "render": function(data, type, row, meta) {
379                     return escape_str(data);
380                 }
381             },
382             {
383                 "data": "ill_request_id",
384                 "orderable": false,
385                 "searchable": false,
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&amp;illrequest_id=' +
390                             encodeURIComponent(data) +
391                             '">' + ill_manage + '</a>';
392                 }
393             }
394         ]
395     }, table_settings, null, additional_filters);
396
397     $("#illfilter_form").on('submit', filter);
398
399     function redrawTable() {
400         let table_dt = ill_requests_table.DataTable();
401         table_dt.draw();
402     }
403
404     function filter() {
405         redrawTable();
406         return false;
407     }
408
409     function clearSearch() {
410         let filters = [
411             "illfilter_backend",
412             "illfilter_branchname",
413             "illfilter_patron",
414             "illfilter_keyword",
415         ];
416         filters.forEach((filter) => {
417             $("#"+filter).val("");
418         });
419
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();
425
426         disableStatusFilter();
427
428         redrawTable();
429     }
430
431     function populateStatusFilter(backend) {
432         $.ajax({
433             type: "GET",
434             url: "/api/v1/ill/backends/"+backend,
435             headers: {
436                 'x-koha-embed': 'statuses+strings'
437             },
438             success: function(response){
439                 let statuses = response.statuses
440                 $('#illfilter_status').append(
441                     '<option value="">'+ill_all_statuses+'</option>'
442                 );
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>'
447                     );
448                 });
449             }
450         });
451     }
452
453     function populateBackendFilter() {
454         $.ajax({
455             type: "GET",
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>'
462                     );
463                 });
464             }
465         });
466     }
467
468     function disableStatusFilter() {
469         $('#illfilter_status').children().remove();
470         $("#illfilter_status").attr('title', ill_manage_select_backend_first);
471         $('#illfilter_status').prop("disabled", true);
472     }
473
474     function enableStatusFilter() {
475         $('#illfilter_status').children().remove();
476         $("#illfilter_status").attr('title', '');
477         $('#illfilter_status').prop("disabled", false);
478     }
479
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();
485         } else {
486             disableStatusFilter();
487         }
488     });
489
490     disableStatusFilter();
491     populateBackendFilter();
492
493     // Clear all filters
494     $('#clear_search').click(function() {
495         clearSearch();
496     });
497
498 });