[open-ils-commits] [GIT] Evergreen ILS branch master updated. 46c929f6a4884e91eb0d038dde247fc8af12689c

Evergreen Git git at git.evergreen-ils.org
Sun Mar 5 22:43:23 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  46c929f6a4884e91eb0d038dde247fc8af12689c (commit)
       via  28cbd5c25147ddc21370b4dd6c7cfe3f6c344613 (commit)
       via  ced34fb5c3329dc34591cf7465e61d78f8a90b5e (commit)
       via  9cc73b7825498ece1e0bbfa8445e1a4438417c44 (commit)
      from  22891eb1dccb101e097f355b344e1aac20e1ef9d (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 46c929f6a4884e91eb0d038dde247fc8af12689c
Author: Kyle Huckins <khuckins at catalystdevworks.com>
Date:   Wed Dec 28 12:15:25 2016 -0800

    LP#1526185 Disable second toast on permfail
    
    Supress extra toast after inputting valid credentials after
    permission failure.
    
    Signed-off-by: Kyle Huckins <khuckins at catalystdevworks.com>
    Signed-off-by: Bill Erickson <berickxx at gmail.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/base_js.tt2 b/Open-ILS/src/templates/staff/base_js.tt2
index d75c3c5..1054c05 100644
--- a/Open-ILS/src/templates/staff/base_js.tt2
+++ b/Open-ILS/src/templates/staff/base_js.tt2
@@ -85,6 +85,8 @@
     s.OP_CHANGE_FAILURE = "[% l('Operator Change Failed') %]";
     s.OP_CHANGE_TITLE = "[% l('Operator Change') %]";
     s.OP_CHANGE_PERM_MESSAGE = "[% l('Another staff member with the above permission may authorize this specific action.  Please notify your library administrator if you need this permission.  If you feel you have received this exception in error, please inform your friendly Evergreen developers or helpdesk staff of the above permission.') %]";
+    s.PERM_OP_CHANGE_SUCCESS = "[% l('Permission Override Login Succeeded') %]";
+    s.PERM_OP_CHANGE_FAILURE = "[% l('Permission Override Login Failed') %]";
   }]);
 </script>
 
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 e70d926..ec00a9a 100644
--- a/Open-ILS/web/js/ui/default/staff/services/navbar.js
+++ b/Open-ILS/web/js/ui/default/staff/services/navbar.js
@@ -82,8 +82,8 @@ angular.module('egCoreMod')
                 }
 
                 $scope.changeOperator = function() {
-                    egOpChange.changeOperator(true).then(function() {
-                        $scope.op_changed = true;
+                    egOpChange.changeOperator().then(function() {
+                        $scope.op_changed = egCore.auth.OCtoken() ? true : false;
                         $scope.username = egCore.auth.user().usrname();
                     });
                 }
diff --git a/Open-ILS/web/js/ui/default/staff/services/op_change.js b/Open-ILS/web/js/ui/default/staff/services/op_change.js
index 94d6690..e7bf1aa 100644
--- a/Open-ILS/web/js/ui/default/staff/services/op_change.js
+++ b/Open-ILS/web/js/ui/default/staff/services/op_change.js
@@ -15,17 +15,18 @@ function($uibModal, $interpolate, $rootScope, $q, egAuth, egStrings, egNet, ngTo
 
     // Returns a promise resolved upon successful op-change.
     // Rejected otherwise.
-    service.changeOperator = function(showTypes, permEvt) {
+    service.changeOperator = function(permEvt) {
         return $uibModal.open({
             templateUrl: './share/t_opchange',
             controller:
                 ['$scope', '$uibModalInstance', function($scope, $uibModalInstance) {
                 $scope.args = {username : '', password : '', type : 'temp'};
-                $scope.displayTypeField = showTypes;
                 $scope.title = egStrings.OP_CHANGE_TITLE;
                 if (permEvt) {
                     $scope.title = permEvt.desc + ": " + permEvt.ilsperm;
                     $scope.message = egStrings.OP_CHANGE_PERM_MESSAGE;
+                } else {
+                    $scope.displayTypeField = true;
                 }
                 $scope.focus = true;
                 $scope.ok = function() { $uibModalInstance.close($scope.args) }
@@ -40,26 +41,34 @@ function($uibModal, $interpolate, $rootScope, $q, egAuth, egStrings, egNet, ngTo
             return egAuth.opChange(args).then(
                 function() {
                     console.debug('op-change succeeded');
-                    ngToast.create(egStrings.OP_CHANGE_SUCCESS);
+                    if (permEvt) {
+                        ngToast.create(egStrings.PERM_OP_CHANGE_SUCCESS);
+                    } else {
+                        ngToast.create(egStrings.OP_CHANGE_SUCCESS);
+                    }
                 },
                 function() {
                     console.debug('op-change failed');
-                    ngToast.warning(egStrings.OP_CHANGE_FAILURE);
+                    if (permEvt) {
+                        ngToast.warning(egStrings.PERM_OP_CHANGE_FAILURE);
+                    } else {
+                        ngToast.warning(egStrings.OP_CHANGE_FAILURE);
+                    }
                 }
             );
         });
     }
 
     // Returns a promise resolved on successful op-change undo.
-    service.changeOperatorUndo = function() {
+    service.changeOperatorUndo = function(hideToast) {
         return egAuth.opChangeUndo().then(
             function() {
                 console.debug('op-change undo succeeded');
-                ngToast.create(egStrings.OP_CHANGE_SUCCESS);
+                if (!hideToast) ngToast.create(egStrings.OP_CHANGE_SUCCESS);
             },
             function() {
                 console.debug('op-change undo failed');
-                ngToast.warning(egStrings.OP_CHANGE_FAILURE);
+                if (!hideToast) ngToast.warning(egStrings.OP_CHANGE_FAILURE);
             }
         );
     }
@@ -76,7 +85,7 @@ function($uibModal, $interpolate, $rootScope, $q, egAuth, egStrings, egNet, ngTo
     egNet.handlePermFailure = function(request) {
         console.debug("perm override required for "+request.method);
 
-        return service.changeOperator(false, request.evt).then(function() {
+        return service.changeOperator(request.evt).then(function() {
 
             return egNet.requestWithParamList(
                 request.service,
@@ -88,7 +97,7 @@ function($uibModal, $interpolate, $rootScope, $q, egAuth, egStrings, egNet, ngTo
             )['finally'](function() {
                 // always undo the operator change after a perm override.
                 console.debug("clearing op-change after perm override redo");
-                service.changeOperatorUndo();
+                service.changeOperatorUndo(true);
             });
         });
     }

commit 28cbd5c25147ddc21370b4dd6c7cfe3f6c344613
Author: Bill Erickson <berickxx at gmail.com>
Date:   Wed Dec 28 10:59:33 2016 -0500

    LP#1526185 op-change supplies egNet.handlePermFailure
    
    Teach egOpChange to handle permission failure events via the new
    egNet.handlePermFailure() handler.
    
    This commit includes additional repairs to op-change promise
    handling and minor formatting adjustments.
    
    Op-change also now displays the username of the op-changed user
    in the navbar immediately upon op-change.
    
    Signed-off-by: Bill Erickson <berickxx at gmail.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/share/t_opchange.tt2 b/Open-ILS/src/templates/staff/share/t_opchange.tt2
index 2ca7fbe..584c296 100644
--- a/Open-ILS/src/templates/staff/share/t_opchange.tt2
+++ b/Open-ILS/src/templates/staff/share/t_opchange.tt2
@@ -8,30 +8,32 @@
     <h4 class="modal-title alert alert-info">{{title}}</h4>
   </div>
   <div class="modal-body">
-    <div class="row" ng-if="message">
+    <div class="row pad-all-min" ng-if="message">
       <div class="col-md-12">
         <p>{{message}}</p>
       </div>
     </div>
-    <div class="row">
+    <div class="row pad-all-min">
       <div class="col-md-4">
         [% l('Username:') %]
       </div>
       <div class="col-md-1"></div>
       <div class="col-md-7">
-        <input ng-keyup="$event.keyCode == 13 ? ok() : null" type='text' ng-model="args.username" class="form-control" focus-me="focus"/>
+        <input ng-keyup="$event.keyCode == 13 ? ok() : null" type='text'
+          ng-model="args.username" class="form-control" focus-me="focus"/>
       </div>
     </div>
-    <div class="row">
+    <div class="row pad-all-min">
       <div class="col-md-4">
         [% l('Password:') %]
       </div>
       <div class="col-md-1"></div>
       <div class="col-md-7">
-        <input ng-keyup="$event.keyCode == 13 ? ok() : null" type='password' ng-model="args.password" class="form-control"/>
+        <input ng-keyup="$event.keyCode == 13 ? ok() : null" type='password'
+          ng-model="args.password" class="form-control"/>
       </div>
     </div>
-    <div class="row" ng-if="displayTypeField == true">
+    <div class="row pad-all-min" ng-if="displayTypeField == true">
       <div class="col-md-4">
         [% l('Login Type:') %]
       </div>
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 1c9f97c..e70d926 100644
--- a/Open-ILS/web/js/ui/default/staff/services/navbar.js
+++ b/Open-ILS/web/js/ui/default/staff/services/navbar.js
@@ -26,10 +26,10 @@ angular.module('egCoreMod')
             inspect(element);
         },
 
-        controller:['$scope','$window','$location','$timeout','hotkeys','egCore','$uibModal','ngToast',
-                    'egOpChange',
-            function($scope , $window , $location , $timeout , hotkeys , egCore , $uibModal , ngToast,
-                    egOpChange) {
+        controller:['$scope','$window','$location','$timeout','hotkeys',
+                    'egCore','$uibModal','ngToast','egOpChange',
+            function($scope , $window , $location , $timeout , hotkeys ,
+                     egCore , $uibModal , ngToast, egOpChange) {
 
                 function navTo(path) {                                           
                     // Strip the leading "./" if any.
@@ -75,11 +75,17 @@ angular.module('egCoreMod')
                 }
 
                 $scope.changeOperatorUndo = function() {
-                    $scope.op_changed = egOpChange.changeOperatorUndo();
+                    egOpChange.changeOperatorUndo().then(function() {
+                        $scope.op_changed = false;
+                        $scope.username = egCore.auth.user().usrname();
+                    });
                 }
 
                 $scope.changeOperator = function() {
-                    $scope.op_changed = egOpChange.changeOperator(true);
+                    egOpChange.changeOperator(true).then(function() {
+                        $scope.op_changed = true;
+                        $scope.username = egCore.auth.user().usrname();
+                    });
                 }
 
                 $scope.currentToken = function () {
diff --git a/Open-ILS/web/js/ui/default/staff/services/op_change.js b/Open-ILS/web/js/ui/default/staff/services/op_change.js
index 3f233a7..94d6690 100644
--- a/Open-ILS/web/js/ui/default/staff/services/op_change.js
+++ b/Open-ILS/web/js/ui/default/staff/services/op_change.js
@@ -11,66 +11,87 @@ angular.module('egCoreMod')
        ['$uibModal','$interpolate', '$rootScope', '$q', 'egAuth', 'egStrings', 'egNet', 'ngToast',
 function($uibModal, $interpolate, $rootScope, $q, egAuth, egStrings, egNet, ngToast) {
 
-	var service = {};
+    var service = {};
 
-
-	service.changeOperator = function(calledFromNavbar, failedRequest) {
-		var _op_changed = false;
-        $uibModal.open({
+    // Returns a promise resolved upon successful op-change.
+    // Rejected otherwise.
+    service.changeOperator = function(showTypes, permEvt) {
+        return $uibModal.open({
             templateUrl: './share/t_opchange',
             controller:
                 ['$scope', '$uibModalInstance', function($scope, $uibModalInstance) {
                 $scope.args = {username : '', password : '', type : 'temp'};
-                $scope.displayTypeField = calledFromNavbar;
+                $scope.displayTypeField = showTypes;
                 $scope.title = egStrings.OP_CHANGE_TITLE;
-                if(failedRequest) {
-                    $scope.title = failedRequest.perm_evt.desc + ": "
-                        + failedRequest.perm_evt.ilsperm;
+                if (permEvt) {
+                    $scope.title = permEvt.desc + ": " + permEvt.ilsperm;
                     $scope.message = egStrings.OP_CHANGE_PERM_MESSAGE;
-                    console.log($scope.message);
                 }
                 $scope.focus = true;
                 $scope.ok = function() { $uibModalInstance.close($scope.args) }
                 $scope.cancel = function () { $uibModalInstance.dismiss() }
             }]
         }).result.then(function (args) {
-            if (!args || !args.username || !args.password) return;
+            if (!args || !args.username || !args.password)
+                return $q.reject();
+
             args.type = args.type || 'temp';
             args.workstation = egAuth.workstation();
-            egAuth.opChange(args).then(
+            return egAuth.opChange(args).then(
                 function() {
-                    _op_changed = true;
-                    if(failedRequest) {
-                        console.log(js2JSON(failedRequest));
-                        egNet.request(
-                            failedRequest.service,
-                            failedRequest.method,
-                            egAuth.token(),
-                            failedRequest.params[1]
-                        ).then(service.changeOperatorUndo());
-                    } else {
-                        ngToast.create(egStrings.OP_CHANGE_SUCCESS);
-                    }
+                    console.debug('op-change succeeded');
+                    ngToast.create(egStrings.OP_CHANGE_SUCCESS);
                 },
                 function() {
+                    console.debug('op-change failed');
                     ngToast.warning(egStrings.OP_CHANGE_FAILURE);
                 }
             );
         });
-        return _op_changed;
     }
 
+    // Returns a promise resolved on successful op-change undo.
     service.changeOperatorUndo = function() {
-        egAuth.opChangeUndo();
-        var _op_changed = false;
-        ngToast.create(egStrings.OP_CHANGE_SUCCESS);
-        return _op_changed;
+        return egAuth.opChangeUndo().then(
+            function() {
+                console.debug('op-change undo succeeded');
+                ngToast.create(egStrings.OP_CHANGE_SUCCESS);
+            },
+            function() {
+                console.debug('op-change undo failed');
+                ngToast.warning(egStrings.OP_CHANGE_FAILURE);
+            }
+        );
     }
 
-    //Check for any permission failure broadcasts. then call changeOperator and retry the action
-    $rootScope.$on('egNetPermFailure', function(args, request_info) {
-        var op_changed = service.changeOperator(false, request_info);
-    })
+    // Tell egNet to use our permission failure handler,
+    // since we know how to launch a login override dialog.
+    //
+    // 1. Launch the change-operator dialog
+    // 2. If op-change succeeds, re-do the failed request using the
+    //    op-change'd authtoken.
+    // 3. Undo the op-change.
+    //
+    // Returns a promise resolved along with the re-ran request.
+    egNet.handlePermFailure = function(request) {
+        console.debug("perm override required for "+request.method);
+
+        return service.changeOperator(false, request.evt).then(function() {
+
+            return egNet.requestWithParamList(
+                request.service,
+                request.method,
+                // original params, but replace the failed authtoken
+                // with the op-change'd authtoken
+                [egAuth.token()].concat(request.params.splice(1))
+
+            )['finally'](function() {
+                // always undo the operator change after a perm override.
+                console.debug("clearing op-change after perm override redo");
+                service.changeOperatorUndo();
+            });
+        });
+    }
 
-	return service;
+    return service;
 }])

commit ced34fb5c3329dc34591cf7465e61d78f8a90b5e
Author: Kyle Huckins <khuckins at catalystdevworks.com>
Date:   Wed Dec 14 13:26:06 2016 -0800

    LP#1526185 Operator Change Service
    
    Move operator change functionality into its
    own dedicated service.
    
    Notify user when action fails due to unauthorized
    credentials, complete with message as to what has
    gone wrong.
    
    Fire off any failed action after input of authorized
    credentials.
    
    Signed-off-by: Kyle Huckins <khuckins at catalystdevworks.com>
    Signed-off-by: Bill Erickson <berickxx at gmail.com>
    Signed-off-by: Kathy Lussier <klussier at masslnc.org>

diff --git a/Open-ILS/src/templates/staff/base_js.tt2 b/Open-ILS/src/templates/staff/base_js.tt2
index 224ae0f..d75c3c5 100644
--- a/Open-ILS/src/templates/staff/base_js.tt2
+++ b/Open-ILS/src/templates/staff/base_js.tt2
@@ -44,6 +44,7 @@
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/statusbar.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/date.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/op_change.js"></script>
 
 [% ELSE %]
 
@@ -82,6 +83,8 @@
     s.EG_CONFIRM_DELETE_RECORD_BODY = "[% l('Delete record {{id}}?') %]";
     s.OP_CHANGE_SUCCESS = "[% l('Operator Change Succeeded') %]";
     s.OP_CHANGE_FAILURE = "[% l('Operator Change Failed') %]";
+    s.OP_CHANGE_TITLE = "[% l('Operator Change') %]";
+    s.OP_CHANGE_PERM_MESSAGE = "[% l('Another staff member with the above permission may authorize this specific action.  Please notify your library administrator if you need this permission.  If you feel you have received this exception in error, please inform your friendly Evergreen developers or helpdesk staff of the above permission.') %]";
   }]);
 </script>
 
diff --git a/Open-ILS/src/templates/staff/share/t_opchange.tt2 b/Open-ILS/src/templates/staff/share/t_opchange.tt2
index 3872441..2ca7fbe 100644
--- a/Open-ILS/src/templates/staff/share/t_opchange.tt2
+++ b/Open-ILS/src/templates/staff/share/t_opchange.tt2
@@ -5,9 +5,14 @@
   <div class="modal-header">
     <button type="button" class="close" 
       ng-click="cancel()" aria-hidden="true">×</button>
-    <h4 class="modal-title alert alert-info">[% l('Operator Change') %]</h4> 
+    <h4 class="modal-title alert alert-info">{{title}}</h4>
   </div>
   <div class="modal-body">
+    <div class="row" ng-if="message">
+      <div class="col-md-12">
+        <p>{{message}}</p>
+      </div>
+    </div>
     <div class="row">
       <div class="col-md-4">
         [% l('Username:') %]
@@ -26,7 +31,7 @@
         <input ng-keyup="$event.keyCode == 13 ? ok() : null" type='password' ng-model="args.password" class="form-control"/>
       </div>
     </div>
-    <div class="row">
+    <div class="row" ng-if="displayTypeField == true">
       <div class="col-md-4">
         [% l('Login Type:') %]
       </div>
diff --git a/Open-ILS/web/js/ui/default/staff/Gruntfile.js b/Open-ILS/web/js/ui/default/staff/Gruntfile.js
index 7015786..b768b05 100644
--- a/Open-ILS/web/js/ui/default/staff/Gruntfile.js
+++ b/Open-ILS/web/js/ui/default/staff/Gruntfile.js
@@ -153,6 +153,7 @@ module.exports = function(grunt) {
             'services/statusbar.js',
             'services/ui.js',
             'services/date.js',
+            'services/op_change.js',
         ],
         dest: 'build/js/<%= pkg.name %>.<%= pkg.version %>.min.js'
       }
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 62b6502..df43abb 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
@@ -426,13 +426,6 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
                     {barcode : params.copy_barcode}
                 );
 
-            case 'PERM_FAILURE':
-                egCore.audio.play('warning.renew.permission');
-                return service.exit_alert(
-                    egCore.strings[evt[0].textcode],
-                    {permission : evt[0].ilsperm}
-                );
-
             default:
                 egCore.audio.play('warning.renew.unknown');
                 return service.exit_alert(
@@ -486,13 +479,6 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog,
                     {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('error.checkout.unknown');
                 return service.exit_alert(
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 ccb7d4d..1c9f97c 100644
--- a/Open-ILS/web/js/ui/default/staff/services/navbar.js
+++ b/Open-ILS/web/js/ui/default/staff/services/navbar.js
@@ -27,7 +27,9 @@ angular.module('egCoreMod')
         },
 
         controller:['$scope','$window','$location','$timeout','hotkeys','egCore','$uibModal','ngToast',
-            function($scope , $window , $location , $timeout , hotkeys , egCore , $uibModal , ngToast) {
+                    'egOpChange',
+            function($scope , $window , $location , $timeout , hotkeys , egCore , $uibModal , ngToast,
+                    egOpChange) {
 
                 function navTo(path) {                                           
                     // Strip the leading "./" if any.
@@ -73,39 +75,11 @@ 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);
+                    $scope.op_changed = egOpChange.changeOperatorUndo();
                 }
 
                 $scope.changeOperator = function() {
-                    $uibModal.open({
-                        templateUrl: './share/t_opchange',
-                        controller:
-                            ['$scope', '$uibModalInstance', function($scope, $uibModalInstance) {
-                            $scope.args = {username : '', password : '', type : 'temp'};
-                            $scope.focus = true;
-                            $scope.ok = function() { $uibModalInstance.close($scope.args) }
-                            $scope.cancel = function () { $uibModalInstance.dismiss() }
-                        }]
-                    }).result.then(function (args) {
-                        if (!args || !args.username || !args.password) return;
-                        args.type = args.type || 'temp';
-                        args.workstation = egCore.auth.workstation();
-                        egCore.auth.opChange(args).then(
-                            function() {
-                                console.log('op change success');
-                                $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?
-                            function() {
-                                console.log('op change failure');
-                                ngToast.warning(egCore.strings.OP_CHANGE_FAILURE);
-                            }  // note failure with toast?
-                        );
-                    });
+                    $scope.op_changed = egOpChange.changeOperator(true);
                 }
 
                 $scope.currentToken = function () {
diff --git a/Open-ILS/web/js/ui/default/staff/services/op_change.js b/Open-ILS/web/js/ui/default/staff/services/op_change.js
new file mode 100644
index 0000000..3f233a7
--- /dev/null
+++ b/Open-ILS/web/js/ui/default/staff/services/op_change.js
@@ -0,0 +1,76 @@
+angular.module('egCoreMod')
+
+/**
+ * egPermLoginDialog.open(
+ *  open("some message goes {{here}}", {
+ *  here : 'foo', ok : function() {}, cancel : function() {}},
+ *  'OK', 'Cancel');
+ */
+.factory('egOpChange',
+
+       ['$uibModal','$interpolate', '$rootScope', '$q', 'egAuth', 'egStrings', 'egNet', 'ngToast',
+function($uibModal, $interpolate, $rootScope, $q, egAuth, egStrings, egNet, ngToast) {
+
+	var service = {};
+
+
+	service.changeOperator = function(calledFromNavbar, failedRequest) {
+		var _op_changed = false;
+        $uibModal.open({
+            templateUrl: './share/t_opchange',
+            controller:
+                ['$scope', '$uibModalInstance', function($scope, $uibModalInstance) {
+                $scope.args = {username : '', password : '', type : 'temp'};
+                $scope.displayTypeField = calledFromNavbar;
+                $scope.title = egStrings.OP_CHANGE_TITLE;
+                if(failedRequest) {
+                    $scope.title = failedRequest.perm_evt.desc + ": "
+                        + failedRequest.perm_evt.ilsperm;
+                    $scope.message = egStrings.OP_CHANGE_PERM_MESSAGE;
+                    console.log($scope.message);
+                }
+                $scope.focus = true;
+                $scope.ok = function() { $uibModalInstance.close($scope.args) }
+                $scope.cancel = function () { $uibModalInstance.dismiss() }
+            }]
+        }).result.then(function (args) {
+            if (!args || !args.username || !args.password) return;
+            args.type = args.type || 'temp';
+            args.workstation = egAuth.workstation();
+            egAuth.opChange(args).then(
+                function() {
+                    _op_changed = true;
+                    if(failedRequest) {
+                        console.log(js2JSON(failedRequest));
+                        egNet.request(
+                            failedRequest.service,
+                            failedRequest.method,
+                            egAuth.token(),
+                            failedRequest.params[1]
+                        ).then(service.changeOperatorUndo());
+                    } else {
+                        ngToast.create(egStrings.OP_CHANGE_SUCCESS);
+                    }
+                },
+                function() {
+                    ngToast.warning(egStrings.OP_CHANGE_FAILURE);
+                }
+            );
+        });
+        return _op_changed;
+    }
+
+    service.changeOperatorUndo = function() {
+        egAuth.opChangeUndo();
+        var _op_changed = false;
+        ngToast.create(egStrings.OP_CHANGE_SUCCESS);
+        return _op_changed;
+    }
+
+    //Check for any permission failure broadcasts. then call changeOperator and retry the action
+    $rootScope.$on('egNetPermFailure', function(args, request_info) {
+        var op_changed = service.changeOperator(false, request_info);
+    })
+
+	return service;
+}])
diff --git a/Open-ILS/web/js/ui/default/staff/test/karma.conf.js b/Open-ILS/web/js/ui/default/staff/test/karma.conf.js
index b0cef3f..8c7b650 100644
--- a/Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+++ b/Open-ILS/web/js/ui/default/staff/test/karma.conf.js
@@ -44,6 +44,7 @@ module.exports = function(config){
       'services/ui.js',
       'services/statusbar.js',
       'services/grid.js',
+      'services/op_change.js',
       'services/navbar.js', 'services/date.js',
       // load app scripts
       'app.js',

commit 9cc73b7825498ece1e0bbfa8445e1a4438417c44
Author: Bill Erickson <berickxx at gmail.com>
Date:   Wed Dec 28 10:50:41 2016 -0500

    LP#1526185 egNet PERM_FAILURE handler
    
    Support a new egNet.handlePermFailure() callback. When this function is
    defined, it's invoked any time an egNet request returns a PERM_FAILURE
    event.
    
    When invoked, the in-progress promise linked to the original
    request is effectively superseded by the promise returned by the
    egNet.handlePermFailure(), living and dying with the new promise. This
    makes it possible to hold off resolving the original request until the
    handler is done.
    
    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/services/net.js b/Open-ILS/web/js/ui/default/staff/services/net.js
index 156d554..26eb31c 100644
--- a/Open-ILS/web/js/ui/default/staff/services/net.js
+++ b/Open-ILS/web/js/ui/default/staff/services/net.js
@@ -39,51 +39,90 @@ function($q,  $rootScope,  egEvent) {
 
     var net = {};
 
-    // raises the egAuthExpired event on NO_SESSION
-    net.checkResponse = function(resp) {
-        var content = resp.content();
-        if (!content) return null;
-        var evt = egEvent.parse(content);
-        if (evt && evt.textcode == 'NO_SESSION') {
-            $rootScope.$broadcast('egAuthExpired') 
-        } else {
-            return content;
+    // Simple container class for tracking a single request.
+    function NetRequest(kwargs) {
+        var self = this;
+        angular.forEach(kwargs, function(val, key) { self[key] = val });
+    }
+
+    // Relay response object to the caller for typical/successful responses.  
+    // Applies special handling to response events that require global
+    // attention.
+    net.handleResponse = function(request) {
+        request.evt = egEvent.parse(request.last);
+
+        if (request.evt) {
+
+            if (request.evt.textcode == 'NO_SESSION') {
+                $rootScope.$broadcast('egAuthExpired');
+                request.deferred.reject();
+                return;
+
+            } else if (request.evt.textcode == 'PERM_FAILURE') {
+
+                if (!net.handlePermFailure) {
+                    // nothing we can do, pass the failure up to the caller.
+                    console.debug("egNet has no handlePermFailure()");
+                    request.deferred.notify(request.last);
+                    return;
+                }
+
+                // handlePermFailure() starts a new series of promises.
+                // Tell our in-progress promise to resolve, etc. along
+                // with the new handlePermFailure promise.
+                request.superseded = true;
+                net.handlePermFailure(request).then(
+                    request.deferred.resolve, 
+                    request.deferred.reject, 
+                    request.deferred.notify
+                );
+            }
         }
+
+        request.deferred.notify(request.last);
     };
 
     net.request = function(service, method) {
-        var last;
-        var deferred = $q.defer();
         var params = Array.prototype.slice.call(arguments, 2);
+
+        var request = new NetRequest({
+            service    : service,
+            method     : method,
+            params     : params,
+            deferred   : $q.defer(),
+            superseded : false
+        });
+
         console.debug('egNet ' + method);
         new OpenSRF.ClientSession(service).request({
             async  : true,
-            method : method,
-            params : params,
+            method : request.method,
+            params : request.params,
             oncomplete : function() {
-                deferred.resolve(last);
+                if (!request.superseded)
+                    request.deferred.resolve(request.last);
             },
             onresponse : function(r) {
-                last = net.checkResponse(r.recv());
-                deferred.notify(last);
+                request.last = r.recv().content();
+                net.handleResponse(request);
             },
             onerror : function(msg) {
                 // 'msg' currently tells us very little, so don't 
                 // bother JSON-ifying it, since there is the off
                 // chance that JSON-ification could fail, e.g if 
                 // the object has circular refs.
-                console.error(method + 
-                    ' (' + params + ')  failed.  See server logs.');
+                console.error(request.method + 
+                    ' (' + request.params + ')  failed.  See server logs.');
                 deferred.reject(msg);
             },
             onmethoderror : function(req, statCode, statMsg) { 
                 console.error('error calling method ' + 
-                method + ' : ' + statCode + ' : ' + statMsg);
+                    request.method + ' : ' + statCode + ' : ' + statMsg);
             }
 
         }).send();
 
-        return deferred.promise;
+        return request.deferred.promise;
     }
 
     // In addition to the service and method names, accepts a single array

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

Summary of changes:
 Open-ILS/src/templates/staff/base_js.tt2           |    5 +
 Open-ILS/src/templates/staff/share/t_opchange.tt2  |   19 +++-
 Open-ILS/web/js/ui/default/staff/Gruntfile.js      |    1 +
 .../web/js/ui/default/staff/circ/services/circ.js  |   14 ---
 .../web/js/ui/default/staff/services/navbar.js     |   38 ++------
 Open-ILS/web/js/ui/default/staff/services/net.js   |   79 +++++++++++----
 .../web/js/ui/default/staff/services/op_change.js  |  106 ++++++++++++++++++++
 .../web/js/ui/default/staff/test/karma.conf.js     |    1 +
 8 files changed, 194 insertions(+), 69 deletions(-)
 create mode 100644 Open-ILS/web/js/ui/default/staff/services/op_change.js


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list