Bug 34310: Input prompt in datatables column search boxes untranslatable
[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         "order": [[0, 'desc']],
196         "stateSave": true, // remember state on page reload
197         "columns": [
198             {
199                 "data": "ill_request_id",
200                 "searchable": true,
201                 "orderable": true,
202                 "render": function( data, type, row, meta ) {
203                     return '<a href="/cgi-bin/koha/ill/ill-requests.pl?' +
204                             'method=illview&amp;illrequest_id=' +
205                             encodeURIComponent(data) +
206                             '">' + escape_str(row.id_prefix) + escape_str(data) + '</a>';
207                 }
208             },
209             {
210                 "data": "", // author
211                 "orderable": false,
212                 "render": function(data, type, row, meta) {
213                     return display_extended_attribute(row, 'author');
214                 }
215             },
216             {
217                 "data": "", // title
218                 "orderable": false,
219                 "render": function(data, type, row, meta) {
220                     return display_extended_attribute(row, 'title');
221                 }
222             },
223             {
224                 "data": "", // article_title
225                 "orderable": false,
226                 "render": function(data, type, row, meta) {
227                     return display_extended_attribute(row, 'article_title');
228                 }
229             },
230             {
231                 "data": "", // issue
232                 "orderable": false,
233                 "render": function(data, type, row, meta) {
234                     return display_extended_attribute(row, 'issue');
235                 }
236             },
237             {
238                 "data": "", // volume
239                 "orderable": false,
240                 "render": function(data, type, row, meta) {
241                     return display_extended_attribute(row, 'volume');
242                 }
243             },
244             {
245                 "data": "",  // year
246                 "orderable": false,
247                 "render": function(data, type, row, meta) {
248                     return display_extended_attribute(row, 'year');
249                 }
250             },
251             {
252                 "data": "", // pages
253                 "orderable": false,
254                 "render": function(data, type, row, meta) {
255                     return display_extended_attribute(row, 'pages');
256                 }
257             },
258             {
259                 "data": "", // type
260                 "orderable": false,
261                 "render": function(data, type, row, meta) {
262                     return display_extended_attribute(row, 'type');
263                 }
264             },
265             {
266                 "data": "ill_backend_request_id",
267                 "orderable": true,
268                 "render": function(data, type, row, meta) {
269                     return escape_str(data);
270                 }
271             },
272             {
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 } ) : ''; }                    },
276             {
277                 "data": "biblio_id",
278                 "orderable": true,
279                 "render": function(data, type, row, meta) {
280                     if ( data === null ) {
281                         return "";
282                     }
283                     return $biblio_to_html(row.biblio, { biblio_id_only: 1, link: 1 });
284                 }
285             },
286             {
287                 "data": "library.name",
288                 "orderable": true,
289                 "render": function(data, type, row, meta) {
290                     return escape_str(data);
291                 }
292             },
293             {
294                 "data": "status",
295                 "orderable": true,
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);
303                 }
304             },
305             {
306                 "data": "requested_date",
307                 "orderable": true,
308                 "render": function(data, type, row, meta) {
309                     return $date(data);
310                 }
311             },
312             {
313                 "data": "timestamp",
314                 "orderable": true,
315                 "render": function(data, type, row, meta) {
316                     return $date(data);
317                 }
318             },
319             {
320                 "data": "replied_date",
321                 "orderable": true,
322                 "render": function(data, type, row, meta) {
323                     return $date(data);
324                 }
325             },
326             {
327                 "data": "completed_date",
328                 "orderable": true,
329                 "render": function(data, type, row, meta) {
330                     return $date(data);
331                 }
332             },
333             {
334                 "data": "access_url",
335                 "orderable": true,
336                 "render": function(data, type, row, meta) {
337                     return '<a target="_blank" href="' + data + '">'
338                     + escape_str(data) + '</a>';
339                 }
340             },
341             {
342                 "data": "cost",
343                 "orderable": true,
344                 "render": function(data, type, row, meta) {
345                     return escape_str(data);
346                 }
347             },
348             {
349                 "data": "paid_price",
350                 "orderable": true,
351                 "render": function(data, type, row, meta) {
352                     return escape_str(data);
353                 }
354             },
355             {
356                 "data": "comments_count",
357                 "orderable": true,
358                 "searchable": false,
359                 "render": function(data, type, row, meta) {
360                     return escape_str(data);
361                 }
362             },
363             {
364                 "data": "opac_notes",
365                 "orderable": true,
366                 "render": function(data, type, row, meta) {
367                     return escape_str(data);
368                 }
369             },
370             {
371                 "data": "staff_notes",
372                 "orderable": true,
373                 "render": function(data, type, row, meta) {
374                     return escape_str(data);
375                 }
376             },
377             {
378                 "data": "ill_backend_id",
379                 "orderable": true,
380                 "render": function(data, type, row, meta) {
381                     return escape_str(data);
382                 }
383             },
384             {
385                 "data": "ill_request_id",
386                 "orderable": false,
387                 "searchable": false,
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&amp;illrequest_id=' +
392                             encodeURIComponent(data) +
393                             '">' + ill_manage + '</a>';
394                 }
395             }
396         ]
397     }, table_settings, null, additional_filters);
398
399     $("#illfilter_form").on('submit', filter);
400
401     function redrawTable() {
402         let table_dt = ill_requests_table.DataTable();
403         table_dt.draw();
404     }
405
406     function filter() {
407         redrawTable();
408         return false;
409     }
410
411     function clearSearch() {
412         let filters = [
413             "illfilter_backend",
414             "illfilter_branchname",
415             "illfilter_patron",
416             "illfilter_keyword",
417         ];
418         filters.forEach((filter) => {
419             $("#"+filter).val("");
420         });
421
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();
427
428         disableStatusFilter();
429
430         redrawTable();
431     }
432
433     function populateStatusFilter(backend) {
434         $.ajax({
435             type: "GET",
436             url: "/api/v1/ill/backends/"+backend,
437             headers: {
438                 'x-koha-embed': 'statuses+strings'
439             },
440             success: function(response){
441                 let statuses = response.statuses
442                 $('#illfilter_status').append(
443                     '<option value="">'+ill_all_statuses+'</option>'
444                 );
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>'
449                     );
450                 });
451             }
452         });
453     }
454
455     function populateBackendFilter() {
456         $.ajax({
457             type: "GET",
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>'
464                     );
465                 });
466             }
467         });
468     }
469
470     function disableStatusFilter() {
471         $('#illfilter_status').children().remove();
472         $("#illfilter_status").attr('title', ill_manage_select_backend_first);
473         $('#illfilter_status').prop("disabled", true);
474     }
475
476     function enableStatusFilter() {
477         $('#illfilter_status').children().remove();
478         $("#illfilter_status").attr('title', '');
479         $('#illfilter_status').prop("disabled", false);
480     }
481
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();
487         } else {
488             disableStatusFilter();
489         }
490     });
491
492     disableStatusFilter();
493     populateBackendFilter();
494
495     // Clear all filters
496     $('#clear_search').click(function() {
497         clearSearch();
498     });
499
500 });