LP#1411699 Dojoless advanced copy location search
authorDan Scott <dscott@laurentian.ca>
Tue, 2 May 2017 04:23:38 +0000 (00:23 -0400)
committerDan Scott <dscott@laurentian.ca>
Wed, 3 May 2017 17:22:10 +0000 (13:22 -0400)
We still use OpenSRF to make the request, but now use the URLSearchParams API +
polyfill for CGI parsing.

URLSearchParams is a browser API implemented on Chrome, Firefox, and Safari,
and a polyfill is available for IE etc from
https://github.com/WebReflection/url-search-params.

This lets us avoid loading Dojo and just rely on the core, much smaller OpenSRF
JS libraries to communicate with the server.

Signed-off-by: Dan Scott <dscott@laurentian.ca>
Open-ILS/src/templates/opac/parts/js.tt2
Open-ILS/web/js/ui/default/opac/copyloc.js

index 4d5b400..23e6b7a 100644 (file)
@@ -59,7 +59,7 @@
     IF CGI.https; url = url.replace('^http:', 'https:'); END; %]
 <script type='text/javascript' id='EIT' src='[% url %]'></script>
 [%- END %]
-[%- IF want_dojo; -%]
+[%- IF want_dojo AND ctx.page != 'advanced'; -%]
 <script type="text/javascript">
      var djConfig = {
          locale: "[% ctx.locale | lower | replace('_', '-') %]",
@@ -74,7 +74,8 @@
     # 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> -->
-
+[%- END %]
+[%- IF want_dojo -%]
 <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>
 [% INCLUDE "opac/parts/acjs.tt2" IF ctx.page == 'record' %]
 [% INCLUDE "opac/parts/ac_google_books.tt2" IF ctx.page == 'record' AND ctx.google_books_preview %]
 [% IF ctx.page == 'advanced' %]
+<script type="text/javascript" src="[% ctx.media_prefix %]/js/url-search-params.js?[% ctx.eg_cache_hash %]"></script>
 <script type="text/javascript" 
     src="[% ctx.media_prefix %]/js/ui/default/opac/copyloc.js"></script>
 [% END %]
index ddd1a5c..05d57fc 100644 (file)
@@ -1,17 +1,18 @@
-dojo.require("DojoSRF");
-dojo.require("openils.CGI");
+;(function () {
+    var org_sel = document.getElementById('adv_org_selector');
+    var loc_chunk = document.getElementById('adv_chunk_copy_location');
+    var loc_sel = document.getElementById('adv_copy_location_selector');
 
 // called on initial page load and when the advance search org unit
 // selector is changed.
 function apply_adv_copy_locations() {
 
     // patron selected org
-    var sel = dojo.byId('adv_org_selector');
-    var selected_id = sel.options[sel.selectedIndex].getAttribute('value');
+    var selected_id = org_sel.options[org_sel.selectedIndex].getAttribute('value');
     var org_unit = aou_hash[selected_id];
 
     if (org_unit.can_have_vols != 't') {
-        dojo.addClass('adv_chunk_copy_location', 'hidden');
+        loc_chunk.classList.add('hidden');
         return;
     }
 
@@ -58,27 +59,21 @@ function fetch_adv_copy_locations(org_ids) {
                 if (list && list.length) {
                     render_adv_copy_locations(list);
                 } else {
-                    dojo.addClass('adv_chunk_copy_location', 'hidden');
+                    loc_chunk.classList.add('hidden');
                 }
             } else {
-                dojo.addClass('adv_chunk_copy_location', 'hidden');
+                loc_chunk.classList.add('hidden');
             }
         }                                                              
     }).send(); 
 }
 
 function render_adv_copy_locations(locations) {
-    var sel = dojo.byId('adv_copy_location_selector');
-    var cgi = new openils.CGI();
-
     // collect any location values from the URL to re-populate the list
-    var url_selected = cgi.param('fi:locations');
-    if (url_selected) {
-        if (!dojo.isArray(url_selected)) 
-            url_selected = [url_selected];
-    }
+    var params = new URLSearchParams(location.search.slice(1));
+    var url_selected = params.getAll('fi:locations');
 
-    dojo.removeClass('adv_chunk_copy_location', 'hidden');
+    loc_chunk.classList.remove('hidden');
     
     // sort by name
     locations = locations.sort(
@@ -86,22 +81,27 @@ function render_adv_copy_locations(locations) {
     );
 
     // remove the previous list of locations
-    dojo.empty(sel);
+    var range = document.createRange();
+    range.selectNodeContents(loc_sel);
+    range.deleteContents();
 
     // append the new list of locations
-    dojo.forEach(locations, function(loc) {
+    locations.forEach(function(loc) {
         var attrs = {value : loc.id, innerHTML : loc.name};
         if (url_selected && url_selected.indexOf(''+loc.id) > -1) {
             attrs.selected = true;
         }
-        sel.appendChild(dojo.create('option', attrs));
+        var option = document.createElement('option');
+        Object.keys(attrs).forEach(function(att) {
+            option[att] = attrs[att];
+        });
+        loc_sel.appendChild(option);
     });
 }
 
 // load the locations on page load
-dojo.addOnLoad(function() {
+window.addEventListener('load', function(event) {
     apply_adv_copy_locations();
-    dojo.connect(dojo.byId('adv_org_selector'), 
-        'onchange', apply_adv_copy_locations);
+    org_sel.addEventListener('change', apply_adv_copy_locations);
 });
-
+})()