Bug 20600: (follow-up) Add date range filtering
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / modules / ill / ill-requests.tt
1 [% USE raw %]
2 [% USE Asset %]
3 [% USE Branches %]
4 [% USE Koha %]
5 [% USE KohaDates %]
6
7 [% INCLUDE 'doc-head-open.inc' %]
8 <title>Koha &rsaquo; ILL requests  &rsaquo;</title>
9 [% INCLUDE 'doc-head-close.inc' %]
10 [% Asset.js("lib/jquery/plugins/jquery.checkboxes.min.js") | $raw %]
11 [% Asset.css("css/datatables.css") | $raw %]
12 [% INCLUDE 'datatables.inc' %]
13 [% INCLUDE 'calendar.inc' %]
14 <script type="text/javascript">
15     //<![CDATA[
16     $(document).ready(function() {
17
18         // Illview Datatable setup
19
20         var table;
21
22         // Filters that are active
23         var activeFilters = {};
24
25         // Fields we don't want to display
26         var ignore = [
27             'accessurl',
28             'backend',
29             'branchcode',
30             'completed',
31             'capabilities',
32             'cost',
33             'medium',
34             'notesopac',
35             'notesstaff',
36             'replied'
37         ];
38
39         // Fields we need to expand (flatten)
40         var expand = [
41             'metadata',
42             'patron'
43         ];
44
45         // Expanded fields
46         // This is auto populated
47         var expanded = {};
48
49         // The core fields that should be displayed first
50         var core = [
51             'metadata_author',
52             'metadata_title',
53             'borrowername',
54             'patron_cardnumber',
55             'biblio_id',
56             'library',
57             'status',
58             'placed',
59             'placed_formatted',
60             'updated',
61             'updated_formatted',
62             'illrequest_id',
63             'comments',
64             'action' // Action should always be last
65         ];
66
67         // Filterable columns
68         var filterable = {
69             status: {
70                 prep: function(tableData, oData) {
71                     var uniques = {};
72                     tableData.forEach(function(row) {
73                         var resolvedName = getStatusName(
74                             oData[0].capabilities[row.status].name
75                         );
76                         uniques[resolvedName] = 1
77                     });
78                     Object.keys(uniques).sort().forEach(function(unique) {
79                         $('#illfilter_status').append(
80                             '<option value="' + unique  +
81                             '">' + unique +  '</option>'
82                         );
83                     });
84                 },
85                 listener: function() {
86                     var me = 'status';
87                     $('#illfilter_status').change(function() {
88                         var sel = $('#illfilter_status option:selected').val();
89                         if (sel && sel.length > 0) {
90                             activeFilters[me] = function() {
91                                 table.column(6).search(sel);
92                             }
93                         } else {
94                             if (activeFilters.hasOwnProperty(me)) {
95                                 delete activeFilters[me];
96                             }
97                         }
98                     });
99                 },
100                 clear: function() {
101                     $('#illfilter_status').val('');
102                 }
103             },
104             pickupBranch: {
105                 prep: function(tableData, oData) {
106                     var uniques = {};
107                     tableData.forEach(function(row) {
108                         uniques[row.library.branchname] = 1
109                     });
110                     Object.keys(uniques).sort().forEach(function(unique) {
111                         $('#illfilter_branchname').append(
112                             '<option value="' + unique  +
113                             '">' + unique +  '</option>'
114                         );
115                     });
116                 },
117                 listener: function() {
118                     var me = 'pickupBranch';
119                     $('#illfilter_branchname').change(function() {
120                         var sel = $('#illfilter_branchname option:selected').val();
121                         if (sel && sel.length > 0) {
122                             activeFilters[me] = function() {
123                                 table.column(5).search(sel);
124                             }
125                         } else {
126                             if (activeFilters.hasOwnProperty(me)) {
127                                 delete activeFilters[me];
128                             }
129                         }
130                     });
131                 },
132                 clear: function() {
133                     $('#illfilter_branchname').val('');
134                 }
135             },
136             barcode: {
137                 listener: function() {
138                     var me = 'barcode';
139                     $('#illfilter_barcode').change(function() {
140                         var val = $('#illfilter_barcode').val();
141                         if (val && val.length > 0) {
142                             activeFilters[me] = function() {
143                                 table.column(3).search(val);
144                             }
145                         } else {
146                             if (activeFilters.hasOwnProperty(me)) {
147                                 delete activeFilters[me];
148                             }
149                         }
150                     });
151                 },
152                 clear: function() {
153                     $('#illfilter_barcode').val('');
154                 }
155             },
156             dateModified: {
157                 clear: function() {
158                     $('#illfilter_datemodified_start, #illfilter_datemodified_end').val('');
159                 }
160             },
161             datePlaced: {
162                 clear: function() {
163                     $('#illfilter_dateplaced_start, #illfilter_dateplaced_end').val('');
164                 }
165             }
166         };
167
168         // Remove any fields we're ignoring
169         var removeIgnore = function(dataObj) {
170             dataObj.forEach(function(thisRow) {
171                 ignore.forEach(function(thisIgnore) {
172                     if (thisRow.hasOwnProperty(thisIgnore)) {
173                         delete thisRow[thisIgnore];
174                     }
175                 });
176             });
177         };
178
179         // Expand any fields we're expanding
180         var expandExpand = function(row) {
181             expand.forEach(function(thisExpand) {
182                 if (row.hasOwnProperty(thisExpand)) {
183                     if (!expanded.hasOwnProperty(thisExpand)) {
184                         expanded[thisExpand] = [];
185                     }
186                     var expandObj = row[thisExpand];
187                     Object.keys(expandObj).forEach(
188                         function(thisExpandCol) {
189                             var expColName = thisExpand + '_' + thisExpandCol;
190                             // Keep a list of fields that have been expanded
191                             // so we can create toggle links for them
192                             if (expanded[thisExpand].indexOf(expColName) == -1) {
193                                 expanded[thisExpand].push(expColName);
194                             }
195                             expandObj[expColName] =
196                                 expandObj[thisExpandCol];
197                             delete expandObj[thisExpandCol];
198                         }
199                     );
200                     $.extend(true, row, expandObj);
201                     delete row[thisExpand];
202                 }
203             });
204         };
205
206         // Build a de-duped list of all column names
207         var allCols = {};
208         core.map(function(thisCore) {
209             allCols[thisCore] = 1;
210         });
211
212         // Strip the expand prefix if it exists, we do this for display
213         var stripPrefix = function(value) {
214             expand.forEach(function(thisExpand) {
215                 var regex = new RegExp(thisExpand + '_', 'g');
216                 value = value.replace(regex, '');
217             });
218             return value;
219         };
220
221         // Our 'render' function for borrowerlink
222         var createPatronLink = function(data, type, row) {
223             var patronLink = '<a title="' + _("View borrower details") + '" ' +
224                 'href="/cgi-bin/koha/members/moremember.pl?' +
225                 'borrowernumber='+row.borrowernumber+'">';
226                 if ( row.patron_firstname ) {
227                     patronLink = patronLink + row.patron_firstname + ' ';
228                 }
229                 patronLink = patronLink + row.patron_surname + '</a>';
230             return patronLink
231         };
232
233         // Our 'render' function for biblio_id
234         var createBiblioLink = function(data, type, row) {
235             return (row.biblio_id) ?
236                 '<a title="' + _("View biblio details") + '" ' +
237                 'href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=' +
238                 row.biblio_id + '">' +
239                 row.biblio_id +
240                 '</a>' : '';
241         };
242
243         // Our 'render' function for the library name
244         var createLibrary = function(data, type, row) {
245             return row.library.branchname;
246         };
247
248         // Render function for request ID
249         var createRequestId = function(data, type, row) {
250             return row.id_prefix + row.illrequest_id;
251         };
252
253         // Render function for request status
254         var createStatus = function(data, type, row, meta) {
255             var origData = meta.settings.oInit.originalData;
256             if (origData.length > 0) {
257                 var status_name = meta.settings.oInit.originalData[0].capabilities[
258                     row.status
259                 ].name;
260                 return getStatusName(status_name);
261             } else {
262                 return '';
263             }
264         };
265
266         var getStatusName = function(origName) {
267             switch( origName ) {
268                 case "New request":
269                     return _("New request");
270                 case "Requested":
271                     return _("Requested");
272                 case "Requested from partners":
273                     return _("Requested from partners");
274                 case "Request reverted":
275                     return _("Request reverted");
276                 case "Queued request":
277                     return _("Queued request");
278                 case "Cancellation requested":
279                     return _("Cancellation requested");
280                 case "Completed":
281                     return _("Completed");
282                 case "Delete request":
283                     return _("Delete request");
284                 default:
285                     return origName;
286             }
287         };
288
289         // Render function for creating a row's action link
290         var createActionLink = function(data, type, row) {
291             return '<a class="btn btn-default btn-sm" ' +
292                 'href="/cgi-bin/koha/ill/ill-requests.pl?' +
293                 'method=illview&amp;illrequest_id=' +
294                 row.illrequest_id +
295                 '">' + _("Manage request") + '</a>';
296         };
297
298         // Columns that require special treatment
299         var specialCols = {
300             action: {
301                 name: '',
302                 func: createActionLink
303             },
304             borrowername: {
305                 name: _("Patron"),
306                 func: createPatronLink
307             },
308             illrequest_id: {
309                 name: _("Request number"),
310                 func: createRequestId
311             },
312             status: {
313                 name: _("Status"),
314                 func: createStatus
315             },
316             biblio_id: {
317                 name: _("Bibliographic record ID"),
318                 func: createBiblioLink
319             },
320             library: {
321                 name: _("Library"),
322                 func: createLibrary
323             },
324             updated: {
325                 name: _("Updated on"),
326             },
327             patron_cardnumber: {
328                 name: _("Patron barcode")
329             }
330         };
331
332         // Toggle request attributes in Illview
333         $('#toggle_requestattributes').on('click', function(e) {
334             e.preventDefault();
335             $('#requestattributes').toggleClass('content_hidden');
336         });
337
338         // Toggle new comment form in Illview
339         $('#toggle_addcomment').on('click', function(e) {
340             e.preventDefault();
341             $('#addcomment').toggleClass('content_hidden');
342         });
343
344         // Filter partner list
345         $('#partner_filter').keyup(function() {
346             var needle = $('#partner_filter').val();
347             $('#partners > option').each(function() {
348                 var regex = new RegExp(needle, 'i');
349                 if (
350                     needle.length == 0 ||
351                     $(this).is(':selected') ||
352                     $(this).text().match(regex)
353                 ) {
354                     $(this).show();
355                 } else {
356                     $(this).hide();
357                 }
358             });
359         });
360
361         // Display the modal containing request supplier metadata
362         $('#ill-request-display-metadata').on('click', function(e) {
363             e.preventDefault();
364             $('#dataPreview').modal({show:true});
365         });
366
367         // Get our data from the API and process it prior to passing
368         // it to datatables
369         var ajax = $.ajax(
370             '/api/v1/illrequests?embed=metadata,patron,capabilities,library,comments'
371             ).done(function() {
372                 var data = JSON.parse(ajax.responseText);
373                 // Make a copy, we'll be removing columns next and need
374                 // to be able to refer to data that has been removed
375                 var dataCopy = $.extend(true, [], data);
376                 // Remove all columns we're not interested in
377                 removeIgnore(dataCopy);
378                 // Expand columns that need it and create an array
379                 // of all column names
380                 $.each(dataCopy, function(k, row) {
381                     expandExpand(row);
382                 });
383
384                 // Assemble an array of column definitions for passing
385                 // to datatables
386                 var colData = [];
387                 Object.keys(allCols).forEach(function(thisCol) {
388                     // Create the base column object
389                     var colObj = {
390                         name: thisCol,
391                         className: thisCol,
392                         defaultContent: ''
393                     };
394                     // We may need to process the data going in this
395                     // column, so do it if necessary
396                     if (
397                         specialCols.hasOwnProperty(thisCol) &&
398                         specialCols[thisCol].hasOwnProperty('func')
399                     ) {
400                         colObj.render = specialCols[thisCol].func;
401                     } else {
402                         colObj.data = thisCol;
403                     }
404                     colData.push(colObj);
405                 });
406
407                 // Initialise the datatable
408                 table = $('#ill-requests').DataTable($.extend(true, {}, dataTablesDefaults, {
409                     'aoColumnDefs': [
410                         { // Last column shouldn't be sortable or searchable
411                             'aTargets': [ 'actions' ],
412                             'bSortable': false,
413                             'bSearchable': false
414                         },
415                         { // Hide the two date columns we use just for sorting
416                             'aTargets': [ 'placed', 'updated' ],
417                             'bVisible': false,
418                             'bSearchable': false
419                         },
420                         { // When sorting 'placed', we want to use the
421                           // unformatted column
422                           'aTargets': [ 'placed_formatted'],
423                           'iDataSort': 7
424                         },
425                         { // When sorting 'updated', we want to use the
426                           // unformatted column
427                           'aTargets': [ 'updated_formatted'],
428                           'iDataSort': 9
429                         }
430                     ],
431                     'aaSorting': [[ 9, 'desc' ]], // Default sort, updated descending
432                     'processing': true, // Display a message when manipulating
433                     'iDisplayLength': 10, // 10 results per page
434                     'sPaginationType': "full_numbers", // Pagination display
435                     'deferRender': true, // Improve performance on big datasets
436                     'data': dataCopy,
437                     'columns': colData,
438                     'originalData': data, // Enable render functions to access
439                                           // our original data
440                     'initComplete': function() {
441
442                         // Prepare any filter elements that need it
443                         for (var el in filterable) {
444                             if (filterable.hasOwnProperty(el)) {
445                                 if (filterable[el].hasOwnProperty('prep')) {
446                                     filterable[el].prep(dataCopy, data);
447                                 }
448                                 if (filterable[el].hasOwnProperty('listener')) {
449                                     filterable[el].listener();
450                                 }
451                             }
452                         }
453
454                     }
455                 }));
456
457                 // Custom date range filtering
458                 $.fn.dataTable.ext.search.push(function(settings, data, dataIndex) {
459                     var placedStart = $('#illfilter_dateplaced_start').datepicker('getDate');
460                     var placedEnd = $('#illfilter_dateplaced_end').datepicker('getDate');
461                     var modifiedStart = $('#illfilter_datemodified_start').datepicker('getDate');
462                     var modifiedEnd = $('#illfilter_datemodified_end').datepicker('getDate');
463                     var rowPlaced = data[8] ? new Date(data[8]) : null;
464                     var rowModified = data[10] ? new Date(data[10]) : null;
465                     var placedPassed = true;
466                     var modifiedPassed = true;
467                     if (placedStart && rowPlaced && rowPlaced < placedStart) {
468                         placedPassed = false
469                     };
470                     if (placedEnd && rowPlaced && rowPlaced > placedEnd) {
471                         placedPassed = false;
472                     }
473                     if (modifiedStart && rowModified && rowModified < modifiedStart) {
474                         modifiedPassed = false
475                     };
476                     if (modifiedEnd && rowModified && rowModified > modifiedEnd) {
477                         modifiedPassed = false;
478                     }
479
480                     return placedPassed && modifiedPassed;
481
482                 });
483
484             }
485         );
486
487         var clearSearch = function() {
488             table.search('').columns().search('');
489             activeFilters = {};
490             for (var filter in filterable) {
491                 if (
492                     filterable.hasOwnProperty(filter) &&
493                     filterable[filter].hasOwnProperty('clear')
494                 ) {
495                     filterable[filter].clear();
496                 }
497             }
498             table.draw();
499         };
500
501         // Apply any search filters, or clear any previous
502         // ones
503         $('#illfilter_form').submit(function(event) {
504             event.preventDefault();
505             table.search('').columns().search('');
506             for (var active in activeFilters) {
507                 if (activeFilters.hasOwnProperty(active)) {
508                     activeFilters[active]();
509                 }
510             }
511             table.draw();
512         });
513
514         // Clear all filters
515         $('#clear_search').click(function() {
516             clearSearch();
517         });
518
519     });
520     //]]>
521 </script>
522 </head>
523
524 <body id="illrequests" class="ill">
525 [% INCLUDE 'header.inc' %]
526 [% INCLUDE 'cat-search.inc' %]
527
528 <div id="breadcrumbs">
529     <a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo;
530     <a href="/cgi-bin/koha/ill/ill-requests.pl">ILL requests</a>
531     [% IF query_type == 'create' %]
532          &rsaquo; New request
533     [% ELSIF query_type == 'status' %]
534          &rsaquo; Status
535     [% END %]
536 </div>
537
538 <div id="doc3" class="yui-t2">
539     <div id="bd">
540         [% IF query_type == 'illlist' %]
541         <div id="illfilter_yui_column" class="yui-b">
542             <form method="get" id="illfilter_form">
543                 <fieldset class="brief">
544                     <h3>Filters</h3>
545                     <ol>
546                         <li>
547                             <label for="illfilter_status">Status:</label>
548                             <select name="illfilter_status" id="illfilter_status">
549                                 <option value=""></option>
550                             </select>
551                         </li>
552                         <li>
553                             <label for="illfilter_dateplaced_start">Date placed between:</label>
554                             <input type="text" name="illfilter_dateplaced_start" id="illfilter_dateplaced_start" class="datepicker">
555                         </li>
556                         <li>
557                             <label for="illfilter_dateplaced_end">and:</label>
558                             <input type="text" name="illfilter_dateplaced_end" id="illfilter_dateplaced_end" class="datepicker">
559                         </li>
560                         <li>
561                             <label for="illfilter_datemodified_start">Updated between:</label>
562                             <input type="text" name="illfilter_datemodified_start" id="illfilter_datemodified_start" class="datepicker">
563                         </li>
564                         <li>
565                             <label for="illfilter_datemodified_end">and:</label>
566                             <input type="text" name="illfilter_datemodified_end" id="illfilter_datemodified_end" class="datepicker">
567                         </li>
568                         <li>
569                             <label for="illfilter_branchname">Library:</label>
570                             <select name="illfilter_branchname" id="illfilter_branchname">
571                                 <option value=""></option>
572                             </select>
573                         </li>
574                         <li>
575                             <label for="illfilter_barcode">Patron barcode:</label>
576                             <input type="text" name="illfilter_barcode" id="illfilter_barcode">
577                         </li>
578                     </ol>
579                     <fieldset class="action">
580                         <input type="submit" value="Search" />
581                         <input type="button" value="Clear" id="clear_search" />
582                     </fieldset>
583                 </fieldset>
584             </form>
585         </div>
586         [% END %]
587         <div id="yui-main">
588             <div id="interlibraryloans" class="yui-b">
589         [% IF !backends_available || !has_branch %]
590             <div class="dialog message">ILL module configuration problem. Take a look at the <a href="/cgi-bin/koha/about.pl#sysinfo">about page</a></div>
591         [% ELSE %]
592                 [% INCLUDE 'ill-toolbar.inc' %]
593
594                 [% IF whole.error %]
595                     <h1>Error performing operation</h1>
596                     <!-- Dispatch on Status -->
597                     <p>We encountered an error:</p>
598                     <p>
599                       <pre>[% whole.message | html %] ([% whole.status | html %])</pre>
600                     </p>
601                 [% END %]
602
603                 [% IF query_type == 'create' %]
604                     <h1>New ILL request</h1>
605                     [% PROCESS $whole.template %]
606
607                 [% ELSIF query_type == 'confirm' %]
608                     <h1>Confirm ILL request</h1>
609                     [% PROCESS $whole.template %]
610
611                 [% ELSIF query_type == 'cancel' and !whole.error %]
612                     <h1>Cancel a confirmed request</h1>
613                     [% PROCESS $whole.template %]
614
615                 [% ELSIF query_type == 'generic_confirm' %]
616                     <h1>Place request with partner libraries</h1>
617                   [% IF error %]
618                     [% IF error == 'no_target_email' %]
619                         <div class="alert">
620                             No target email addresses found. Either select at least
621                             one partner or check your ILL partner library records.
622                         </div>
623                     [% ELSIF error == 'no_library_email' %]
624                         <div class="alert">
625                             Your library has no usable email address. Please set it.
626                         </div>
627                     [% ELSIF error == 'unkown_error' %]
628                         <div class="alert">
629                             Unknown error processing your request. Contact your administrator.
630                         </div>
631                     [% END %]
632                   [% END %]
633                     <!-- Start of GENERIC_EMAIL case -->
634                     [% IF whole.value.partners %]
635                        [% ill_url = "/cgi-bin/koha/ill/ill-requests.pl?method=illview&illrequest_id=" _ request.illrequest_id %]
636                         <form method="POST" action="/cgi-bin/koha/ill/ill-requests.pl">
637                             <fieldset class="rows">
638                                 <legend>Interlibrary loan request details</legend>
639                                 <ol>
640                                     <li>
641                                         <label for="partner_filter">Filter partner libraries:</label>
642                                         <input type="text" id="partner_filter">
643                                     </li>
644                                     <li>
645                                         <label for="partners" class="required">Select partner libraries:</label>
646                                         <select size="5" multiple="true" id="partners" name="partners" required="required">
647                                             [% FOREACH partner IN whole.value.partners %]
648                                                 <option value=[% partner.email | html %]>
649                                                     [% partner.branchcode _ " - " _ partner.surname %]
650                                                 </option>
651                                             [% END %]
652                                         </select>
653
654                                     </li>
655                                     <li>
656                                         <label for="subject" class="required">Subject Line</label>
657                                         <input type="text" name="subject" id="subject" type="text" value="[% whole.value.draft.subject | html %]" required="required" />
658                                     </li>
659                                     <li>
660                                         <label for="body" class="required">Email text:</label>
661                                         <textarea name="body" id="body" rows="20" cols="80" required="required">[% whole.value.draft.body | html %]</textarea>
662                                     </li>
663                                 </ol>
664                                 <input type="hidden" value="generic_confirm" name="method">
665                                 <input type="hidden" value="draft" name="stage">
666                                 <input type="hidden" value="[% request.illrequest_id | html %]" name="illrequest_id">
667                             </fieldset>
668                             <fieldset class="action">
669                                 <input type="submit" class="btn btn-default" value="Send email"/>
670                                 <span><a href="[% ill_url | url %]" title="Return to request details">Cancel</a></span>
671                             </fieldset>
672                         </form>
673                     [% ELSE %]
674                         <fieldset class="rows">
675                             <legend>Interlibrary loan request details</legend>
676                             <p>No partners have been defined yet. Please create appropriate patron records (by default ILLLIBS category).</p>
677                             <p>Be sure to provide email addresses for these patrons.</p>
678                             <p><span><a href="[% ill_url | url %]" title="Return to request details">Cancel</a></span></p>
679                         </fieldset>
680                     [% END %]
681                 <!-- generic_confirm ends here -->
682
683                 [% ELSIF query_type == 'edit_action' %]
684                     <form method="POST" action="/cgi-bin/koha/ill/ill-requests.pl">
685                         <fieldset class="rows">
686                             <legend>Request details</legend>
687                             <ol>
688                                 [% type = request.get_type %]
689                                 <li class="borrowernumber">
690                                     <label for="borrowernumber">Patron ID:</label>
691                                     [% request.borrowernumber | html %]
692                                 </li>
693                                 <li class="biblio_id">
694                                     <label for="biblio_id" class="biblio_id">Bibliographic record ID:</label>
695                                     <input name="biblio_id" id="biblio_id" type="text" value="[% request.biblio_id | html %]">
696                                 </li>
697                                 <li class="branchcode">
698                                     <label for="library" class="branchcode">Library:</label>
699                                     <select name="branchcode" id="library">
700                                         [% PROCESS options_for_libraries libraries => Branches.all( selected => request.branchcode ) %]
701                                     </select>
702                                 </li>
703                                 <li class="status">
704                                     <label class="status">Status:</label>
705                                     [% stat = request.status %]
706                                     [% request.capabilities.$stat.name | html %]
707                                 </li>
708                                 <li class="updated">
709                                     <label class="updated">Last updated:</label>
710                                     [% request.updated | $KohaDates  with_hours => 1 %]
711                                 </li>
712                                 <li class="medium">
713                                     <label class="medium">Request type:</label>
714                                     [% IF type %][% type | html %][% ELSE %]<span>N/A</span>[% END %]
715                                 </li>
716                                 <li class="cost">
717                                     <label class="cost">Cost:</label>
718                                     [% IF request.cost %][% request.cost | html %][% ELSE %]<span>N/A</span>[% END %]
719                                 </li>
720                                 <li class="price_paid">
721                                     <label class="price_paid">Price paid:</label>
722                                     <input name="price_paid" id="price_paid" type="text" value="[% request.price_paid | html %]">
723                                 </li>
724                                 <li class="req_id">
725                                     <label class="req_id">Request number:</label>
726                                     [% request.id_prefix _ request.illrequest_id | html %]
727                                 </li>
728                                 <li class="notesstaff">
729                                     <label for="notesstaff" class="notesstaff">Staff notes:</label>
730                                     <textarea name="notesstaff" id="notesstaff" rows="5">[% request.notesstaff | html %]</textarea>
731                                 </li>
732                                 <li class="notesopac">
733                                     <label for="notesopac" class="notesopac">Opac notes:</label>
734                                     <textarea name="notesopac" id="notesopac" rows="5">[% request.notesopac | html %]</textarea>
735                                 </li>
736                             </ol>
737                         </fieldset>
738                         <fieldset class="action">
739                             <input type="hidden" value="edit_action" name="method">
740                             <input type="hidden" value="form" name="stage">
741                             <input type="hidden" value="[% request.illrequest_id | html %]" name="illrequest_id">
742                             <input type="hidden" value="[% request.borrowernumber | html %]" name="borrowernumber">
743                             <input type="submit" value="Submit">
744                             <a class="cancel" href="/cgi-bin/koha/ill/ill-requests.pl?method=illview&amp;illrequest_id=[% request.id | html %]">Cancel</a>
745                         </fieldset>
746                     </form>
747
748                 [% ELSIF query_type == 'delete_confirm' %]
749
750                     <div class="dialog alert">
751                         <h3>Are you sure you wish to delete this request?</h3>
752                         <form action="/cgi-bin/koha/ill/ill-requests.pl" method="post">
753                             <input type="hidden" name="method" value="delete" />
754                             <input type="hidden" name="confirmed" value="1" />
755                             <input type="hidden" name="illrequest_id" value="[% request.id | html %]" />
756                             <button type="submit" class="btn btn-default btn-sm approve"><i class="fa fa-fw fa-check"></i> Yes, delete</button>
757                         </form>
758                         <a class="btn btn-default btn-sm deny" href="/cgi-bin/koha/ill/ill-requests.pl?method=illview&amp;illrequest_id=[% request.id | html %]"><i class="fa fa-fw fa-remove"></i>No, do not delete</a>
759                     </div>
760
761                 [% ELSIF query_type == 'illview' %]
762                     [% req_status = request.status %]
763
764                     [% IF error %]
765                       [% IF error == 'migrate_target' %]
766                           <div class="alert">
767                               The backend you tried to migrate to does not yet support migrations, please try again with an alternative target.
768                           </div>
769                       [% END %]
770                     [% END %]
771
772                     <h1>Manage ILL request</h1>
773                     <div id="request-toolbar" class="btn-toolbar">
774                         <a title="Edit request" id="ill-toolbar-btn-edit-action" class="btn btn-sm btn-default" href="/cgi-bin/koha/ill/ill-requests.pl?method=edit_action&amp;illrequest_id=[% request.illrequest_id | html %]">
775                         <span class="fa fa-pencil"></span>
776                         Edit request
777                         </a>
778                         [% FOREACH action IN request.available_actions %]
779                             [% IF action.method == 'migrate' %]
780                                 [% IF backends.size > 2 %]
781                                     <div class="dropdown btn-group">
782                                         <button class="btn btn-sm btn-default dropdown-toggle" type="button" id="ill-migrate-dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
783                                             <i class="fa [% action.ui_method_icon | html %]"></i> [% action.ui_method_name | html %] <span class="caret"></span>
784                                         </button>
785                                         <ul class="dropdown-menu" aria-labelledby="ill-migrate-dropdown">
786                                             [% FOREACH backend IN backends %]
787                                                 [% IF backend != request.backend %]
788                                                     <li><a href="/cgi-bin/koha/ill/ill-requests.pl?method=[% action.method | uri %]&amp;illrequest_id=[% request.illrequest_id | uri %]&amp;backend=[% backend | uri %]">[% backend | html %]</a></li>
789                                                 [% END %]
790                                             [% END %]
791                                         </ul>
792                                     </div>
793                                 [% ELSIF backends.size == 2 %]
794                                     [% FOREACH backend IN backends %]
795                                         [% IF backend != request.backend %]
796                                             <a title="[% action.ui_method_name | html %]" id="ill-toolbar-btn-[% action.id | lower | html %]" class="btn btn-sm btn-default" href="/cgi-bin/koha/ill/ill-requests.pl?method=[% action.method | uri %]&amp;illrequest_id=[% request.illrequest_id | uri %]&amp;backend=[% backend | uri %]">
797                                             <span class="fa [% action.ui_method_icon | html %]"></span>
798                                             [% action.ui_method_name | html %]
799                                             </a>
800                                         [% END %]
801                                     [% END %]
802                                 [% END %]
803                             [% ELSIF action.method != 0 %]
804                                 <a title="[% action.ui_method_name | html %]" id="ill-toolbar-btn-[% action.id | lower | html %]" class="btn btn-sm btn-default" href="/cgi-bin/koha/ill/ill-requests.pl?method=[% action.method | uri %]&amp;illrequest_id=[% request.illrequest_id | uri %]">
805                                 <span class="fa [% action.ui_method_icon | html %]"></span>
806                                 [% action.ui_method_name | html %]
807                                 </a>
808                             [% END %]
809                         [% END %]
810                         <a title="Display supplier metadata" id="ill-request-display-metadata" class="btn btn-sm btn-default pull-right" href="#">
811                             <span class="fa fa-eye"></span>
812                             Display supplier metadata
813                         </a>
814                     </div>
815                     <div class="ill-view-panel panel panel-default">
816                         <div class="panel-heading">
817                             <h3>Request details</h3>
818                         </div>
819                         <div class="panel-body">
820                             <h4>Details from library</h4>
821                             <div class="rows">
822                                 <ol>
823                                     <li class="orderid">
824                                         <span class="label orderid">Order ID:</span>
825                                         [% IF request.orderid %][% request.orderid | html %][% ELSE %]<span>N/A</span>[% END %]
826                                     </li>
827                                     <li class="borrowernumber">
828                                         <span class="label borrowernumber">Patron:</span>
829                                         [% borrowerlink = "/cgi-bin/koha/members/moremember.pl" _ "?borrowernumber=" _ request.patron.borrowernumber %]
830                                         <a href="[% borrowerlink | url %]" title="View borrower details">
831                                         [% request.patron.firstname _ " " _ request.patron.surname _ " [" _ request.patron.cardnumber _ "]" | html %]
832                                         </a>
833                                     </li>
834
835                                     <li class="biblio_id">
836                                         <span class="label biblio_id">Bibliographic record ID:</span>
837                                         [% IF request.biblio_id %]
838                                             <a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% request.biblio_id | uri %]">[% request.biblio_id | html %]</a>
839                                         [% ELSE %]
840                                             <span>N/A</span>
841                                         [% END %]
842                                     </li>
843                                     <li class="branchcode">
844                                         <span class="label branchcode">Library:</span>
845                                         [% Branches.GetName(request.branchcode) | html %]
846                                     </li>
847                                     <li class="status">
848                                         <span class="label status">Status:</span>
849                                         [% request.capabilities.$req_status.name | html %]
850                                     </li>
851                                     <li class="updated">
852                                         <span class="label updated">Last updated:</span>
853                                         [% request.updated | $KohaDates  with_hours => 1 %]
854                                     </li>
855                                     <li class="medium">
856                                         <span class="label medium">Request type:</span>
857                                         [% type = request.get_type %]
858                                         [% IF type %][% type | html %][% ELSE %]<span>N/A</span>[% END %]
859                                     </li>
860                                     <li class="cost">
861                                         <span class="label cost">Cost:</span>
862                                         [% IF request.cost %][% request.cost | html %][% ELSE %]<span>N/A</span>[% END %]
863                                     </li>
864                                     <li class="price_paid">
865                                         <span class="label price_paid">Price paid:</span>
866                                         [% IF request.price_paid %][% request.price_paid | html %][% ELSE %]<span>N/A</span>[% END %]
867                                     </li>
868                                     <li class="req_id">
869                                         <span class="label req_id">Request number:</span>
870                                         [% request.id_prefix _ request.illrequest_id | html %]
871                                     </li>
872                                     <li class="notesstaff">
873                                         <span class="label notes_staff">Staff notes:</span>
874                                         <p>[% request.notesstaff | html %]</p>
875                                     </li>
876                                     <li class="notesopac">
877                                         <span class="label notes_opac">Notes:</span>
878                                         <p>[% request.notesopac | html %]</p>
879                                     </li>
880                                 </ol>
881                             </div>
882                             <div class="rows">
883                                 <h4>Details from supplier ([% request.backend | html %])</h4>
884                                 <ol>
885                                     [% FOREACH meta IN request.metadata %]
886                                         <li class="requestmeta-[% meta.key.replace('\s','_') | html %]">
887                                             <span class="label">[% meta.key | html %]:</span>
888                                             [% meta.value | html %]
889                                         </li>
890                                     [% END %]
891                                 </ol>
892                             </div>
893                         </div>
894                     </div>
895
896                     <div id="dataPreview" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="dataPreviewLabel" aria-hidden="true">
897                         <div class="modal-dialog">
898                             <div class="modal-content">
899                                 <div class="modal-header">
900                                     <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
901                                     <h3 id="dataPreviewLabel"> Supplier metadata</h3>
902                                 </div>
903                                 <div class="modal-body">
904                                     <div id="requestattributes">
905                                         [% FOREACH attr IN request.illrequestattributes %]
906                                         <div class="requestattr-[% attr.type | html %]">
907                                             <span class="label">[% attr.type | html %]:</span>
908                                             [% attr.value | html %]
909                                         </div>
910                                             [% END %]
911                                     </div>
912                                 </div>
913                                 <div class="modal-footer">
914                                     <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">Close</button>
915                                 </div>
916                             </div>
917                         </div>
918                     </div>
919
920                     <div class="ill-view-panel panel panel-default">
921                         <div class="panel-heading">
922                             <h3>[% request.illcomments.count | html %] comments</h3>
923                         </div>
924                         <div class="panel-body">
925                             [% IF request.illcomments.count && request.illcomments.count > 0 %]
926                                 [% FOREACH comment IN request.illcomments %]
927                                     <div class="rows comment_[% comment.patron.categorycode | html %]">
928                                     <h5>Comment by:
929                                     <a href="[% borrowerlink | url %]" title="View borrower details">
930                                     [% comment.patron.firstname _ " " _ comment.patron.surname _ " [" _ comment.patron.cardnumber _ "]" | html %]</a>
931                                     [% comment.timestamp | $KohaDates with_hours => 1 %]</h5>
932                                     <p>[% comment.comment | html %]</p>
933                                     </div>
934                                 [% END %]
935                             [% END %]
936                                 <div class="rows">
937                                     <h3><a id="toggle_addcomment" href="#">Add comment</a></h3>
938                                     <div id="addcomment" class="content_hidden">
939                                         <form class="validated" method="post" action="/cgi-bin/koha/ill/ill-requests.pl">
940                                             <input type="hidden" value="save_comment" name="method">
941                                             <input type="hidden" value="[% csrf_token | html %]" name="csrf_token">
942                                             <input type="hidden" value="[% request.illrequest_id | html %]" name="illrequest_id">
943                                             <fieldset class="rows">
944                                                 <ol>
945                                                     <li>
946                                                         <label class="required" for="comment">Comment: </label>
947                                                         <textarea class="required" required="required" cols="80" rows="10" id="comment" name="comment"></textarea>
948                                                         <span class="required">Required</span>
949                                                     </li>
950                                                 </ol>
951                                             </fieldset>
952                                             <fieldset class="action">
953                                                 <input type="submit" value="Submit">
954                                             </fieldset>
955                                         </form>
956                                     </div>
957                                 </div>
958                             </div>
959                     </div>
960
961                 [% ELSIF query_type == 'illlist' %]
962                     <!-- illlist -->
963                     <h1>View ILL requests</h1>
964                     <div id="results">
965                         <h3>Details for all requests</h3>
966
967                         <table id="ill-requests">
968                             <thead>
969                                 <tr id="illview-header">
970                                     <th>Author</th>
971                                     <th>Title</th>
972                                     <th>Patron</th>
973                                     <th>Bibliographic record ID</th>
974                                     <th>Library</th>
975                                     <th>Status</th>
976                                     <th class="placed">&nbsp;</th>
977                                     <th class="placed_formatted">Date placed</th>
978                                     <th class="updated">&nbsp;</th>
979                                     <th class="updated_formatted">Updated on</th>
980                                     <th>Request number</th>
981                                     <th>Comments</th>
982                                     <th class="actions"></th>
983                                 </tr>
984                             </thead>
985                             <tbody id="illview-body">
986                             </tbody>
987                         </table>
988                     </div>
989                 [% ELSE %]
990                 <!-- Custom Backend Action -->
991                 [% PROCESS $whole.template %]
992
993                 [% END %]
994         [% END %]
995             </div>
996         </div>
997     </div>
998
999 [% TRY %]
1000 [% PROCESS backend_jsinclude %]
1001 [% CATCH %]
1002 [% END %]
1003
1004 [% INCLUDE 'intranet-bottom.inc' %]