LP1916085 Bootstrap OPAC - Pagination on copy table
[Evergreen.git] / Open-ILS / src / templates-bootstrap / opac / parts / record / copy_table.tt2
1 [%-
2
3 # If being used in serial mode, flatten list of units so that they can be
4 # used like one long list of copies without changing so much code below.
5 IF serial_holdings;
6     copies = [];
7     FOREACH h IN serial_holdings;
8         units = h.units.slice(0); # copy
9         FOREACH unit IN units;
10             unit.holding_label = h.label;
11         END;
12         copies = copies.merge(units);
13     END;
14 END;
15
16 FOREACH copy_info IN copies;
17     IF copy_info.call_number_label != '##URI##';
18         has_copies = 'true';
19     END;
20     IF copy_info.part_label != '';
21         has_parts = 'true';
22     END;
23     IF has_parts && has_copies;
24         LAST;
25     END;
26 END;
27 -%]
28 [%-
29 IF has_copies or ctx.foreign_copies;
30   depth = CGI.param('copy_depth').defined ? CGI.param('copy_depth') : CGI.param('depth').defined ? CGI.param('depth') : ctx.copy_summary.last.depth;
31   total_copies = ctx.copy_summary.$depth.count;
32 %]
33 <table class="container-fluid table table-hover mt-4 miniTable copyTable w-100" >
34     <thead>
35         <tr>
36             [% IF serial_holdings -%]
37             <th scope='col'>[% l("Issue Label") %]</th>
38             [%- ELSE -%]
39             <th scope='col'>[% l("Location") %]</th>
40             [%- END %]
41             <th scope='col'>[% l("Call Number / Copy Notes") %]</th>
42             [%- IF has_parts == 'true' %]
43             <th scope='col'>[% l("Part") %]</th>
44             [%- END %]
45             <th scope='col'>[% l("Barcode") %]</th>
46             <th scope='col'>[% l("Shelving Location") %]</th>
47             [%- IF ctx.is_staff || ctx.use_courses %]
48             <th scope='col'>[% l("Circulation Modifier") %]</th>
49             [%- END %]
50             [%- IF ctx.is_staff %]
51             <th scope='col'>[% l("Age Hold Protection") %]</th>
52             <th scope='col'>[% l("Active/Create Date") %]</th>
53             [%- END %]
54             [%- IF ctx.is_staff OR serial_holdings %]
55             <th scope='col'>[% l("Holdable?") %]</th>
56             [%- END %]
57             <th scope='col'>[% l("Status") %]</th>
58             <th scope='col'>[% l("Due Date") %]</th>
59             [%- IF ctx.use_courses %]
60             <th scope='col'>[% l("Courses") %]</th>
61             [%- END %]
62         </tr>
63     </thead>
64     <tbody>
65 [%- FOREACH peer IN ctx.foreign_copies;
66         FOREACH bib IN peer.foreign_copy_maps; %]
67     <tr><td>
68     [%- bib_lib_name = ctx.get_aou(bib.target_copy.circ_lib).name | html;
69         l("[_1] (foreign item)", bib_lib_name); -%]
70         <ul><li>
71             <span class="bib_peer_type">[% bib.peer_type.name | html %]</span>:
72             <a href="[% mkurl(ctx.opac_root _ '/record/' _ bib.target_copy.call_number.record) %]">
73                 <span class="bib_peer_title">[% peer.title | html %]</span> /
74                 <span class="bib_peer_author">[% peer.author | html %]</span>
75             </a>
76         </li></ul>
77     </td>
78     <td>[% bib.target_copy.call_number.label | html %]</td>
79     <td>[% bib.target_copy.barcode | html %]</td>
80     <td>[% bib.target_copy.location.name | html %]</td>
81     <td>[% bib.target_copy.status.name | html %]</td>
82     <td>[% date.format(ctx.parse_datetime(copy_info.due_date, copy_info.circ_circ_lib),DATE_FORMAT) %]</td>
83 </tr>
84    [%- END; # FOREACH peer
85 END; # FOREACH bib
86 -%]
87         [%- last_cn = 0;
88         FOR copy_info IN copies;
89             callnum = copy_info.call_number_label;
90             NEXT IF callnum == '##URI##';
91
92             callnum_prefix = copy_info.call_number_prefix_label;
93             IF callnum_prefix != "";
94                 callnum = callnum_prefix _ " " _ callnum;
95             END;
96
97             callnum_suffix = copy_info.call_number_suffix_label;
98             IF callnum_suffix != "";
99                 callnum = callnum  _ " " _ callnum_suffix;
100             END;
101         -%]
102         <tr property="offers" typeof="Offer">
103             [%- IF serial_holdings %]
104             <td class='rdetail-issue-issue'>
105                 [%- copy_info.holding_label | html; -%]
106             </td>
107             [%- ELSE %]<td>
108             [%- INCLUDE "opac/parts/library_name_link.tt2"; -%]
109                 <link property="businessFunction" href="http://purl.org/goodrelations/v1#LeaseOut">
110                 <meta property="price" content="0.00">
111             </td>[% END %]
112             <td><span property="sku">[% callnum | html %]</span> [% IF ctx.get_org_setting(CGI.param('loc')
113                 OR ctx.aou_tree.id, 'sms.enable') == 1 %](<a href="[% mkurl(ctx.opac_root _ '/sms_cn',
114                {copy_id => copy_info.id}) %];rec=[%- ctx.bre_id -%]" rel="nofollow" vocab="">Text</a>)[% END %]</td>
115             [%- IF has_parts == 'true' %]
116             <td>[% copy_info.part_label | html %]</td>
117             [%- END %]
118             <td property="serialNumber">
119                 [% copy_info.barcode | html -%]
120                 [% IF ctx.is_staff %]
121                   [%- IF ctx.is_browser_staff %]
122                     <a target="_blank" href="[% ctx.base_path %]/staff/cat/item/[% copy_info.id %]">[% l('view') %]</a>
123                     [% IF ctx.has_perm('UPDATE_COPY', copy_info.circ_lib)
124                         OR ctx.has_perm('UPDATE_COPY', copy_info.call_number_owning_lib) %]
125                         <span> | </span>
126                         <a target="_blank" href="[% ctx.base_path %]/staff/cat/item/[% copy_info.id %]/edit">[% l('edit') %]</a>
127                     [% END %]
128                   [% ELSE %]
129                     <a onclick="xulG.new_tab(xulG.urls.XUL_COPY_STATUS, {}, {'from_item_details_new': true, 'barcodes': ['[%- copy_info.barcode | html | replace('\'', '\\\'') -%]']})"
130                         href="javascript:;">[% l('view') %]</a>
131                     [%# if the user can edit copies, show the copy edit link %]
132                     [% IF ctx.has_perm('UPDATE_COPY', copy_info.circ_lib)
133                         OR ctx.has_perm('UPDATE_COPY', copy_info.call_number_owning_lib) %]
134                         <span> | </span>
135                         <a href="javascript:;"
136                             onclick="xulG.volume_item_creator({copy_id : [% copy_info.id %]})">
137                             [% l(' edit') %]
138                         </a>
139                     [% END %]
140                   [% END %]
141                 [% END %]
142                 [%- IF attrs.gtin13;
143                     '<meta property="gtin13" content="' _ attrs.gtin13 _ '" />';
144                 END; -%]
145             </td>
146             <td property="availableAtOrFrom">[%- INCLUDE "opac/parts/location_name_link.tt2"; -%]</td>
147             [% IF copy_info.courses.size > 0 || ctx.is_staff %]
148             <td>[% copy_info.circ_modifier | html %]</td>
149             [% ELSIF ctx.use_courses %]
150             <td></td>
151             [% END %]
152             [% IF ctx.is_staff %]
153             <td>
154                 [% copy_info.age_protect ?
155                     ctx.get_crahp(copy_info.age_protect).name : l('None') | html %]
156             </td>
157             <td>[%
158                 IF ctx.get_org_setting(copy_info.circ_lib, 'circ.holds.age_protect.active_date') == 1;
159                     disp_date = copy_info.active_date ? copy_info.active_date : copy_info.create_date;
160                 ELSE;
161                     disp_date = copy_info.create_date;
162                 END;
163
164                 IF disp_date;
165                     date.format(
166                         ctx.parse_datetime(disp_date),
167                         DATE_FORMAT
168                     );
169                 ELSE;
170                    '-';
171                 END;
172             %]</td>
173             [% END # is_staff %]
174             [% IF ctx.is_staff OR serial_holdings %]
175             <td>[%  # Show copy/volume hold links to staff (without
176                 # checking whether they have permissions to do those).
177                 overall_holdable = (
178                     copy_info.holdable == 't' AND
179                     copy_info.location_holdable == 't' AND
180                     copy_info.status_holdable == 't'
181                 );
182                 IF overall_holdable;
183                     hold_link = '';
184                     param_sep = l(" / ");
185
186                     # Only staff get to place copy or volume holds
187                     IF ctx.is_staff;
188                         hold_link = '<a href="' _
189                             mkurl(ctx.opac_root _ '/place_hold', {
190                                 hold_target => copy_info.id,
191                                 hold_type => 'C',
192                                 hold_source_page => mkurl()
193                             }) _ '">' _ l('Copy hold') _ '</a>';
194                         IF copy_info.call_number != last_cn;
195                             last_cn = copy_info.call_number;
196                             hold_link = hold_link _ param_sep;
197                             hold_link = hold_link _ '<a href="' _
198                                 mkurl(ctx.opac_root _ '/place_hold', {
199                                     hold_target => copy_info.call_number,
200                                     hold_type => 'V',
201                                     hold_source_page => mkurl()
202                                 }) _ '">' _ l('Volume hold') _ '</a>';
203                         END;
204                         IF serial_holdings;
205                             hold_link = hold_link _ param_sep;
206                         END;
207                     END;
208                     IF serial_holdings;
209                         hold_link = hold_link _
210                             '<a class="rdetail-issue-place-hold" href="' _
211                             mkurl(ctx.opac_root _ '/place_hold', {
212                                 hold_target => copy_info.issuance,
213                                 hold_type => 'I',
214                                 hold_source_page => mkurl()
215                             }) _ '" rel="nofollow" vocab="">' _ l('Issue hold') _ '</a>';
216                     END;
217
218                     hold_link;
219                 ELSE;
220                     l("Not holdable");
221                 END %]</td>
222             [%- END %]
223             <td>[%-
224                 schema_copy_status.${copy_info.status_code};
225                 copy_info.copy_status | html;
226             -%]</td>
227             <td>[%
228                 IF copy_info.due_date;
229                     date.format(
230                         ctx.parse_datetime(copy_info.due_date, copy_info.circ_circ_lib),
231                         DATE_FORMAT
232                     );
233                 ELSE;
234                     '-';
235                 END %]</td>
236             [%- IF ctx.use_courses %]
237             <td>[%- FOREACH course IN copy_info.courses %]
238                 <div>[% course.course_number %]</div>
239             [% END %]</td>
240             [% END %]
241         </tr>
242
243         [% IF copy_info.notes; %]
244             [% FOREACH note IN copy_info.notes; %]
245                 <tr><td>&nbsp;</td><td class="copy_note" colspan="4" property="description"><strong>[% note.title | html %]:</strong> [% note.value | html %]</td></tr>
246             [% END %]
247         [% END %]
248
249         [% IF copy_info.tags; %]
250             [% FOREACH tag IN copy_info.tags; %]
251                 <tr class="copy_tag_row">
252                     <td>&nbsp;</td>
253                     <td class="copy_tag" colspan="4">
254                     <span class="copy_tag_type_label">[% tag.tag_type.label _ ": " | html %]</span>
255                         <span class="copy_tag_value">
256                         [% IF tag.url %]
257                             <a href="[% tag.url | html %]">
258                             [% END %]
259                                 [% tag.value | html %]
260                             [% IF tag.url %]
261                             </a>
262                             [% END %]
263                         </span>
264                     </td>
265                 </tr>
266             [% END %]
267         [% END %]
268
269
270 [%- IF copy_info.peer_bib_marc.size > 0;
271 '<tr><td><ul>';
272     FOREACH bib IN copy_info.peer_bib_marc;
273         attrs = {marc_xml => bib};
274         PROCESS get_marc_attrs args=attrs %]
275 [%- IF attrs.bibid != ctx.bre_id; -%]
276     <li property="isRelatedTo" typeof="Product">
277         [%- # Map the bound-with relationship -%]
278         <a href="[% mkurl(ctx.opac_root _ '/record/' _ attrs.bibid) %]" property="url">
279             <span class="bib_peer_title" property="name">[% attrs.title | html %]</span>
280             / <span class="bib_peer_author">[% attrs.author | html %]</span>
281         </a>
282     </li>
283 [%- END; # IF attrs.bibid %]
284 [%- END; # FOREACH bib in copy_info.peer_bib_marc
285 '</ul></td></tr>';
286     END # IF copy_info.peer_bib_marc.size
287 %]
288
289 [%- END; # FOR copy_info
290 %]
291         [% IF ctx.copy_limit < total_copies AND NOT serial_holdings %]
292             <tr class="offset">
293             [%- IF ctx.copy_offset > 0;
294                 new_offset = ctx.copy_offset - ctx.copy_limit;
295                 IF new_offset < 0; new_offset = 0; END %]
296                 <td>
297                 <a href="[% mkurl('', {copy_offset => new_offset, copy_limit => ctx.copy_limit}) %]">&laquo; [%
298                     l('Previous [_1]', ctx.copy_offset - new_offset) %]</a>
299                 </td>
300             [%- END %]
301             [%- IF copies.size >= ctx.copy_limit AND (ctx.copy_offset + ctx.copy_limit < total_copies) %]
302                 <td>
303                     <a href="[% mkurl('', {copy_offset => ctx.copy_offset + ctx.copy_limit, copy_limit => ctx.copy_limit}) %]">[%
304                     l('Next [_1]', ctx.copy_limit) %] &raquo;</a>
305                 </td>
306             [%- END %]
307             </tr>
308         [% END %]
309
310         [% IF NOT serial_holdings -%]
311             [%- more_copies_limit = 50 %] [%# TODO: config %]
312             [%- IF  ctx.copy_limit != more_copies_limit AND copies.size >= ctx.copy_limit AND ctx.copy_limit < total_copies %]
313                 <tr class="not_serial">
314                     <td>
315                         <div class="rdetail_show_copies">
316                             <a href="[% mkurl('', {copy_limit => more_copies_limit, copy_offset => 0}) %]"><i class="fas fa-plus-square"></i> [% l('Show more copies') %]</a>
317                         </div>
318                     </td>
319                 </tr>
320             [%- ELSIF ctx.copy_limit == more_copies_limit %]
321                 <tr class="not_serial">
322                     <td>
323                         <div  class="rdetail_show_copies">
324                             <a href="[% mkurl('', {copy_limit => 0, copy_offset => 0}) %]"><i class="fas fa-minus-square"></i> [% l('Show fewer copies') %]</a>
325                         </div>
326                     </td>
327                 </tr>
328             [%- END %]
329         [%- END %]
330     </tbody>
331 </table>
332 [% END %]