]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/templates/opac/parts/record/copy_table.tt2
358b836b161549c52592ddedb7508e5789366eff
[Evergreen.git] / Open-ILS / src / templates / 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 [%- MACRO display_ou_distance(ou) BLOCK;
29     km = ctx.ou_distances.$ou;
30     IF km && km != '-1';
31         IF ctx.get_org_setting(ctx.physical_loc || ctx.search_ou, 'opac.geographic_proximity_in_miles');
32             distance = l('[_1] mi', POSIX.sprintf('%.01f', km / 1.609));
33         ELSE;
34             distance = l('[_1] km', POSIX.sprintf('%.01f', km));
35         END;
36     ELSE;
37         distance = '-';
38     END;
39 %]
40 [% distance %]
41 [%- END %]
42 [%-
43 IF has_copies or ctx.foreign_copies;
44   depth = CGI.param('copy_depth').defined ? CGI.param('copy_depth') : CGI.param('depth').defined ? CGI.param('depth') : ctx.copy_summary.last.depth;
45   total_copies = ctx.copy_summary.$depth.count;
46 %]
47 [% use_courses = (ctx.get_org_setting(ctx.aou_tree.id, 'circ.course_materials_opt_in') == 1) ? 1 : 0 %]
48 [% IF ctx.geo_sort %]
49 <form method="GET">
50 [% FOREACH p IN CGI.params.keys; NEXT IF p == 'geographic-location' %]
51   <input type="hidden" name="[% p | html %]" value="[% CGI.params.$p | html %]"/>
52 [% END %]
53 <span with="50%">
54 <th colspan="6">
55     [% l("Sort by distance from:") %]
56     <input type="text" id="geographic-location-box" name="geographic-location" aria-label="[% l('Enter address or postal code') %]" placeholder="[% l('Enter address/postal code') %]" class="search-box" x-webkit-speech="" value="[% p = 'geographic-location'; CGI.params.$p %]"></input>
57     <button type="submit" class="opac-button">[% l('Go') %]</button>
58 </span>
59 [% p = 'geographic-location'; IF CGI.params.$p && !ctx.has_valid_coords %]
60 <span class="alert">[% l('Sorry, your address is not recognized') %]</span>
61 [% END %]
62 </form>
63 [% p = 'geographic-location'; IF CGI.params.$p && ctx.has_valid_coords %]
64 <form method="GET">
65 [% FOREACH p IN CGI.params.keys; NEXT IF p == 'geographic-location' %]
66   <input type="hidden" name="[% p | html %]" value="[% CGI.params.$p | html %]"/>
67 [% END %]
68    <button type="submit" class="opac-button">[% l('Use default item sort') %]</button>
69 </form>
70 [% END %]
71 [% END %]
72 <table class="table_no_border_space table_no_cell_pad table_no_border" width="100%" id="rdetails_status">
73     <thead>
74         <tr>
75             [% IF serial_holdings -%]
76             <th scope='col'>[% l("Issue Label") %]</th>
77             [%- ELSE -%]
78             <th scope='col'>[% l("Location") %]</th>
79             [%- END %]
80             <th scope='col'>[% l("Call Number / Copy Notes") %]</th>
81             [%- IF has_parts == 'true' %]
82             <th scope='col'>[% l("Part") %]</th>
83             [%- END %]
84             <th scope='col'>[% l("Barcode") %]</th>
85             <th scope='col'>[% l("Shelving Location") %]</th>
86             [% IF ctx.is_staff || use_courses %]
87             <th scope='col'>[% l("Circulation Modifier") %]</th>
88             [% END %]
89             [% IF ctx.is_staff %]
90             <th scope='col'>[% l("Age Hold Protection") %]</th>
91             <th scope='col'>[% l("Active/Create Date") %]</th>
92             [%- END %]
93             [%- IF ctx.is_staff OR serial_holdings %]
94             <th scope='col'>[% l("Holdable?") %]</th>
95             [%- END %]
96             <th scope='col'>[% l("Status") %]</th>
97             <th scope='col'>[% l("Due Date") %]</th>
98             [%- IF use_courses %]
99             <th scope='col'>[% l("Courses") %]</th>
100             [%- END %]
101             [%- IF ctx.geo_sort && ctx.has_valid_coords %]
102             <th scope='col'>[% l("Distance") %]</th>
103             [%- END %]
104         </tr>
105     </thead>
106     <tbody class="copy_details_table">
107 [%- FOREACH peer IN ctx.foreign_copies;
108         FOREACH bib IN peer.foreign_copy_maps; %]
109     <tr class="copy_details_row"><td>
110     [%- bib_lib_name = ctx.get_aou(bib.target_copy.circ_lib).name | html;
111         l("[_1] (foreign item)", bib_lib_name); -%]
112         <ul><li>
113             <span class="bib_peer_type">[% bib.peer_type.name | html %]</span>:
114             <a href="[% mkurl(ctx.opac_root _ '/record/' _ bib.target_copy.call_number.record) %]">
115                 <span class="bib_peer_title">[% peer.title | html %]</span> / 
116                 <span class="bib_peer_author">[% peer.author | html %]</span>
117             </a>
118         </li></ul>
119     </td>
120     <td>[% bib.target_copy.call_number.label | html %]</td>
121     <td>[% bib.target_copy.barcode | html %]</td>
122     <td>[% bib.target_copy.location.name | html %]</td>
123     <td>[% bib.target_copy.status.name | html %]</td>
124     <td>[% date.format(ctx.parse_datetime(copy_info.due_date, copy_info.circ_circ_lib),DATE_FORMAT) %]</td>
125     [%- IF use_courses %]
126     <td></td>
127     [%- END %]
128     [%- IF ctx.geo_sort && ctx.has_valid_coords %]
129     <td>[% display_ou_distance(bib.target_copy.circ_lib) %]</td>
130     [%- END %]
131 </tr>
132    [%- END; # FOREACH peer
133 END; # FOREACH bib
134 -%]
135         [%- last_cn = 0;
136         FOR copy_info IN copies;
137             callnum = copy_info.call_number_label;
138             NEXT IF callnum == '##URI##';
139
140             callnum_prefix = copy_info.call_number_prefix_label;
141             IF callnum_prefix != "";
142                 callnum = callnum_prefix _ " " _ callnum;
143             END;
144
145             callnum_suffix = copy_info.call_number_suffix_label;
146             IF callnum_suffix != "";
147                 callnum = callnum  _ " " _ callnum_suffix;
148             END;
149         -%]
150         <tr class="copy_details_offers_row" property="offers" typeof="Offer">
151             [%- IF serial_holdings %]<td class='rdetail-issue-issue'>
152                 [%- copy_info.holding_label | html; -%]
153             </td>
154             [%- ELSE %]<td>
155             [%- INCLUDE "opac/parts/library_name_link.tt2"; -%]
156                 <link property="businessFunction" href="http://purl.org/goodrelations/v1#LeaseOut">
157                 <meta property="price" content="0.00">
158             </td>[% END %]
159             <td><span property="sku">[% callnum | html %]</span> [% IF ctx.get_org_setting(CGI.param('loc') 
160                 OR ctx.aou_tree.id, 'sms.enable') == 1 %](<a href="[% mkurl(ctx.opac_root _ '/sms_cn', 
161                {copy_id => copy_info.id}) %];rec=[%- ctx.bre_id -%]" rel="nofollow" vocab="">Text</a>)[% END %]</td>
162             [%- IF has_parts == 'true' %]
163             <td>[% copy_info.part_label | html %]</td>
164             [%- END %]
165             <td property="serialNumber">
166                 [% copy_info.barcode | html -%]
167                 [% IF ctx.is_staff %]
168                   [%- IF ctx.is_browser_staff %]
169                     <a target="_blank" href="[% ctx.base_path %]/staff/cat/item/[% copy_info.id %]">[% l('view') %]</a>
170                     [% IF ctx.has_perm('UPDATE_COPY', copy_info.circ_lib) 
171                         OR ctx.has_perm('UPDATE_COPY', copy_info.call_number_owning_lib) %]
172                         <span> | </span>
173                         <a href="javascript:;" onclick='window.open("[% ctx.base_path %]/staff/cat/item/[% copy_info.id %]/edit", "_blank");'>[% l('edit') %]</a>
174                     [% END %]
175                   [% ELSE %]
176                     <a onclick="xulG.new_tab(xulG.urls.XUL_COPY_STATUS, {}, {'from_item_details_new': true, 'barcodes': ['[%- copy_info.barcode | html | replace('\'', '\\\'') -%]']})"
177                         href="javascript:;">[% l('view') %]</a>
178                     [%# if the user can edit copies, show the copy edit link %]
179                     [% IF ctx.has_perm('UPDATE_COPY', copy_info.circ_lib) 
180                         OR ctx.has_perm('UPDATE_COPY', copy_info.call_number_owning_lib) %]
181                         <span> | </span>
182                         <a href="javascript:;" 
183                             onclick="xulG.volume_item_creator({copy_id : [% copy_info.id %]})">
184                             [% l(' edit') %]
185                         </a>
186                     [% END %]
187                   [% END %]
188                 [% END %]
189                 [%- IF attrs.gtin13;
190                     '<meta property="gtin13" content="' _ attrs.gtin13 _ '" />';
191                 END; -%]
192             </td>
193             <td property="availableAtOrFrom">[%- INCLUDE "opac/parts/location_name_link.tt2"; -%]</td>
194
195             [% IF copy_info.courses.size > 0 || ctx.is_staff %]
196             <td>[% copy_info.circ_modifier | html %]</td>
197             [% ELSIF use_courses %]
198             <td></td>
199             [% END %]
200             [% IF ctx.is_staff %]
201             <td>
202                 [% copy_info.age_protect ?
203                     ctx.get_crahp(copy_info.age_protect).name : l('None') | html %]
204             </td>
205             <td>[% 
206                 IF ctx.get_org_setting(copy_info.circ_lib, 'circ.holds.age_protect.active_date') == 1;
207                     disp_date = copy_info.active_date ? copy_info.active_date : copy_info.create_date;
208                 ELSE;
209                     disp_date = copy_info.create_date;
210                 END;
211             
212                 IF disp_date;
213                     date.format(
214                         ctx.parse_datetime(disp_date),
215                         DATE_FORMAT
216                     );
217                 ELSE;
218                    '-';
219                 END;
220             %]</td>
221             [% END # is_staff %]
222             [% IF ctx.is_staff OR serial_holdings %]
223             <td>[%  # Show copy/volume hold links to staff (without
224                 # checking whether they have permissions to do those).
225                 overall_holdable = (
226                     copy_info.holdable == 't' AND
227                     copy_info.location_holdable == 't' AND
228                     copy_info.status_holdable == 't'
229                 );
230                 IF overall_holdable;
231                     hold_link = '';
232                     param_sep = l(" / ");
233
234                     # Only staff get to place copy or volume holds
235                     IF ctx.is_staff; 
236                         hold_link = '<a href="' _
237                             mkurl(ctx.opac_root _ '/place_hold', {
238                                 hold_target => copy_info.id,
239                                 hold_type => 'C',
240                                 hold_source_page => mkurl()
241                             }) _ '">' _ l('Copy hold') _ '</a>';
242                         IF copy_info.call_number != last_cn;
243                             last_cn = copy_info.call_number; 
244                             hold_link = hold_link _ param_sep;
245                             hold_link = hold_link _ '<a href="' _
246                                 mkurl(ctx.opac_root _ '/place_hold', {
247                                     hold_target => copy_info.call_number,
248                                     hold_type => 'V',
249                                     hold_source_page => mkurl()
250                                 }) _ '">' _ l('Volume hold') _ '</a>';
251                         END;
252                         IF serial_holdings;
253                             hold_link = hold_link _ param_sep;
254                         END;
255                     END; 
256                     IF serial_holdings; 
257                         hold_link = hold_link _
258                             '<a class="rdetail-issue-place-hold" href="' _
259                             mkurl(ctx.opac_root _ '/place_hold', {
260                                 hold_target => copy_info.issuance,
261                                 hold_type => 'I',
262                                 hold_source_page => mkurl()
263                             }) _ '" rel="nofollow" vocab="">' _ l('Issue hold') _ '</a>';
264                     END; 
265
266                     hold_link;
267                 ELSE; 
268                     l("Not holdable");
269                 END %]</td>
270             [%- END %]
271             <td>[%-
272                 schema_copy_status.${copy_info.status_code};
273                 copy_info.copy_status | html;
274             -%]</td>
275             <td>[%
276                 IF copy_info.due_date;
277                     date.format(
278                         ctx.parse_datetime(copy_info.due_date, copy_info.circ_circ_lib),
279                         DATE_FORMAT
280                     );
281                 ELSE;
282                     '-';
283                 END %]</td>
284             [%- IF use_courses %]
285             <td>[%- FOREACH course IN copy_info.courses %]
286                 <div>[% course.course_number %]</div>
287             [% END %]</td>
288             [% END %]
289             [%- IF ctx.geo_sort && ctx.has_valid_coords %]
290                <td>[% display_ou_distance(copy_info.circ_lib) %]</td>
291             [%- END %]
292         </tr>
293
294         [% IF copy_info.notes; %]
295             [% FOREACH note IN copy_info.notes; %]
296                 <tr><td>&nbsp;</td><td class="copy_note" colspan="4" property="description"><strong>[% note.title | html %]:</strong> [% note.value | html %]</td></tr>
297             [% END %]
298         [% END %]
299
300         [% IF copy_info.tags; %]
301             [% FOREACH tag IN copy_info.tags; %]
302                 <tr class="copy_tag_row">
303                     <td>&nbsp;</td>
304                     <td class="copy_tag" colspan="4">
305                         <span class="copy_tag_type_label">[% tag.tag_type.label _ ": " | html %]</span>
306                         <span class="copy_tag_value">
307                             [% IF tag.url %]
308                             <a href="[% tag.url | html %]">
309                             [% END %]
310                                 [% tag.value | html %]
311                             [% IF tag.url %]
312                             </a>
313                             [% END %]
314                         </span>
315                     </td>
316                 <tr>
317             [% END %]
318         [% END %]
319
320 <tr><td>
321 [%- IF copy_info.peer_bib_marc.size > 0;
322 '<ul>';
323     FOREACH bib IN copy_info.peer_bib_marc;
324         attrs = {marc_xml => bib};
325         PROCESS get_marc_attrs args=attrs %]
326 [%- IF attrs.bibid != ctx.bre_id; -%]
327     <li property="isRelatedTo" typeof="Product">
328         [%- # Map the bound-with relationship -%]
329         <a href="[% mkurl(ctx.opac_root _ '/record/' _ attrs.bibid) %]" property="url">
330             <span class="bib_peer_title" property="name">[% attrs.title | html %]</span>
331             / <span class="bib_peer_author">[% attrs.author | html %]</span>
332         </a>
333     </li>
334 [%- END; # IF attrs.bibid %]
335 [%- END; # FOREACH bib in copy_info.peer_bib_marc
336 '</ul>';
337     END # IF copy_info.peer_bib_marc.size
338 %]
339 </td></tr>
340 [%- END; # FOR copy_info
341 %]
342         <tr>
343         [%- IF ctx.copy_offset > 0 AND NOT serial_holdings;
344             new_offset = ctx.copy_offset - ctx.copy_limit;
345             IF new_offset < 0; new_offset = 0; END %]
346             <td>
347                 <a href="[% mkurl('', {copy_offset => new_offset, copy_limit => ctx.copy_limit}) %]">&laquo; [%
348                     l('Previous [_1]', ctx.copy_offset - new_offset) %]</a>
349             </td>
350         [%- END %]
351         [%- IF copies.size >= ctx.copy_limit AND NOT serial_holdings AND (ctx.copy_offset + ctx.copy_limit < total_copies) %]
352             <td>
353                 <a href="[% mkurl('', {copy_offset => ctx.copy_offset + ctx.copy_limit, copy_limit => ctx.copy_limit}) %]">[%
354                     l('Next [_1]', ctx.copy_limit) %] &raquo;</a>
355             </td>
356         [%- END %]
357         </tr>
358         [% IF NOT serial_holdings -%]
359         <tr>
360             <td>
361                 [%- more_copies_limit = 50 %] [%# TODO: config %]
362                 [%- IF  ctx.copy_limit != more_copies_limit AND copies.size >= ctx.copy_limit AND ctx.copy_limit < total_copies %]
363                     <div class="rdetail_show_copies">
364                         <img src="[% ctx.media_prefix %]/images/plus_sign.png[% ctx.cache_key %]" alt="[% l('Show more copies icon') %]"/>
365                         <a href="[% mkurl('', {copy_limit => more_copies_limit, copy_offset => 0}) %]">[% l('Show more copies') %]</a>
366                     </div>
367                 [%- ELSIF ctx.copy_limit == more_copies_limit %]
368                     <div  class="rdetail_show_copies">
369                         <img src="[% ctx.media_prefix %]/images/minus_sign.png[% ctx.cache_key %]" alt="[% l('Show fewer copies icon') %]"/>
370                         <a href="[% mkurl('', {copy_limit => 0, copy_offset => 0}) %]">[% l('Show fewer copies') %]</a>
371                     </div>
372                 [%- END %]
373             </td>
374         </tr>
375         [%- END %]
376     </tbody>
377 </table>
378 [% END; %]