This commit also renames the directory that contains the bootstrap-based OPAC. With
the OILSWebTemplatePath, several redundant files also can be safely removed.
Adds a release notes entry describing how to enable this OPAC in eg_vhosts.conf.
Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
Signed-off-by: Ruth Frasur <rfrasur@library.in.gov>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
# Templates will be loaded from the following paths in reverse order.
PerlAddVar OILSWebTemplatePath "@localstatedir@/templates"
+ #PerlAddVar OILSWebTemplatePath "@localstatedir@/templates-bootstrap" #Uncomment this line to use the new bootstrap OPAC
#PerlAddVar OILSWebTemplatePath "@localstatedir@/templates_localskin"
#-------------------------------------------------
background-size: contain; /* Resize the background image to cover the entire container */
background-image: url("https://evergreen-ils.org/wp-content/uploads/2018/09/Evergreen-Final-Logo.png");
-}
\ No newline at end of file
+}
+++ /dev/null
-<!--
-This file allows us to bring TT2 i18n'ized strings
-to js source files, via js blob.
--->
-<script>
- // Add a boost-style format function to JavaScript string.
- // Implementation stolen from StackOverflow:
- // https://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format
- String.prototype.format = function() {
- var args = arguments;
- return this.replace(/{(\d+)}/g, function(match, number) {
- return typeof args[number] != 'undefined'
- ? args[number]
- : match;
- });
- };
-
- var eg_opac_i18n = {};
-
- eg_opac_i18n.EG_MISSING_REQUIRED_INPUT = "[% l('Please fill out all required fields') %]";
- eg_opac_i18n.EG_INVALID_DATE = "[% l('That is not a valid date in the future.') %]";
- // For multiple holds placement confirmation dialog. {0} is replaced by number of copies requested.
- eg_opac_i18n.EG_MULTIHOLD_MESSAGE = "[% l('Do you really want to place {0} holds for this title?') %]";
-</script>
+++ /dev/null
-[%- PROCESS "opac/parts/header.tt2";
- WRAPPER "opac/parts/base.tt2";
- INCLUDE "opac/parts/topnav.tt2";
- ctx.page_title = l("Library details: [_1]", ctx.library.name);
- canon = ctx.proto _ '://' _ ctx.hostname _ mkurl('', {}, 1);
- ctx.metalinks.push('<link rel="canonical" href="' _ canon _ '" />');
- ctx.metalinks.push('<meta property="og:url" content="' _ canon _ '" />');
- ctx.metalinks.push('<meta property="og:type" content="http://schema.org/Library" />');
--%]
- [%- INCLUDE "opac/parts/searchbar.tt2" %]
- [%- INCLUDE "opac/parts/library/core_info.tt2"; %]
-[%- END; %]
+++ /dev/null
-[%- PROCESS "opac/parts/header.tt2";
- WRAPPER "opac/parts/base.tt2";
- INCLUDE "opac/parts/topnav.tt2";
- basic_search = "f";
- ctx.page_title = l("Account Login") %]
- <h2 class="sr-only">[% l('Account Login') %]</h2>
- <div class='mobile_hide'>
- [% INCLUDE "opac/parts/searchbar.tt2" %]
- </div>
- <div id="content-wrapper">
- <div id="main-content">
- <h3 class="sr-only">[% l('Account Login Form') %]</h3>
- [% INCLUDE "opac/parts/login/form.tt2" %]
- <div class="clear-both very-big-height"></div>
- </div>
- </div>
-[%- END %]
+++ /dev/null
-[%- PROCESS "opac/parts/misc_util.tt2";
- USE CSVFilter 'csv';
- USE date;
- SET DATE_FORMAT = l('%m/%d/%Y'); -%]
-[%- l('Title') | csv -%]
-[%- l('Author') | csv -%]
-[%- l('Checkout Date') | csv -%]
-[%- l('Due Date') | csv -%]
-[%- l('Date Returned') | csv -%]
-[%- l('Barcode') | csv -%]
-[%- l('Call Number') | csv -%]
-[%- l('Format') | csv 'last' %]
-[% FOREACH circ IN ctx.csv.circs;
- attrs = { marc_xml => circ.marc_xml };
- PROCESS get_marc_attrs args=attrs;
- formats = [];
- FOR format IN attrs.all_formats;
- formats.push(format.label);
- END;
--%]
-[%- IF circ.circ.target_copy.call_number.id == -1 -%]
- [%- circ.circ.target_copy.dummy_title | csv -%]
- [%- circ.circ.target_copy.dummy_author | csv -%]
-[%- ELSIF attrs.title -%]
- [%- attrs.title | csv -%]
- [%- attrs.author | csv -%]
-[%- END -%]
-[%- date.format(ctx.parse_datetime(circ.circ.xact_start), DATE_FORMAT) | csv-%]
-[%- date.format(ctx.parse_datetime(circ.circ.due_date), DATE_FORMAT) | csv -%]
-[%- IF circ.circ.checkin_time;
- date.format(ctx.parse_datetime(circ.circ.checkin_time), DATE_FORMAT) | csv;
- ELSE; -%]
-,
-[%- END -%]
-[%- circ.circ.target_copy.barcode | csv -%]
-[%- circ.circ.target_copy.call_number.label | csv -%]
-[%- formats.join('+') | csv 'last' %]
-[% END -%]
+++ /dev/null
-[% PROCESS "opac/parts/header.tt2";
- PROCESS "opac/parts/misc_util.tt2";
- PROCESS "opac/parts/hold_status.tt2";
- PROCESS "opac/parts/myopac/column_sort_support.tt2";
- WRAPPER "opac/parts/myopac/base.tt2";
- myopac_page = "ebook_place_hold";
-%]
-<h3 class="sr-only">[% l('Place Hold on E-Item') %]</h3>
-<div id='myopac_holds_div'>
-
- <div class="header_middle">
- <span class="float-left">[% l('Place Hold on E-Item') %]</span>
- </div>
- <div class="clear-both"></div>
- <div id="ebook_place_hold_failed" class="warning_box hidden">[% l('Hold could not be placed.') %]</div>
- <div id="ebook_place_hold_succeeded" class="success hidden">[% l('E-item is now on hold.') %]</div>
- <div id="ebook_spinner"><img src="[% ctx.media_prefix %]/opac/images/progressbar_green.gif[% ctx.cache_key %]" alt="[% l("Loading...") %]"/></div>
- <div id='ebook_holds_main' class="hidden">
- <table id="ebook_holds_main_table"
- title="[% l('Place Hold on E-Item') %]"
- class="table_no_border_space table_no_cell_pad item_list_padding">
- <thead>
- <tr>
- <th>[% l("Title") %]</th>
- <th>[% l("Author") %]</th>
- <th>[% l("Expire Date") %]</th>
- <th>[% l("Status") %]</th>
- <th>[% l("Actions") %]</th>
- </tr>
- </thead>
- <tbody id="ebook_holds_main_table_body"></tbody>
- </table>
- </div>
-</div>
-[% END %]
-
+++ /dev/null
-[%- ctx.csv.template_output.data -%]
+++ /dev/null
-[% PROCESS "opac/parts/header.tt2";
- PROCESS "opac/parts/misc_util.tt2";
- WRAPPER "opac/parts/myopac/base.tt2";
- myopac_page = "lists/update"
-%]
-
-<!-- we should never see this page on success -->
-
-[% IF ctx.bucket_action_failed %]
-<div id='bookbag_udpate_failures'>
-
- <div>
- <strong>[% l("Problem with list management:") %]</strong>
- </div>
-
- <div>
- <ul>
- [% IF ctx.bucket_action == 'create' %]
- [% IF ctx.bucket_failure_noname %]
- <li>[% l('A list name is required') %]</li>
- [% END %]
- [% END %]
- </ul>
- </div>
-
- <div>
- [% url = ctx.referer;
- # The return link should return the user to the page where the edit
- # failure occurred.
- # mkurl() does not support 'page' params w/ existing CGI params.
- # build the URL manually.
- IF ctx.where_from;
- from = ctx.where_from | uri;
- IF url.match('\?');
- url = url _ ';where_from=' _ from;
- ELSE;
- url = url _ '?where_from=' _ from;
- END;
- END; %]
- <a href="[% url %]">[% l('Return') %]</a>
- </div>
-</div>
-[% END %]
-[% END %]
+++ /dev/null
-[% PROCESS "opac/parts/header.tt2";
- PROCESS "opac/parts/misc_util.tt2";
- WRAPPER "opac/parts/myopac/base.tt2";
- myopac_page = "main";
- myopac_main_page = "pay" %]
-<div id="myopac_summary_div">
-
- <div class="payment-processing">
- [% l('Processing...') %] <br/><br/>
- [% l('Processing your payment may take some time.') %]<br/>
- [% l("Please do not Refresh or use your browser's Back button or your credit card may be charged more than once.") %]<br/>
- </div>
-
-</div>
-[% END %]
+++ /dev/null
-[% PROCESS "opac/parts/header.tt2";
- PROCESS "opac/parts/misc_util.tt2";
- WRAPPER "opac/parts/myopac/base.tt2";
- myopac_page = "messages";
- limit = (ctx.patron_messages_limit.defined) ? ctx.patron_messages_limit : 20;
- offset = (ctx.patron_messages_offset.defined) ? ctx.patron_messages_offset : 0;
- count = (ctx.patron_messages_count.defined) ? ctx.patron_messages_count : 0;
- display_single = (ctx.display_single_message.defined) ? ctx.display_single_message : 0;
-%]
-<h3 class="sr-only">[% l('My Messages') %]</h3>
-[% IF display_single;
- PROCESS "opac/myopac/messages/single_message.tt2";
-ELSE;
- PROCESS "opac/myopac/messages/list.tt2";
-END %]
-[% END %]
+++ /dev/null
-[% PROCESS "opac/parts/header.tt2";
- PROCESS "opac/parts/misc_util.tt2";
- WRAPPER "opac/parts/myopac/base.tt2";
- myopac_page = "prefs" %]
- [% IF ctx.email_receipt_result; # result should be undef on success %]
- <div class="payment-error">
- [% l('Error preparing receipt:') %]
- <span title="[% ctx.email_receipt_result.textcode | html %]">
- [% ctx.email_receipt_result.desc | html %]
- </span>
- </div>
- [% ELSE %]
- <div>
- [% l('Your receipt will be emailed to [_1]', ctx.user.email) | html %]
- </div>
- [% END %]
- <p>
- [ <a href="[% ctx.opac_root %]/myopac/main_payments">[%
- l("Back to Payments History") %]</a> ]
- </p>
-[% END %]
+++ /dev/null
-[%# sic! no wrapper %]
-<html>
- <head>
- <meta charset="utf-8">
- <title>[% l('Receipt') %]</title>
- </head>
- <body onload="if (document.getElementById('printable-receipt')) window.print();">
- [% IF ctx.printable_receipt.template_output %]
- <tt id="printable-receipt">
- [% ctx.printable_receipt.template_output.data %]
- </tt>
- [% ELSE %]
- <div class="payment-error">
- [% l(
- 'Error preparing receipt: [_1]',
- (ctx.printable_receipt.textcode ? ctx.printable_receipt.textcode _ ' / ' _ ctx.printable_receipt.desc : 0) ||
- ctx.printable_receipt.error_output.data ||
- l('No receipt data returned from server')
- ) | html %]
- </div>
- [% END %]
- <hr />
- <p>[ <a href="[% ctx.opac_root %]/myopac/main_payments">[%
- l("Back to Payments History") %]</a> ]</p>
- </body>
-</html>
+++ /dev/null
-[% PROCESS "opac/parts/header.tt2";
- PROCESS "opac/parts/misc_util.tt2";
- WRAPPER "opac/parts/myopac/base.tt2";
- myopac_page = "reservations";
-%]
-<h3 class="sr-only">[% l('Reservations') %]</h3>
-[% IF ctx.reservations.size %]
- <table id="acct_reservations_main_header" class="table_no_border_space table_no_cell_pad item_list_padding">
- <tr>
- <th scope="col">[% l('Resource type') %]</th>
- <th scope="col">[% l('Start time') %]</th>
- <th scope="col">[% l('End time') %]</th>
- <th scope="col">[% l('Pickup location') %]</th>
- <th scope="col">[% l('Status') %]</th>
- </tr>
- [% FOREACH r IN ctx.reservations %]
- <tr>
- <td>[% r.resource_type_name %]</td>
- <td>[% date.format(ctx.parse_datetime(r.start_time, r.pickup_lib), DATE_FORMAT _ ' %I:%M %p') %]</td>
- <td>[% date.format(ctx.parse_datetime(r.end_time, r.pickup_lib), DATE_FORMAT _ ' %I:%M %p') %]</td>
- <td><a href="../library/[% r.shortname %]">[% r.pickup_name %]</a></td>
- <td>
- [% IF r.cancel_time %]
- [% l('Canceled') %]
- [% ELSIF r.pickup_time %]
- [% l('Checked Out') %]
- [% ELSIF r.capture_time %]
- [% l('Ready for Pickup') %]
- [% ELSE %]
- [% l('Reserved') %]
- [% END %]
- </td>
- </tr>
- [% END %]
- </table>
-[% ELSE %]
- [% l('You have no current reservations') %]
-[% END %]
-[% END %]
+++ /dev/null
-<div class="password_message">
-[% l('Note: The password must be at least 7 characters in length, contain at least one letter (a-z/A-Z), and contain at least one number.'); %]
-</div>
\ No newline at end of file
+++ /dev/null
-
-<script type="text/javascript">
-
- /* Checks to see if a given type of added content has data to show.
- * The first arg to callback() is boolean indicating the presence of data */
- function acIsAvailable(bre_id, type, callback) {
- var url = '/opac/extras/ac/' + type + '/html/r/' + bre_id;
- dojo.xhr('HEAD', {
- url : url,
- failOk : true, // http://bugs.dojotoolkit.org/ticket/11568
- error : function(err) { callback(false, bre_id, type); },
- load : function(result) { callback(true, bre_id, type); }
- });
- }
-
- [%-
- FOR type IN ctx.added_content.keys;
- IF ctx.added_content.$type.status == '3' # status unknown %]
-
- dojo.addOnLoad(function() {
- var bre_id = '[% ctx.bre_id %]';
- var type = '[% type %]';
-
- acIsAvailable(bre_id, type, function(avail, bre_id, type) {
- if (avail) {
-
- [% IF CGI.param('expand') == 'addedcontent' %]
-
- // if the content is available, un-hide the tab
- dojo.removeClass(dojo.byId('ac:' + type), 'hidden');
-
- [% ELSE %]
- // if no default type is selected on the main tab link
- // set one here, since we have available content
-
- var link = dojo.query('[name=addedcontent]')[0];
- var href = link.getAttribute('href');
- if (!href.match('[\&;]ac=')) {
- href = href.replace('#addedcontent', ';ac=' + type + '#addedcontent');
- dojo.attr(link, 'href', href);
- dojo.attr(dojo.query('[name=addedcontent_lbl]')[0], 'href', href);
- }
-
- [% END %]
- }
- });
- });
- [% END; # IF status unknown
- END; # FOR type
-
- ident = ctx.record_attrs.isbn_clean || ctx.record_attrs.upc;
- IF ident;
- -%]
-
-[%- IF ENV.OILS_NOVELIST_URL -%]
- /* Load novelist content */
- setTimeout( function() {
- novSelect.loadContentForQuery(
- {
- ClientIdentifier : '[% ident %]',
- ISBN : '[% ident %]',
- version : '2.1'
- },
- '[% ENV.OILS_NOVELIST_PROFILE %]',
- '[% ENV.OILS_NOVELIST_PASSWORD %]',
- function(d){
- // note if d.length == 0, there is no content to display
- // hide the Loading... text
- dojo.byId('novelist-loading').innerHTML = '';
- }
- )}, 100);
-[%- END; # Novelist -%]
-
- [% END; # IF ident
- %]
-</script>
+++ /dev/null
-<div id="record_basket">
- <div id="basket_actions">
- <select id="select_basket_action" aria-label="[% l('Select basket action') %]">
- <option value="">[% l('-- Basket Actions --') %]</option>
- <option value="[% mkurl(ctx.opac_root _ '/mylist', {}) %]">[% l('View Basket') %]</option>
- <option value="[% mkurl(ctx.opac_root _ '/mylist/move', { action => 'place_hold', entire_list => 1 }) %]">[% l('Place Holds') %]</option>
- <option value="[% mkurl(ctx.opac_root _ '/mylist/print', {}) %]">[% l('Print Title Details') %]</option>
- <option value="[% mkurl(ctx.opac_root _ '/mylist/email', {}) %]">[% l('Email Title Details') %]</option>
- [% IF !ctx.is_browser_staff %]
- <option value="[% mkurl(ctx.opac_root _ '/myopac/lists', { move_cart_by_default => 1, from_basket => 1 }) %]">[% l('Add Basket to Saved List') %]</option>
- [% END %]
- [% IF ctx.is_browser_staff %]
- <option value="add_cart_to_bucket">[% l('Add Basket to Bucket') %]</option>
- [% END %]
- <option value="[% mkurl(ctx.opac_root _ '/mylist/clear', {}) %]">[% l('Clear Basket') %]</option>
- </select>
- <input class="opac-button" type="button" id="do_basket_action" value="[% l('Go') %]" />
- </div>
- <div id="record_basket_icon">
- <a href="[% mkurl(ctx.opac_root _ '/mylist') %]" class="no-dec" rel="nofollow" vocab="">
- <img src="[% ctx.media_prefix %]/images/cart-sm.png[% ctx.cache_key %]" alt="[% l('View Basket') %]">
- </a>
- <div id="record_basket_count_floater">
- <a href="[% mkurl(ctx.opac_root _ '/mylist') %]" class="no-dec" rel="nofollow" vocab="">
- <span id="record_basket_count">[% ctx.mylist.size %]</span>
- <span class="sr-only">[% l('records in basket') %]</span>
- </a>
- </div>
- </div>
-</div>
+++ /dev/null
-[%- IF ENV.OILS_CHILIFRESH_URL AND ENV.OILS_CHILIFRESH_ACCOUNT
- AND (ctx.page == 'rresult' OR ctx.page == 'record');
- chili_url = ENV.OILS_CHILIFRESH_URL;
- IF CGI.https AND ENV.OILS_CHILIFRESH_HTTPS_URL;
- chili_url = ENV.OILS_CHILIFRESH_HTTPS_URL;
- END;
-%]
- <!-- Set up the chilifresh account information and load the JS -->
- <input type="hidden" id="chilifresh_account" name="chilifresh_account" value="[% ENV.OILS_CHILIFRESH_ACCOUNT %]"/>
- <!--
- <input type="hidden" id="chilifresh_profile" name="chilifresh_profile" value="[% ENV.OILS_CHILIFRESH_PROFILE %]"/>
- -->
- <input type="hidden" id="chilifresh_version" name="chilifresh_version" value="onsite_v1" />
- <input type="hidden" id="chilifresh_type" name="chilifresh_type" value="search" />
- <script type="text/javascript" src="[% chili_url %]"></script>
- <script>try { setTimeout(chili_init, 0); } catch(E) {}</script>
-[%- END %]
+++ /dev/null
-[%-
-# Display holdings/availability info from ebook API
-#
-# We require the following info:
-# - rec_id: internal ID for this record (rec.id in search results, ctx.bre_id in record summary)
-# - ebook_id: external ID for title (ISBN for OneClickdigital, unique identifier for OverDrive)
-# - vendor (oneclickdigital, overdrive)
-
-IF args.ebook;
-
- IF ctx.page == 'rresult';
- ebook.rec_id = rec.id;
- ELSE;
- ebook.rec_id = ctx.bre_id;
- END;
-
- ebook.ebook_id = args.ebook.ebook_id;
- ebook.vendor = args.ebook.vendor;
-
-# This div is hidden by default. The JS layer will unhide it, use the ebook_id
-# to retrieve holdings/availability info via the appropriate vendor API, and
-# overwrite the div's contents with that information.
--%]
-<div id="[% ebook.rec_id %]" class="ebook_avail hidden">
- <div id="[% ebook.ebook_id %]" class="[% ebook.vendor %]_avail">
- <table id="[% ebook.rec_id %]_ebook_holdings" class="result_holdings_table hidden">
- <thead>
- <tr>
- <th>[% l('Available Formats') %]</th>
- <th>[% l('Status') %]</th>
- </tr>
- <tbody>
- <tr>
- <td id="[% ebook.rec_id %]_formats"></td>
- <td id="[% ebook.rec_id %]_status"></td>
- </tr>
- </tbody>
- </table>
- </div>
-</div>
-[% END %]
+++ /dev/null
-[%
-# HTML display chunks
-progress_icon = '<img id="ebook_avail_spinner" src="/opac/images/progressbar_green.gif' _ ctx.cache_key _ '" alt="' _ l("Checking availability for this item...") _ '"/>'
-%]
-
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/opac/ebook_api/session.js[% ctx.cache_key %]"></script>
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/opac/ebook_api/ebook.js[% ctx.cache_key %]"></script>
-<script type="text/javascript">
-
-// translatable strings as JS variables
-var l_strings = {};
-l_strings.download = '[% l('Download') %]';
-l_strings.ready_for_checkout = '[% l('Ready for Checkout') %]';
-l_strings.suspended = '[% l('Suspended') %]';
-l_strings.checkout = '[% l('Checkout') %]';
-l_strings.place_hold = '[% l('Place Hold') %]';
-l_strings.cancel_hold = '[% l('Cancel Hold') %]';
-
-// give us cookies!
-dojo.require("dojo.cookie");
-
-// context org unit
-[% IF !ctx.page OR ctx.page != 'rresult';
- PROCESS get_library;
-END %]
-var ou = [% loc_value %];
-
-// list of enabled vendors
-var vendor_list = [];
-[% IF ebook_api.ebook_test.enabled == 'true' %]
-vendor_list.push('ebook_test');
-[% END %]
-[% IF ebook_api.oneclickdigital.enabled == 'true' %]
-vendor_list.push('oneclickdigital');
-[% END %]
-[% IF ebook_api.overdrive.enabled == 'true' %]
-vendor_list.push('overdrive');
-[% END %]
-
-var cookie_registry = [ 'ebook_xact_cache' ];
-dojo.forEach(vendor_list, function(v) {
- cookie_registry.push(v);
-});
-
-// essential info for performing a transaction
-var ebook_action = {};
-[%- IF CGI.param("action").defined %]
-ebook_action.type = '[% CGI.param("action") | html %]';
-[%- END -%]
-[%- IF CGI.param("title").defined %]
-ebook_action.title_id = '[% CGI.param("title") | html %]';
-[%- END -%]
-[%- IF CGI.param("vendor").defined %]
-ebook_action.vendor = '[% CGI.param("vendor") | html %]';
-[%- END -%]
-
-[% IF ctx.user %]
-// user- or login-specific vars
-var authtoken = '[% ctx.authtoken %]';
-var patron_id = '[% ctx.active_card %]'; // using barcode of active card as patron ID
-[%- IF ctx.user.email %]
-var patron_email = '[% ctx.user.email | html %]';
-[%- ELSE %]
-var patron_email = null;
-[%- END %]
-
-var myopac_page;
-[% IF myopac_page %]
-myopac_page = "[% myopac_page %]";
-[% END %]
-
-[% END %]
-
-// enforce removal of ebook API cookies on logout
-dojo.addOnLoad(function() {
- var logout_handle = dojo.connect(dojo.byId('#logout_link'), 'onclick', function() {
- dojo.forEach(cookie_registry, function(cookie) {
- dojo.cookie(cookie, '', {path: '/', expires: '-1h'});
- });
- // When we switch to jQuery, use .one()
- // instead of dojo's .connect() and .disconnect()
- dojo.disconnect(logout_handle);
- });
-});
-</script>
-
-[%- IF ctx.user %]
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/opac/ebook_api/relation.js[% ctx.cache_key %]"></script>
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/opac/ebook_api/loggedin.js[% ctx.cache_key %]"></script>
-[%- END %]
-
-[%- IF (ctx.page == 'rresult' OR ctx.page == 'record') %]
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/opac/ebook_api/avail.js[% ctx.cache_key %]"></script>
-[%- END %]
-
+++ /dev/null
-<script type="text/javascript">
-var vendors_requiring_password = [];
-
-[% IF !loc_value; PROCESS get_library; END; %]
-[% IF ebook_api.overdrive.enabled == 'true'
- AND loc_value
- AND ctx.get_org_setting(loc_value, 'ebook_api.overdrive.password_required') %]
-vendors_requiring_password.push('overdrive');
-[% END %]
-
-dojo.addOnLoad(function() {
- var handle = dojo.connect(dojo.byId('#login-form-box'), 'onclick', function(evt) {
- // disconnect this event since it's one-time-only
- // (when we switch to jQuery, we can use .one() here)
- dojo.disconnect(handle);
-
- // we cache the username (and password) for now, but will
- // replace that with the patron's active barcode later
- vendors_requiring_password.forEach(function(v) {
- if (vendor_list.includes(v)) {
- checkSession(v, function(v,ses) {
- var username = dojo.byId('#username_field').value;
- var password = dojo.byId('#password_field').value;
- new OpenSRF.ClientSession('open-ils.ebook_api').request({
- method: 'open-ils.ebook_api.patron.cache_password',
- params: [ ses, password ],
- async: true,
- oncomplete: function(r) {
- var resp = r.recv();
- if (resp) {
- console.log('patron password has been cached');
- return;
- }
- }
- }).send();
- });
- }
- });
- });
-});
-</script>
+++ /dev/null
-[%-
- # If caller passes a list of possible filter_groups
- # search all until we find some values
- IF !filter_group.size; filter_group = [filter_group]; END;
- group = '';
- FOR code IN filter_group;
- group = ctx.search_filter_groups.$code;
- LAST IF group AND group.entries.size;
- END;
- name = name || "fg:" _ group.code;
- id = id || group.code _ "_selector";
- class = class || '';
- values = values || CGI.param(name);
- IF size AND size < 1; size = group.entries.size; END;
--%]
-
-<select id='[% id %]' class='[% class %]' name='[% name %]' title="[% filter_label || l('Search Filter') %]"[%
- multiple ? ' multiple="multiple"' : '';
- size ? (' size="' _ size _ '"') : ''; %]>
-[% IF none_ok %]
- <option value=''>[% none_label ? none_label : l('-- Any --') %]</option>
-[% END;
-
-FOR o IN group.entries %]
- <option value='[% o.id %]'[% values.grep(o.id).size ? ' selected="selected"' : '' %]>[% o.query.label | html %]</option>
-[% END -%]
-</select>
-
+++ /dev/null
-<select title="[% l('Search sorting') %]"
- [% class ? ('class="' _ class _ '"') : '' %] id='[% id || "opac.result.sort" %]'
- name="[% name || 'sort' %]" [% IF submit_on_change %]onchange='this.form.submit()'[% END %]>
- [% IF mode != 'bookbag' %]<option value=''>[% l("Sort by Relevance") %]</option>[% END %]
- <optgroup label='[% l("Sort by Title") %]'>
- <option value='titlesort'[% value == 'titlesort' ? ' selected="selected"' : '' %]>[% l("Title: A to Z") %]</option>
- <option value='titlesort.descending'[% value == 'titlesort.descending' ? ' selected="selected"' : '' %]>[% l("Title: Z to A") %]</option>
- </optgroup>
- <optgroup label='[% l("Sort by Author") %]'>
- <option value='authorsort'[% value == 'authorsort' ? ' selected="selected"' : '' %]>[% l("Author: A to Z") %]</option>
- <option value='authorsort.descending'[% value == 'authorsort.descending' ? ' selected="selected"' : '' %]>[% l("Author: Z to A") %]</option>
- </optgroup>
- <optgroup label='[% l("Sort by Publication Date") %]'>
- <option value='pubdate.descending'[% value == 'pubdate.descending' ? ' selected="selected"' : '' %]>[% l("Date: Newest to Oldest") %]</option>
- <option value='pubdate'[% value == 'pubdate' ? ' selected="selected"' : '' %]>[% l("Date: Oldest to Newest") %]</option>
- </optgroup>
- <optgroup label='[% l("Sort by Popularity") %]'>
- <option value='popularity'[% value == 'popularity' ? ' selected="selected"' : '' %]>[% l("Most Popular") %]</option>
-<!-- Sorting by least popular items first is probably not an expected
- choice in production, but could be useful in cases where every
- record has at least one badge value assigned and you want
- to investigate the long tail.
--->
-<!--
- <option value='popularity.descending'[% value == 'popularity.descending' ? ' selected="selected"' : '' %]>[% l("Least Popular") %]</option>
--->
- <option value='poprel'[% value == 'poprel' ? ' selected="selected"' : '' %]>[% l("Popularity Adjusted Relevance") %]</option>
- </optgroup>
-</select>
+++ /dev/null
-[%- PROCESS "opac/parts/header.tt2";
- IF google_analytics.enabled == 'true' %]
-
-<!-- http://www.google.com/support/googleanalytics/bin/answer.py?answer=174090 -->
-<script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', '[% google_analytics.code %]']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script');
- ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('oils:' == document.location.protocol || 'https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0];
- s.parentNode.insertBefore(ga, s);
- })();
-</script>
-[%- END %]
+++ /dev/null
-[%
- # XXX It might be cleaner to move this into its own file or something.
- #
- # The following hash should have fail_parts as keys and user/patron-friendly
- # strings as values. If the system returns an event with a fail_part when
- # you attempt to place a hold and the fail part matches something in this
- # hash, this is the message that will be displayed to the user. Wait until
- # these are used to pass them through l() for i18n.
-
- FAIL_PART_MSG_MAP = {
- "actor.usr.barred" => l("The patron is barred"),
- "asset.copy.circulate" => l("The item does not circulate"),
- "asset.copy_location.circulate" => l("Items from this shelving location do not circulate"),
- "asset.copy.status" => l("The item cannot circulate at this time"),
- "circ.holds.target_skip_me" => l("The item's circulation library does not fulfill holds"),
- "config.circ_matrix_circ_mod_test" => l("The patron has too many items of this type checked out"),
- "config.circ_matrix_test.circulate" => l("Circulation rules reject this item as non-circulatable"),
- "config.hold_matrix_test.holdable" => l("Hold rules reject this item as unholdable"),
- "config.hold_matrix_test.max_holds" => l("The patron has reached the maximum number of holds"),
- "config.rule_age_hold_protect.prox" => l("The item is too new to transit this far"),
- "item.holdable" => l("The item is not holdable"),
- "location.holdable" => l("The item's location is not holdable"),
- "status.holdable" => l("The item is not in a holdable status"),
- "no_item" => l("The system could not find this item"),
- "no_ultimate_items" => l("The system could not find any items to match this hold request"),
- "no_matchpoint" => l("System rules do not define how to handle this item"),
- "no_user" => l("The system could not find this patron"),
- "transit_range" => l("The item cannot transit this far")
- };
-
-
- # This works like the above has, but instead of fail_parts for keys, use
- # the textcode of the event. This will only be consulted for events
- # that do not have a fail_part matching something in the above hash.
- # Wait until these are used to pass them through l() for i18n.
-
- EVENT_MSG_MAP = {
- "PATRON_EXCEEDS_FINES" => l("Patron has reached the maximum fine amount")
- };
-%]
+++ /dev/null
-<!-- JS imports, etc. -->
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/opac/simple.js[% ctx.cache_key %]"></script>
-[% INCLUDE "opac/i18n_strings.tt2" %]
-
-[% IF ctx.want_jquery || ctx.readonly %]
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/common/build/js/jquery.min.js[% ctx.cache_key %]"></script>
-[% END; # ctx.want_jquery %]
-
-[% IF ctx.readonly %]
-<script type="text/javascript">
- $(document).ready(function() {
- $('a').removeAttr('href');
- $('a').click(function(event) { event.preventDefault(); });
- $('button').prop('disabled', true);
- $('button').click(function(event) { event.preventDefault(); });
- $('input').prop('disabled', true);
- $('input').click(function(event) { event.preventDefault(); });
- $('select').prop('disabled', true);
- $('select').click(function(event) { event.preventDefault(); });
- $('textarea').prop('disabled', true);
- $('textarea').click(function(event) { event.preventDefault(); });
- });
-</script>
-[% END %]
-
-<!-- DOB validation for Patron Registration in OPAC -->
-<script type="text/javascript">
- function dobValidate(input) {
- var validformat = /^(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$/
- var returnval = false
- if (!validformat.test(input.value))
- alert("[% l('You have entered an invalid date, or an improperly formatted date. Please enter Date of Birth in YYYY-MM-DD or YYYY/MM/DD format and try again.') %]")
- else
- returnval = true
- if (returnval == false) input.select()
- return returnval
-}
-</script>
-
-[%- IF ctx.use_stripe %]
-<script type="text/javascript">unHideMe($("pay_fines_now"));[%# the DOM is loaded now, right? %]</script>
-[% END -%]
-
-[%- IF ctx.is_staff %]
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/opac/staff.js[% ctx.cache_key %]"></script>
- [% IF ctx.page == 'record' %]
- [% IF ctx.search_result_index >= 0 %]
- <script>
- rdetail_next_prev_actions(
- "[% ctx.search_result_index %]",
- "[% ctx.hit_count %]",
- "[% ctx.prev_rec_url || '' %]",
- "[% ctx.next_rec_url || '' %]",
- "[% mkurl(ctx.first_search_record, {page => 0}) %]",
- "[% mkurl(ctx.opac_root _ '/results', {find_last => 1, page => POSIX.floor(ctx.hit_count / ctx.page_size)}) %]",
- "[% mkurl(ctx.opac_root _ '/results', {}, ['expand','cnoffset']) %]"
- );
- </script>
- [% END %]
- [% IF ctx.mfhd_summaries.size %]
- <script>
- window.mfhdDetails = [
- [% FOR summary IN ctx.mfhd_summaries %]
- [% IF summary.sre_id != -1 %]
- {
- 'id' : '[% summary.sre_id %]',
- 'label' : '[% summary.location | replace("'", "\\'") %]',
- 'entryNum' : [% loop.index %],
- 'owning_lib' : '[% summary.owning_lib %]'
- },
- [% END %]
- [% END %]
- ];
- </script>
- [% END %]
- [% END %]
-[%- END %]
-
-[%- IF ENV.OILS_NOVELIST_URL AND ctx.page == 'record';
- url = ENV.OILS_NOVELIST_URL;
- IF CGI.https; url = url.replace('^http:', 'https:'); END; %]
-<script type='text/javascript' id='EIT' src='[% url %]'></script>
-[%- END %]
-[%- IF ctx.page == 'record' AND ctx.google_books_preview %]
-<script src='[% ctx.media_prefix %]/js/ui/default/opac/ac_google_books.js[% ctx.cache_key %]' async defer></script>
-[%- END %]
-
-<script>
- window.egStrings = [];
- window.egStrings['CONFIRM_BASKET_EMPTY'] = "[% l('Remove all records from basket?') %]";
-</script>
-<script src='[% ctx.media_prefix %]/js/ui/default/opac/record_selectors.js[% ctx.cache_key %]' async defer></script>
-
-<!-- Require some inputs and selections for browsers that don't support required form field element -->
-[% IF ctx.page == 'place_hold' %]
- <script type="text/javascript" src="[% ctx.media_prefix %]/js/ui/default/opac/holds-validation.js[% ctx.cache_key %]">
- </script>
-[% END %]
-
-[%- IF want_dojo; -%]
-<script type="text/javascript">
- var djConfig = {
- locale: "[% ctx.locale | lower | replace('_', '-') %]",
- parseOnLoad: true,
- isDebug: false
- }, lang, bidi;
-</script>
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/dojo/dojo/dojo.js?[% ctx.eg_cache_hash %]"></script>
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/dojo/dojo/openils_dojo.js?[% ctx.eg_cache_hash %]"></script>
-
-[%- # So the following works in Mozilla and Chrome, but not in IE8.
- # Seems like it /should/ work anywhere, though, and obviate the
- # next three script tags: %]
-<!-- <script type="text/javascript" src="[% ctx.media_prefix %]/js/dojo/DojoSRF.js?[% ctx.eg_cache_hash %]"></script> -->
-
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/dojo/opensrf/opensrf.js?[% ctx.eg_cache_hash %]"></script>
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/dojo/opensrf/opensrf_xhr.js?[% ctx.eg_cache_hash %]"></script>
-<script type="text/javascript" src="[% ctx.media_prefix %]/js/dojo/opensrf/JSON_v1.js?[% ctx.eg_cache_hash %]"></script>
-
-[% IF use_autosuggest.enabled == "t" AND basic_search != "f"; %]
-<script type="text/javascript">
- dojo.require("openils.widget.AutoSuggest");
-
- /* Set focus, and place the cursor at the end of the input string */
- dojo.addOnLoad(function() {
- /* Don't error out if the object doesn't exist, like on advanced search pages */
- if (dojo.byId('search_box')) {
- dijit.byId('search_box').focus();
-
- var sb_value = dijit.byId('search_box').value;
- /* Dojo won't trigger a change if the value doesn't change */
- if (sb_value) {
- dijit.byId('search_box').setValue(sb_value + ' ');
- dijit.byId('search_box').setValue(sb_value);
- }
- }
- });
-</script>
-[% END; # use_autosuggest %]
-
-[% INCLUDE "opac/parts/acjs.tt2" IF ctx.page == 'record' %]
-[% IF ctx.page == 'advanced' %]
-<script type="text/javascript"
- src="[% ctx.media_prefix %]/js/ui/default/opac/copyloc.js[% ctx.cache_key %]"></script>
-[% END %]
-
-[% IF ebook_api.enabled == 'true' %]
- [% INCLUDE "opac/parts/ebook_api/base_js.tt2" %]
- [% INCLUDE "opac/parts/ebook_api/login_js.tt2" IF (ctx.page == 'login') %]
-[% END %]
-
-<!-- provide a JS friendly org unit hash -->
-<script type="text/javascript">
-var aou_hash = {
-[% FOR org_unit IN ctx.aou_list %]
- [% org_unit.id %] : {
- id : "[% org_unit.id %]",
- name : "[% org_unit.name | replace('"', '\"') %]",
- parent_ou : "[% org_unit.parent_ou %]",
- depth : "[% org_unit.ou_type.depth %]",
- can_have_vols : "[% org_unit.ou_type.can_have_vols %]"
- }[%- ',' UNLESS loop.last -%]
-[% END %]
-};
-</script>
-
-<script type="text/javascript">if ($('client_tz_id')) { $('client_tz_id').value = OpenSRF.tz }</script>
-[%- END; # want_dojo -%]
-
-[%- IF ctx.max_cart_size; %]
-<script type="text/javascript">var max_cart_size = [% ctx.max_cart_size %];</script>
-[%- END; %]
-
-
-<link rel="stylesheet" href="[% ctx.media_prefix %]/js/ui/default/common/build/js/glide/css/glide.core.min.css[% ctx.cache_key %]">
-<link rel="stylesheet" href="[% ctx.media_prefix %]/js/ui/default/common/build/js/glide/css/glide.theme.min.css[% ctx.cache_key %]">
+++ /dev/null
-[%-
- opac_root = ctx.opac_root;
- IF ctx.kpac_root;
- opac_root = ctx.kpac_root;
- END;
--%]
-<div id="content-wrapper">
- <div id="main-content" class="content-wrapper-library-page" vocab="http://schema.org/" typeof="Library">
- <h1 property="name">[% ctx.library.name | html %]</h1>
-
- [%-
- lib_url = ctx.get_org_setting(ctx.library.id, 'lib.info_url');
- IF lib_url;
- '<div id="library-url"><a href="'; lib_url | html; '" property="url">'; l('Library web site'); '</a></div>';
- END;
- -%]
-
- [%- IF ctx.hours; %]
- [%- INCLUDE "opac/parts/library/hours.tt2"; %]
- [% END; -%]
-
- [%- IF (ctx.library.email OR ctx.library.phone); %]
- <h2 id="contact-info">[% l('Contact information') %]</h2>
- [%- IF ctx.library.email; %]
- <div>[% l('Email address: ') %]<a href="mailto:[% ctx.library.email | html %]" property="email">[% ctx.library.email | html %]</a></div>
- [%- END; %]
- [%- IF ctx.library.phone; %]
- <div>[% l('Telephone: ') %]<a href="tel:[% ctx.library.phone | html %]" property="telephone">[% ctx.library.phone | html %]</a></div>
- [% END; %]
- [% END; %]
-
- [%- IF ctx.library.mailing_address; %]
- <div id="addresses">
- <div id="mailing" property="location address" typeof="PostalAddress">
- <h3 property="contactType">[% l('Mailing address') %]</h3>
- <span property="streetAddress">[% ctx.mailing_address.street1 | html %]
- [%- IF ctx.mailing_address.street2; "<br />"; ctx.mailing_address.street2 | html; END; %]
- </span><br />
- <span property="addressLocality">[% ctx.mailing_address.city | html %]</span><br />
- <span property="addressRegion">[% ctx.mailing_address.state | html %]</span><br />
- <span property="addressCountry">[% ctx.mailing_address.country | html %]</span><br />
- <span property="postalCode">[% ctx.mailing_address.post_code | html %]</span><br />
- </div>
- </div>
- [%- END; %]
-
- [%- IF ctx.library.parent_ou; %]
- <h2>[% l('Branch relationship') %]</h2>
- <div id="branch-info">[% l('Parent library: ') %]
- <a property="branchOf" href="[% mkurl(opac_root _ '/library/' _ ctx.parent.shortname, {}, 1) %]">[% ctx.parent.name | html %]</a>
- </div>
- [% END; -%]
-
- <div class="common-full-pad"></div>
- </div>
-</div>
+++ /dev/null
-[%
- UNLESS TIME_FORMAT;
- TIME_FORMAT = '%l:%M %p';
- END;
-
- time_format = TIME_FORMAT;
-
- USE date (format = time_format);
- today = date.format(format = '%Y-%m-%d ');
- # We need to add "today" to the opening/closing hours for Date input
--%]
-<h2>[% l('Opening hours') %]</h2>
-
-[%-
- open = today _ ctx.hours.dow_0_open;
- close = today _ ctx.hours.dow_0_close;
- IF open == close;
-%]
-<div class="opening-hours">[% l('Monday: closed') %]</div>
-[%- ELSE %]
-<div class="opening-hours" property="openingHoursSpecification" typeof="OpeningHoursSpecification"><link property="dayOfWeek" href="http://purl.org/goodrelations/v1#Monday" />[%
- l('Monday: [_1] - [_2]', '<time property="opens" content="' _ date.format(open, format => '%H:%M:%S') _ '">' _ date.format(open) _ '</time>',
- '<time property="closes" content="' _ date.format(close, format => '%H:%M:%S') _ '">' _ date.format(close) _ '</time>') -%]
-</div>
-[%- END %]
-
-[%-
- open = today _ ctx.hours.dow_1_open;
- close = today _ ctx.hours.dow_1_close;
- IF open == close;
-%]
-<div class="opening-hours">[% l('Tuesday: closed') %]</div>
-[%- ELSE %]
-<div class="opening-hours" property="openingHoursSpecification" typeof="OpeningHoursSpecification"><link property="dayOfWeek" href="http://purl.org/goodrelations/v1#Tuesday" />[%
- l('Tuesday: [_1] - [_2]', '<time property="opens" content="' _ date.format(open, format => '%H:%M:%S') _ '">' _ date.format(open) _ '</time>',
- '<time property="closes" content="' _ date.format(close, format => '%H:%M:%S') _ '">' _ date.format(close) _ '</time>') -%]
-</div>
-[%- END %]
-
-[%-
- open = today _ ctx.hours.dow_2_open;
- close = today _ ctx.hours.dow_2_close;
- IF open == close;
-%]
-<div class="opening-hours">[% l('Wednesday: closed') %]</div>
-[%- ELSE %]
-<div class="opening-hours" property="openingHoursSpecification" typeof="OpeningHoursSpecification"><link property="dayOfWeek" href="http://purl.org/goodrelations/v1#Wednesday" />[%
- l('Wednesday: [_1] - [_2]', '<time property="opens" content="' _ date.format(open, format => '%H:%M:%S') _ '">' _ date.format(open) _ '</time>',
- '<time property="closes" content="' _ date.format(close, format => '%H:%M:%S') _ '">' _ date.format(close) _ '</time>') -%]
-</div>
-[%- END %]
-
-[%-
- open = today _ ctx.hours.dow_3_open;
- close = today _ ctx.hours.dow_3_close;
- IF open == close;
-%]
-<div class="opening-hours">[% l('Thursday: closed') %]</div>
-[%- ELSE %]
-<div class="opening-hours" property="openingHoursSpecification" typeof="OpeningHoursSpecification"><link property="dayOfWeek" href="http://purl.org/goodrelations/v1#Thursday" />[%
- l('Thursday: [_1] - [_2]', '<time property="opens" content="' _ date.format(open, format => '%H:%M:%S') _ '">' _ date.format(open) _ '</time>',
- '<time property="closes" content="' _ date.format(close, format => '%H:%M:%S') _ '">' _ date.format(close) _ '</time>') -%]
-</div>
-[%- END %]
-
-[%-
- open = today _ ctx.hours.dow_4_open;
- close = today _ ctx.hours.dow_4_close;
- IF open == close;
-%]
-<div class="opening-hours">[% l('Friday: closed') %]</div>
-[%- ELSE %]
-<div class="opening-hours" property="openingHoursSpecification" typeof="OpeningHoursSpecification"><link property="dayOfWeek" href="http://purl.org/goodrelations/v1#Friday" />[%
- l('Friday: [_1] - [_2]', '<time property="opens" content="' _ date.format(open, format => '%H:%M:%S') _ '">' _ date.format(open) _ '</time>',
- '<time property="closes" content="' _ date.format(close, format => '%H:%M:%S') _ '">' _ date.format(close) _ '</time>') -%]
-</div>
-[%- END %]
-
-[%-
- open = today _ ctx.hours.dow_5_open;
- close = today _ ctx.hours.dow_5_close;
- IF open == close;
-%]
-<div class="opening-hours">[% l('Saturday: closed') %]</div>
-[%- ELSE %]
-<div class="opening-hours" property="openingHoursSpecification" typeof="OpeningHoursSpecification"><link property="dayOfWeek" href="http://purl.org/goodrelations/v1#Saturday" />[%
- l('Saturday: [_1] - [_2]', '<time property="opens" content="' _ date.format(open, format => '%H:%M:%S') _ '">' _ date.format(open) _ '</time>',
- '<time property="closes" content="' _ date.format(close, format => '%H:%M:%S') _ '">' _ date.format(close) _ '</time>') -%]
-</div>
-[%- END %]
-
-[%-
- open = today _ ctx.hours.dow_6_open;
- close = today _ ctx.hours.dow_6_close;
- IF open == close;
-%]
-<div class="opening-hours">[% l('Sunday: closed') %]</div>
-[%- ELSE %]
-<div class="opening-hours" property="openingHoursSpecification" typeof="OpeningHoursSpecification"><link property="dayOfWeek" href="http://purl.org/goodrelations/v1#Sunday" />[%
- l('Sunday: [_1] - [_2]', '<time property="opens" content="' _ date.format(open, format => '%H:%M:%S') _ '">' _ date.format(open) _ '</time>',
- '<time property="closes" content="' _ date.format(close, format => '%H:%M:%S') _ '">' _ date.format(close) _ '</time>') -%]
-</div>
-[%- END %]
+++ /dev/null
-[%-
- opac_root = ctx.opac_root;
- IF ctx.kpac_root;
- opac_root = ctx.kpac_root;
- END;
-
- # Requires a "fleshed_ou" (aou) object defined.
- # Allow fleshed circ_libs
- org_id = fleshed_ou.id;
- org_name = fleshed_ou.name;
- org_sname = fleshed_ou.shortname;
-
- lib_url = ctx.get_org_setting(org_id, 'lib.info_url');
- prefer_external_url = ctx.get_org_setting(org_id, 'lib.prefer_external_url');
- UNLESS lib_url && prefer_external_url;
- lib_url = mkurl(opac_root _ '/library/' _ org_sname, {}, 1);
- END;
- IF lib_url; '<a property="offeredBy" typeof="Library" href="'; lib_url | html; '">'; END;
- '<span property="name">'; org_name | html; '</span>';
- IF lib_url; '</a>'; END;
--%]
-
+++ /dev/null
-[% # Check if we need to do anything.
- hold_type = CGI.param('hold_type');
- max_holds = ctx.get_org_setting(ctx.default_pickup_lib, 'circ.holds.max_duplicate_holds');
- can_dup = ctx.has_perm('CREATE_DUPLICATE_HOLDS', ctx.default_pickup_lib);
- IF ctx.hold_data.size == 1 && (hold_type == 'M' || hold_type == 'T') && max_holds && max_holds > 1 && can_dup;
-%]
-<p>
-<label for="num_copies">[% l('Number of copies') %]</label>
-<select id="num_copies" name="num_copies" title="[% l('Number of copies') %]">
-[% FOR num IN [1..max_holds] %]
-<option value="[% num %]">[% num %]</option>
-[% END %]
-</select>
-</p>
-[% END %]
+++ /dev/null
-[%# Produce a URL for a given field that cycles for sorting from
- "nothing" to "ascending" to "descending" then back to "nothing".
-%]
-[% MACRO sort_url(field)
- IF (CGI.param('sort') == field);
- SWITCH CGI.param('sort_type');
- CASE "asc";
- mkurl('',{sort=>field, sort_type=>'desc'},1);
- CASE "desc";
- mkurl('',{sort=>field, sort_type=>'asc'}, 1);
- END;
- ELSE;
- mkurl('',{sort=>field, sort_type=>'asc'}, 1);
- END;
-%]
-[%# SET click_sort = l("click to sort") %]
-[%# SET click_sort = "title=\"$click_sort\"" %]
-
-[%# Produce arrows to indicate the sorting status of the column %]
-[% MACRO sort_indicator(field)
- IF (CGI.param('sort') == field);
- SWITCH CGI.param('sort_type');
- CASE "asc";
-" <span class=\"column_sort_arrow\">▲</span>";
- CASE "desc";
-" <span class=\"column_sort_arrow\">▼</span>";
- END;
- END;
-%]
-
-[%# Column headers for sortable columns %]
-[% MACRO sort_head(field, field_label)
- BLOCK %]
-<a href="[% sort_url(field) %]" [% click_sort %]>[% l(field_label) %]</a>[%- sort_indicator(field) %]
-[% END
-%]
+++ /dev/null
-<tr>
- <td colspan="3">
- <br />
- [% l('Important! You must have a printed receipt ' _
- 'to be eligible for a refund on lost items ' _
- '(regulations allow for no exceptions).')
- %]
- <br />
- <strong>
- [% l('To ensure your necessary receipt information ' _
- 'is not lost, enter your email address above ' _
- 'and a receipt will be emailed to you. Otherwise, ' _
- 'make certain you have a printed receipt in hand ' _
- 'before closing the payment receipt screen.')
- %]
- </strong>
- </td>
-</tr>
+++ /dev/null
-<p>
- [% l('Ensure your account has a valid email address so that we can notify ' _
- 'you about available holds, items that are about to be overdue, and ' _
- 'overdue items!') %]
-</p>
+++ /dev/null
-[%- IF ctx.pref_ou && ctx.pref_ou != ctx.search_ou; %]
-<span class="preflib">[%
- l('Preferred library: [_1]', '<span class="bold">' _ ctx.get_aou(ctx.pref_ou).name _ '</span>');
- IF NOT ctx.is_staff %]<a href="[% mkurl(ctx.opac_root _ '/myopac/prefs_settings')
- %]" class="preflib_change" title="[% l("Change preferred library"); %]">[% l('?') %]</a>[% END; %]
-</span>
-[%- END; %]
+++ /dev/null
-[%-
-UNLESS params;
- params = ['locg', 'loc', 'query', 'qtype', 'sort'];
-END;
-FOR param IN params;
- IF CGI.param(param); %]
- <input type="hidden" name="[% param %]" value="[% CGI.param(param) | html %]" />
- [%- END;
-END; %]
+++ /dev/null
-[%-
-
-PROCESS "opac/parts/relators.tt2";
-
-author_cnt = 0;
-authors = [
- {
- type => 'author',
- label => l('Author'),
- xpath => '//*[@tag="100"]|//*[@tag="110"]|//*[@tag="111"]'
- }, {
- type => 'added',
- label => l('Added Author'),
- xpath => '//*[@tag="700"]|//*[@tag="710"]|//*[@tag="711"]'
- }, {
- type => 'cast',
- label => l('Cast'),
- xpath => '//*[@tag="511"][@ind1="1"]'
- }, {
- type => 'notes',
- label => l('Author Notes: '),
- xpath => '' # Comes from added content...
- }
-];
-
-BLOCK find_hl_value;
- outlist = [];
- norm_needle = PROCESS normalize_string(unnorm_string=needle);
- FOREACH hl IN attrs.display_field_list;
- norm_value = PROCESS normalize_string(unnorm_string=hl.value);
- outlist.push(hl.$f) IF norm_value == norm_needle;
- END;
-
- outlist.0;
-END;
-
-BLOCK normalize_string;
- unnorm_string.replace('[#"^$\+\-,\.:;&|\[\]()]', ' ').replace('\s+',' ').replace('^\s+','').replace('\s+$','');
-END;
-
-BLOCK normalize_qterm;
- PROCESS normalize_string(unnorm_string=subfield.textContent);
-END;
-
-BLOCK normalize_authors;
- link_term = link_term _ ' ' _ sf;
- sf_raw = PROCESS normalize_qterm;
- qterm = qterm _ ' ' _ sf_raw;
- indexed_term = 1;
-END;
-
-BLOCK build_author_links;
- FOR node IN ctx.marc_xml.findnodes(xpath);
- author_cnt = author_cnt + 1;
- contrib_ref = '#schemacontrib' _ author_cnt;
- iprop = ''; # schema.org item type / property
- link_term = ''; # Linked term (e.g. Personal name + Fuller form of name)
- supp_term = ''; # Supplementary terms
- qterm = ''; # Search query
- tlabels = [];
- birthdate = '';
- deathdate = '';
- graphics = [];
- tag = node.getAttribute('tag');
- FOR subfield IN node.childNodes;
- indexed_term = '';
- NEXT UNLESS subfield.nodeName == "subfield";
- code = subfield.getAttribute('code');
- IF code == '4';
- relcode = subfield.textContent.substr(0,3);
- tlabels.push( relators.$relcode || label );
- END;
- IF code == 'e';
- tlabels.push( subfield.textContent() );
- indexed_term = 1;
- END;
- IF code == '6';
- target_field = tag;
- linked_fields = [subfield.textContent()];
- get_linked_880s;
- END;
- NEXT UNLESS code.match('[a-z]');
- sf = subfield.textContent | html;
-
- # Only Persons have birth/death dates in schema.org
- # Match personal/corporate/conference MODS subfields
- IF tag.substr(1,2) == '00';
- IF code.match('[abcqu]');
- PROCESS normalize_authors;
- END;
- IF code.match('d');
- IF subfield.textContent.match('^\s*\d{4}');
- birthdate = subfield.textContent.replace('^\s*(\d{4}).*$', '$1');
- END;
- IF subfield.textContent.match('-\d{4}.*$');
- deathdate = subfield.textContent.replace('^\s*.{4}\-(\d{4}).*$', '$1');
- END;
- indexed_term = 1;
- sf_raw = PROCESS normalize_qterm;
- qterm = qterm _ ' ' _ sf_raw;
- END;
- ELSIF tag.substr(1,2) == '10';
- IF code.match('[abcdn]');
- PROCESS normalize_authors;
- END;
- ELSIF code.match('[acdeq]');
- PROCESS normalize_authors;
- END;
- UNLESS indexed_term;
- supp_term = supp_term _ ' ' _ sf;
- END;
- END;
- url = mkurl(ctx.opac_root _ '/results', {query => qterm.replace('^\s*(.*?)\s*$', '$1'), qtype => 'author'}, stop_parms.merge(expert_search_parms, general_search_parms, browse_search_parms, facet_search_parms));
- tlabel = tlabels.join(', ');
- tlabels = [];
- author_type = (tlabel || label) | html;
-
- # schema.org changes
- IF type == 'author';
- IF tag.substr(1,2) == '10' && args.schema.itemtype && args.schema.itemtype.match('MusicAlbum');
- iprop = ' typeof="MusicGroup" property="byArtist"';
- ELSIF tag.substr(1,2) == '00';
- iprop = ' typeof="Person" property="author"';
- ELSE;
- iprop = ' typeof="Organization" property="author"';
- END;
- ELSIF type == 'added';
- IF tag.substr(1,2) == '00';
- iprop = ' typeof="Person" property="contributor';
- ELSE;
- iprop = ' typeof="Organization" property="contributor';
- END;
- IF relcode;
- iprop = iprop _ ' http://id.loc.gov/vocabulary/relators/' _ relcode;
- END;
- iprop = iprop _ '"';
- END;
-
- link_term = link_term.replace('^\s+', '');
- match_term = link_term _ ' ' _ birthdate _ ' ' _ deathdate;
- matching_author_hl = PROCESS find_hl_value needle=match_term f=attrs.hl_field;
-
- authtml = ' <span class="rdetail-author-div"' _ iprop _ ' resource="' _ contrib_ref _ '"><a href="' _ url _ '"><span resource="' _ contrib_ref _ '">';
- IF iprop; authtml = authtml _ '<span property="name">'; END;
- IF matching_author_hl;
- authtml = authtml _ matching_author_hl;
- ELSE;
- authtml = authtml _ link_term;
- END;
- IF iprop; authtml = authtml _ '</span>'; END;
- IF birthdate AND !matching_author_hl;
- authtml = authtml _ ' <span property="birthDate">' _ birthdate _ '</span>-';
- END;
- IF deathdate AND !matching_author_hl;
- authtml = authtml _ '<span property="deathDate">' _ deathdate _ '</span>';
- END;
- authtml = authtml _ '</span></a>'; # End search link
-
- # Display supplemental terms (mostly about the author's work)
- IF supp_term;
- authtml = authtml _ ' ' _ supp_term;
- END;
-
- # Display linked 880 fields
- FOREACH link880 IN graphics;
- diratt = '';
- IF link880.dir;
- diratt = ' dir="' _ link880.dir _ '"';
- END;
- authtml = authtml _ ' <span class="graphic880"' _ diratt _ '>';
- link880.value | html;
- authtml = authtml _ '</span>';
- END;
- authtml = authtml _ ' (<span property="description">' _ author_type _ '</span>). ';
- authtml = authtml _ '</span>'; # End author span
- authlist.push(authtml);
- END;
-END;
-%]
-
-<div class='rdetail_authors_div'>
-[%- FOREACH author IN authors;
- NEXT UNLESS author.xpath;
- authlist = [];
- PROCESS build_author_links(
- xpath=author.xpath, label=author.label, type=author.type
- );
- IF authlist.size;
- FOREACH authtml IN authlist;
- authtml;
- END;
- END;
-END %]
-</div>
-
-
+++ /dev/null
-[%-
-contents = [
- {
- display_field => 'general_note',
- label => l('General Note: '),
- xpath => '//*[@tag="500"]'
- }, {
- label => l('With Note: '),
- xpath => '//*[@tag="501"]'
- }, {
- display_field => 'thesis',
- label => l('Dissertation Note: '),
- xpath => '//*[@tag="502"]'
- }, {
- display_field => 'bibliography',
- label => l('Bibliography, etc. Note: '),
- xpath => '//*[@tag="504"]'
- }, {
- display_field => 'toc',
- label => l('Formatted Contents Note: '),
- xpath => '//*[@tag="505"]'
- }, {
- label => l('Restrictions on Access Note: '),
- xpath => '//*[@tag="506"]'
- }, {
- label => l('Scale Note for Graphic Material: '),
- xpath => '//*[@tag="507"]'
- }, {
- display_field => 'production_credits',
- label => l('Creation/Production Credits Note: '),
- xpath => '//*[@tag="508"]'
- }, {
- label => l('Citation/References Note: '),
- xpath => '//*[@tag="510"]'
- }, {
- display_field => 'performers',
- label => l('Participant or Performer Note: '),
- xpath => '//*[@tag="511"]'
- }, {
- label => l('Type of Report and Period Covered Note: '),
- xpath => '//*[@tag="513"]'
- }, {
- label => l('Data Quality Note: '),
- xpath => '//*[@tag="514"]'
- }, {
- label => l('Numbering Peculiarities Note: '),
- xpath => '//*[@tag="515"]'
- }, {
- label => l('Type of Computer File or Data Note: '),
- xpath => '//*[@tag="516"]'
- }, {
- label => l('Date/Time and Place of an Event Note: '),
- xpath => '//*[@tag="518"]'
- }, {
- display_field => 'abstract',
- label => l('Summary, etc.: '),
- xpath => '//*[@tag="520"]'
- }, {
- label => l('Target Audience Note: '),
- xpath => '//*[@tag="521"]'
- }, {
- label => l('Geographic Coverage Note: '),
- xpath => '//*[@tag="522"]'
- }, {
- label => l('Preferred Citation of Described Materials Note: '),
- xpath => '//*[@tag="524"]'
- }, {
- label => l('Supplement Note: '),
- xpath => '//*[@tag="525"]'
- }, {
- label => l('Study Program Information Note: '),
- xpath => '//*[@tag="526"]'
- }, {
- label => l('Additional Physical Form available Note: '),
- xpath => '//*[@tag="530"]'
- }, {
- label => l('Reproduction Note: '),
- xpath => '//*[@tag="533"]'
- }, {
- label => l('Original Version Note: '),
- xpath => '//*[@tag="534"]'
- }, {
- label => l('Location of Originals/Duplicates Note: '),
- xpath => '//*[@tag="535"]'
- }, {
- label => l('Funding Information Note: '),
- xpath => '//*[@tag="536"]'
- }, {
- label => l('System Details Note: '),
- xpath => '//*[@tag="538"]'
- }, {
- label => l('Terms Governing Use and Reproduction Note: '),
- xpath => '//*[@tag="540"]'
- }, {
- label => l('Immediate Source of Acquisition Note: '),
- xpath => '//*[@tag="541"]'
- }, {
- label => l('Information Relating to Copyright Status: '),
- xpath => '//*[@tag="542"]'
- }, {
- label => l('Location of Other Archival Materials Note: '),
- xpath => '//*[@tag="544"]'
- }, {
- label => l('Biographical or Historical Data: '),
- xpath => '//*[@tag="545"]'
- }, {
- label => l('Language Note: '),
- xpath => '//*[@tag="546"]'
- }, {
- label => l('Former Title Complexity Note: '),
- xpath => '//*[@tag="547"]'
- }, {
- label => l('Issuing Body Note: '),
- xpath => '//*[@tag="550"]'
- }, {
- label => l('Entity and Attribute Information Note: '),
- xpath => '//*[@tag="552"]'
- }, {
- label => l('Cumulative Index/Finding Aids Note: '),
- xpath => '//*[@tag="555"]'
- }, {
- label => l('Information About Documentation Note: '),
- xpath => '//*[@tag="556"]'
- }, {
- label => l('Ownership and Custodial History: '),
- xpath => '//*[@tag="561"]'
- }, {
- label => l('Copy and Version Identification Note: '),
- xpath => '//*[@tag="562"]'
- }, {
- label => l('Binding Information: '),
- xpath => '//*[@tag="563"]'
- }, {
- label => l('Case File Characteristics Note: '),
- xpath => '//*[@tag="565"]'
- }, {
- label => l('Methodology Note: '),
- xpath => '//*[@tag="567"]'
- }, {
- label => l('Linking Entry Complexity Note: '),
- xpath => '//*[@tag="580"]'
- }, {
- label => l('Publications About Described Materials Note: '),
- xpath => '//*[@tag="581"]'
- }, {
- label => l('Action Note: '),
- xpath => '//*[@tag="583"]'
- }, {
- label => l('Accumulation and Frequency of Use Note: '),
- xpath => '//*[@tag="584"]'
- }, {
- label => l('Exhibitions Note: '),
- xpath => '//*[@tag="585"]'
- }, {
- label => l('Awards Note: '),
- xpath => '//*[@tag="586"]'
- }, {
- label => l('Source of Description Note: '),
- xpath => '//*[@tag="588"]'
- }
-];
-
-BLOCK render_contents;
- xpath = xpath || '//*[starts-with(@tag,"5")]';
- FOR node IN ctx.marc_xml.findnodes(xpath);
- all_content = [];
- graphics = [];
- FOR subfield IN node.childNodes;
- NEXT UNLESS subfield.nodeName == "subfield";
- code = subfield.getAttribute('code');
- IF code == '6';
- linked_fields = [subfield.textContent()];
- target_field = node.getAttribute('tag');
- get_linked_880s;
- END;
- NEXT UNLESS code.match('[a-z]');
- all_content.push(subfield.textContent);
- END;
- total_contents = all_content.join(" ").replace('\s+$', '');
- %] [% "<div class='content_field'>"; total_contents | html ; "</div>";
- FOREACH link880 IN graphics;
- '<div class="graphic880"' _ link880.dir _ '>';
- link880.value | html;
- '</div>';
- END;
- END;
-END;
-
-BLOCK render_all_contents;
- FOREACH cont IN contents;
- content = '';
- df = cont.display_field;
- IF df AND attrs.hl.$df.size;
- content = '<!-- highlighted -->' _ attrs.hl.$df.join('<br/>');
- ELSE;
- content = PROCESS render_contents(xpath=cont.xpath);
- END;
- IF content.match('\S');
--%]
-<tr>
- <td class='rdetail_content_type'>[% cont.label %]</td>
- <td class='rdetail_content_value' property='keywords'>[% content %]</td>
-</tr>
- [%- END; %]
- [%- END; %]
-[%- END %]
-
-[%- content_html = PROCESS render_all_contents;
- IF content_html.length > 0;
-%]
-<h2 class='rdetail_contents'>[% l('Content descriptions') %]</h2>
-<table class='rdetail_content'>
- <tbody>
-[%- content_html %]
- </tbody>
-</table>
-[%- END %]
+++ /dev/null
-[%-
-expand_path = CGI.param('sepath') || [];
-expand_path = expand_path.list; # sic
-
-seoffset_list = CGI.param('seoffset') || [];
-seoffset_list = seoffset_list.list; # sic
-
-IF expand_path.size == 0 AND seoffset_list.size == 0;
- seoffset_list = [0,0]; # compensate for $auto_expand_first; see ML
-END;
-
-selimit = CGI.param('selimit') || 10;
-ght_sepath = [];
-ght_depth = 0;
-
-VIEW grouped_holding_tree;
- BLOCK list;
- level_description = item.shift;
- level_description.caption =
- level_description.caption.replace('[\(\)]', '');
-
- '<div class="rdetail-holding-group">';
- prev_seoffset_list = seoffset_list.slice(0, ght_depth);
- next_seoffset_list = seoffset_list.slice(0, ght_depth);
-
- prev_seoffset_list.$ght_depth = prev_seoffset_list.$ght_depth - selimit;
- IF prev_seoffset_list.$ght_depth < 0;
- prev_seoffset_list.$ght_depth = 0;
- END;
-
- has_more = 0;
- at_deepest_level = 0;
-
- next_seoffset_list.$ght_depth = next_seoffset_list.$ght_depth + selimit;
- IF item.0.units;
- INCLUDE "opac/parts/record/copy_table.tt2" serial_holdings=item;
- "<hr />";
-
- at_deepest_level = 1;
- IF NOT item.last.label;
- has_more = 1;
- END;
- ELSE;
- FOREACH node IN item;
- IF NOT node.label;
- has_more = 1;
- LAST;
- END;
-
- IF node.value;
- ght_sepath.push(node.value);
- new_seoffsets = seoffset_list.slice(0, ght_depth);
- new_seoffsets.push(0);
-
- expand_link = mkurl(
- '', {'sepath' => ght_sepath, 'seoffset' => new_seoffsets},
- 0, 'issues'
- );
-
- collapse_sepath = ght_sepath.slice(0, -2);
- IF collapse_sepath.size == 0;
- collapse_clear_params = ['sepath'];
- ELSE;
- collapse_clear_params = 0;
- END;
-
- collapse_link = mkurl(
- '', {
- 'sepath' => collapse_sepath,
- 'seoffset' => new_seoffsets.slice(0, -2)
- }, collapse_clear_params, 'issues'
- );
-
- "<div class='rdetail-holding-group'>";
- IF node.children.size;
- # TODO: make images or figure out a CSS trick or
- # something. I doubt we can count on all OPAC clients
- # having adequate fonts to cover these Unicode glyphs.
- "▼ <a href='"; collapse_link;
- ELSE;
- "► <a href='"; expand_link;
- END;
- "'>"; node.label; "</a></div>";
-
- IF node.children.size;
- ght_depth = ght_depth + 1;
- view.print(node.children);
- ght_depth = ght_depth - 1;
- END;
-
- waste = ght_sepath.pop;
- ELSE;
- "<div class='rdetail-holding-group'>"; node.label; "</div>";
- at_deepest_level = 1;
- END;
- END;
- END;
-
- to_clear = 0;
- new_sepath_end = ght_depth - 1;
- IF new_sepath_end < 0;
- to_clear = ['sepath'];
- new_sepath = [];
- ELSE;
- new_sepath = expand_path.slice(0, ght_depth - 1);
- END;
-
- # So the "holdings" level of the tree is sorted ascending, while all
- # the higher levels are sorted descending. This seems weird until you
- # look at it. I dunno. I think it feels right. It could be changed I
- # guess. Anyway, this means we have to be careful about which
- # paging link we label "earlier" and which one we label "later."
-
- next_link = ''; prev_link = '';
- IF has_more;
- next_link = '<a class="paging" href="' _
- mkurl('',{seoffset => next_seoffset_list, sepath => new_sepath},to_clear,'issues') _ '">LABEL_HERE</a> ';
- END;
- IF seoffset_list.$ght_depth > 0;
- prev_link = '<a class="paging" href="' _
- mkurl('',{seoffset => prev_seoffset_list, sepath => new_sepath},to_clear,'issues') _ '">LABEL_HERE</a> ';
- END;
-
- IF at_deepest_level;
- prev_link.replace('LABEL_HERE', '« ' _ l('Earlier issues'));
- next_link.replace('LABEL_HERE', l('Later issues') _ ' »');
- ELSE;
- # XXX this is really bad for i18n (notice the sloppy pluralization),
- # but then the middle layer for serials only knows English names
- # for things like "month". There's a bigger problem to solve
- # here...
- caption = level_description.caption;
- IF level_description.display_grouping == 'chron';
- caption = caption _ 's';
- END;
- next_link.replace(
- 'LABEL_HERE',
- '« ' _ l('Earlier') _ ' ' _ caption
- );
- prev_link.replace(
- 'LABEL_HERE',
- l('Later') _ ' ' _ caption _ ' »'
- );
- END;
- '</div>';
- END;
-END;
-
-VIEW holding_summary_tree;
- BLOCK hash;
- '<div class="rdetail-holding-group">';
- ctx.get_aou(item.org_unit).name; "<br />";
- FOREACH summary IN item.holding_summaries;
- IF summary.holdings;
- twisty = '▼ ';
- link = mkurl(
- '', {},
- ['sid','stype','selimit','sepath','seoffset'], 'issues'
- );
- link_title = l('Collapse');
- ELSE;
- twisty = '► ';
- link = mkurl(
- '', {sid => summary.id, stype => summary.summary_type},
- ['selimit','sepath','seoffset'], 'issues'
- );
- link_title = l('Expand');
- END;
- '<span>'; twisty;
- '<a href="' _ link _ '" title="' _ link_title _ '">';
- summary.generated_coverage.join(", ");
- '</a></span><br />';
- IF summary.holdings;
- grouped_holding_tree.print(summary.holdings);
- END;
- END;
- FOREACH child IN item.children;
- view.print(child);
- END;
- '</div>';
- END;
-END %]
- <div class="holding-summary-tree">
- [% holding_summary_tree.print(ctx.holding_summary_tree) %]
- </div>
- <div class="holding-summary-tree-pager">
- [% slimit = CGI.param('slimit') || 10;
- soffset = CGI.param('soffset') || 0;
- soffset_prev = soffset - slimit;
- IF soffset_prev < 0; soffset_prev = 0; END;
- soffset_next = soffset + slimit;
- %]
- [% IF soffset > 0 %]
- <a href="[% mkurl('', {soffset => soffset_prev}, ['sid','stype','sepath','selimit','seoffset'], 'issues') %]>[% l('Previous') %]</a>
- [% END %]
- [% IF ctx.holding_summary_tree.more %]
- <a href="[% mkurl('', {soffset => soffset_next}, ['sid','stype','sepath','selimit','seoffset'], 'issues') %]">[% l('Next') %]</a>
- [% END %]
- </div>
+++ /dev/null
-[% IF ctx.mfhd_summaries.size; %]
- <div class="rdetail-mfhd-holdings">
- <table><tbody>
-[%
- mfhd = {
- basic_holdings = l('Volumes'),
- basic_holdings_add = l('Additional Volume Information'),
- supplement_holdings = l('Supplements'),
- supplement_holdings_add = l('Additional Supplement Information'),
- index_holdings = l('Indexes'),
- index_holdings_add = l('Additional Index Information'),
- online = l('Online'),
- missing = l('Missing'),
- incomplete = l('Incomplete'),
- };
-
- FOREACH serial IN ctx.mfhd_summaries;
- printed_mfhd_header = 0;
- FOREACH type IN mfhd.keys;
- NEXT UNLESS serial.$type.size;
- IF !printed_mfhd_header; %]
- <tr>
- <td class="rdetail-mfhd-head" colspan="2">[% l('Holdings summary ([_1])', serial.location) | html %]</td>
- </tr>
- [% printed_mfhd_header = 1;
- END; %]
- <tr>
- <td class="rdetail-mfhd-type">[% mfhd.$type %]</td>
- <td class="rdetail-mfhd-contents">[%
- FOR thing IN serial.$type;
- thing.join(", ") | html;
- END %]</td>
- </tr>
- [% END;
- IF printed_mfhd_header; %]
- <tr>
- <td class="rdetail-mfhd-foot" colspan="2"> </td>
- </tr>
- [% END; %]
- [% END %]
- </tbody></table>
- </div>
-[% END %]
+++ /dev/null
-<div class='rdetail_extras_div'>
- [%
- IF ctx.holding_summary_tree;
- INCLUDE 'opac/parts/record/issues-db.tt2'; # "new" serials holdings
- END;
- %]
- [% INCLUDE 'opac/parts/record/issues-mfhd.tt2' # mfhd-based "classic" serials %]
-</div>
+++ /dev/null
-[%-
- # Default to the root of the org unit tree in the absence of a specific library
- loc = ctx.search_ou;
-
- # Get the full name of the library
- ou_name = ctx.get_aou(loc).name | uri;
-
- # Generate the gross RefWorks URL, based on parameters from config.tt2
- rw_uri = ctx.refworks.url _
- '/express/expressimport.asp?vendor=' _
- ou_name _
- '&filter=MARC+Format&database=All+MARC+Formats&' _
- 'encoding=65001&url=http%3A%2F%2F' _
- CGI.server_name _
- '/opac/extras/supercat/marctxt/record/' _
- ctx.bre_id;
-%]
-<div class="rdetail_aux_utils rdetail_refworks">
- <a href="[% rw_uri %]" rel="nofollow" vocab=""><img src="/images/starz.png[% ctx.cache_key %]" alt="" />[% l('Export to RefWorks') %]</a>
-</div>
+++ /dev/null
-[%
- subjects = [
- {
- display_field => 'subject',
- label => l('Subject: '),
- xpath => '//*[@tag="600" or @tag="610" or @tag="611" or @tag="630" or @tag="650" or @tag="651"]'
- }, {
- display_field => 'genre',
- label => l('Genre: '),
- facet => 'identifier|genre',
- joiner => ' -- ',
- xpath => '//*[@tag="655"]',
- subfields => '[abvxyz]'
- }, {
- label => l('Topic Heading: '),
- xpath => '//*[@tag="690"]'
- }, {
- label => l('Geographic Setting: '),
- xpath => '//*[@tag="691"]'
- }, {
- label => l('Biographical Subject: '),
- xpath => '//*[@tag="692"]'
- }, {
- label => l('Character Attributes: '),
- xpath => '//*[@tag="693"]'
- }, {
- label => l('Setting: '),
- xpath => '//*[@tag="698"]'
- }, {
- label => l('Time Period: '),
- xpath => '//*[@tag="699"]'
- }
- ];
-
- BLOCK render_subject;
- xpath = s.xpath || '//*[starts-with(@tag,"6")]';
- FOR node IN ctx.marc_xml.findnodes(xpath);
- '<span property="about">';
- all_terms = [];
- graphics = [];
- FOR subfield IN node.childNodes;
- NEXT UNLESS subfield.nodeName == "subfield";
- code = subfield.getAttribute('code');
- IF code == '6';
- linked_fields = [subfield.textContent()];
- target_field = node.getAttribute('tag');
- get_linked_880s;
- END;
-
- NEXT UNLESS code.match('[a-z]');
- IF s.subfields; NEXT UNLESS code.match(s.subfields); END;
-
- IF code.match('[vxyz]'); " > "; END;
-
- # at this point, we actually have a partial term to use.
- raw_term = subfield.textContent;
- single_term = raw_term | html;
-
- # facets should be used as-is
- IF !s.facet; raw_term = raw_term.replace('\-', ' ').replace('[#"^$\+,:;&|\[\]()]', ''); END;
-
- all_terms.push(raw_term);
-
- IF s.facet;
- total_term = s.facet _ '[' _ all_terms.join(s.joiner).replace('\s+$', '') _ ']';
- ELSE;
- total_term = all_terms.join(" ").replace('\s+$', '');
- END;
-
- %]<a href="[%-
- mkurl(ctx.opac_root _ '/results', {qtype=>'subject', query=>total_term}, stop_parms.merge(expert_search_parms, general_search_parms, browse_search_parms, facet_search_parms))
- -%]">[% single_term %]</a> [%-
-
- END;
- IF all_terms.size; "<br/>"; END;
- FOREACH link880 IN graphics;
- '<div class="graphic880"' _ link880.dir _ '>';
- link880.value | html;
- '</div>';
- END;
- '</span>';
- END;
- END;
-
- BLOCK render_hl_subject;
- total_term = s.value;
- IF s.facet;
- total_term = s.facet _ '[' _ s.value _ ']';
- END;
-
- '<span property="about"><!-- highlighted -->';
- %]<a href="[%-
- mkurl(ctx.opac_root _ '/results', {qtype=>'subject', query=>total_term}, stop_parms.merge(expert_search_parms, general_search_parms, browse_search_parms, facet_search_parms))
- -%]">[% s.$f %]</a> [%-
- '</span>';
- END;
-%]
-
-[% BLOCK render_all_subjects;
- FOREACH subj IN subjects;
- content = '';
- df = subj.display_field;
- IF df AND attrs.hl_display_fields.$df.size;
- content = [];
- FOREACH hl_s IN attrs.hl_display_fields.$df;
- hl_s.facet = subj.facet;
- next_s = PROCESS render_hl_subject(s=hl_s,f=attrs.hl_field);
- content.push(next_s);
- END;
-
- content = content.join('<br/>');
-%]
- <table class='rdetail_subject'>
- <tbody>
- <tr>
- <td class='rdetail_subject_type'>[% subj.label %]</td>
- <td class='rdetail_subject_value'>[% content %]</td>
- </tr>
- </tbody>
- </table>
-[%
- ELSE;
- content = PROCESS render_subject(s=subj);
- IF content.match('\S');
-%]
- <table class='rdetail_subject'>
- <tbody>
- <tr>
- <td class='rdetail_subject_type'>[% subj.label %]</td>
- <td class='rdetail_subject_value'>[% content %]</td>
- </tr>
- </tbody>
- </table>
- [%- END; %]
- [%- END; %]
- [%- END; %]
-[%- END %]
-
-[%- subject_html = PROCESS render_all_subjects;
- IF subject_html.length > 0;
-%]
-<h2 class='rdetail_related_subjects'>[% l('Search for related items by subject') %]</h2>
-[%- subject_html %]
-[%- END %]
+++ /dev/null
-<div class='rdetail_extras_div'>
- [%- IF attrs.summary %]
- <div class='rdetail-extras-summary'>
- <strong>[% l('Summary: ') %]</strong>
- [% FOR sum IN attrs.summaries %]
- [% IF !loop.first; '<br/>'; END %]
- <span>[% sum | html %] </span>
- [% END %]
- </div>
- [%- END %]
- [%- IF ENV.OILS_CONTENT_CAFE_USER %]
- <!-- Embedded content cafe iframe -->
- [% ident = attrs.isbn_clean || attrs.upc %]
- <iframe width="100%" height="400" frameborder="0"
- src="[% ctx.ext_proto %]://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=[%-
- ENV.OILS_CONTENT_CAFE_USER %]&Password=[% ENV.OILS_CONTENT_CAFE_PASS %]&ItemKey=[% ident | uri %]&Options=Y" >
- </iframe>
- [%- END %]
-</div>
-
+++ /dev/null
-[%-
-# Generated from http://www.loc.gov/marc/relators/relacode.html
-# using the build/tools/relator_map script
-relators = {
- 'abr' => l('Abridger'),
- 'acp' => l('Art copyist'),
- 'act' => l('Actor'),
- 'adi' => l('Art director'),
- 'adp' => l('Adapter'),
- 'aft' => l('Author of afterword, colophon, etc.'),
- 'anl' => l('Analyst'),
- 'anm' => l('Animator'),
- 'ann' => l('Annotator'),
- 'ant' => l('Bibliographic antecedent'),
- 'ape' => l('Appellee'),
- 'apl' => l('Appellant'),
- 'app' => l('Applicant'),
- 'aqt' => l('Author in quotations or text abstracts'),
- 'arc' => l('Architect'),
- 'ard' => l('Artistic director'),
- 'arr' => l('Arranger'),
- 'art' => l('Artist'),
- 'asg' => l('Assignee'),
- 'asn' => l('Associated name'),
- 'ato' => l('Autographer'),
- 'att' => l('Attributed name'),
- 'auc' => l('Auctioneer'),
- 'aud' => l('Author of dialog'),
- 'aui' => l('Author of introduction, etc.'),
- 'aus' => l('Screenwriter'),
- 'aut' => l('Author'),
- 'bdd' => l('Binding designer'),
- 'bjd' => l('Bookjacket designer'),
- 'bkd' => l('Book designer'),
- 'bkp' => l('Book producer'),
- 'blw' => l('Blurb writer'),
- 'bnd' => l('Binder'),
- 'bpd' => l('Bookplate designer'),
- 'brd' => l('Broadcaster'),
- 'brl' => l('Braille embosser'),
- 'bsl' => l('Bookseller'),
- 'cas' => l('Caster'),
- 'ccp' => l('Conceptor'),
- 'chr' => l('Choreographer'),
- 'clb' => l('Collaborator'),
- 'cli' => l('Client'),
- 'cll' => l('Calligrapher'),
- 'clr' => l('Colorist'),
- 'clt' => l('Collotyper'),
- 'cmm' => l('Commentator'),
- 'cmp' => l('Composer'),
- 'cmt' => l('Compositor'),
- 'cnd' => l('Conductor'),
- 'cng' => l('Cinematographer'),
- 'cns' => l('Censor'),
- 'coe' => l('Contestant-appellee'),
- 'col' => l('Collector'),
- 'com' => l('Compiler'),
- 'con' => l('Conservator'),
- 'cor' => l('Collection registrar'),
- 'cos' => l('Contestant'),
- 'cot' => l('Contestant-appellant'),
- 'cou' => l('Court governed'),
- 'cov' => l('Cover designer'),
- 'cpc' => l('Copyright claimant'),
- 'cpe' => l('Complainant-appellee'),
- 'cph' => l('Copyright holder'),
- 'cpl' => l('Complainant'),
- 'cpt' => l('Complainant-appellant'),
- 'cre' => l('Creator'),
- 'crp' => l('Correspondent'),
- 'crr' => l('Corrector'),
- 'crt' => l('Court reporter'),
- 'csl' => l('Consultant'),
- 'csp' => l('Consultant to a project'),
- 'cst' => l('Costume designer'),
- 'ctb' => l('Contributor'),
- 'cte' => l('Contestee-appellee'),
- 'ctg' => l('Cartographer'),
- 'ctr' => l('Contractor'),
- 'cts' => l('Contestee'),
- 'ctt' => l('Contestee-appellant'),
- 'cur' => l('Curator'),
- 'cwt' => l('Commentator for written text'),
- 'dbp' => l('Distribution place'),
- 'dfd' => l('Defendant'),
- 'dfe' => l('Defendant-appellee'),
- 'dft' => l('Defendant-appellant'),
- 'dgg' => l('Degree granting institution'),
- 'dgs' => l('Degree supervisor'),
- 'dis' => l('Dissertant'),
- 'dln' => l('Delineator'),
- 'dnc' => l('Dancer'),
- 'dnr' => l('Donor'),
- 'dpc' => l('Depicted'),
- 'dpt' => l('Depositor'),
- 'drm' => l('Draftsman'),
- 'drt' => l('Director'),
- 'dsr' => l('Designer'),
- 'dst' => l('Distributor'),
- 'dtc' => l('Data contributor'),
- 'dte' => l('Dedicatee'),
- 'dtm' => l('Data manager'),
- 'dto' => l('Dedicator'),
- 'dub' => l('Dubious author'),
- 'edc' => l('Editor of compilation'),
- 'edm' => l('Editor of moving image work'),
- 'edt' => l('Editor'),
- 'egr' => l('Engraver'),
- 'elg' => l('Electrician'),
- 'elt' => l('Electrotyper'),
- 'eng' => l('Engineer'),
- 'enj' => l('Enacting jurisdiction'),
- 'etr' => l('Etcher'),
- 'evp' => l('Event place'),
- 'exp' => l('Expert'),
- 'fac' => l('Facsimilist'),
- 'fds' => l('Film distributor'),
- 'fld' => l('Field director'),
- 'flm' => l('Film editor'),
- 'fmd' => l('Film director'),
- 'fmk' => l('Filmmaker'),
- 'fmo' => l('Former owner'),
- 'fmp' => l('Film producer'),
- 'fnd' => l('Funder'),
- 'fpy' => l('First party'),
- 'frg' => l('Forger'),
- 'gis' => l('Geographic information specialist'),
- 'grt' => l('Graphic technician'),
- 'his' => l('Host institution'),
- 'hnr' => l('Honoree'),
- 'hst' => l('Host'),
- 'ill' => l('Illustrator'),
- 'ilu' => l('Illuminator'),
- 'ins' => l('Inscriber'),
- 'inv' => l('Inventor'),
- 'isb' => l('Issuing body'),
- 'itr' => l('Instrumentalist'),
- 'ive' => l('Interviewee'),
- 'ivr' => l('Interviewer'),
- 'jud' => l('Judge'),
- 'jug' => l('Jurisdiction governed'),
- 'lbr' => l('Laboratory'),
- 'lbt' => l('Librettist'),
- 'ldr' => l('Laboratory director'),
- 'led' => l('Lead'),
- 'lee' => l('Libelee-appellee'),
- 'lel' => l('Libelee'),
- 'len' => l('Lender'),
- 'let' => l('Libelee-appellant'),
- 'lgd' => l('Lighting designer'),
- 'lie' => l('Libelant-appellee'),
- 'lil' => l('Libelant'),
- 'lit' => l('Libelant-appellant'),
- 'lsa' => l('Landscape architect'),
- 'lse' => l('Licensee'),
- 'lso' => l('Licensor'),
- 'ltg' => l('Lithographer'),
- 'lyr' => l('Lyricist'),
- 'mcp' => l('Music copyist'),
- 'mdc' => l('Metadata contact'),
- 'med' => l('Medium'),
- 'mfp' => l('Manufacture place'),
- 'mfr' => l('Manufacturer'),
- 'mod' => l('Moderator'),
- 'mon' => l('Monitor'),
- 'mrb' => l('Marbler'),
- 'mrk' => l('Markup editor'),
- 'msd' => l('Musical director'),
- 'mte' => l('Metal-engraver'),
- 'mtk' => l('Minute taker'),
- 'mus' => l('Musician'),
- 'nrt' => l('Narrator'),
- 'opn' => l('Opponent'),
- 'org' => l('Originator'),
- 'orm' => l('Organizer'),
- 'osp' => l('Onscreen presenter'),
- 'oth' => l('Other'),
- 'own' => l('Owner'),
- 'pan' => l('Panelist'),
- 'pat' => l('Patron'),
- 'pbd' => l('Publishing director'),
- 'pbl' => l('Publisher'),
- 'pdr' => l('Project director'),
- 'pfr' => l('Proofreader'),
- 'pht' => l('Photographer'),
- 'plt' => l('Platemaker'),
- 'pma' => l('Permitting agency'),
- 'pmn' => l('Production manager'),
- 'pop' => l('Printer of plates'),
- 'ppm' => l('Papermaker'),
- 'ppt' => l('Puppeteer'),
- 'pra' => l('Praeses'),
- 'prc' => l('Process contact'),
- 'prd' => l('Production personnel'),
- 'pre' => l('Presenter'),
- 'prf' => l('Performer'),
- 'prg' => l('Programmer'),
- 'prm' => l('Printmaker'),
- 'prn' => l('Production company'),
- 'pro' => l('Producer'),
- 'prp' => l('Production place'),
- 'prs' => l('Production designer'),
- 'prt' => l('Printer'),
- 'prv' => l('Provider'),
- 'pta' => l('Patent applicant'),
- 'pte' => l('Plaintiff-appellee'),
- 'ptf' => l('Plaintiff'),
- 'pth' => l('Patent holder'),
- 'ptt' => l('Plaintiff-appellant'),
- 'pup' => l('Publication place'),
- 'rbr' => l('Rubricator'),
- 'rcd' => l('Recordist'),
- 'rce' => l('Recording engineer'),
- 'rcp' => l('Addressee'),
- 'rdd' => l('Radio director'),
- 'red' => l('Redaktor'),
- 'ren' => l('Renderer'),
- 'res' => l('Researcher'),
- 'rev' => l('Reviewer'),
- 'rpc' => l('Radio producer'),
- 'rps' => l('Repository'),
- 'rpt' => l('Reporter'),
- 'rpy' => l('Responsible party'),
- 'rse' => l('Respondent-appellee'),
- 'rsg' => l('Restager'),
- 'rsp' => l('Respondent'),
- 'rsr' => l('Restorationist'),
- 'rst' => l('Respondent-appellant'),
- 'rth' => l('Research team head'),
- 'rtm' => l('Research team member'),
- 'sad' => l('Scientific advisor'),
- 'sce' => l('Scenarist'),
- 'scl' => l('Sculptor'),
- 'scr' => l('Scribe'),
- 'sds' => l('Sound designer'),
- 'sec' => l('Secretary'),
- 'sgd' => l('Stage director'),
- 'sgn' => l('Signer'),
- 'sht' => l('Supporting host'),
- 'sll' => l('Seller'),
- 'sng' => l('Singer'),
- 'spk' => l('Speaker'),
- 'spn' => l('Sponsor'),
- 'spy' => l('Second party'),
- 'srv' => l('Surveyor'),
- 'std' => l('Set designer'),
- 'stg' => l('Setting'),
- 'stl' => l('Storyteller'),
- 'stm' => l('Stage manager'),
- 'stn' => l('Standards body'),
- 'str' => l('Stereotyper'),
- 'tcd' => l('Technical director'),
- 'tch' => l('Teacher'),
- 'ths' => l('Thesis advisor'),
- 'tld' => l('Television director'),
- 'tlp' => l('Television producer'),
- 'trc' => l('Transcriber'),
- 'trl' => l('Translator'),
- 'tyd' => l('Type designer'),
- 'tyg' => l('Typographer'),
- 'uvp' => l('University place'),
- 'vac' => l('Voice actor'),
- 'vdg' => l('Videographer'),
- 'voc' => l('Vocalist'),
- 'wac' => l('Writer of added commentary'),
- 'wal' => l('Writer of added lyrics'),
- 'wam' => l('Writer of accompanying material'),
- 'wat' => l('Writer of added text'),
- 'wdc' => l('Woodcutter'),
- 'wde' => l('Wood engraver'),
- 'win' => l('Writer of introduction'),
- 'wit' => l('Witness'),
- 'wpr' => l('Writer of preface'),
- 'wst' => l('Writer of supplementary textual content'),
-} -%]
\ No newline at end of file
+++ /dev/null
-[%- depths = attrs.copy_counts.size;
- depth = 0;
- displayed_ous = {};
- hiding_disabled = ctx.org_hiding_disabled();
- WHILE depth < depths;
- org_unit = ctx.get_aou(attrs.copy_counts.$depth.org_unit);
- ou_name = org_unit.name;
- displayed_ous.$ou_name = 1;
- IF attrs.copy_counts.$depth.count > 0 AND (
- hiding_disabled OR ctx.org_within_hiding_scope(org_unit.id));
-%]
-<div class="result_count">
-[% IF ctx.get_aou(attrs.copy_counts.$depth.org_unit).opac_visible == 't' %]
- [% l('[_1] of [quant,_2,copy,copies] available at [_3].',
- attrs.copy_counts.$depth.available,
- attrs.copy_counts.$depth.count,
- ou_name) | html
- %]
-[% END %]
-</div>
-[%- END;
- depth = depth + 1;
- END;
-
- depth = attrs.plib_copy_counts.size - 1;
- org_unit = ctx.get_aou(attrs.plib_copy_counts.$depth.org_unit);
- ou_name = org_unit.name;
- UNLESS displayed_ous.exists(ou_name);
-
-%]
-[%- IF attrs.plib_copy_counts.$depth.count > 0 AND (
- hiding_disabled OR ctx.org_within_hiding_scope(org_unit.id)) %]
-<div class="result_count preferred">[%
- l('[_1] of [quant,_2,copy,copies] available at [_3].',
- attrs.plib_copy_counts.$depth.available,
- attrs.plib_copy_counts.$depth.count,
- ou_name) | html
- %]
-</div>
-[%- END %]
-[%- END %]
+++ /dev/null
-[%# XXX Is this block generally desired? <p>
- <strong>Still not finding what you are looking for?</strong><br />
- Request that your library purchase the material you are looking for by making a
- <a href="javascript:;">Purchase Request</a><br />
- <strong>Note:</strong> You must be logged in to make a Purchase Request<br />
-</p> %]
+++ /dev/null
-[% IF NOT sms_number_hide_label; '<label for="sms_notify">' _ l('Mobile number:') _ '</label>'; END; %]
-<input type="text" name="sms_notify" [% setting = 'opac.default_sms_notify';
-IF ctx.user_setting_map.$setting; %] value='[% ctx.user_setting_map.$setting | html %]' [% END %]
-[% IF sms_number_hide_label; 'aria-label="' _ l('Mobile number') _ '"'; END; %] id="sms_notify" />
-[% IF NOT sms_number_hide_hint; l('Hint: use the full 10 digits of your phone #, no spaces, no dashes'); END; %]
+++ /dev/null
-[%- PROCESS "opac/parts/header.tt2" %]
-[% IF ctx.use_stripe %]
- <script type="text/javascript" src="https://js.stripe.com/v2/"></script> <!-- use an ou setting for this url? -->
- <script type="text/javascript">
- // This script is only displayed when logged in, so ctx.user.home_ou is always available
- Stripe.setPublishableKey('[% ctx.get_org_setting(ctx.user.home_ou.id, 'credit.processor.stripe.pubkey') %]');
-
- function stripe_onsubmit() {
- var form = document.getElementById("payment_form");
- var button = document.getElementById("payment_submit");
-
- button.disabled = true;
-
- Stripe.card.createToken(form, stripe_callback);
-
- return false;
- }
-
- function stripe_callback(status, response) {
- var form = document.getElementById("payment_form");
- var button = document.getElementById("payment_submit");
- var stripe_token = document.getElementById("stripe_token");
-
- if(response.error) {
- alert(response.error.message);
- button.disabled = false;
- return;
- }
-
- stripe_token.value = response.id; // response.id is the token id, though there are more fields available if needed.
- form.setAttribute("onsubmit","");
- form.submit();
- }
- </script>
-[%- END %]
+++ /dev/null
-<!-- ****************** tips.xml ***************************** -->
-<div class="hide_me">
- <div id='tips' class='tips hide_me'>
- <div class='hide_me'>
- <span>[% l("Click on a folder icon in the sidebar to access related quick searches") %]</span>
- <span>[% l("If you don't find what you want try expanding your search using the range selector at the right of the search bar") %]</span>
- </div>
- <strong>[% l("Tip:") %]</strong>
- </div>
-</div>
-<!-- ****************** end: tips.xml ***************************** -->
+++ /dev/null
-<div class="password_message">
-[% l('Note: You must have a valid email address associated with your library account. If not, please contact your local library for further assistance.'); %]
-</div>
+++ /dev/null
-[%- PROCESS "opac/parts/header.tt2";
- WRAPPER "opac/parts/base.tt2";
- INCLUDE "opac/parts/topnav.tt2";
- IF ctx.is_staff;
- basic_search = "f";
- END;
- ctx.page_title = l("Place Hold") %]
- <h2 class="sr-only">[% l('Hold Placement') %]</h2>
- [% INCLUDE "opac/parts/searchbar.tt2" %]
- <div id="content-wrapper">
- <div id="main-content" class="container">
- <div class="common-full-pad"></div>
- [% IF ctx.hold_attempt_made %]
- [% INCLUDE "opac/parts/place_hold_result.tt2" %]
- [% ELSE %]
- [% INCLUDE "opac/parts/place_hold.tt2" %]
- [% END %]
- <div class="common-full-pad"></div>
- </div>
- </div>
-[%- END %]
+++ /dev/null
-[% PROCESS "opac/parts/header.tt2";
- PROCESS "opac/parts/config.tt2";
- WRAPPER "opac/parts/base.tt2";
- INCLUDE "opac/parts/topnav.tt2";
- ctx.page_title = l("Record Detail") %]
- [% INCLUDE "opac/parts/searchbar.tt2" %]
- <br class="clear-both" />
- <div id="content-wrapper" class="content-wrapper-record-page">
- <div id='main-content'>
- <br/>
- [% IF ctx.user.email %]
- <h2 class='success'>[% l('Your email has been queued for delivery to [_1]', ctx.user.email ) %]</h2>
- [% ELSE %]
- <h2 class='error'>
- [% here_link_text = "<a href=\"${ctx.opac_root}/myopac/update_email?return_to_referer=1\">";
- here_link_text = here_link_text _ l("here");
- here_link_text = here_link_text _ "</a>";
- l('Your account does not currently have an email address set. Set your email address [_1]', here_link_text) %]
- </h2>
- [% END %]
- <br/>
- [% IF ctx.redirect_to %]
- <p>[ <a href="[% ctx.redirect_to | html %]">[% l("Return") %]</a> ] </p>
- [% ELSE %]
- <p>[ <a href="[% mkurl(ctx.opac_root _ '/record/' _ ctx.bre_id) %]">[% l("Back to Record") %]</a> ]</p>
- [% END %]
- <div class="common-full-pad"></div>
- </div>
- <br class="clear-both" />
- </div>
-[% END %]
-
+++ /dev/null
-[%- PROCESS "opac/parts/header.tt2";
- WRAPPER "opac/parts/base.tt2";
- INCLUDE "opac/parts/topnav.tt2";
- ctx.page_title = l("Send Call Number via Text/SMS") %]
- <h2 class="sr-only">[% l('Send Call Number via Text/SMS') %]</h2>
- <div class="mobile_hide">
- [% INCLUDE "opac/parts/searchbar.tt2" %]
- </div>
- <div id="content-wrapper">
- <div id="main-content">
- <div class="common-full-pad"></div>
- <div>
- <p>
- [% IF ctx.event != -1 %]
- <br/>
-
- [% IF ctx.origin.search('redirect');
- SET ctx.origin = ctx.opac_root _ '/record/' _ CGI.url_param('rec') _ '?query=' _
- CGI.url_param('query') _ ';qtype=' _ CGI.url_param('qtype') _ ';locg=' _ CGI.url_param('locg');
- END %]
-
- [% IF ctx.sms_notify %]
- <h1>[% l('Your message has been sent!') %]</h1>
- <a href="[% ctx.origin %]">[% l('Return to record') %]</a>
- <div class="sms_text"><pre>[% ctx.event.template_output.data %]</pre></div>
- [% ELSE %]
- <h1>[% l('Text call number') %]</h1>
- <a href="[% ctx.origin %]">[% l('Return to record') %]</a>
- <div class="sms_text"><pre>[% ctx.event.template_output.data %]</pre></div>
- <form method="post">
- <input type="hidden" name="copy_id" value="[% ctx.copy_id %]"/>
- <input type="hidden" name="origin" value="[% ctx.origin %]"/>
- [% INCLUDE "opac/parts/sms_carrier_selector.tt2" sms_carrier_hide_warning="true" %]<br/>
- [% INCLUDE "opac/parts/sms_number_textbox.tt2" %]<br/>
- <input type="submit"
- name="submit"
- value="[% l('Submit') %]"
- title="[% l('Submit') %]"
- alt="[% l('Submit') %]"
- class="opac-button" />
- <br/>[% l('Note: carrier charges may apply'); %]
- </form>
- [% END %]
- [% ELSE %]
- <span>[% l('SMS not enabled for this site.') %]</span>
- [% END %]
- </p>
- </div>
- <div class="common-full-pad"></div>
- </div>
- </div>
-[%- END %]
+++ /dev/null
-[%- PROCESS "opac/parts/header.tt2";
- PROCESS "opac/parts/misc_util.tt2";
- WRAPPER "opac/parts/base.tt2";
- INCLUDE "opac/parts/topnav.tt2";
- ctx.page_title = l("Basket Warning") %]
- <h2 class="sr-only">[% l('Basket Warning') %]</h2>
- [% INCLUDE "opac/parts/searchbar.tt2" %]
- <div id="content-wrapper">
- <div id="main-content">
- <p class="big-strong">[% l('You are adding to a basket.') %]
- [% IF ctx.user ;
- l('This information will disappear when you logout, unless you save it to a permanent list.');
- ELSE;
- l('This information will disappear when you end your session, unless you login and save it to a permanent list.');
- END
- %]</p>
- <form method="post" action="[% mkurl(ctx.opac_root _ '/temp_warn/post', {}, 1) %]">
- <input type="hidden" name="redirect_to" value="[% ctx.redirect_to %]" />
- <input type="checkbox" name="no_temp_list_warn" value="on" />
- <label for="no_temp_list_warn">[% l('Do not show this warning again.') %]</label>
- <br />
- <input type="submit" class="fixed" value="[% l('OK') %]" />
- </form>
- <div class="common-full-pad"></div>
- </div>
- </div>
-[%- END %]
--- /dev/null
+New Bootstrap-based OPAC
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+This release includes a new OPAC with a cleaner, more modern design.
+
+To enable the new OPAC design, open the _/etc/apache2/eg_vhost.conf_ file.
+
+Find the following line:
+
+------------------------------------------------------------------------------
+PerlAddVar OILSWebTemplatePath "/openils/var/templates"
+------------------------------------------------------------------------------
+
+Add the following line directly below it:
+
+------------------------------------------------------------------------------
+PerlAddVar OILSWebTemplatePath "/openils/var/templates-bootstrap"
+------------------------------------------------------------------------------
+
+Be sure that, if you have any local customizations, that they are referenced below
+this line. This way, your customizations will still appear in the new OPAC design
+(although they may need to be adjusted to better fit the new style).
+
+You can also turn on the new OPAC for some virtual hosts only, by adding it to the
+appropriate virtual host entry. Be sure to reference the OILSWebTemplatePath for
+the `templates-bootstrap` directory before referencing any local customizations
+used by that virtual host.
+