[open-ils-commits] [GIT] Evergreen ILS branch master updated. 6cd8861d10273ee19f73f6e65d635764f30fc564

Evergreen Git git at git.evergreen-ils.org
Mon Jan 9 11:01:48 EST 2017


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".

The branch, master has been updated
       via  6cd8861d10273ee19f73f6e65d635764f30fc564 (commit)
       via  1515f43c22509e59e5f3ff7186ab923bd53a6369 (commit)
       via  b94229a9ef6b009e7771edd1e96a00ccef2910ba (commit)
       via  9c4defc6257b5064c38b53e4da9051ed5f81f278 (commit)
       via  b78bd1d10b2ada0cc95703c7ece70a458b71093f (commit)
       via  5b581917afbd73f3c9ea7a24f2e96b44a7ca1645 (commit)
       via  2db38700221cb2168fd468f3e83eb4c4e98f3ab5 (commit)
       via  8771aa573c6ae977b3e4b44f305749e9d7de9906 (commit)
       via  79cf7527f3b3256e56a9fc6a0886e45440e0a068 (commit)
       via  6e55f5caa162aaeb68e2a48d5fb53154ee998a98 (commit)
       via  aefc4777bf281e9afe9eccc27035df7ea8462a82 (commit)
       via  1cd8e151cf32ab9b1a22ce057ae47dbbaf9ca1e8 (commit)
       via  42ffc72eb5d45f31fae8be66574527f2999a7bab (commit)
       via  a32a6c44f03876db9f259cf7efaa37750795336c (commit)
       via  92dc007a0b20c56512fec192ff53f33ce32720df (commit)
       via  8d33988746ddc5ea7659573c7024ae20ca7f64a9 (commit)
       via  962124df44bbeef77f9689aa5ea0807972d6f89f (commit)
       via  cebe4394a58cbede28a0e600ace1032c09e089aa (commit)
       via  ace09c477993179d8a810090df13d3208c7f87ae (commit)
       via  90f60d70bbefde0c6f53bcc819e238c91d981875 (commit)
       via  9600f3016296f080dcbd367ae05efb95128fcefa (commit)
       via  3554927642b71ad33444b5fe16fdd81fc2b94f2e (commit)
       via  eb7f5c7fa4ea49e2e0763f3b1e183b2aefd2c4f4 (commit)
       via  e90954f7690f637129724dc83511ef7321351063 (commit)
       via  8a6569a9e4aa349d9574cbf3efd8e88ac4e2364f (commit)
       via  18ff36e87f0f4e1d75a827739475c8864150dc49 (commit)
       via  a0fcb732db2d411ba6f3def6d82025f80f8b925a (commit)
       via  f239a6ec481f1f0493eafe800cb60d83f5e86b7f (commit)
       via  d74fb6ef6f28a0c3983a7553d048837e23799aa4 (commit)
       via  f28b9a13978f319ded726595aad12832754a2954 (commit)
       via  7f80d05c1bbd981360703b7db8a48034a4ddb813 (commit)
       via  f0a4e25a6181f9b788df642518db4b1975719a30 (commit)
       via  0218e2e0d86d0694b7b90b7eb7182d208c01330c (commit)
       via  46e689f771b29bbdfe0b6c2b47ab2af8dd30b678 (commit)
       via  fc54e4e15aa22ab68490061015837f7b18447549 (commit)
       via  f689d48551ca5c86f2e6f8a90385086d91f0d411 (commit)
       via  5da2dcc549d8937306b8d2ff875f83db54e0ef0b (commit)
      from  36e56a4e54df2cc937a99b2019917d7f4244cfb8 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 6cd8861d10273ee19f73f6e65d635764f30fc564
Author: Bill Erickson <berickxx at gmail.com>
Date:   Wed Dec 28 16:15:24 2016 -0500

    LP#1635407 webstaff: show patron alert pane once
    
    Display the patron alerts pane only once per patron instance per
    browser tab.  This is done by setting a new session storage value which
    tracks the last alerted patron.  This value is replaced each time a new
    patron is loaded into the main patron app (e.g. double-clicking the
    patron row in patron search) and is maintained separately per browser
    tab.
    
    Signed-off-by: Bill Erickson <berickxx at gmail.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/circ/patron/app.js b/Open-ILS/web/js/ui/default/staff/circ/patron/app.js
index fcf195f..630ca9c 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/patron/app.js
@@ -248,13 +248,23 @@ function($q , $timeout , $location , egCore,  egUser , $locale) {
         service.patron_stats = null;
         service.noncat_ids = [];
         service.hasAlerts = false;
-        service.alertsShown = false;
         service.patronExpired = false;
         service.patronExpiresSoon = false;
         service.invalidAddresses = false;
     }
     service.resetPatronLists();  // initialize
 
+    // Returns true if the last alerted patron matches the current
+    // patron.  Otherwise, the last alerted patron is set to the 
+    // current patron and false is returned.
+    service.alertsShown = function() {
+        var key = 'eg.circ.last_alerted_patron';
+        var last_id = egCore.hatch.getSessionItem(key);
+        if (last_id && last_id == service.current.id()) return true;
+        egCore.hatch.setSessionItem(key, service.current.id());
+        return false;
+    }
+
     // shortcut to force-reload the current primary
     service.refreshPrimary = function() {
         if (!service.current) return $q.when();
@@ -584,8 +594,7 @@ function($scope,  $q,  $location , $filter,  egCore,  egUser,  patronSvc) {
         $scope.alert_penalties = 
             function() {return patronSvc.alert_penalties}
 
-        if (patronSvc.alertsShown) return false;
-        patronSvc.alertsShown = true;
+        if (patronSvc.alertsShown()) return false;
 
         // if the patron has any unshown alerts, show them now
         if (patronSvc.hasAlerts && 

commit 1515f43c22509e59e5f3ff7186ab923bd53a6369
Author: Kyle Huckins <khuckins at catalystdevworks.com>
Date:   Thu Nov 17 11:47:31 2016 -0800

    LP#1502292 Add Volumes from Bib Record
    
    Add 'Add Volumes' button to record summary pane to
    add a new volume for a record.
    
    Signed-off-by: Kyle Huckins <khuckins at catalystdevworks.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>
    
    	modified:   Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
    	modified:   Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
    
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2 b/Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
index c57b542..632c0be 100644
--- a/Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
+++ b/Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
@@ -4,7 +4,7 @@
 </div>
 
 <div ng-show="record_id" class="row col-md-12 pad-vert">
-  <div class="col-md-9">
+  <div class="col-md-8">
     <button type="button" ng-disabled="from_route" class="btn btn-default" ng-click="opac_call('rdetailStart')">
        [% l('Start') %]
     </button>
@@ -21,7 +21,10 @@
        [% l('Back To Results') %] ( {{ search_result_index }} / {{ search_result_hit_count }} )
     </button>
   </div>
-  <div class="col-md-3">
+  <div class="col-md-4">
+    <button type="button" class="btn btn-default" ng-click="selectedHoldingsVolCopyAdd()">
+        [% l('Add Volumes') %]
+    </button>
     <button type="button" class="btn btn-default" ng-click="add_to_record_bucket()">
         [% l('Add To Bucket') %]
     </button>
diff --git a/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js b/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
index 9423e50..3b48469 100644
--- a/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+++ b/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
@@ -954,12 +954,20 @@ function($scope , $routeParams , $location , $window , $q , egCore , egHolds , e
                 raw.push( {callnumber : v} );
             });
         } else if (vols) {
-            angular.forEach(
-                $scope.holdingsGridControls.selectedItems(),
-                function (item) {
-                    raw.push({owner : item.owner_id});
-                }
-            );
+            if (typeof $scope.holdingsGridControls.selectedItems == "function" &&
+                $scope.holdingsGridControls.selectedItems().length > 0) {
+                angular.forEach($scope.holdingsGridControls.selectedItems(),
+                    function (item) {
+                        raw.push({
+                            owner : item.owner_id,
+                            label : item.call_number.label
+                        });
+                    });
+            } else {
+                raw.push({
+                    owner : egCore.auth.user().ws_ou()
+                });
+            }
         }
 
         if (raw.length == 0) raw.push({});

commit b94229a9ef6b009e7771edd1e96a00ccef2910ba
Author: Jason Etheridge <jason at esilibrary.com>
Date:   Tue Jan 3 06:58:25 2017 -0500

    webstaff: booking options from Patron interface
    
    Includes some workarounds for xulG errors, and lets the booking interfaces
    receive the patron barcode via a query param instead of xulG.  The XUL client
    spawns a new tab for these interfaces, but we stick with web norms and load in
    the current tab (control+click will open a new tab).  This does, however, blow
    away the patron interface; it doesn't embed like most of the options from the
    Other menu.  One other change: we don't have support for nested drop-down menus
    in the web client, so I've flattened the entries like so:
    
    * Booking: Create or Cancel Reservations
    * Booking: Pick Up Reservations
    * Booking: Return Reservations
    
    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/circ/patron/index.tt2 b/Open-ILS/src/templates/staff/circ/patron/index.tt2
index 65d14e7..407668d 100644
--- a/Open-ILS/src/templates/staff/circ/patron/index.tt2
+++ b/Open-ILS/src/templates/staff/circ/patron/index.tt2
@@ -165,6 +165,21 @@ angular.module('egCoreMod').run(['egStrings', function(s) {
               [% l('Test Password') %]
             </a>
           </li>
+          <li>
+            <a href="./booking/legacy/booking/reservation?patron_barcode={{patron().card().barcode()}}" target="_top">
+              [% l('Booking: Create or Cancel Reservations') %]
+            </a>
+          </li>
+          <li>
+            <a href="./booking/legacy/booking/pickup?patron_barcode={{patron().card().barcode()}}" target="_top">
+              [% l('Booking: Pick Up Reservations') %]
+            </a>
+          </li>
+          <li>
+            <a href="./booking/legacy/booking/return?patron_barcode={{patron().card().barcode()}}" target="_top">
+              [% l('Booking: Return Reservations') %]
+            </a>
+          </li>
        </ul>
       </li>
       <li ng-class="{active : tab == 'search'}" class="pull-right">
diff --git a/Open-ILS/web/js/ui/default/booking/pickup.js b/Open-ILS/web/js/ui/default/booking/pickup.js
index 62dfea5..fed016d 100644
--- a/Open-ILS/web/js/ui/default/booking/pickup.js
+++ b/Open-ILS/web/js/ui/default/booking/pickup.js
@@ -29,6 +29,20 @@ function my_init() {
     init_auto_l10n(document.getElementById("auto_l10n_start_here"));
 
     setTimeout(
-        function() { react_to_pass_in(xulG.bresv_interface_opts); }, 0
+        function() {
+            var opts;
+            if (typeof xulG != 'undefined' && typeof xulG.bresv_interface_opts != 'undefined') {
+                opts = xulG.bresv_interface_opts;
+            } else {
+                opts = {};
+            }
+            var uri = location.href;
+            var query = uri.substring(uri.indexOf("?") + 1, uri.length);
+            var queryObject = dojo.queryToObject(query);
+            if (typeof queryObject['patron_barcode'] != 'undefined') {
+                opts.patron_barcode = queryObject['patron_barcode'];
+            }
+            react_to_pass_in(opts);
+        }, 0
     );
 }
diff --git a/Open-ILS/web/js/ui/default/booking/reservation.js b/Open-ILS/web/js/ui/default/booking/reservation.js
index 590c6b7..1e9901c 100644
--- a/Open-ILS/web/js/ui/default/booking/reservation.js
+++ b/Open-ILS/web/js/ui/default/booking/reservation.js
@@ -797,6 +797,13 @@ function early_action_passthru() {
         return false;
     }
 
+    var uri = location.href;
+    var query = uri.substring(uri.indexOf("?") + 1, uri.length);
+    var queryObject = dojo.queryToObject(query);
+    if (typeof queryObject['patron_barcode'] != 'undefined') {
+        opts.patron_barcode = queryObject['patron_barcode'];
+    }
+
     if (opts.patron_barcode) {
         document.getElementById("contain_patron_barcode").style.display="none";
         document.getElementById("patron_barcode").value = opts.patron_barcode;
@@ -837,7 +844,11 @@ function my_init() {
 
     setTimeout(
         function() {
-            if (!(opts = xulG.bresv_interface_opts)) opts = {};
+            if (typeof xulG != 'undefined' && typeof xulG.bresv_interface_opts != 'undefined') {
+                opts = xulG.bresv_interface_opts;
+            } else {
+                opts = {};
+            }
             if (early_action_passthru())
                 provide_brt_selector(document.getElementById("brt_selector_here"));
         }, 0
diff --git a/Open-ILS/web/js/ui/default/booking/return.js b/Open-ILS/web/js/ui/default/booking/return.js
index cdc3edd..b47156b 100644
--- a/Open-ILS/web/js/ui/default/booking/return.js
+++ b/Open-ILS/web/js/ui/default/booking/return.js
@@ -38,6 +38,20 @@ function my_init() {
     init_auto_l10n(document.getElementById("auto_l10n_start_here"));
 
     setTimeout(
-        function() { react_to_pass_in(xulG.bresv_interface_opts); }, 0
+        function() {
+            var opts;
+            if (typeof xulG != 'undefined' && typeof xulG.bresv_interface_opts != 'undefined') {
+                opts = xulG.bresv_interface_opts;
+            } else {
+                opts = {};
+            }
+            var uri = location.href;
+            var query = uri.substring(uri.indexOf("?") + 1, uri.length);
+            var queryObject = dojo.queryToObject(query);
+            if (typeof queryObject['patron_barcode'] != 'undefined') {
+                opts.patron_barcode = queryObject['patron_barcode'];
+            }
+            react_to_pass_in(opts);
+        }, 0
     );
 }

commit 9c4defc6257b5064c38b53e4da9051ed5f81f278
Author: Jason Etheridge <jason at esilibrary.com>
Date:   Mon Dec 19 16:00:13 2016 -0500

    webstaff: workaround a xulG undefined bug in Admin -> Booking -> Resources
    
    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/conify/global/booking/resource.tt2 b/Open-ILS/src/templates/conify/global/booking/resource.tt2
index 66f92bf..6170199 100644
--- a/Open-ILS/src/templates/conify/global/booking/resource.tt2
+++ b/Open-ILS/src/templates/conify/global/booking/resource.tt2
@@ -57,7 +57,7 @@
 
             setTimeout(
                 function() {
-                    if (xulG && xulG.resultant_brsrc)
+                    if (typeof xulG != 'undefined' && xulG.resultant_brsrc)
                         search = {id: xulG.resultant_brsrc};
 
                     brsrcGrid.overrideEditWidgets.type =

commit b78bd1d10b2ada0cc95703c7ece70a458b71093f
Author: Jason Etheridge <jason at esilibrary.com>
Date:   Mon Dec 19 15:44:48 2016 -0500

    webstaff: broader CSS tweak for Chrome for disabled text widgets
    
    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/base.tt2 b/Open-ILS/src/templates/base.tt2
index efdee63..a6f4b8c 100644
--- a/Open-ILS/src/templates/base.tt2
+++ b/Open-ILS/src/templates/base.tt2
@@ -16,6 +16,11 @@
             dojo.require("dijit.layout.LayoutContainer");
             dojo.require("dijit.layout.ContentPane");
         </script>
+        <style>
+            .tundra .dijitComboBoxDisabled, .tundra .dijitTextBoxDisabled {
+                    color: gray !important;
+            }
+        </style>
     </head>
     <body class='tundra'>
         [% INCLUDE login.tt2 %] <!-- shared login page -->

commit 5b581917afbd73f3c9ea7a24f2e96b44a7ca1645
Author: Jason Etheridge <jason at esilibrary.com>
Date:   Mon Dec 12 14:55:42 2016 -0500

    webstaff: error sounds instead of warning sounds for some events
    
    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/circ/services/circ.js b/Open-ILS/web/js/ui/default/staff/circ/services/circ.js
index 2d34b81..2d2a2d8 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/services/circ.js
@@ -238,13 +238,13 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
         var data = final_resp.data = {};
 
         if (!final_resp.evt[0]) {
-            egCore.audio.play('warning.unknown.no_event');
+            egCore.audio.play('error.unknown.no_event');
             return;
         }
 
         var payload = final_resp.evt[0].payload;
         if (!payload) {
-            egCore.audio.play('warning.unknown.no_payload');
+            egCore.audio.play('error.unknown.no_payload');
             return;
         }
 
@@ -456,11 +456,11 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
                 return $q.when(final_resp);
 
             case 'ITEM_NOT_CATALOGED':
-                egCore.audio.play('warning.checkout.no_cataloged');
+                egCore.audio.play('error.checkout.no_cataloged');
                 return service.precat_dialog(params, options);
 
             case 'OPEN_CIRCULATION_EXISTS':
-                egCore.audio.play('warning.checkout.open_circ');
+                egCore.audio.play('error.checkout.open_circ');
                 return service.circ_exists_dialog(evt, params, options);
 
             case 'COPY_IN_TRANSIT':
@@ -485,7 +485,7 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
                 );
 
             default:
-                egCore.audio.play('warning.checkout.unknown');
+                egCore.audio.play('error.checkout.unknown');
                 return service.exit_alert(
                     egCore.strings.CHECKOUT_FAILED_GENERIC, {
                         barcode : params.copy_barcode,
@@ -1323,13 +1323,13 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
                 ).then(function() { return final_resp });
 
             case 'ASSET_COPY_NOT_FOUND':
-                egCore.audio.play('warning.checkin.not_found');
+                egCore.audio.play('error.checkin.not_found');
                 return egAlertDialog.open(
                     egCore.strings.UNCAT_ALERT_DIALOG, params)
                     .result.then(function() {return final_resp});
 
             case 'ITEM_NOT_CATALOGED':
-                egCore.audio.play('warning.checkin.not_cataloged');
+                egCore.audio.play('error.checkin.not_cataloged');
                 evt[0].route_to = egCore.strings.ROUTE_TO_CATALOGING;
                 if (options.no_precat_alert) 
                     return $q.when(final_resp);

commit 2db38700221cb2168fd468f3e83eb4c4e98f3ab5
Author: Jason Etheridge <jason at esilibrary.com>
Date:   Mon Dec 12 14:42:54 2016 -0500

    webstaff: add sounds related to checkout
    
    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/circ/services/circ.js b/Open-ILS/web/js/ui/default/staff/circ/services/circ.js
index a2692ea..2d34b81 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/services/circ.js
@@ -237,10 +237,16 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
     service.munge_resp_data = function(final_resp,worklog_action,worklog_method) {
         var data = final_resp.data = {};
 
-        if (!final_resp.evt[0]) return;
+        if (!final_resp.evt[0]) {
+            egCore.audio.play('warning.unknown.no_event');
+            return;
+        }
 
         var payload = final_resp.evt[0].payload;
-        if (!payload) return;
+        if (!payload) {
+            egCore.audio.play('warning.unknown.no_payload');
+            return;
+        }
 
         data.circ = payload.circ;
         data.parent_circ = payload.parent_circ;
@@ -446,6 +452,7 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
         // Other events
         switch (evt[0].textcode) {
             case 'SUCCESS':
+                egCore.audio.play('success.checkout');
                 return $q.when(final_resp);
 
             case 'ITEM_NOT_CATALOGED':
@@ -453,27 +460,32 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
                 return service.precat_dialog(params, options);
 
             case 'OPEN_CIRCULATION_EXISTS':
+                egCore.audio.play('warning.checkout.open_circ');
                 return service.circ_exists_dialog(evt, params, options);
 
             case 'COPY_IN_TRANSIT':
+                egCore.audio.play('warning.checkout.in_transit');
                 return service.copy_in_transit_dialog(evt, params, options);
 
             case 'PATRON_CARD_INACTIVE':
             case 'PATRON_INACTIVE':
             case 'PATRON_ACCOUNT_EXPIRED':
             case 'CIRC_CLAIMS_RETURNED':
+                egCore.audio.play('warning.checkout');
                 return service.exit_alert(
                     egCore.strings[evt[0].textcode],
                     {barcode : params.copy_barcode}
                 );
 
             case 'PERM_FAILURE':
+                egCore.audio.play('warning.checkout.permission');
                 return service.exit_alert(
                     egCore.strings[evt[0].textcode],
                     {permission : evt[0].ilsperm}
                 );
 
             default:
+                egCore.audio.play('warning.checkout.unknown');
                 return service.exit_alert(
                     egCore.strings.CHECKOUT_FAILED_GENERIC, {
                         barcode : params.copy_barcode,

commit 8771aa573c6ae977b3e4b44f305749e9d7de9906
Author: Jason Etheridge <jason at esilibrary.com>
Date:   Mon Dec 12 15:20:36 2016 -0500

    webstaff: sound for batch hold edit
    
    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/circ/services/holds.js b/Open-ILS/web/js/ui/default/staff/circ/services/holds.js
index 2b2ed77..27aae5e 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/services/holds.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/services/holds.js
@@ -169,7 +169,19 @@ function($uibModal , $q , egCore , egConfirmDialog , egAlertDialog) {
         return egCore.net.request(
             'open-ils.circ',
             'open-ils.circ.hold.update.batch',
-            egCore.auth.token(), null, new_values);
+            egCore.auth.token(), null, new_values).then(
+            function(resp) {
+                if (evt = egCore.evt.parse(resp)) {
+                    egCore.audio.play(
+                        'warning.hold.batch_update');
+                    console.error('unable to batch update holds: '
+                        + evt.toString());
+                } else {
+                    egCore.audio.play(
+                        'success.hold.batch_update');
+                }
+            }
+        );
     }
 
     service.set_copy_quality = function(hold_ids) {

commit 79cf7527f3b3256e56a9fc6a0886e45440e0a068
Author: Mike Rylander <mrylander at gmail.com>
Date:   Mon Dec 12 10:36:27 2016 -0500

    webstaff: Add sounds for in house use and patron lookup
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/circ/in_house_use/app.js b/Open-ILS/web/js/ui/default/staff/circ/in_house_use/app.js
index 45e9e59..2183d96 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/in_house_use/app.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/in_house_use/app.js
@@ -79,6 +79,7 @@ function($scope,  egCore,  egGridDataProvider , egConfirmDialog) {
             ).then(function(copy) {
 
                 if (!copy) {
+                    egCore.audio.play('error.in_house.copy_not_found');
                     $scope.copyNotFound = true;
                     return;
                 }
@@ -108,7 +109,12 @@ function($scope,  egCore,  egGridDataProvider , egConfirmDialog) {
             'open-ils.circ', method, egCore.auth.token(), args
 
         ).then(function(resp) {
-            if (evt = egCore.evt.parse(resp)) return alert(evt);
+            if (evt = egCore.evt.parse(resp)) {
+                egCore.audio.play('error.in_house');
+                return alert(evt);
+            }
+
+            egCore.audio.play('success.in_house');
 
             var item = {num_uses : resp.length};
             item.copy = data.copy;
diff --git a/Open-ILS/web/js/ui/default/staff/circ/patron/app.js b/Open-ILS/web/js/ui/default/staff/circ/patron/app.js
index bc2f390..fcf195f 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/patron/app.js
@@ -694,6 +694,7 @@ function($scope , $location , egCore , egConfirmDialog , egUser , patronSvc) {
 
     // jump to the patron checkout UI
     function loadPatron(user_id) {
+        egCore.audio.play('success.patron.by_barcode');
         $location
         .path('/circ/patron/' + user_id + '/checkout')
         .search('card', $scope.args.barcode);
@@ -739,6 +740,7 @@ function($scope , $location , egCore , egConfirmDialog , egUser , patronSvc) {
             if (!resp || !resp[0]) {
                 $scope.bcNotFound = args.barcode;
                 $scope.selectMe = true;
+                egCore.audio.play('warning.patron.not_found');
                 return;
             }
 
@@ -760,6 +762,7 @@ function($scope , $location , egCore , egConfirmDialog , egUser , patronSvc) {
                 // opt-in disallowed at this location by patron's home library
                 $scope.optInRestricted = true;
                 $scope.selectMe = true;
+                egCore.audio.play('warning.patron.opt_in_restricted');
                 return;
             }
            

commit 6e55f5caa162aaeb68e2a48d5fb53154ee998a98
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 30 05:54:22 2016 -0500

    webstaff: use ng-show rather than ng-if for showIframe
    
    This avoids an issue with ng-if creating a separate
    scope.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/share/t_eframe.tt2 b/Open-ILS/src/templates/staff/share/t_eframe.tt2
index 0c9d72d..8bb274d 100644
--- a/Open-ILS/src/templates/staff/share/t_eframe.tt2
+++ b/Open-ILS/src/templates/staff/share/t_eframe.tt2
@@ -3,7 +3,7 @@
   <button type="button" class="btn btn-default btn-xs" ng-show="allowEscape && !showIframe" ng-click="restoreEmbed()">[% l('Re-embed') %]</button>
   <!-- height is calculated at render time -->
   <iframe 
-    ng-if="showIframe"
+    ng-show="showIframe"
     ng-attr-style="{{ autoresize ? undefined : 'height:' + height + 'px' }}"
     src="{{url}}">
   </iframe>
diff --git a/Open-ILS/web/js/ui/default/staff/services/eframe.js b/Open-ILS/web/js/ui/default/staff/services/eframe.js
index 9bd6e3d..e87b0ba 100644
--- a/Open-ILS/web/js/ui/default/staff/services/eframe.js
+++ b/Open-ILS/web/js/ui/default/staff/services/eframe.js
@@ -280,6 +280,7 @@ angular.module('egCoreMod')
             }
             $scope.restoreEmbed = function() {
                 $scope.showIframe = true;
+                $scope.reload();
             }
         }]
     }

commit aefc4777bf281e9afe9eccc27035df7ea8462a82
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Tue Dec 6 17:31:04 2016 -0500

    webstaff: fix bower.json to bring in iframe-resizer
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/bower.json b/Open-ILS/web/js/ui/default/staff/bower.json
index 59fa196..ff2ede1 100644
--- a/Open-ILS/web/js/ui/default/staff/bower.json
+++ b/Open-ILS/web/js/ui/default/staff/bower.json
@@ -30,10 +30,10 @@
     "angular-tree-control": "~0.2.28",
     "angular-animate": "~1.5.3",
     "angular-hotkeys": "cfp-angular-hotkeys#^1.7.0",
-    "angular-cookies": "^1.5.8"
+    "angular-cookies": "^1.5.8",
+    "iframe-resizer": "^3.5.5"
   },
   "resolutions": {
-    "angular": "~1.5.5",
-    "iframe-resizer": "^3.5.5"
+    "angular": "~1.5.5"
   }
 }

commit 1cd8e151cf32ab9b1a22ce057ae47dbbaf9ca1e8
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 30 05:25:52 2016 -0500

    webstaff: throw a kitchen sink at double-scrollbar issues
    
    This patch ameliorates, but does not eliminate, a bunch
    of cases where double-scrollbars could appear.
    
    [1] Adds iframe-resizer (https://github.com/davidjbradshaw/iframe-resizer, MIT license)
        as an option for automatically adjusting the height of an iframe
        to fit the contents.  This can be enabled by ensuring that
        the page to be embedded brings in
    
        /js/ui/default/staff/build/js/iframeResizer.contentWindow.min.j
    
        and adding an 'autoresize' attribute to the egEmbedFrame directive.
    
        This is now used by the legacy reports page.
    
    [2] Gives a 'min-height' attribute to egEmbedFrame and sets a
        value for Dojo grid interfaces embedded by local and server admistration.
    [3] Adds a 'allow-escape' attribute to egEmbedFrame; when set to
        true, adds buttons to allow the user to open the embedded page
        in a new tab.
    [4] Removes some extraneous <div>s that were interferring with resizing
        for some grids.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/conify/global/cat/authority/browse_axis.tt2 b/Open-ILS/src/templates/conify/global/cat/authority/browse_axis.tt2
index 676edbb..e9c580a 100644
--- a/Open-ILS/src/templates/conify/global/cat/authority/browse_axis.tt2
+++ b/Open-ILS/src/templates/conify/global/cat/authority/browse_axis.tt2
@@ -8,7 +8,6 @@
             <button dojoType="dijit.form.Button" onClick="aba_grid.deleteSelected()">[% l('Delete Selected') %]</button>
         </div>
     </div>
-    <div>
         <table  jsId="aba_grid"
                 dojoType="openils.widget.AutoGrid"
                 autoHeight="true"
@@ -19,7 +18,6 @@
                 fmClass="aba"
                 editOnEnter="true">
         </table>
-    </div>
 </div>
 <script type="text/javascript">
     dojo.require("openils.widget.AutoGrid");
diff --git a/Open-ILS/src/templates/conify/global/cat/authority/browse_axis_authority_field_map.tt2 b/Open-ILS/src/templates/conify/global/cat/authority/browse_axis_authority_field_map.tt2
index adae8d0..f64937e 100644
--- a/Open-ILS/src/templates/conify/global/cat/authority/browse_axis_authority_field_map.tt2
+++ b/Open-ILS/src/templates/conify/global/cat/authority/browse_axis_authority_field_map.tt2
@@ -12,7 +12,6 @@
         [% l('Showing only browse axis-authority field maps linked to authority field:') %]
         <a id="authority-field-metadata"></a>
     </div>
-    <div>
         <table  jsId="abaafm_grid"
                 dojoType="openils.widget.AutoGrid"
                 autoHeight="true"
@@ -23,7 +22,6 @@
                 fmClass="abaafm"
                 editOnEnter="true">
         </table>
-    </div>
 </div>
 <script type="text/javascript"
     src="[% ctx.media_prefix %]/js/ui/default/conify/global/cat/authority/common.js"></script>
diff --git a/Open-ILS/src/templates/conify/global/cat/authority/control_set.tt2 b/Open-ILS/src/templates/conify/global/cat/authority/control_set.tt2
index 8c440a4..564d162 100644
--- a/Open-ILS/src/templates/conify/global/cat/authority/control_set.tt2
+++ b/Open-ILS/src/templates/conify/global/cat/authority/control_set.tt2
@@ -8,7 +8,6 @@
             <button dojoType="dijit.form.Button" onClick="acs_grid.deleteSelected()">[% l('Delete Selected') %]</button>
         </div>
     </div>
-    <div>
     <table  jsId="acs_grid"
             dojoType="openils.widget.AutoGrid"
             autoHeight="true"
diff --git a/Open-ILS/src/templates/conify/global/cat/authority/control_set_authority_field.tt2 b/Open-ILS/src/templates/conify/global/cat/authority/control_set_authority_field.tt2
index bc232e6..92c8239 100644
--- a/Open-ILS/src/templates/conify/global/cat/authority/control_set_authority_field.tt2
+++ b/Open-ILS/src/templates/conify/global/cat/authority/control_set_authority_field.tt2
@@ -12,7 +12,6 @@
         [% l('Showing only authority fields linked to control set:') %]
         <a id="control-set-metadata"></a>
     </div>
-    <div>
         <table  jsId="acsaf_grid"
                 dojoType="openils.widget.AutoGrid"
                 autoHeight="true"
@@ -31,7 +30,6 @@
                 </tr>
             </thead>
         </table>
-    </div>
 </div>
 <script type="text/javascript"
     src="[% ctx.media_prefix %]/js/ui/default/conify/global/cat/authority/common.js"></script>
diff --git a/Open-ILS/src/templates/conify/global/cat/authority/control_set_bib_field.tt2 b/Open-ILS/src/templates/conify/global/cat/authority/control_set_bib_field.tt2
index 7929cae..e496b5d 100644
--- a/Open-ILS/src/templates/conify/global/cat/authority/control_set_bib_field.tt2
+++ b/Open-ILS/src/templates/conify/global/cat/authority/control_set_bib_field.tt2
@@ -12,7 +12,6 @@
         [% l('Showing only control set bib fields linked to authority field:') %]
         <a id="authority-field-metadata"></a>
     </div>
-    <div>
         <table  jsId="acsbf_grid"
                 dojoType="openils.widget.AutoGrid"
                 autoHeight="true"
@@ -23,7 +22,6 @@
                 fmClass="acsbf"
                 editOnEnter="true">
         </table>
-    </div>
 </div>
 <script type="text/javascript"
     src="[% ctx.media_prefix %]/js/ui/default/conify/global/cat/authority/common.js"></script>
diff --git a/Open-ILS/src/templates/conify/global/cat/authority/thesaurus.tt2 b/Open-ILS/src/templates/conify/global/cat/authority/thesaurus.tt2
index 2b6673b..45846e7 100644
--- a/Open-ILS/src/templates/conify/global/cat/authority/thesaurus.tt2
+++ b/Open-ILS/src/templates/conify/global/cat/authority/thesaurus.tt2
@@ -12,7 +12,6 @@
         [% l('Showing only thesauri linked to control set:') %]
         <a id="control-set-metadata"></a>
     </div>
-    <div>
         <table  jsId="at_grid"
                 dojoType="openils.widget.AutoGrid"
                 autoHeight="true"
@@ -29,7 +28,6 @@
                 </tr>
             </thead>
         </table>
-    </div>
 </div>
 <script type="text/javascript"
     src="[% ctx.media_prefix %]/js/ui/default/conify/global/cat/authority/common.js"></script>
diff --git a/Open-ILS/src/templates/conify/global/config/actor_sip_fields.tt2 b/Open-ILS/src/templates/conify/global/config/actor_sip_fields.tt2
index c3ff16a..3ea23bf 100644
--- a/Open-ILS/src/templates/conify/global/config/actor_sip_fields.tt2
+++ b/Open-ILS/src/templates/conify/global/config/actor_sip_fields.tt2
@@ -8,7 +8,6 @@
             <button dojoType='dijit.form.Button' onClick='actorSipFieldsGrid.deleteSelected()'>[% l('Delete Selected') %]</button>
         </div>
     </div>
-    <div>
     <table  jsId="actorSipFieldsGrid"
             dojoType="openils.widget.AutoGrid"
             fieldOrder="['field', 'name', 'one_only']"
diff --git a/Open-ILS/src/templates/conify/global/config/asset_sip_fields.tt2 b/Open-ILS/src/templates/conify/global/config/asset_sip_fields.tt2
index 82a0dae..bba754c 100644
--- a/Open-ILS/src/templates/conify/global/config/asset_sip_fields.tt2
+++ b/Open-ILS/src/templates/conify/global/config/asset_sip_fields.tt2
@@ -8,7 +8,6 @@
             <button dojoType='dijit.form.Button' onClick='assetSipFieldsGrid.deleteSelected()'>[% l('Delete Selected') %]</button>
         </div>
     </div>
-    <div>
     <table  jsId="assetSipFieldsGrid"
             dojoType="openils.widget.AutoGrid"
             fieldOrder="['field', 'name', 'one_only']"
diff --git a/Open-ILS/src/templates/conify/global/config/global_flag.tt2 b/Open-ILS/src/templates/conify/global/config/global_flag.tt2
index d0a87be..3074012 100644
--- a/Open-ILS/src/templates/conify/global/config/global_flag.tt2
+++ b/Open-ILS/src/templates/conify/global/config/global_flag.tt2
@@ -5,7 +5,6 @@
         <div>[% l('Global Flags') %]</div>
         <div></div>
     </div>
-    <div>
     <table  jsId="gfGrid"
             dojoType="openils.widget.AutoGrid"
             fieldOrder="['name', 'label', 'enabled', 'value']"
diff --git a/Open-ILS/src/templates/conify/global/config/rule_circ_duration.tt2 b/Open-ILS/src/templates/conify/global/config/rule_circ_duration.tt2
index b089800..1cdd497 100644
--- a/Open-ILS/src/templates/conify/global/config/rule_circ_duration.tt2
+++ b/Open-ILS/src/templates/conify/global/config/rule_circ_duration.tt2
@@ -8,7 +8,6 @@
             <button dojoType='dijit.form.Button' onClick='ruleCircDurationGrid.deleteSelected()'>[% l('Delete Selected') %]</button>
         </div>
     </div>
-    <div>
     <table  jsId="ruleCircDurationGrid"
             dojoType="openils.widget.AutoGrid"
             fieldOrder="['name', 'max_renewals', 'shrt', 'normal', 'extended']"
diff --git a/Open-ILS/src/templates/staff/base_js.tt2 b/Open-ILS/src/templates/staff/base_js.tt2
index 3a8f50c..fac9711 100644
--- a/Open-ILS/src/templates/staff/base_js.tt2
+++ b/Open-ILS/src/templates/staff/base_js.tt2
@@ -16,6 +16,7 @@
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/build/js/angular-cookies.min.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/build/js/ngToast.min.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/build/js/angular-tree-control.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/build/js/iframeResizer.min.js"></script>
 
 <!-- IDL / opensrf (network) -->
 <script src="[% ctx.media_prefix %]/js/dojo/opensrf/JSON_v1.js"></script>
diff --git a/Open-ILS/src/templates/staff/reporter/t_legacy.tt2 b/Open-ILS/src/templates/staff/reporter/t_legacy.tt2
index cbaa379..738ca7f 100644
--- a/Open-ILS/src/templates/staff/reporter/t_legacy.tt2
+++ b/Open-ILS/src/templates/staff/reporter/t_legacy.tt2
@@ -1 +1 @@
-<eg-embed-frame save-space="150" url="rurl"></eg-embed-frame>
+<eg-embed-frame autoresize save-space="150" url="rurl"></eg-embed-frame>
diff --git a/Open-ILS/src/templates/staff/share/t_eframe.tt2 b/Open-ILS/src/templates/staff/share/t_eframe.tt2
index 0562f66..0c9d72d 100644
--- a/Open-ILS/src/templates/staff/share/t_eframe.tt2
+++ b/Open-ILS/src/templates/staff/share/t_eframe.tt2
@@ -1,8 +1,11 @@
 <div class="eg-embed-frame">
+  <button type="button" class="btn btn-default btn-xs" ng-show="allowEscape &&  showIframe" ng-click="escapeEmbed()">[% l('Open in New Window') %]</button>
+  <button type="button" class="btn btn-default btn-xs" ng-show="allowEscape && !showIframe" ng-click="restoreEmbed()">[% l('Re-embed') %]</button>
   <!-- height is calculated at render time -->
   <iframe 
-    src="{{url}}" 
-    style="height:{{height}}px">
+    ng-if="showIframe"
+    ng-attr-style="{{ autoresize ? undefined : 'height:' + height + 'px' }}"
+    src="{{url}}">
   </iframe>
 </div>
 
diff --git a/Open-ILS/web/js/ui/default/staff/Gruntfile.js b/Open-ILS/web/js/ui/default/staff/Gruntfile.js
index 4bfb433..2d982c4 100644
--- a/Open-ILS/web/js/ui/default/staff/Gruntfile.js
+++ b/Open-ILS/web/js/ui/default/staff/Gruntfile.js
@@ -32,7 +32,10 @@ module.exports = function(grunt) {
             'bower_components/ngtoast/dist/ngToast.min.js',
             'bower_components/jquery/dist/jquery.min.js',
             'bower_components/angular-cookies/angular-cookies.min.js',
-            'bower_components/angular-cookies/angular-cookies.min.js.map'
+            'bower_components/angular-cookies/angular-cookies.min.js.map',
+            'bower_components/iframe-resizer/js/iframeResizer.min.js',
+            'bower_components/iframe-resizer/js/iframeResizer.map',
+            'bower_components/iframe-resizer/js/iframeResizer.contentWindow.min.js'
           ]
         }]
       },
diff --git a/Open-ILS/web/js/ui/default/staff/admin/local/app.js b/Open-ILS/web/js/ui/default/staff/admin/local/app.js
index 20b9647..afceb4d 100644
--- a/Open-ILS/web/js/ui/default/staff/admin/local/app.js
+++ b/Open-ILS/web/js/ui/default/staff/admin/local/app.js
@@ -9,7 +9,7 @@ angular.module('egLocalAdmin',
     var resolver = {delay : function(egStartup) {return egStartup.go()}};
 
     var eframe_template = 
-        '<eg-embed-frame url="local_admin_url" handlers="funcs"></eg-embed-frame>';
+        '<eg-embed-frame allow-escape="true" min-height="min_height" url="local_admin_url" handlers="funcs"></eg-embed-frame>';
 
     // non-conify routes come first
     $routeProvider.when('/admin/local/money/cash_reports', {
@@ -76,6 +76,8 @@ function($scope , $routeParams , $location , egCore) {
     var conify_path = '/eg/conify/global/' + 
         $routeParams.schema + '/' + $routeParams.page;
 
+    $scope.min_height = 800;
+
     // embed URL must include protocol/domain or it will be loaded via
     // push-state, resulting in an infinitely nested pages.
     $scope.local_admin_url = 
diff --git a/Open-ILS/web/js/ui/default/staff/admin/server/app.js b/Open-ILS/web/js/ui/default/staff/admin/server/app.js
index a28987a..962f0e5 100644
--- a/Open-ILS/web/js/ui/default/staff/admin/server/app.js
+++ b/Open-ILS/web/js/ui/default/staff/admin/server/app.js
@@ -9,7 +9,7 @@ angular.module('egServerAdmin',
     var resolver = {delay : function(egStartup) {return egStartup.go()}};
 
     var eframe_template = 
-        '<eg-embed-frame url="server_admin_url" handlers="funcs"></eg-embed-frame>';
+        '<eg-embed-frame allow-escape="true" min-height="min_height" url="server_admin_url" handlers="funcs"></eg-embed-frame>';
 
     // old-style Confiy
     $routeProvider.when('/admin/server/legacy/:schema/:page', {
@@ -51,6 +51,8 @@ function($scope , $routeParams , $location , egCore) {
         (angular.isDefined($routeParams.module) ? ($routeParams.module + '/') : '') +
         $routeParams.schema + '/' + $routeParams.page;
 
+    $scope.min_height = 800;
+
     // embed URL must include protocol/domain or it will be loaded via
     // push-state, resulting in an infinitely nested pages.
     $scope.server_admin_url = 
diff --git a/Open-ILS/web/js/ui/default/staff/bower.json b/Open-ILS/web/js/ui/default/staff/bower.json
index f332f3b..59fa196 100644
--- a/Open-ILS/web/js/ui/default/staff/bower.json
+++ b/Open-ILS/web/js/ui/default/staff/bower.json
@@ -33,6 +33,7 @@
     "angular-cookies": "^1.5.8"
   },
   "resolutions": {
-    "angular": "~1.5.5"
+    "angular": "~1.5.5",
+    "iframe-resizer": "^3.5.5"
   }
 }
diff --git a/Open-ILS/web/js/ui/default/staff/services/eframe.js b/Open-ILS/web/js/ui/default/staff/services/eframe.js
index aa87c7b..9bd6e3d 100644
--- a/Open-ILS/web/js/ui/default/staff/services/eframe.js
+++ b/Open-ILS/web/js/ui/default/staff/services/eframe.js
@@ -18,12 +18,21 @@ angular.module('egCoreMod')
 
             // called after onload of each new iframe page
             onchange : '=?',
+
+            // for tweaking height
             saveSpace : '@',
+            minHeight : '=?',
+
+            // to display button for displaying embedded page
+            // in a new tab
+            allowEscape : '=?'
         },
 
         templateUrl : './share/t_eframe',
 
         link: function (scope, element, attrs) {
+            scope.autoresize = 'autoresize' in attrs;
+            scope.showIframe = true;
             element.find('iframe').on(
                 'load',
                 function() {scope.egEmbedFrameLoader(this)}
@@ -38,6 +47,9 @@ angular.module('egCoreMod')
             // Set the initial iframe height to just under the window height.
             // leave room for the navbar, padding, margins, etc.
             $scope.height = $window.outerHeight - $scope.save_space;
+            if ($scope.minHeight && $scope.height < $scope.minHeight) {
+                $scope.height = $scope.minHeight;
+            }
 
             // browser client doesn't use cookies, so we don't load the
             // (at the time of writing, quite limited) angular.cookies
@@ -78,9 +90,13 @@ angular.module('egCoreMod')
                 $scope.frame = {dom:iframe};
                 $scope.iframe = iframe;
 
-                // Reset the iframe height to the final content height.
-                if ($scope.height < $scope.iframe.contentWindow.document.body.scrollHeight)
-                    $scope.height = $scope.iframe.contentWindow.document.body.scrollHeight;
+                if ($scope.autoresize) {
+                    iFrameResize({}, $scope.iframe);
+                } else {
+                    // Reset the iframe height to the final content height.
+                    if ($scope.height < $scope.iframe.contentWindow.document.body.scrollHeight)
+                        $scope.height = $scope.iframe.contentWindow.document.body.scrollHeight;
+                }
 
                 var page = $scope.iframe.contentWindow.location.href;
                 console.debug('egEmbedFrameLoader(): ' + page);
@@ -91,6 +107,10 @@ angular.module('egCoreMod')
                         $scope.iframe.contentWindow.location);
                 }
 
+                $scope.style = function() {
+                    return 'height:' + $scope.height + 'px';
+                }
+
                 // tell the iframe'd window its inside the staff client
                 $scope.iframe.contentWindow.IAMXUL = true;
 
@@ -106,6 +126,7 @@ angular.module('egCoreMod')
 
                 // Adjust the height again if the iframe loads the openils.Util Dojo module
                 $timeout(function () {
+                    if ($scope.autoresize) return; // let iframe-resizer handle it
                     if ($scope.iframe.contentWindow.openils && $scope.iframe.contentWindow.openils.Util) {
 
                         // HACK! for patron reg page
@@ -251,6 +272,15 @@ angular.module('egCoreMod')
 
                 if ($scope.onchange) $scope.onchange(page);
             }
+
+            // open a new tab with the embedded URL
+            $scope.escapeEmbed = function() {
+                $scope.showIframe = false;
+                $window.open($scope.url, '_blank').focus();
+            }
+            $scope.restoreEmbed = function() {
+                $scope.showIframe = true;
+            }
         }]
     }
 })
diff --git a/Open-ILS/web/reports/oils_rpt_common.xhtml b/Open-ILS/web/reports/oils_rpt_common.xhtml
index c1aad54..fbbae6b 100644
--- a/Open-ILS/web/reports/oils_rpt_common.xhtml
+++ b/Open-ILS/web/reports/oils_rpt_common.xhtml
@@ -10,6 +10,7 @@
 		parseOnLoad: true
 	}
 </script>
+<script type="text/javascript" src="/js/ui/default/staff/build/js/iframeResizer.contentWindow.min.js"></script>
 <script type="text/javascript" src="/js/dojo/dojo/dojo.js"></script>
 <script type="text/javascript">
 	dojo.require('dojo.parser');

commit 42ffc72eb5d45f31fae8be66574527f2999a7bab
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Tue Nov 29 21:45:10 2016 -0500

    webstaff: tweaks to transit list
    
    - make call number column sortable
    - add shelving location column
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/circ/transits/t_list.tt2 b/Open-ILS/src/templates/staff/circ/transits/t_list.tt2
index 8654c31..3359a12 100644
--- a/Open-ILS/src/templates/staff/circ/transits/t_list.tt2
+++ b/Open-ILS/src/templates/staff/circ/transits/t_list.tt2
@@ -51,7 +51,8 @@
     <a target="_self" href="./cat/item/{{item['target_copy.id']}}">{{item['target_copy.barcode']}}</a>
   </eg-grid-field>
   <eg-grid-field path='target_copy.circ_lib.shortname' hidden></eg-grid-field>
-  <eg-grid-field path='target_copy.call_number.label' hidden></eg-grid-field>
+  <eg-grid-field path='target_copy.location.name' label="[% l('Copy Location') %]" hidden sortable></eg-grid-field>
+  <eg-grid-field path='target_copy.call_number.label' hidden sortable></eg-grid-field>
   <eg-grid-field path='target_copy.call_number.record.simple_record.title' label="[% l('Title') %]" sortable>
     <a target="_self" href="[% ctx.base_path %]/staff/cat/catalog/record/{{item['target_copy.call_number.record.simple_record.id']}}">
       {{item['target_copy.call_number.record.simple_record.title']}}

commit a32a6c44f03876db9f259cf7efaa37750795336c
Author: Jason Etheridge <jason at esilibrary.com>
Date:   Fri Dec 2 16:24:26 2016 -0500

    webstaff: Booking Admininstration
    
      * Resource Attribute Maps
      * Resource Attribute Values
      * Resource Attributes
      * Resource Types
      * Resources
    
    and a xulG load timing issue workaround
    
    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/conify/global/booking/resource.tt2 b/Open-ILS/src/templates/conify/global/booking/resource.tt2
index 946a39c..66f92bf 100644
--- a/Open-ILS/src/templates/conify/global/booking/resource.tt2
+++ b/Open-ILS/src/templates/conify/global/booking/resource.tt2
@@ -55,15 +55,19 @@
 
             var search = {'owner':list};
 
-            if (xulG && xulG.resultant_brsrc)
-                search = {id: xulG.resultant_brsrc};
+            setTimeout(
+                function() {
+                    if (xulG && xulG.resultant_brsrc)
+                        search = {id: xulG.resultant_brsrc};
 
-            brsrcGrid.overrideEditWidgets.type =
-                new openils.widget.PCrudAutocompleteBox({
-                    "fmclass": "brt", "searchAttr": "name"
-                });
-            brsrcGrid.overrideEditWidgets.type.shove = {"create": ""};
-            brsrcGrid.loadAll({order_by:{brsrc : 'barcode'}}, search);
+                    brsrcGrid.overrideEditWidgets.type =
+                        new openils.widget.PCrudAutocompleteBox({
+                            "fmclass": "brt", "searchAttr": "name"
+                        });
+                    brsrcGrid.overrideEditWidgets.type.shove = {"create": ""};
+                    brsrcGrid.loadAll({order_by:{brsrc : 'barcode'}}, search);
+                }, 0
+            );
         }
     );
 </script>
diff --git a/Open-ILS/src/templates/staff/admin/booking/index.tt2 b/Open-ILS/src/templates/staff/admin/booking/index.tt2
new file mode 100644
index 0000000..4c8b5da
--- /dev/null
+++ b/Open-ILS/src/templates/staff/admin/booking/index.tt2
@@ -0,0 +1,15 @@
+[%
+  WRAPPER "staff/base.tt2";
+  ctx.page_title = l("Booking Administration"); 
+  ctx.page_app = "egBookingAdmin";
+%]
+
+[% BLOCK APP_JS %]
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/eframe.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/admin/booking/app.js"></script>
+<link rel="stylesheet" href="[% ctx.base_path %]/staff/css/admin.css" />
+[% END %]
+
+<div ng-view></div>
+
+[% END %]
diff --git a/Open-ILS/src/templates/staff/admin/booking/t_splash.tt2 b/Open-ILS/src/templates/staff/admin/booking/t_splash.tt2
new file mode 100644
index 0000000..fcd79e8
--- /dev/null
+++ b/Open-ILS/src/templates/staff/admin/booking/t_splash.tt2
@@ -0,0 +1,39 @@
+
+<div class="container-fluid" style="text-align:center">
+  <div class="alert alert-info alert-less-pad strong-text-2">
+    <span>[% l('Booking Administration') %]</span>
+  </div>
+</div>
+
+<div class="container admin-splash-container">
+
+[%
+    interfaces = [
+     [ l('Resource Attribute Maps'), "./admin/booking/conify/resource_attr_map" ]
+    ,[ l('Resource Attribute Values'), "./admin/booking/conify/resource_attr_value" ]
+    ,[ l('Resource Attributes'), "./admin/booking/conify/resource_attr" ]
+    ,[ l('Resource Types'), "./admin/booking/conify/resource_type" ]
+    ,[ l('Resources'), "./admin/booking/conify/resource" ]
+   ];
+
+   USE table(interfaces, cols=3);
+%]
+
+<div class="row">
+[% FOREACH col = table.cols %]
+    <div class="col-md-4">
+    [% FOREACH item = col %][% IF item.1 %]
+        <div class="row new-entry">
+            <div class="col-md-12">
+            <span class="glyphicon glyphicon-pencil"></span>
+            <a target="_self" href="[% item.1 %]">
+                [% item.0 %]
+            </a>
+            </div>
+        </div>
+    [% END %][% END %]
+    </div>
+[% END %]
+</div>
+
+</div>
diff --git a/Open-ILS/src/templates/staff/navbar.tt2 b/Open-ILS/src/templates/staff/navbar.tt2
index 23db624..e989fcf 100644
--- a/Open-ILS/src/templates/staff/navbar.tt2
+++ b/Open-ILS/src/templates/staff/navbar.tt2
@@ -413,6 +413,12 @@
             </a>
           </li>
           <li>
+            <a href="./admin/booking/index" target="_self">
+              <span class="glyphicon glyphicon-calendar"></span>
+              [% l('Booking Administration') %]
+            </a>
+          </li>
+          <li>
             <a href="./reporter/legacy/main" target="_self">
               <span class="glyphicon glyphicon-object-align-bottom"></span>
               [% l('Reports') %]
diff --git a/Open-ILS/web/js/ui/default/staff/admin/booking/app.js b/Open-ILS/web/js/ui/default/staff/admin/booking/app.js
new file mode 100644
index 0000000..6f12e09
--- /dev/null
+++ b/Open-ILS/web/js/ui/default/staff/admin/booking/app.js
@@ -0,0 +1,60 @@
+angular.module('egBookingAdmin',
+    ['ngRoute', 'ui.bootstrap', 'egCoreMod','egUiMod'])
+
+.config(['$routeProvider','$locationProvider','$compileProvider', 
+ function($routeProvider , $locationProvider , $compileProvider) {
+
+    $locationProvider.html5Mode(true);
+    $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|blob):/); 
+    var resolver = {delay : function(egStartup) {return egStartup.go()}};
+
+    var eframe_template = 
+        '<eg-embed-frame url="booking_admin_url" handlers="funcs"></eg-embed-frame>';
+
+    $routeProvider.when('/admin/booking/:noun/:verb/:extra?', {
+        template: eframe_template,
+        controller: 'EmbedBookingCtl',
+        resolve : resolver
+    });
+
+    // default page 
+    $routeProvider.otherwise({
+        templateUrl : './admin/booking/t_splash',
+        resolve : resolver
+    });
+}])
+
+.controller('EmbedBookingCtl',
+       ['$scope','$routeParams','$location','egCore',
+function($scope , $routeParams , $location , egCore) {
+
+    $scope.funcs = {
+        ses : egCore.auth.token(),
+    }
+
+    var booking_path = '/eg/';
+
+    if ($routeParams.noun == 'conify') {
+        booking_path += 'conify/global/booking/' + $routeParams.verb
+            + (typeof $routeParams.extra != 'undefined'
+                ? '/' + $routeParams.extra
+                : '')
+            + location.search;
+    } else {
+        booking_path += 'booking/'
+            + $routeParams.noun + '/' + $routeParams.verb
+            + (typeof $routeParams.extra != 'undefined'
+                ? '/' + $routeParams.extra
+                : '')
+            + location.search;
+    }
+
+    // embed URL must include protocol/domain or it will be loaded via
+    // push-state, resulting in an infinitely nested pages.
+    $scope.booking_admin_url =
+        $location.absUrl().replace(/\/eg\/staff.*/, booking_path);
+
+    console.log('Loading Admin Booking URL: ' + $scope.booking_admin_url);
+
+}])
+

commit 92dc007a0b20c56512fec192ff53f33ce32720df
Author: Jason Etheridge <jason at esilibrary.com>
Date:   Fri Dec 2 16:04:44 2016 -0500

    webstaff: final Booking menu entry
    
      * Return Reservations
    
    and xulG load timing issue workaround
    
    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/navbar.tt2 b/Open-ILS/src/templates/staff/navbar.tt2
index ac82c6d..23db624 100644
--- a/Open-ILS/src/templates/staff/navbar.tt2
+++ b/Open-ILS/src/templates/staff/navbar.tt2
@@ -353,7 +353,7 @@
           </li>
           <li>
             <a href="./booking/legacy/booking/pull_list" target="_self">
-              <span class="glyphicon glyphicon-ok"></span>
+              <span class="glyphicon glyphicon-th-list"></span>
               [% l('Pull List') %]
             </a>
           </li>
@@ -365,10 +365,16 @@
           </li>
           <li>
             <a href="./booking/legacy/booking/pickup" target="_self">
-              <span class="glyphicon glyphicon-user"></span>
+              <span class="glyphicon glyphicon-export"></span>
               [% l('Pick Up Reservations') %]
             </a>
           </li>
+          <li>
+            <a href="./booking/legacy/booking/return" target="_self">
+              <span class="glyphicon glyphicon-import"></span>
+              [% l('Return Reservations') %]
+            </a>
+          </li>
         </ul>
       </li>
 
diff --git a/Open-ILS/web/js/ui/default/booking/return.js b/Open-ILS/web/js/ui/default/booking/return.js
index 64c9cf8..cdc3edd 100644
--- a/Open-ILS/web/js/ui/default/booking/return.js
+++ b/Open-ILS/web/js/ui/default/booking/return.js
@@ -37,5 +37,7 @@ function my_init() {
     }, document.getElementById("barcode"));
     init_auto_l10n(document.getElementById("auto_l10n_start_here"));
 
-    react_to_pass_in(xulG.bresv_interface_opts);
+    setTimeout(
+        function() { react_to_pass_in(xulG.bresv_interface_opts); }, 0
+    );
 }

commit 8d33988746ddc5ea7659573c7024ae20ca7f64a9
Author: Jason Etheridge <jason at esilibrary.com>
Date:   Fri Dec 2 15:58:17 2016 -0500

    webstaff: more Booking menu entries
    
      * Pull List
      * Capture Resources
      * Pick Up Reservations
    
    plus another xulG load timing issue workaround
    
    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/navbar.tt2 b/Open-ILS/src/templates/staff/navbar.tt2
index fe72af0..ac82c6d 100644
--- a/Open-ILS/src/templates/staff/navbar.tt2
+++ b/Open-ILS/src/templates/staff/navbar.tt2
@@ -351,7 +351,24 @@
               [% l('Create Reservations') %]
             </a>
           </li>
-          <li class="divider"></li>
+          <li>
+            <a href="./booking/legacy/booking/pull_list" target="_self">
+              <span class="glyphicon glyphicon-ok"></span>
+              [% l('Pull List') %]
+            </a>
+          </li>
+          <li>
+            <a href="./booking/legacy/booking/capture" target="_self">
+              <span class="glyphicon glyphicon-pushpin"></span>
+              [% l('Capture Resources') %]
+            </a>
+          </li>
+          <li>
+            <a href="./booking/legacy/booking/pickup" target="_self">
+              <span class="glyphicon glyphicon-user"></span>
+              [% l('Pick Up Reservations') %]
+            </a>
+          </li>
         </ul>
       </li>
 
diff --git a/Open-ILS/web/js/ui/default/booking/pickup.js b/Open-ILS/web/js/ui/default/booking/pickup.js
index afa0527..62dfea5 100644
--- a/Open-ILS/web/js/ui/default/booking/pickup.js
+++ b/Open-ILS/web/js/ui/default/booking/pickup.js
@@ -28,5 +28,7 @@ function my_init() {
     }, document.getElementById("patron_barcode"));
     init_auto_l10n(document.getElementById("auto_l10n_start_here"));
 
-    react_to_pass_in(xulG.bresv_interface_opts);
+    setTimeout(
+        function() { react_to_pass_in(xulG.bresv_interface_opts); }, 0
+    );
 }

commit 962124df44bbeef77f9689aa5ea0807972d6f89f
Author: Jason Etheridge <jason at esilibrary.com>
Date:   Fri Dec 2 15:43:10 2016 -0500

    webstaff: first ported Booking interface
    
      * Create Reservations
    
    with a xulG timing issue workaround :-/
    
    Signed-off-by: Jason Etheridge <jason at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/booking/index.tt2 b/Open-ILS/src/templates/staff/booking/index.tt2
new file mode 100644
index 0000000..678f22a
--- /dev/null
+++ b/Open-ILS/src/templates/staff/booking/index.tt2
@@ -0,0 +1,20 @@
+[%
+  WRAPPER "staff/base.tt2";
+  ctx.page_title = l("Booking");
+  ctx.page_app = "egBooking";
+%]
+
+[% BLOCK APP_JS %]
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/grid.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/eframe.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/ui.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/user.js"></script>
+<!--<script src="[% ctx.media_prefix %]/js/ui/default/staff/reporter/services/template.js"></script>-->
+<!--[% INCLUDE 'staff/reporter/share/report_strings.tt2' %]-->
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/booking/app.js"></script>
+<link rel="stylesheet" href="[% ctx.base_path %]/staff/css/booking.css" />
+[% END %]
+
+<div ng-view></div>
+
+[% END %]
diff --git a/Open-ILS/src/templates/staff/navbar.tt2 b/Open-ILS/src/templates/staff/navbar.tt2
index 262ceef..fe72af0 100644
--- a/Open-ILS/src/templates/staff/navbar.tt2
+++ b/Open-ILS/src/templates/staff/navbar.tt2
@@ -340,6 +340,21 @@
        </ul>
       </li>
 
+      <!-- booking -->
+      <li class="dropdown" uib-dropdown>
+        <a href uib-dropdown-toggle>[% l('Booking') %]<b class="caret"></b>
+        </a>
+        <ul uib-dropdown-menu>
+          <li>
+            <a href="./booking/legacy/booking/reservation" target="_self">
+              <span class="glyphicon glyphicon-plus"></span>
+              [% l('Create Reservations') %]
+            </a>
+          </li>
+          <li class="divider"></li>
+        </ul>
+      </li>
+
       <!-- admin -->
       <li class="dropdown" uib-dropdown>
         <a href uib-dropdown-toggle>[% l('Administration') %]<b class="caret"></b></a>
diff --git a/Open-ILS/web/js/ui/default/booking/reservation.js b/Open-ILS/web/js/ui/default/booking/reservation.js
index fcaf572..590c6b7 100644
--- a/Open-ILS/web/js/ui/default/booking/reservation.js
+++ b/Open-ILS/web/js/ui/default/booking/reservation.js
@@ -835,7 +835,11 @@ function my_init() {
     init_aous_cache();
     init_timestamp_widgets();
 
-    if (!(opts = xulG.bresv_interface_opts)) opts = {};
-    if (early_action_passthru())
-        provide_brt_selector(document.getElementById("brt_selector_here"));
+    setTimeout(
+        function() {
+            if (!(opts = xulG.bresv_interface_opts)) opts = {};
+            if (early_action_passthru())
+                provide_brt_selector(document.getElementById("brt_selector_here"));
+        }, 0
+    );
 }
diff --git a/Open-ILS/web/js/ui/default/staff/booking/app.js b/Open-ILS/web/js/ui/default/staff/booking/app.js
new file mode 100644
index 0000000..5f116d1
--- /dev/null
+++ b/Open-ILS/web/js/ui/default/staff/booking/app.js
@@ -0,0 +1,46 @@
+angular.module('egBooking',
+    ['ngRoute', 'ui.bootstrap', 'egCoreMod','egUiMod'])
+
+.config(['$routeProvider','$locationProvider','$compileProvider', 
+ function($routeProvider , $locationProvider , $compileProvider) {
+
+    $locationProvider.html5Mode(true);
+    $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|blob):/); 
+    var resolver = {delay : function(egStartup) {return egStartup.go()}};
+
+    var eframe_template = 
+        '<eg-embed-frame url="booking_url" handlers="funcs"></eg-embed-frame>';
+
+    $routeProvider.when('/booking/legacy/:noun/:verb', {
+        template: eframe_template,
+        controller: 'EmbedBookingCtl',
+        resolve : resolver
+    });
+
+    // default page 
+    $routeProvider.otherwise({
+        templateUrl : './t_splash',
+        resolve : resolver
+    });
+}])
+
+.controller('EmbedBookingCtl', 
+       ['$scope','$routeParams','$location','egCore',
+function($scope , $routeParams , $location , egCore) {
+
+    $scope.funcs = {
+        ses : egCore.auth.token(),
+    }
+
+    var booking_path = '/eg//eg/' + 
+        $routeParams.noun + '/' + $routeParams.verb + location.search;
+
+    // embed URL must include protocol/domain or it will be loaded via
+    // push-state, resulting in an infinitely nested pages.
+    $scope.booking_url = 
+        $location.absUrl().replace(/\/eg\/staff.*/, booking_path);
+
+    console.log('Loading Booking URL: ' + $scope.booking_url);
+
+}])
+

commit cebe4394a58cbede28a0e600ace1032c09e089aa
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 30 15:11:10 2016 -0500

    webstaff: add seed data for item status receipt template
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
index 0ebc960..c8bcb60 100644
--- a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+++ b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
@@ -412,7 +412,12 @@ function($scope , $q , egCore , ngToast) {
         },
         location : {
             name : 'General Collection'
-        }
+        },
+        // flattened versions for item status template
+        // TODO - make this go away
+        'call_number.label' : '636.8 JON',
+        'call_number.record.simple_record.title' : 'Test Title',
+        'location.name' : 'General Colleciton'
     }
 
     var one_hold = {
@@ -470,6 +475,7 @@ function($scope , $q , egCore , ngToast) {
         ],
 
         copy : seed_copy,
+        copies : [ seed_copy ],
 
         checkins : [
             {

commit ace09c477993179d8a810090df13d3208c7f87ae
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 30 15:06:08 2016 -0500

    webstaff: link to item status print template
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2 b/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
index 4beafb6..b049c56 100644
--- a/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
+++ b/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
@@ -26,6 +26,7 @@
           <option value="hold_pull_list">[% l('Hold Pull List') %]</option>
           <option value="hold_shelf_list">[% l('Hold Shelf List') %]</option>
           <option value="in_house_use_list">[% l('In-House Use List') %]</option>
+          <option value="item_status">[% l('Item Status') %]</option>
           <option value="items_out">[% l('Items Out') %]</option>
           <option value="patron_address">[% l('Patron Address') %]</option>
           <option value="patron_note">[% l('Patron Note') %]</option>

commit 90f60d70bbefde0c6f53bcc819e238c91d981875
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Tue Nov 29 16:34:14 2016 -0500

    webstaff: add printing to transit list page
    
    Adds a 'Print Transits' button and a transit_list print template. Using
    the button prints _all_ transits that match the filter criteria, not just
    the ones that happen to be displayed on the table.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2 b/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
index 48a7249..4beafb6 100644
--- a/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
+++ b/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
@@ -30,6 +30,7 @@
           <option value="patron_address">[% l('Patron Address') %]</option>
           <option value="patron_note">[% l('Patron Note') %]</option>
           <option value="renew">[% l('Renew') %]</option>
+          <option value="transit_list">[% l('Transit List') %]</option>
           <option value="transit_slip">[% l('Transit Slip') %]</option>
         </select>
         <label for="print_context">[% l('Force Printer Context') %]</label>
diff --git a/Open-ILS/src/templates/staff/circ/transits/t_list.tt2 b/Open-ILS/src/templates/staff/circ/transits/t_list.tt2
index 6d598f0..8654c31 100644
--- a/Open-ILS/src/templates/staff/circ/transits/t_list.tt2
+++ b/Open-ILS/src/templates/staff/circ/transits/t_list.tt2
@@ -40,6 +40,8 @@
 
   <eg-grid-menu-item handler="abort_transit" 
     label="[% l('Abort Transit') %]"></eg-grid-menu-item>
+  <eg-grid-menu-item handler="print_full_list"
+    label="[% l('Print Transits') %]"></eg-grid-menu-item>
 
   <eg-grid-field path='id' hidden required></eg-grid-field>
   <eg-grid-field path='target_copy.id' hidden required></eg-grid-field>
diff --git a/Open-ILS/src/templates/staff/share/print_templates/t_transit_list.tt2 b/Open-ILS/src/templates/staff/share/print_templates/t_transit_list.tt2
new file mode 100644
index 0000000..09e8333
--- /dev/null
+++ b/Open-ILS/src/templates/staff/share/print_templates/t_transit_list.tt2
@@ -0,0 +1,30 @@
+<!--
+Template for printing transits. Data specific to this template
+includes:
+
+transits - list; each entry contains:
+
+  * copy_status
+  * dest (library, keys include shortname)
+  * source_send_time
+  * id
+  * source (library, keys include shortname)
+  * target_copy (copy, keys include barcode)
+  * target_copy.call_number.record.simple_record.title
+-->
+<div>
+  <div>[% l('Transits:') %]</div>
+  <hr/>
+  <ol>
+    <li ng-repeat="transit in transits">
+      <div>[% l('From: [_1] To: [_2] <br> When: [_3] <br> Barcode: [_4] Title: [_5]',
+        '{{transit.source.shortname}}',
+        '{{transit.dest.shortname}}',
+        "{{transit.source_send_time | date:'short'}}",
+        '{{transit.target_copy.barcode}}',
+        '{{transit.target_copy.call_number.record.simple_record.title}}') %]</div>
+    </li>
+  </ol>
+  <hr/>
+  <div>{{current_location.shortname}} {{today | date:'short'}}</div>
+<br/>
diff --git a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
index da2b348..0ebc960 100644
--- a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+++ b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
@@ -403,7 +403,12 @@ function($scope , $q , egCore , ngToast) {
     var seed_copy = {
         barcode : '33434322323',
         call_number : {
-            label : '636.8 JON'
+            label : '636.8 JON',
+            record : {
+                simple_record : {
+                    'title' : 'Test Title'
+                }
+            }
         },
         location : {
             name : 'General Collection'
@@ -419,6 +424,20 @@ function($scope , $q , egCore , ngToast) {
         hold_type : 'T'
     }
 
+    var seed_transit = {
+        source : {
+            name : 'Library Y',
+            shortname : 'LY',
+            holds_address : seed_addr
+        },
+        dest : {
+            name : 'Library X',
+            shortname : 'LX',
+            holds_address : seed_addr
+        },
+        source_send_time : new Date().toISOString(),
+        target_copy : seed_copy
+    }
 
     $scope.preview_scope = {
         //bills
@@ -496,14 +515,8 @@ function($scope , $q , egCore , ngToast) {
             value : 'This patron is super nice!'
         },
 
-        transit : {
-            dest : {
-                name : 'Library X',
-                shortname : 'LX',
-                holds_address : seed_addr
-            },
-            target_copy : seed_copy
-        },
+        transit : seed_transit,
+        transits : [ seed_transit ],
         title : seed_record.title,
         author : seed_record.author,
         patron : seed_user,
diff --git a/Open-ILS/web/js/ui/default/staff/circ/transits/list.js b/Open-ILS/web/js/ui/default/staff/circ/transits/list.js
index 5e6550a..4ae321f 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/transits/list.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/transits/list.js
@@ -242,5 +242,47 @@ function($scope , $q , $routeParams , $window , egCore , egTransits , egGridData
     $scope.$watch('dates.end_date', function(newVal, oldVal) {
         if (newVal && newVal != oldVal) refresh_page();
     });
+
+    function fetch_all_matching_transits(transits) {
+        var deferred = $q.defer();
+        var filter = current_query();
+        egCore.pcrud.search('atc',
+            filter, {
+                'flesh' : 5,
+                // atc -> target_copy       -> call_number -> record -> simple_record
+                // atc -> hold_transit_copy -> hold        -> usr    -> card
+                'flesh_fields' : {
+                    'atc' : ['target_copy','dest','source','hold_transit_copy'],
+                    'acp' : ['call_number','location','circ_lib'],
+                    'acn' : ['record'],
+                    'bre' : ['simple_record'],
+                    'ahtc' : ['hold'],
+                    'ahr' : ['usr'],
+                    'au' : ['card']
+                },
+                'select' : { 'bre' : ['id'] },
+                order_by : { atc : 'source_send_time' },
+            }
+        ).then(
+            deferred.resolve, null,
+            function(transit) {
+                transits.push(egCore.idl.toHash(transit));
+            }
+        );
+        return deferred.promise;
+    }
+
+    $scope.print_full_list = function() {
+        var print_data = { transits : [] };
+
+        return fetch_all_matching_transits(print_data.transits).then(function() {
+            if (print_data.transits.length == 0) return $q.when();
+            return egCore.print.print({
+                template : 'transit_list',
+                scope : print_data
+            });
+        });
+
+    }
 }])
 

commit 9600f3016296f080dcbd367ae05efb95128fcefa
Author: Mike Rylander <mrylander at gmail.com>
Date:   Tue Nov 29 16:29:48 2016 -0500

    webstaff: Allow persistent op change
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/services/auth.js b/Open-ILS/web/js/ui/default/staff/services/auth.js
index 3ab8563..4e98956 100644
--- a/Open-ILS/web/js/ui/default/staff/services/auth.js
+++ b/Open-ILS/web/js/ui/default/staff/services/auth.js
@@ -191,9 +191,11 @@ function($q , $timeout , $rootScope , $window , $location , egNet , egHatch) {
         service.login_api(args).then(function(evt) {
 
             if (evt.textcode == 'SUCCESS') {
-                egHatch.setLoginSessionItem('eg.auth.token.oc', service.token());
-                egHatch.setLoginSessionItem('eg.auth.time.oc', service.authtime());
-                service.OCuser(service.user());
+                if (args.type != 'persist') {
+                    egHatch.setLoginSessionItem('eg.auth.token.oc', service.token());
+                    egHatch.setLoginSessionItem('eg.auth.time.oc', service.authtime());
+                    service.OCuser(service.user());
+                }
                 service.handle_login_ok(args, evt);
                 service.testAuthToken().then(
                     deferred.resolve,
diff --git a/Open-ILS/web/js/ui/default/staff/services/navbar.js b/Open-ILS/web/js/ui/default/staff/services/navbar.js
index c9aa522..ccb7d4d 100644
--- a/Open-ILS/web/js/ui/default/staff/services/navbar.js
+++ b/Open-ILS/web/js/ui/default/staff/services/navbar.js
@@ -96,7 +96,7 @@ angular.module('egCoreMod')
                         egCore.auth.opChange(args).then(
                             function() {
                                 console.log('op change success');
-                                $scope.op_changed = true;
+                                $scope.op_changed = egCore.auth.OCtoken() ? true : false;
                                 $scope.username = egCore.auth.user().usrname();
                                 ngToast.create(egCore.strings.OP_CHANGE_SUCCESS);
                             }, // note success with toast?

commit 3554927642b71ad33444b5fe16fdd81fc2b94f2e
Author: Mike Rylander <mrylander at gmail.com>
Date:   Tue Nov 29 16:20:33 2016 -0500

    webstaff: We need the md5 functions everywhere now, move the <script> up to base_js
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/acq/index.tt2 b/Open-ILS/src/templates/staff/acq/index.tt2
index 7c26ae3..b3a17d1 100644
--- a/Open-ILS/src/templates/staff/acq/index.tt2
+++ b/Open-ILS/src/templates/staff/acq/index.tt2
@@ -5,7 +5,6 @@
 %]
 
 [% BLOCK APP_JS %]
-<script src="[% ctx.media_prefix %]/js/dojo/opensrf/md5.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/grid.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/eframe.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/ui.js"></script>
diff --git a/Open-ILS/src/templates/staff/base_js.tt2 b/Open-ILS/src/templates/staff/base_js.tt2
index bf812ba..3a8f50c 100644
--- a/Open-ILS/src/templates/staff/base_js.tt2
+++ b/Open-ILS/src/templates/staff/base_js.tt2
@@ -1,4 +1,5 @@
 <script src="/IDL2js"></script>
+<script src="[% ctx.media_prefix %]/js/dojo/opensrf/md5.js"></script>
 
 [% IF EXPAND_WEB_IMPORTS %]
 
diff --git a/Open-ILS/src/templates/staff/circ/patron/index.tt2 b/Open-ILS/src/templates/staff/circ/patron/index.tt2
index 50c8bd7..65d14e7 100644
--- a/Open-ILS/src/templates/staff/circ/patron/index.tt2
+++ b/Open-ILS/src/templates/staff/circ/patron/index.tt2
@@ -23,9 +23,6 @@
 
 <!-- load the rest on demand? -->
 
-<!-- required for credentials verify API -->
-<script src="[% ctx.media_prefix %]/js/dojo/opensrf/md5.js"></script>
-
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/checkout.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/items_out.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/patron/holds.js"></script>
diff --git a/Open-ILS/src/templates/staff/index.tt2 b/Open-ILS/src/templates/staff/index.tt2
index b2e25f8..803774f 100644
--- a/Open-ILS/src/templates/staff/index.tt2
+++ b/Open-ILS/src/templates/staff/index.tt2
@@ -5,8 +5,6 @@
 %]
 
 [% BLOCK APP_JS %]
-<!-- needed for login -->
-<script src="[% ctx.media_prefix %]/js/dojo/opensrf/md5.js"></script>
 <!-- splash / login page app -->
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/app.js"></script>
 [% END %]
diff --git a/Open-ILS/src/templates/staff/reporter/index.tt2 b/Open-ILS/src/templates/staff/reporter/index.tt2
index ee6e2fc..733189e 100644
--- a/Open-ILS/src/templates/staff/reporter/index.tt2
+++ b/Open-ILS/src/templates/staff/reporter/index.tt2
@@ -5,7 +5,6 @@
 %]
 
 [% BLOCK APP_JS %]
-<script src="[% ctx.media_prefix %]/js/dojo/opensrf/md5.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/grid.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/eframe.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/ui.js"></script>

commit eb7f5c7fa4ea49e2e0763f3b1e183b2aefd2c4f4
Author: Mike Rylander <mrylander at gmail.com>
Date:   Tue Nov 29 16:08:17 2016 -0500

    webstaff: Display issue with operator change
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/services/auth.js b/Open-ILS/web/js/ui/default/staff/services/auth.js
index 638ce7d..3ab8563 100644
--- a/Open-ILS/web/js/ui/default/staff/services/auth.js
+++ b/Open-ILS/web/js/ui/default/staff/services/auth.js
@@ -191,12 +191,14 @@ function($q , $timeout , $rootScope , $window , $location , egNet , egHatch) {
         service.login_api(args).then(function(evt) {
 
             if (evt.textcode == 'SUCCESS') {
-                service.OCuser(service.user());
                 egHatch.setLoginSessionItem('eg.auth.token.oc', service.token());
                 egHatch.setLoginSessionItem('eg.auth.time.oc', service.authtime());
+                service.OCuser(service.user());
                 service.handle_login_ok(args, evt);
-                deferred.resolve();
-
+                service.testAuthToken().then(
+                    deferred.resolve,
+                    function () { service.opChangeUndo().then(deferred.reject)  }
+                );
             } else {
                 // note: the likely outcome here is a NO_SESION
                 // server event, which results in broadcasting an 
diff --git a/Open-ILS/web/js/ui/default/staff/services/navbar.js b/Open-ILS/web/js/ui/default/staff/services/navbar.js
index 305a62c..c9aa522 100644
--- a/Open-ILS/web/js/ui/default/staff/services/navbar.js
+++ b/Open-ILS/web/js/ui/default/staff/services/navbar.js
@@ -75,6 +75,7 @@ angular.module('egCoreMod')
                 $scope.changeOperatorUndo = function() {
                         egCore.auth.opChangeUndo();
                         $scope.op_changed = false;
+                        $scope.username = egCore.auth.user().usrname();
                         ngToast.create(egCore.strings.OP_CHANGE_SUCCESS);
                 }
 
@@ -96,6 +97,7 @@ angular.module('egCoreMod')
                             function() {
                                 console.log('op change success');
                                 $scope.op_changed = true;
+                                $scope.username = egCore.auth.user().usrname();
                                 ngToast.create(egCore.strings.OP_CHANGE_SUCCESS);
                             }, // note success with toast?
                             function() {

commit e90954f7690f637129724dc83511ef7321351063
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 16 06:39:56 2016 -0500

    webstaff: improve default search lib/preferred lib selectors
    
    These selectors now better indicate when a value has not
    been set yet.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/admin/workstation/t_splash.tt2 b/Open-ILS/src/templates/staff/admin/workstation/t_splash.tt2
index 4e60199..ab77e66 100644
--- a/Open-ILS/src/templates/staff/admin/workstation/t_splash.tt2
+++ b/Open-ILS/src/templates/staff/admin/workstation/t_splash.tt2
@@ -54,7 +54,8 @@
     </div>
     <div class="col-md-2">
       <eg-org-selector id="search_lib_selector"
-        selected="search_lib"
+        selected="search_lib" nodefault
+        label="[% l('Select...') %]"
         onchange="handle_search_lib_changed">
       </eg-org-selector>
     </div>
@@ -67,7 +68,8 @@
     </div>
     <div class="col-md-2">
       <eg-org-selector id="pref_lib_selector"
-        selected="pref_lib"
+        selected="pref_lib" nodefault
+        label="[% l('Select...') %]"
         onchange="handle_pref_lib_changed">
       </eg-org-selector>
     </div>

commit 8a6569a9e4aa349d9574cbf3efd8e88ac4e2364f
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 16 06:34:54 2016 -0500

    webstaff: fix "nodefault" attribute for egOrgSelector
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/services/ui.js b/Open-ILS/web/js/ui/default/staff/services/ui.js
index 0925dd4..3ed6429 100644
--- a/Open-ILS/web/js/ui/default/staff/services/ui.js
+++ b/Open-ILS/web/js/ui/default/staff/services/ui.js
@@ -457,7 +457,7 @@ function($window , egStrings) {
                     }
                 });
 
-                if (!$scope.selected)
+                if (!$scope.selected && !$scope.nodefault)
                     $scope.selected = egOrg.get(egAuth.user().ws_ou());
             });
 

commit 18ff36e87f0f4e1d75a827739475c8864150dc49
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 16 05:54:25 2016 -0500

    webstaff: add print action and template for item status page
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/cat/item/t_list.tt2 b/Open-ILS/src/templates/staff/cat/item/t_list.tt2
index 596a24b..087c4e0 100644
--- a/Open-ILS/src/templates/staff/cat/item/t_list.tt2
+++ b/Open-ILS/src/templates/staff/cat/item/t_list.tt2
@@ -65,3 +65,10 @@
   </eg-grid-field>
 </eg-grid>
 
+<div class="flex-row pad-vert">
+  <div class="flex-cell"></div>
+  <div class="pad-horiz">
+    <button class="btn btn-default"
+      ng-click="print_list()">[% l('Print') %]</button>
+  </div>
+</div>
diff --git a/Open-ILS/src/templates/staff/share/print_templates/t_item_status.tt2 b/Open-ILS/src/templates/staff/share/print_templates/t_item_status.tt2
new file mode 100644
index 0000000..0de9e1e
--- /dev/null
+++ b/Open-ILS/src/templates/staff/share/print_templates/t_item_status.tt2
@@ -0,0 +1,26 @@
+<!--
+Template for printing copies from the Item Status page. Available
+macros include:
+
+copies - list; each entry is a fleshed, flattened copy record
+with a variety of keys, including
+
+  barcode
+  call_number.record.simple_record.title (title)
+  call_number.label 
+  location.name
+
+-->
+<div>
+  <div>[% l('The following items have been examined:') %]</div>
+  <hr/>
+  <ol>
+    <li ng-repeat="copy in copies">
+      <div>[% l('Title: [_1] <br> Barcode: [_2]',
+        "{{copy['call_number.record.simple_record.title']}}",
+        '{{copy.barcode}}') %]</div>
+    </li>
+  </ol>
+  <hr/>
+  <div>{{current_location.shortname}} {{today | date:'short'}}</div>
+<br/>
diff --git a/Open-ILS/web/js/ui/default/staff/cat/item/app.js b/Open-ILS/web/js/ui/default/staff/cat/item/app.js
index 7a26635..33cc22c 100644
--- a/Open-ILS/web/js/ui/default/staff/cat/item/app.js
+++ b/Open-ILS/web/js/ui/default/staff/cat/item/app.js
@@ -796,6 +796,17 @@ function($scope , $q , $routeParams , $location , $timeout , $window , egCore ,
         }
     }
 
+    $scope.print_list = function() {
+        var print_data = { copies : copyGrid.allItems() };
+
+        if (print_data.copies.length == 0) return $q.when();
+
+        return egCore.print.print({
+            template : 'item_status',
+            scope : print_data
+        });
+    }
+
     if (copyId.length > 0) {
         itemSvc.fetch(null,copyId).then(
             function() {

commit a0fcb732db2d411ba6f3def6d82025f80f8b925a
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 16 05:31:06 2016 -0500

    webstaff: move print button for in-house use page
    
    Move it to the lower-right-hand corner to be consistent
    with other circulation interfaces.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/circ/in_house_use/index.tt2 b/Open-ILS/src/templates/staff/circ/in_house_use/index.tt2
index edf032c..184212e 100644
--- a/Open-ILS/src/templates/staff/circ/in_house_use/index.tt2
+++ b/Open-ILS/src/templates/staff/circ/in_house_use/index.tt2
@@ -71,14 +71,19 @@
   items-provider="gridDataProvider"
   persist-key="circ.in_house_use">
 
-  <eg-grid-menu-item handler="print_list" label="[% l('Print List') %]"></eg-grid-menu-item>
-
   <eg-grid-field label="[% l('# of Uses') %]"   path='num_uses' visible></eg-grid-field>
   <eg-grid-field label="[% l('Barcode') %]"     path='copy.barcode' visible></eg-grid-field>
   <eg-grid-field label="[% l('Call Number') %]" path="copy.call_number.label" visible></eg-grid-field>
   <eg-grid-field label="[% l('Location') %]"    path="copy.location.name" visible></eg-grid-field>
   <eg-grid-field label="[% l('Title') %]"       path="title" visible></eg-grid-field>
 </eg-grid>
- 
+
+<div class="flex-row pad-vert">
+  <div class="flex-cell"></div>
+  <div class="pad-horiz">
+    <button class="btn btn-default"
+      ng-click="print_list()">[% l('Print List') %]</button>
+  </div>
+</div>
 
 [% END %]

commit f239a6ec481f1f0493eafe800cb60d83f5e86b7f
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 16 05:26:39 2016 -0500

    webstaff: another addition to seed data for print template previews
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
index 2ea0f2c..da2b348 100644
--- a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+++ b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
@@ -468,7 +468,8 @@ function($scope , $q , egCore , ngToast) {
                     due_date : new Date().toISOString(),
                 },
                 copy : seed_copy,
-                title : seed_record.title
+                title : seed_record.title,
+                author : seed_record.author
             },
         ],
 

commit d74fb6ef6f28a0c3983a7553d048837e23799aa4
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 16 05:21:10 2016 -0500

    webstaff: add more seed data for print template previews
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
index 0e5663b..2ea0f2c 100644
--- a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+++ b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
@@ -415,7 +415,8 @@ function($scope , $q , egCore , ngToast) {
         phone_notify : '111-222-3333',
         sms_notify : '111-222-3333',
         email_notify : 'user at example.org',
-        request_time : new Date().toISOString()
+        request_time : new Date().toISOString(),
+        hold_type : 'T'
     }
 
 
@@ -430,6 +431,7 @@ function($scope , $q , egCore , ngToast) {
                     last_billing_type : 'Overdue materials',
                     total_owed : 1.50,
                     last_payment_note : 'Test Note 1',
+                    last_payment_type : 'cash_payment',
                     total_paid : 0.50,
                     balance_owed : 1.00
                 }
@@ -441,16 +443,31 @@ function($scope , $q , egCore , ngToast) {
                     last_billing_type : 'Overdue materials',
                     total_owed : 2.50,
                     last_payment_note : 'Test Note 2',
+                    last_payment_type : 'credit_payment',
                     total_paid : 0.50,
                     balance_owed : 2.00
                 }
             }
         ],
 
-        circulations : [
-            {   
-                due_date : new Date().toISOString(), 
+        copy : seed_copy,
+
+        checkins : [
+            {
+                due_date : new Date().toISOString(),
                 target_copy : seed_copy,
+                copy_barcode : seed_copy.barcode,
+                call_number : seed_copy.call_number,
+                title : seed_record.title
+            },
+        ],
+
+        circulations : [
+            {
+                circ : {
+                    due_date : new Date().toISOString(),
+                },
+                copy : seed_copy,
                 title : seed_record.title
             },
         ],
@@ -488,13 +505,33 @@ function($scope , $q , egCore , ngToast) {
         },
         title : seed_record.title,
         author : seed_record.author,
-        patron : egCore.idl.toHash(egCore.auth.user()),
+        patron : seed_user,
         address : seed_addr,
+        dest_location : egCore.idl.toHash(egCore.org.get(egCore.auth.user().ws_ou())),
+        dest_address : seed_addr,
         hold : one_hold,
         holds : [
-            {hold : one_hold, title : 'Some Title 1', author : 'Some Author 1'},
-            {hold : one_hold, title : 'Some Title 2', author : 'Some Author 2'},
-            {hold : one_hold, title : 'Some Title 3', author : 'Some Author 3'}
+            {
+                hold : one_hold, title : 'Some Title 1', author : 'Some Author 1',
+                volume : { label : '646.4 SOM' }, copy : seed_copy,
+                part : { label : 'v. 1' },
+                patron_barcode : 'S52802662',
+                patron_alias : 'XYZ', patron_last : 'Smith', patron_first : 'Jane'
+            },
+            {
+                hold : one_hold, title : 'Some Title 2', author : 'Some Author 2',
+                volume : { label : '646.4 SOM' }, copy : seed_copy,
+                part : { label : 'v. 1' },
+                patron_barcode : 'S52802662',
+                patron_alias : 'XYZ', patron_last : 'Smith', patron_first : 'Jane'
+            },
+            {
+                hold : one_hold, title : 'Some Title 3', author : 'Some Author 3',
+                volume : { label : '646.4 SOM' }, copy : seed_copy,
+                part : { label : 'v. 1' },
+                patron_barcode : 'S52802662',
+                patron_alias : 'XYZ', patron_last : 'Smith', patron_first : 'Jane'
+            }
         ]
     }
 

commit f28b9a13978f319ded726595aad12832754a2954
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 16 05:20:41 2016 -0500

    webstaff: fix some thinkos in print templates
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/share/print_templates/t_hold_shelf_list.tt2 b/Open-ILS/src/templates/staff/share/print_templates/t_hold_shelf_list.tt2
index 34441cd..c95fb3e 100644
--- a/Open-ILS/src/templates/staff/share/print_templates/t_hold_shelf_list.tt2
+++ b/Open-ILS/src/templates/staff/share/print_templates/t_hold_shelf_list.tt2
@@ -19,8 +19,8 @@
   <tbody>
     <tr ng-repeat="hold_data in holds">
       <td>
-        <span ng-if="hold.patron_alias">{{hold_data.patron_alias}}</span>
-        <span ng-if="!hold.patron_alias">
+        <span ng-if="hold_data.patron_alias">{{hold_data.patron_alias}}</span>
+        <span ng-if="!hold_data.patron_alias">
           [% l('[_1], [_2]',
             '{{hold_data.patron_last}}',
             '{{hold_data.patron_first}}') %]
diff --git a/Open-ILS/src/templates/staff/share/print_templates/t_hold_shelf_slip.tt2 b/Open-ILS/src/templates/staff/share/print_templates/t_hold_shelf_slip.tt2
index f1980d7..590e00b 100644
--- a/Open-ILS/src/templates/staff/share/print_templates/t_hold_shelf_slip.tt2
+++ b/Open-ILS/src/templates/staff/share/print_templates/t_hold_shelf_slip.tt2
@@ -18,7 +18,7 @@
   <br/>
 
   <div>[% l('Hold for patron [_1], [_2] [_3]',
-    '{{patron.family_given_name}}',
+    '{{patron.family_name}}',
     '{{patron.first_given_name}}',
     '{{patron.second_given_name}}') %]</div>
   <div>[% l('Barcode: [_1]', '{{patron.card.barcode}}') %]</div>
diff --git a/Open-ILS/src/templates/staff/share/print_templates/t_hold_transit_slip.tt2 b/Open-ILS/src/templates/staff/share/print_templates/t_hold_transit_slip.tt2
index 6b36c25..64a213d 100644
--- a/Open-ILS/src/templates/staff/share/print_templates/t_hold_transit_slip.tt2
+++ b/Open-ILS/src/templates/staff/share/print_templates/t_hold_transit_slip.tt2
@@ -15,7 +15,7 @@
   <br/>
 
   <div>[% l('Hold for patron [_1], [_2] [_3]',
-    '{{patron.family_given_name}}',
+    '{{patron.family_name}}',
     '{{patron.first_given_name}}',
     '{{patron.second_given_name}}') %]</div>
   <div>[% l('Barcode: [_1]', '{{patron.card.barcode}}') %]</div>

commit 7f80d05c1bbd981360703b7db8a48034a4ddb813
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 16 03:18:53 2016 -0500

    webstaff: teach print templates admin about three existing templates
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2 b/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
index 25c3f2a..48a7249 100644
--- a/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
+++ b/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
@@ -17,6 +17,7 @@
           <option value="bills_current">[% l('Bills, Current') %]</option>
           <option value="bills_historical">[% l('Bills, Historical') %]</option>
           <option value="bill_payment">[% l('Bills, Payment') %]</option>
+          <option value="checkin">[% l('Checkin') %]</option>
           <option value="checkout">[% l('Checkout') %]</option>
           <option value="hold_transit_slip">[% l('Hold Transit Slip') %]</option>
           <option value="hold_shelf_slip">[% l('Hold Shelf Slip') %]</option>
@@ -25,8 +26,10 @@
           <option value="hold_pull_list">[% l('Hold Pull List') %]</option>
           <option value="hold_shelf_list">[% l('Hold Shelf List') %]</option>
           <option value="in_house_use_list">[% l('In-House Use List') %]</option>
+          <option value="items_out">[% l('Items Out') %]</option>
           <option value="patron_address">[% l('Patron Address') %]</option>
           <option value="patron_note">[% l('Patron Note') %]</option>
+          <option value="renew">[% l('Renew') %]</option>
           <option value="transit_slip">[% l('Transit Slip') %]</option>
         </select>
         <label for="print_context">[% l('Force Printer Context') %]</label>

commit f0a4e25a6181f9b788df642518db4b1975719a30
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 16 03:07:22 2016 -0500

    webstaff: add print template and action for in-house uses list
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2 b/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
index 1b09453..25c3f2a 100644
--- a/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
+++ b/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
@@ -24,6 +24,7 @@
           <option value="holds_for_patron">[% l('Holds for Patron') %]</option>
           <option value="hold_pull_list">[% l('Hold Pull List') %]</option>
           <option value="hold_shelf_list">[% l('Hold Shelf List') %]</option>
+          <option value="in_house_use_list">[% l('In-House Use List') %]</option>
           <option value="patron_address">[% l('Patron Address') %]</option>
           <option value="patron_note">[% l('Patron Note') %]</option>
           <option value="transit_slip">[% l('Transit Slip') %]</option>
diff --git a/Open-ILS/src/templates/staff/circ/in_house_use/index.tt2 b/Open-ILS/src/templates/staff/circ/in_house_use/index.tt2
index 769d533..edf032c 100644
--- a/Open-ILS/src/templates/staff/circ/in_house_use/index.tt2
+++ b/Open-ILS/src/templates/staff/circ/in_house_use/index.tt2
@@ -70,6 +70,9 @@
   main-label="[% l('In-House Use') %]"
   items-provider="gridDataProvider"
   persist-key="circ.in_house_use">
+
+  <eg-grid-menu-item handler="print_list" label="[% l('Print List') %]"></eg-grid-menu-item>
+
   <eg-grid-field label="[% l('# of Uses') %]"   path='num_uses' visible></eg-grid-field>
   <eg-grid-field label="[% l('Barcode') %]"     path='copy.barcode' visible></eg-grid-field>
   <eg-grid-field label="[% l('Call Number') %]" path="copy.call_number.label" visible></eg-grid-field>
diff --git a/Open-ILS/src/templates/staff/share/print_templates/t_in_house_use_list.tt2 b/Open-ILS/src/templates/staff/share/print_templates/t_in_house_use_list.tt2
new file mode 100644
index 0000000..8bf8533
--- /dev/null
+++ b/Open-ILS/src/templates/staff/share/print_templates/t_in_house_use_list.tt2
@@ -0,0 +1,28 @@
+<!--
+Template for printing in-house uses. Data specific to this template
+includes:
+
+in_house_uses - list; each entry contains:
+
+  * num_uses - number of uses
+  * copy - data for a copy, including the following keys:
+
+              barcode : barcode
+              location.name : shelving location
+              call_number.label : call number
+
+  * title - copy title
+-->
+<div>
+  <div>[% l('You marked the following in-house items used:') %]</div>
+  <hr/>
+  <ol>
+    <li ng-repeat="ihu in in_house_uses">
+      <div>[% l('Barcode: [_1] Uses: [_2]',
+        '{{ihu.copy.barcode}}',
+        '{{ihu.num_uses}}') %]</div>
+    </li>
+  </ol>
+  <hr/>
+  <div>{{current_location.shortname}} {{today | date:'short'}}</div>
+<br/>
diff --git a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
index de37438..0e5663b 100644
--- a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+++ b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
@@ -401,7 +401,13 @@ function($scope , $q , egCore , ngToast) {
     };
 
     var seed_copy = {
-        barcode : '33434322323'
+        barcode : '33434322323',
+        call_number : {
+            label : '636.8 JON'
+        },
+        location : {
+            name : 'General Collection'
+        }
     }
 
     var one_hold = {
@@ -449,6 +455,14 @@ function($scope , $q , egCore , ngToast) {
             },
         ],
 
+        in_house_uses : [
+            {
+                num_uses : 3,
+                copy : seed_copy,
+                title : seed_record.title
+            }
+        ],
+
         previous_balance : 8.45,
         payment_total : 2.00,
         payment_applied : 2.00,
diff --git a/Open-ILS/web/js/ui/default/staff/circ/in_house_use/app.js b/Open-ILS/web/js/ui/default/staff/circ/in_house_use/app.js
index 0904c94..45e9e59 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/in_house_use/app.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/in_house_use/app.js
@@ -121,4 +121,23 @@ function($scope,  egCore,  egGridDataProvider , egConfirmDialog) {
         });
     }
 
+    $scope.print_list = function() {
+        var print_data = { in_house_uses : [] };
+
+        if (checkouts.length == 0) return $q.when();
+
+        angular.forEach(checkouts, function(ihu) {
+            print_data.in_house_uses.push({
+                num_uses : ihu.num_uses,
+                copy : egCore.idl.toHash(ihu.copy),
+                title : ihu.title
+            })
+        });
+
+        return egCore.print.print({
+            template : 'in_house_use_list',
+            scope : print_data
+        });
+    }
+
 }])

commit 0218e2e0d86d0694b7b90b7eb7182d208c01330c
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 16 01:53:45 2016 -0500

    webstaff: add support for per-template printer contexts
    
    Per-template printer contexts can now be set, imported, exported,
    and passed along to Hatch during printing.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2 b/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
index 7448a46..1b09453 100644
--- a/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
+++ b/Open-ILS/src/templates/staff/admin/workstation/t_print_templates.tt2
@@ -9,23 +9,35 @@
 <h2>[% l('Print Templates') %]</h2>
 
 <div class="row">
-  <div class="col-md-2">[% l('Template Name') %]</div>
-  <div class="col-md-3">
-    <select class="form-control" ng-model="print.template_name" ng-change="template_changed()">
-      <option value="bills_current">[% l('Bills, Current') %]</option>
-      <option value="bills_historical">[% l('Bills, Historical') %]</option>
-      <option value="bill_payment">[% l('Bills, Payment') %]</option>
-      <option value="checkout">[% l('Checkout') %]</option>
-      <option value="hold_transit_slip">[% l('Hold Transit Slip') %]</option>
-      <option value="hold_shelf_slip">[% l('Hold Shelf Slip') %]</option>
-      <option value="holds_for_bib">[% l('Holds for Bib Record') %]</option>
-      <option value="holds_for_patron">[% l('Holds for Patron') %]</option>
-      <option value="hold_pull_list">[% l('Hold Pull List') %]</option>
-      <option value="hold_shelf_list">[% l('Hold Shelf List') %]</option>
-      <option value="patron_address">[% l('Patron Address') %]</option>
-      <option value="patron_note">[% l('Patron Note') %]</option>
-      <option value="transit_slip">[% l('Transit Slip') %]</option>
-    </select>
+  <div class="col-md-5">
+    <div class="form-inline">
+      <div class="form-group">
+        <label for="print_tempate_name">[% l('Template Name') %]</label>
+        <select id="print_template_name" class="form-control" ng-model="print.template_name" ng-change="template_changed()">
+          <option value="bills_current">[% l('Bills, Current') %]</option>
+          <option value="bills_historical">[% l('Bills, Historical') %]</option>
+          <option value="bill_payment">[% l('Bills, Payment') %]</option>
+          <option value="checkout">[% l('Checkout') %]</option>
+          <option value="hold_transit_slip">[% l('Hold Transit Slip') %]</option>
+          <option value="hold_shelf_slip">[% l('Hold Shelf Slip') %]</option>
+          <option value="holds_for_bib">[% l('Holds for Bib Record') %]</option>
+          <option value="holds_for_patron">[% l('Holds for Patron') %]</option>
+          <option value="hold_pull_list">[% l('Hold Pull List') %]</option>
+          <option value="hold_shelf_list">[% l('Hold Shelf List') %]</option>
+          <option value="patron_address">[% l('Patron Address') %]</option>
+          <option value="patron_note">[% l('Patron Note') %]</option>
+          <option value="transit_slip">[% l('Transit Slip') %]</option>
+        </select>
+        <label for="print_context">[% l('Force Printer Context') %]</label>
+        <select class="form-control" ng-model="print.template_context">
+          <option value="default">[% l('Default') %]</option>
+          <option value="receipt">[% l('Receipt') %]</option>
+          <option value="label">[% l('Label') %]</option>
+          <option value="mail">[% l('Mail') %]</option>
+          <option value="offline">[% l('Offline') %]</option>
+        </select>
+      </div>
+    </div>
   </div>
   <div class="col-md-7">
     <button class="btn btn-default pull-left" ng-click="save_locally()">[% l('Save Locally') %]</button>
diff --git a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
index dd51bc8..de37438 100644
--- a/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+++ b/Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
@@ -368,7 +368,8 @@ function($scope , $q , egCore , ngToast) {
 
     $scope.print = {
         template_name : 'bills_current',
-        template_output : ''
+        template_output : '',
+        template_context : 'default'
     };
 
     // print preview scope data
@@ -508,6 +509,10 @@ function($scope , $q , egCore , ngToast) {
                 $scope.print.load_failed = true;
             }
         );
+        egCore.print.getPrintTemplateContext($scope.print.template_name)
+        .then(function(template_context) {
+            $scope.print.template_context = template_context;
+        });
     }
 
     $scope.save_locally = function() {
@@ -515,21 +520,35 @@ function($scope , $q , egCore , ngToast) {
             $scope.print.template_name,
             $scope.print.template_content
         );
+        egCore.print.storePrintTemplateContext(
+            $scope.print.template_name,
+            $scope.print.template_context
+        );
     }
 
     $scope.exportable_templates = function() {
         var templates = {};
+        var contexts = {};
         var deferred = $q.defer();
         var promises = [];
-        egCore.hatch.getKeys('eg.print.template.').then(function(keys) {
+        egCore.hatch.getKeys('eg.print.template').then(function(keys) {
             angular.forEach(keys, function(key) {
-                promises.push(egCore.hatch.getItem(key).then(function(value) {
-                    templates[key.replace('eg.print.template.', '')] = value;
-                }));
+                if (key.match(/^eg\.print\.template\./)) {
+                    promises.push(egCore.hatch.getItem(key).then(function(value) {
+                        templates[key.replace('eg.print.template.', '')] = value;
+                    }));
+                } else {
+                    promises.push(egCore.hatch.getItem(key).then(function(value) {
+                        contexts[key.replace('eg.print.template_context.', '')] = value;
+                    }));
+                }
             });
             $q.all(promises).then(function() {
                 if (Object.keys(templates).length) {
-                    deferred.resolve(templates);
+                    deferred.resolve({
+                        templates: templates,
+                        contexts: contexts
+                    });
                 } else {
                     ngToast.warning(egCore.strings.PRINT_TEMPLATES_FAIL_EXPORT);
                     deferred.reject();
@@ -543,10 +562,13 @@ function($scope , $q , egCore , ngToast) {
     $scope.$watch('imported_print_templates.data', function(newVal, oldVal) {
         if (newVal && newVal != oldVal) {
             try {
-                var templates = JSON.parse(newVal);
-                angular.forEach(templates, function(template_content, template_name) {
+                var data = JSON.parse(newVal);
+                angular.forEach(data.templates, function(template_content, template_name) {
                     egCore.print.storePrintTemplate(template_name, template_content);
                 });
+                angular.forEach(data.contexts, function(template_context, template_name) {
+                    egCore.print.storePrintTemplateContext(template_name, template_context);
+                });
                 $scope.template_changed(); // refresh
                 ngToast.create(egCore.strings.PRINT_TEMPLATES_SUCCESS_IMPORT);
             } catch (E) {
diff --git a/Open-ILS/web/js/ui/default/staff/services/print.js b/Open-ILS/web/js/ui/default/staff/services/print.js
index 30a1751..2c90818 100644
--- a/Open-ILS/web/js/ui/default/staff/services/print.js
+++ b/Open-ILS/web/js/ui/default/staff/services/print.js
@@ -1,7 +1,6 @@
 /**
  * egPrint : manage print templates, process templates, print content
  *
- * TODO: create configurable links between print template and context.
  */
 angular.module('egCoreMod')
 
@@ -34,7 +33,11 @@ function($q , $window , $timeout , $http , egHatch , egAuth , egIDL , egOrg , eg
             .then(function(content) {
                 args.content = content;
                 if (!args.content_type) args.content_type = 'html';
-                return service.print_content(args);
+                service.getPrintTemplateContext(args.template)
+                .then(function(context) {
+                    args.context = context;
+                    return service.print_content(args);
+                });
             });
 
         } 
@@ -69,7 +72,6 @@ function($q , $window , $timeout , $http , egHatch , egAuth , egIDL , egOrg , eg
             promise = $q.when(args.content);
         }
 
-        // TODO: link print context to template type
         var context = args.context || 'default';
 
         return promise.then(function(html) {
@@ -136,6 +138,21 @@ function($q , $window , $timeout , $http , egHatch , egAuth , egIDL , egOrg , eg
         return egHatch.setItem('eg.print.template.' + name, html);
     }
 
+    service.getPrintTemplateContext = function(name) {
+        var deferred = $q.defer();
+
+        egHatch.getItem('eg.print.template_context.' + name)
+        .then(
+            function(context) { deferred.resolve(context); },
+            function()        { deferred.resolve('default'); }
+        );
+
+        return deferred.promise;
+    }
+    service.storePrintTemplateContext = function(name, context) {
+        return egHatch.setItem('eg.print.template_context.' + name, context);
+    }
+
     return service;
 }])
 

commit 46e689f771b29bbdfe0b6c2b47ab2af8dd30b678
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Wed Nov 16 00:34:06 2016 -0500

    webstaff: fix support of the disabled automatic print attempt type list
    
    This patch ensures that the disabled automatic print attempt type list
    setting is now honored. In addition, if bill payment receipts are
    disabled via the setting, the "Receipt on Pay" and "# Copies" widgets
    are not displayed on the bill payment page.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/circ/patron/t_bills.tt2 b/Open-ILS/src/templates/staff/circ/patron/t_bills.tt2
index 4378e32..fcf8012 100644
--- a/Open-ILS/src/templates/staff/circ/patron/t_bills.tt2
+++ b/Open-ILS/src/templates/staff/circ/patron/t_bills.tt2
@@ -103,7 +103,7 @@
 <!-- pull-right is causing the content to flow several pixels 
 off to the right.  flex-row is honoring the boundaries better. 
 not sure what's up, there. -->
-<div class="flex-row">
+<div class="flex-row" ng-if="!disable_auto_print">
   <div class="flex-cell"></div>
   <form class="form-inline" role="form">
    <div class="checkbox">
diff --git a/Open-ILS/web/js/ui/default/staff/circ/patron/bills.js b/Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
index 37c2a18..7c869b3 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
@@ -13,7 +13,7 @@ function($q , egCore , egWorkLog , patronSvc) {
     service.fetchBillSettings = function() {
         if (service.settings) return $q.when(service.settings);
         return egCore.org.settings(
-            ['ui.circ.billing.uncheck_bills_and_unfocus_payment_box','ui.circ.billing.amount_warn','ui.circ.billing.amount_limit']
+            ['ui.circ.billing.uncheck_bills_and_unfocus_payment_box','ui.circ.billing.amount_warn','ui.circ.billing.amount_limit','circ.staff_client.do_not_auto_attempt_print']
         ).then(function(s) {return service.settings = s});
     }
 
@@ -151,6 +151,7 @@ function($scope , $q , $routeParams , egCore , egConfirmDialog , $location,
     $scope.warn_amount = 1000;
     $scope.max_amount = 100000;
     $scope.amount_verified = false;
+    $scope.disable_auto_print = false;
 
     // pre-define list-returning funcs in case we access them
     // before the grid instantiates
@@ -303,7 +304,7 @@ function($scope , $q , $routeParams , egCore , egConfirmDialog , $location,
             $scope.payment_type, make_payments, note, $scope.check_number)
         .then(function(payment_ids) {
 
-            if ($scope.receipt_on_pay) {
+            if (!$scope.disable_auto_print && $scope.receipt_on_pay) {
                 printReceipt(
                     $scope.payment_type, payment_ids, make_payments, note);
             }
@@ -409,6 +410,11 @@ function($scope , $q , $routeParams , egCore , egConfirmDialog , $location,
         if (s['ui.circ.billing.amount_limit']) {
             $scope.max_amount = Number(s['ui.circ.billing.amount_limit']);
         }
+        if (s['circ.staff_client.do_not_auto_attempt_print'] && angular.isArray(s['circ.staff_client.do_not_auto_attempt_print'])) {
+            $scope.disable_auto_print = Boolean(
+                s['circ.staff_client.do_not_auto_attempt_print'].indexOf('Bill Pay') > -1
+            );
+        }
     });
 
     $scope.gridControls.allItemsRetrieved = function() {
diff --git a/Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js b/Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js
index cf3c8f1..82d6e82 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js
@@ -76,7 +76,9 @@ function($scope , $q , $routeParams , egCore , egUser , patronSvc ,
         'circ.staff_client.do_not_auto_attempt_print'
     ]).then(function(settings) { 
         printOnComplete = !Boolean(
-            settings['circ.staff_client.do_not_auto_attempt_print']);
+            angular.isArray(settings['circ.staff_client.do_not_auto_attempt_print']) &&
+            (settings['circ.staff_client.do_not_auto_attempt_print'].indexOf('Checkout') > -1)
+        );
     });
 
     egCirc.get_noncat_types().then(function(list) {
diff --git a/Open-ILS/web/js/ui/default/staff/circ/services/circ.js b/Open-ILS/web/js/ui/default/staff/circ/services/circ.js
index 753f54b..a2692ea 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/services/circ.js
@@ -13,16 +13,30 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
     var service = {
         // auto-override these events after the first override
         auto_override_checkout_events : {},
-        require_initials : false
+        require_initials : false,
+        never_auto_print : {
+            hold_shelf_slip : false,
+            hold_transit_slip : false,
+            transit_slip : false
+        }
     };
 
     egCore.startup.go().finally(function() {
         egCore.org.settings([
             'ui.staff.require_initials.patron_standing_penalty',
             'ui.admin.work_log.max_entries',
-            'ui.admin.patron_log.max_entries'
+            'ui.admin.patron_log.max_entries',
+            'circ.staff_client.do_not_auto_attempt_print'
         ]).then(function(set) {
             service.require_initials = Boolean(set['ui.staff.require_initials.patron_standing_penalty']);
+            if (angular.isArray(set['circ.staff_client.do_not_auto_attempt_print'])) {
+                if (set['circ.staff_client.do_not_auto_attempt_print'].indexOf('Hold Slip') > 1)
+                    service.never_auto_print['hold_shelf_slip'] = true;
+                if (set['circ.staff_client.do_not_auto_attempt_print'].indexOf('Hold/Transit Slip') > 1)
+                    service.never_auto_print['hold_transit_slip'] = true;
+                if (set['circ.staff_client.do_not_auto_attempt_print'].indexOf('Transit Slip') > 1)
+                    service.never_auto_print['transit_slip'] = true;
+            }
         });
     });
 
@@ -1358,7 +1372,17 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
 
         return service.collect_route_data(tmpl, evt, params, options)
         .then(function(data) {
-            
+
+            var template = data.transit ?
+                (data.patron ? 'hold_transit_slip' : 'transit_slip') :
+                'hold_shelf_slip';
+            if (service.never_auto_print[template]) {
+                // do not show the dialog or print if the
+                // disabled automatic print attempt type list includes
+                // the specified template
+                return;
+            }
+
             // All actions flow from the print data
 
             var print_context = {
@@ -1385,11 +1409,7 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
             if (evt.payload.hold) sound += '.hold';
             egCore.audio.play(sound);
 
-            function print_transit() {
-                var template = data.transit ? 
-                    (data.patron ? 'hold_transit_slip' : 'transit_slip') :
-                    'hold_shelf_slip';
-
+            function print_transit(template) {
                 return egCore.print.print({
                     context : 'default', 
                     template : template, 
@@ -1400,7 +1420,7 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
             // when auto-print is on, skip the dialog and go straight
             // to printing.
             if (options.auto_print_holds_transits) 
-                return print_transit();
+                return print_transit(template);
 
             return $uibModal.open({
                 templateUrl: tmpl,
@@ -1419,7 +1439,7 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
 
                     $scope.print = function() { 
                         $uibModalInstance.close();
-                        print_transit();
+                        print_transit(template);
                     }
                 }]
 

commit fc54e4e15aa22ab68490061015837f7b18447549
Author: Galen Charlton <gmc at esilibrary.com>
Date:   Mon Nov 28 11:55:24 2016 -0500

    webstaff: fix misalignment of ‡ in MARC editor
    
    This patch sets the font used to display the "‡" character in the
    MARC editor to the same font used for input fields, fixing a
    vertical misalginment that displayed in Chrome and Firefox
    on some platforms.
    
    Signed-off-by: Galen Charlton <gmc at esilibrary.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/css/cat.css.tt2 b/Open-ILS/src/templates/staff/css/cat.css.tt2
index 6f51d0f..8d6cb81 100644
--- a/Open-ILS/src/templates/staff/css/cat.css.tt2
+++ b/Open-ILS/src/templates/staff/css/cat.css.tt2
@@ -60,6 +60,7 @@ input.marcedit:focus {
 
 .marcsfcodedelimiter {
     color: blue;
+    font-family: 'Lucida Console', Monaco, monospace;
     font-weight: normal;
     text-align: center;
     padding-right: 0px !important;

commit f689d48551ca5c86f2e6f8a90385086d91f0d411
Author: Mike Rylander <mrylander at gmail.com>
Date:   Mon Nov 28 11:31:03 2016 -0500

    webstaff: Clean up dojo idiom use for chome happiness
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/acq/common/li_table.js b/Open-ILS/web/js/ui/default/acq/common/li_table.js
index 851982d..7a34720 100644
--- a/Open-ILS/web/js/ui/default/acq/common/li_table.js
+++ b/Open-ILS/web/js/ui/default/acq/common/li_table.js
@@ -205,8 +205,11 @@ function AcqLiTable() {
 
         /* Note that this will directly contain dijits, not the AutoWidget
          * wrapper object. */
-        this.batchUpdateWidgets = {};
+        if (!this.batchUpdateWidgets) {
+            this.batchUpdateWidgets = {};
+        }
 
+        if (this.batchUpdateWidgets.item_count) this.batchUpdateWidgets.item_count.destroy();
         this.batchUpdateWidgets.item_count = new dijit.form.TextBox(
             {
                 "style": {"width": "3em"},
@@ -217,45 +220,53 @@ function AcqLiTable() {
             "acq-bu-item_count"
         );
 
-        (new openils.widget.AutoFieldWidget({
-            "fmClass": "acqdf",
-            "selfReference": true,
-            "dijitArgs": { "required": false },
-            "forceSync": true,
-            "parentNode": "acq-bu-distribution_formula"
-        })).build(
-            function(w) {
-                dojo.style(w.domNode, {"width": "12em"});
-                /* dijitArgs to AutoFieldWidget won't work for 'disabled' */
-                w.attr(
-                    "disabled",
-                    dojo.indexOf(disabled_fields, "distribution_formula") != -1
-                );
-                self.batchUpdateWidgets.distribution_formula = w;
-            }
+        if (!this.batchUpdateWidgets.distribution_formula) {
+            (new openils.widget.AutoFieldWidget({
+                "fmClass": "acqdf",
+                "selfReference": true,
+                "dijitArgs": { "required": false },
+                "forceSync": true,
+                "parentNode": "acq-bu-distribution_formula"
+            })).build(
+                function(w) {
+                    dojo.style(w.domNode, {"width": "12em"});
+                    self.batchUpdateWidgets.distribution_formula = w;
+                }
+            );
+        }
+
+        /* dijitArgs to AutoFieldWidget won't work for 'disabled' */
+        self.batchUpdateWidgets.distribution_formula.attr(
+            'disabled',
+            dojo.indexOf(disabled_fields, "distribution_formula") != -1
         );
 
         function buildOneBatchWidget(field, args) {
-            (new openils.widget.AutoFieldWidget(args)).build(
-                function(w, aw) {
-                    if (field == "fund") {
-                        dojo.connect(
-                            w, "onChange", function(val) {
-                                self._updateFundSelectorStyle(aw, val);
-                            }
-                        );
-                        if (w.store)
-                            self._ensureCSSFundClasses(w.store);
+            if (!self.batchUpdateWidgets[field]) {
+                (new openils.widget.AutoFieldWidget(args)).build(
+                    function(w, aw) {
+                        if (field == "fund") {
+                            dojo.connect(
+                                w, "onChange", function(val) {
+                                    self._updateFundSelectorStyle(aw, val);
+                                }
+                            );
+                            if (w.store)
+                                self._ensureCSSFundClasses(w.store);
+                        }
+
+                        dojo.style(w.domNode, {"width": "10em"});
+                        self.batchUpdateWidgets[field] = w;
                     }
+                );
+            }
 
-                    dojo.style(w.domNode, {"width": "10em"});
-                    w.attr(
-                        "disabled",
-                        dojo.indexOf(disabled_fields, field) != -1
-                    );
-                    self.batchUpdateWidgets[field] = w;
-                }
-            );
+            if (self.batchUpdateWidgets[field]) {
+                self.batchUpdateWidgets[field].attr(
+                    "disabled",
+                    dojo.indexOf(disabled_fields, field) != -1
+                );
+            }
         }
 
         dojo.forEach(

commit 5da2dcc549d8937306b8d2ff875f83db54e0ef0b
Author: Mike Rylander <mrylander at gmail.com>
Date:   Wed Nov 23 12:37:39 2016 -0500

    webstaff: honor sticky-setting org by calling onchange handler; have newer holdings service requests cancel ongoing older ones
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/web/js/ui/default/staff/cat/services/holdings.js b/Open-ILS/web/js/ui/default/staff/cat/services/holdings.js
index 71255a4..3f4ec7d 100644
--- a/Open-ILS/web/js/ui/default/staff/cat/services/holdings.js
+++ b/Open-ILS/web/js/ui/default/staff/cat/services/holdings.js
@@ -33,9 +33,11 @@ function(egCore , $q) {
     // resolved with the last received copy
     service.prototype.fetch = function(opts) {
         var svc = this;
-        if (svc.ongoing) {
-            console.log('Skipping fetch, ongoing = true');
-            return $q.when();
+
+        if (svc.ongoing && svc.p) {
+            svc.p.cancel = true;
+            console.log('Canceling fetch for org '+ svc.org.id());
+            if (svc.p.reject) svc.p.reject();
         }
 
         var rid = opts.rid;
@@ -61,12 +63,13 @@ function(egCore , $q) {
         var org_list = egCore.org.descendants(org.id(), true);
         console.log('Holdings fetch with: rid='+rid+' org='+org_list+' copy='+copy+' vol='+vol+' empty='+empty);
 
-        return egCore.pcrud.search(
+        var p = egCore.pcrud.search(
             'acn',
             {record : rid, owning_lib : org_list, deleted : 'f'},
             svc.flesh
         ).then(
             function() { // finished
+                if (p.cancel) return;
                 svc.copies = svc.copies.sort(
                     function (a, b) {
                         function compare_array (x, y, i) {
@@ -236,6 +239,7 @@ function(egCore , $q) {
 
             // notify reads the stream of copies, one at a time.
             function(cn) {
+                if (p.cancel) return;
 
                 var copies = cn.copies().filter(function(cp){ return cp.deleted() == 'f' });
                 cn.copies([]);
@@ -278,6 +282,8 @@ function(egCore , $q) {
                 return cn;
             }
         );
+
+        return svc.p = p;
     };
 
     return service;
diff --git a/Open-ILS/web/js/ui/default/staff/services/ui.js b/Open-ILS/web/js/ui/default/staff/services/ui.js
index 86268d7..0925dd4 100644
--- a/Open-ILS/web/js/ui/default/staff/services/ui.js
+++ b/Open-ILS/web/js/ui/default/staff/services/ui.js
@@ -493,6 +493,8 @@ function($window , egStrings) {
                 var orgId = scope.hatch.getLocalItem(scope.stickySetting);
                 if (orgId) {
                     scope.selected = scope.egOrg.get(orgId);
+                    if (scope.onchange)
+                        scope.onchange(scope.selected);
                 }
             }
 

-----------------------------------------------------------------------

Summary of changes:
 Open-ILS/src/templates/base.tt2                    |    5 +
 .../templates/conify/global/booking/resource.tt2   |   20 ++-
 .../conify/global/cat/authority/browse_axis.tt2    |    2 -
 .../authority/browse_axis_authority_field_map.tt2  |    2 -
 .../conify/global/cat/authority/control_set.tt2    |    1 -
 .../cat/authority/control_set_authority_field.tt2  |    2 -
 .../global/cat/authority/control_set_bib_field.tt2 |    2 -
 .../conify/global/cat/authority/thesaurus.tt2      |    2 -
 .../conify/global/config/actor_sip_fields.tt2      |    1 -
 .../conify/global/config/asset_sip_fields.tt2      |    1 -
 .../templates/conify/global/config/global_flag.tt2 |    1 -
 .../conify/global/config/rule_circ_duration.tt2    |    1 -
 Open-ILS/src/templates/staff/acq/index.tt2         |    1 -
 .../src/templates/staff/admin/booking/index.tt2    |   15 ++
 .../src/templates/staff/admin/booking/t_splash.tt2 |   39 ++++++
 .../staff/admin/workstation/t_print_templates.tt2  |   52 +++++---
 .../templates/staff/admin/workstation/t_splash.tt2 |    6 +-
 Open-ILS/src/templates/staff/base_js.tt2           |    2 +
 Open-ILS/src/templates/staff/booking/index.tt2     |   20 +++
 .../src/templates/staff/cat/catalog/t_catalog.tt2  |    7 +-
 Open-ILS/src/templates/staff/cat/item/t_list.tt2   |    7 +
 .../templates/staff/circ/in_house_use/index.tt2    |   10 ++-
 Open-ILS/src/templates/staff/circ/patron/index.tt2 |   18 ++-
 .../src/templates/staff/circ/patron/t_bills.tt2    |    2 +-
 .../src/templates/staff/circ/transits/t_list.tt2   |    5 +-
 Open-ILS/src/templates/staff/css/cat.css.tt2       |    1 +
 Open-ILS/src/templates/staff/index.tt2             |    2 -
 Open-ILS/src/templates/staff/navbar.tt2            |   44 ++++++
 Open-ILS/src/templates/staff/reporter/index.tt2    |    1 -
 Open-ILS/src/templates/staff/reporter/t_legacy.tt2 |    2 +-
 .../share/print_templates/t_hold_shelf_list.tt2    |    4 +-
 .../share/print_templates/t_hold_shelf_slip.tt2    |    2 +-
 .../share/print_templates/t_hold_transit_slip.tt2  |    2 +-
 .../share/print_templates/t_in_house_use_list.tt2  |   28 ++++
 .../staff/share/print_templates/t_item_status.tt2  |   26 ++++
 .../staff/share/print_templates/t_transit_list.tt2 |   30 ++++
 Open-ILS/src/templates/staff/share/t_eframe.tt2    |    7 +-
 Open-ILS/web/js/ui/default/acq/common/li_table.js  |   81 +++++++-----
 Open-ILS/web/js/ui/default/booking/pickup.js       |   18 +++-
 Open-ILS/web/js/ui/default/booking/reservation.js  |   21 +++-
 Open-ILS/web/js/ui/default/booking/return.js       |   18 +++-
 Open-ILS/web/js/ui/default/staff/Gruntfile.js      |    5 +-
 .../web/js/ui/default/staff/admin/booking/app.js   |   60 ++++++++
 .../web/js/ui/default/staff/admin/local/app.js     |    4 +-
 .../web/js/ui/default/staff/admin/server/app.js    |    4 +-
 .../js/ui/default/staff/admin/workstation/app.js   |  143 ++++++++++++++++----
 Open-ILS/web/js/ui/default/staff/booking/app.js    |   46 +++++++
 Open-ILS/web/js/ui/default/staff/bower.json        |    3 +-
 .../web/js/ui/default/staff/cat/catalog/app.js     |   20 ++-
 Open-ILS/web/js/ui/default/staff/cat/item/app.js   |   11 ++
 .../js/ui/default/staff/cat/services/holdings.js   |   14 ++-
 .../js/ui/default/staff/circ/in_house_use/app.js   |   27 ++++-
 .../web/js/ui/default/staff/circ/patron/app.js     |   18 ++-
 .../web/js/ui/default/staff/circ/patron/bills.js   |   10 +-
 .../js/ui/default/staff/circ/patron/checkout.js    |    4 +-
 .../web/js/ui/default/staff/circ/services/circ.js  |   62 +++++++--
 .../web/js/ui/default/staff/circ/services/holds.js |   14 ++-
 .../web/js/ui/default/staff/circ/transits/list.js  |   42 ++++++
 Open-ILS/web/js/ui/default/staff/services/auth.js  |   14 ++-
 .../web/js/ui/default/staff/services/eframe.js     |   37 +++++-
 .../web/js/ui/default/staff/services/navbar.js     |    4 +-
 Open-ILS/web/js/ui/default/staff/services/print.js |   23 +++-
 Open-ILS/web/js/ui/default/staff/services/ui.js    |    4 +-
 Open-ILS/web/reports/oils_rpt_common.xhtml         |    1 +
 64 files changed, 905 insertions(+), 176 deletions(-)
 create mode 100644 Open-ILS/src/templates/staff/admin/booking/index.tt2
 create mode 100644 Open-ILS/src/templates/staff/admin/booking/t_splash.tt2
 create mode 100644 Open-ILS/src/templates/staff/booking/index.tt2
 create mode 100644 Open-ILS/src/templates/staff/share/print_templates/t_in_house_use_list.tt2
 create mode 100644 Open-ILS/src/templates/staff/share/print_templates/t_item_status.tt2
 create mode 100644 Open-ILS/src/templates/staff/share/print_templates/t_transit_list.tt2
 create mode 100644 Open-ILS/web/js/ui/default/staff/admin/booking/app.js
 create mode 100644 Open-ILS/web/js/ui/default/staff/booking/app.js


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list