LP1920989 Adds missing course reserves files to the bootstrap opac. user/gcollum/LP1920989_Bootstrap_opac_missing_course_files
authorGarry Collum <gcollum@gmail.com>
Tue, 23 Mar 2021 18:55:57 +0000 (14:55 -0400)
committerGarry Collum <gcollum@gmail.com>
Tue, 23 Mar 2021 18:55:57 +0000 (14:55 -0400)
Copies missing course reserves files from templates/opac into
templates-bootstrap/opac.  The missing files were being rendered
from the former directory.

Signed-off-by: Garry Collum <gcollum@gmail.com>
Open-ILS/src/templates-bootstrap/opac/course/results.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/course/body.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/course_search/global_row.tt2 [new file with mode: 0644]
Open-ILS/src/templates-bootstrap/opac/parts/course_search/qtype_selector.tt2 [new file with mode: 0644]

diff --git a/Open-ILS/src/templates-bootstrap/opac/course/results.tt2 b/Open-ILS/src/templates-bootstrap/opac/course/results.tt2
new file mode 100644 (file)
index 0000000..41966bf
--- /dev/null
@@ -0,0 +1,114 @@
+[%- PROCESS "opac/parts/header.tt2";
+    WRAPPER "opac/parts/base.tt2";
+    INCLUDE "opac/parts/topnav.tt2";
+    ctx.page_title = l("Course Search Results");
+    page = CGI.param('page');
+    page = page.match('^\d+$') ? page : 0; # verify page is a sane value
+
+    page_count = (!ctx.page_size.defined || !ctx.hit_count.defined || ctx.page_size == 0) ? 1 : POSIX.ceil(ctx.hit_count / ctx.page_size);
+
+    # We don't want search engines indexing search results
+    ctx.metalinks.push('<meta name="robots" content="noindex,follow">');
+
+    PROCESS "opac/parts/misc_util.tt2";
+    PROCESS get_library;
+    ctx.result_start = 1 + ctx.page_size * page;
+    ctx.result_stop = ctx.page_size * (page + 1);
+    IF ctx.result_stop > ctx.hit_count; ctx.result_stop = ctx.hit_count; END;
+
+    result_count = ctx.result_start;
+-%]
+<h2 class="sr-only">[% l('Course Search Results') %]</h2>
+[% INCLUDE "opac/parts/searchbar.tt2" %]
+<div class="almost-content-wrapper">
+  <div id="results_header_bar">
+    <div id="results_header_inner">
+      <div class="results_header_btns">
+        <a href="[% mkurl(ctx.opac_root _ '/course_search', {$loc_name => loc_value}, 1) %]">[% l('Another Search') %]</a>
+      </div>
+    </div>
+  </div>
+</div>
+<div id="content-wrapper">
+  <div id="main-content">
+    <div id="results-page">
+      [% PROCESS "opac/parts/result/paginate.tt2" %] 
+      [% ctx.results_count_header = PROCESS results_count_header;
+    ctx.results_count_header %]
+      <div id="result_table_div">
+      <div id="result_block" class="result_block_visible">
+
+      <table id="result_table_table" title="[% l('Search Results') %]"
+        class="table_no_border_space table_no_cell_pad">
+        <thead class="sr-only">
+          <tr>
+            <th>[% l('Search result number') %]</th>
+            <th>[% l('Course details') %]</th>
+          </tr>
+        </thead>
+        <tbody id="result_table">
+        [% FOR course IN ctx.courses %]
+          [% course_url_path = ctx.opac_root _ '/course/' _ course.id; %]
+          [% # Do not pass "advanced params" to result detail code.
+          # Instead, pass the scrubed query in one-line form
+          del_parms = del_parms.merge(['query', 'bool', 
+                   'qtype', 'contains', '_adv']);
+          add_parms.import(
+           {query => ctx.naive_query_scrub(ctx.user_query)} );
+                  %]
+          <tr class="result_table_row">
+            <td class="results_row_count" name="results_row_count">
+              [% result_count; result_count = result_count + 1 %].
+            </td>
+            <td class="result_table_pic_header"></td>
+            <td class="result_table_title_cell" name="result_table_title_cell">
+              <div class="result_metadata">
+                <a class="record_title search_link" name="course_[% course.id %]"
+                  href="[% mkurl(course_url_path) %]"
+                  [% html_text_attr('title', l('Display course details for "[_1]"', course.name)) %]>
+                  [% course.course_number %]:  [% l(course.name) %]
+                </a>
+                <div>
+                  [% FOR instructor IN course.instructors %]
+                    [% instructorString = '';
+                      IF instructor.pref_family_name;
+                        instructorString = instructorString _ instructor.pref_family_name _ ', ';
+                      ELSE;
+                        instructorString = instructorString _ instructor.family_name _ ', ';
+                      END;
+                      IF instructor.pref_first_given_name;
+                        instructorString = instructorString _ instructor.pref_first_given_name;
+                      ELSE;
+                        instructorString = instructorString _ instructor.first_given_name;
+                      END; %]
+                  <a title="[% l('Perform an Instructor Search') %]"
+                    class="record_author"
+                    href="[%
+                       mkurl(ctx.opac_root _ '/results', {qtype => 'instructor', query => instructorString})
+                    %]" rel="nofollow" vocab="">
+                  [% instructorString %] ([% l(instructor.usr_role) %])</a>.
+                  [% END %]
+                </div>
+                <div>
+                  <span><strong>[% l('Course Number') %]</strong>: [% course.course_number %]</span>
+                </div>
+                <div>
+                  <span><strong>[% l('Section Number') %]</strong>: [% course.section_number %]</span>
+                </div>
+              </div>
+            </td>
+            <td>
+              [% ctx.get_aou(course.owning_lib).name %]
+            </td>
+          </tr>
+        [% END %]
+        </tbody>
+      </table>
+      </div>
+      </div>
+    </div>
+    <div class="common-full-pad"></div>
+  </div>
+  <br class="clear-both" />
+</div>
+[%- END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/parts/course/body.tt2 b/Open-ILS/src/templates-bootstrap/opac/parts/course/body.tt2
new file mode 100644 (file)
index 0000000..2d80caf
--- /dev/null
@@ -0,0 +1,123 @@
+<div id='canvas_main' class='canvas'>
+  <div class="course_details">
+    <div>
+      <h1>
+        [% l(ctx.course.name) %] ([% ctx.course.course_number %])
+        [% IF ctx.course.is_archived == 't' %]
+        <span class="archived_course">
+          This course is inactive.
+        </span>
+        [% END %]
+      </h1>
+      [% IF ctx.instructors.size %]
+      <div class="course_instructors_div">
+        <strong>Course Instructors:</strong>
+        [%- FOR instructor IN ctx.instructors;
+          instructorString = '';
+          IF instructor.pref_family_name;
+            instructorString = instructorString _ instructor.pref_family_name _ ', ';
+          ELSE;
+            instructorString = instructorString _ instructor.family_name _ ', ';
+          END;
+          IF instructor.pref_first_given_name;
+            instructorString = instructorString _ instructor.pref_first_given_name;
+          ELSE;
+            instructorString = instructorString _ instructor.first_given_name;
+          END;
+          instructorString = instructorString _ ' (' _ l(instructor.usr_role) _ ')'; %]
+          <span class="course-instructor-div">[% instructorString %].</span>
+        [% END %]
+      </div>
+      [% END %]
+
+      <div class="course_details_div">
+        <h2>[% l('Course Details') %]</h2>
+        <div>
+          <span><strong>[% l('Course Title') %]: </strong></span>
+          <span>[% ctx.course.name %]</span>
+        </div>
+        <div>
+          <span><strong>[% l('Course Number') %]: </strong></span>
+          <span>[% ctx.course.course_number %]</span>
+        <div>
+        </div>
+          <span><strong>[% l('Section Number') %]: </strong></span>
+          <span>[% ctx.course.section_number %]</span>
+        </div>
+        <div>
+          [%
+            owning_lib = ctx.get_aou(ctx.course.owning_lib);
+            lib_url = ctx.get_org_setting(owning_lib.id, 'lib.info_url');
+            prefer_external_url = ctx.get_org_setting(owning_lib.id, 'lib.prefer_external_url');
+            UNLESS lib_url && prefer_external_url;
+              lib_url = mkurl(ctx.opac_root _ '/library/' _ owning_lib.shortname, {}, 1);
+             END;
+          %]
+          <span><strong>[% l('Owning Library') %]: </strong></span>
+          <span><a href="[% lib_url %]">[% owning_lib.name %]</a></span>
+        </div>
+      </div>
+
+      [%- UNLESS ctx.course.is_archived == 't' %]
+      <div>
+        <span><h2>[% l('Course Materials') %]</h2></span>
+        <table class="table_no_border_space table_no_cell_pad table_no_border" width="100%" id="course_material_table">
+          <thead>
+            <tr>
+              <th scope="col">Location</th>
+              <th scope="col">Call Number</th>
+              <th scope="col">Title</th>
+              <th scope="col">Barcode</th>
+              <th scope="col">Relationship</th>
+              <th scope="col">Status</th>
+              <th scope="col">Shelving Location</th>
+            </tr>
+          </thead>
+          <tbody>
+            [% FOREACH material IN ctx.course_materials %]
+              <tr>
+                <td>
+                  [% IF material.item %]
+                    [%- fleshed_ou = material.item.circ_lib -%]
+                    [%- INCLUDE "opac/parts/library_name_link_from_ou.tt2"; -%]
+                  [% ELSE %]
+                    [% l('Online') %]
+                  [% END %]
+                  <link property="businessFunction" href="http://purl.org/goodrelations/v1#LeaseOut">
+                  <meta property="price" content="0.00">
+                </td>
+                <td>
+                  [% IF material.item %]
+                    [% material.item.call_number.label %]
+                  [% END %]
+                </td>
+                <td>
+                  <a href="[% mkurl(ctx.opac_root _ '/record/' _ material.record.id) %]">
+                    [% material.record.wide_display_entry.title %]
+                  </a>
+                </td>
+                <td>
+                  [% IF material.item %]
+                    [% material.item.barcode %]
+                  [% END %]
+                </td>
+                <td> [% material.relationship %] </td>
+                <td>
+                  [% IF material.item %]
+                    [% material.item.status.name %]
+                  [% END %]
+                </td>
+                <td>
+                  [% IF material.item %]
+                    [% material.item.location.name %]
+                  [% END %]
+                </td>
+              </tr>
+            [% END %]
+          </tbody>
+        </table>
+      </div>
+      [% END %]
+    </div>
+  </div>
+</div>
diff --git a/Open-ILS/src/templates-bootstrap/opac/parts/course_search/global_row.tt2 b/Open-ILS/src/templates-bootstrap/opac/parts/course_search/global_row.tt2
new file mode 100644 (file)
index 0000000..d68842f
--- /dev/null
@@ -0,0 +1,55 @@
+[%
+    contains_options = [
+        {value => 'contains', label => l('Contains')},
+        {value => 'nocontains', label => l('Does not contain')}
+    ];
+    contains = CGI.param('contains');
+    queries = CGI.param('query');
+    bools = CGI.param('bool');
+    qtypes = CGI.param('qtype');
+    rowcount = 3;
+
+    # scalar.merge treats the scalar as a 1-item array
+    WHILE queries.size < rowcount; queries = queries.merge(['']); END;
+    WHILE bools.size < rowcount; bools = bools.merge(['and']); END;
+    WHILE qtypes.size < rowcount; qtypes = qtypes.merge(search.default_qtypes.${qtypes.size} ? [search.default_qtypes.${qtypes.size}] : ['keyword']); END;
+
+    FOR qtype IN qtypes;
+        c = contains.shift;
+        b = bools.shift;
+        q = queries.shift; %]
+
+<!-- tag the second row so the bool column won't be hidden -->
+<tr[% IF loop.index == 1 %] id="adv_global_row"[% END %]>
+    <td class="td-left">
+
+        <!-- bool selector.  hide for first row.  safe to ignore first bool value in form submission -->
+        <select title="[% l('Boolean search operator') %]" 
+          name='bool' style='width: auto' [% IF loop.first %] class='invisible' [% END %]>
+            <option value='and' [% b == 'and' ? 'selected="selected"' : '' %]>[% l('And') %]</option>
+            <option value='or' [% b == 'or' ? 'selected="selected"' : '' %]>[% l('Or') %]</option>
+        </select>
+
+        <!-- keyword, subject, etc. selector -->
+        <span class="qtype_selector_margin">
+            [% INCLUDE "opac/parts/course_search/qtype_selector.tt2"
+                query_type=qtype %]
+        </span>
+
+        <select title="[% l('Search phrase match strictness') %]"
+          name='contains' style='margin-right: 7px;'>
+            [% FOR o IN contains_options; -%]
+            <option value="[% o.value %]" [% c == o.value ? ' selected="selected"' : '' %]>[% o.label %]</option>
+            [% END %]
+        </select>
+        <input title="[% l('Search term') %]" aria-label="[% l('Search term') %]"
+          type='text' size='18' name='query' value="[% q | html %]" x-webkit-speech [% IF loop.index == 0 %] autofocus [% END %] />
+        <a href="javascript:;" class="row-remover"
+            title="[% l('Remove row') %]" alt="[% l('Remove row') %]"
+            onclick='return killRowIfAtLeast(2, this);'>
+                <img src="[% ctx.media_prefix %]/images/expert_row_close_btn.png[% ctx.cache_key %]"
+                    alt="[% l('Remove row') %]"/>
+            </a>
+    </td>
+</tr>
+[% END %]
diff --git a/Open-ILS/src/templates-bootstrap/opac/parts/course_search/qtype_selector.tt2 b/Open-ILS/src/templates-bootstrap/opac/parts/course_search/qtype_selector.tt2
new file mode 100644 (file)
index 0000000..003218b
--- /dev/null
@@ -0,0 +1,30 @@
+[% query_types = [
+    {value => "name", label => l("Course Name"), plural_label => l("Course Names"), browse => 1},
+    {value => "course_number", label => l("Course Number"), plural_label => l('Course Numbers'), browse => 1}
+];
+
+locg = CGI.param('locg') || ctx.physical_loc || ctx.aou_tree.id || 1;
+
+IF ctx.get_org_setting(locg, 'circ.course_materials_browse_by_instructor');
+query_types.push({
+    value => "instructor", 
+    label => l("Instructor"),
+    plural_label => l('Instructors'), 
+    browse => 1},
+);
+END;
+-%]
+<select name="[% name || 'qtype' %]"[% IF id; ' id="'; id ; '"' ; END -%]
+    title="[% l('Select query type:') %]">
+    [%  query_type = query_type || CGI.param('qtype') || search.default_qtypes.0;
+      FOR qt IN query_types;
+        NEXT IF browse_only AND NOT qt.browse -%]
+    <option value='[% qt.value | html %]'[%
+        query_type == qt.value ? ' selected="selected"' : ''
+    %]>[% IF plural AND qt.plural_label;
+        qt.plural_label | html;
+    ELSE;
+        qt.label | html;
+    END %]</option>
+    [% END -%]
+</select>