LP#1402797 Where possible, handle all circ events, not just the first one in the...
authorMike Rylander <mrylander@gmail.com>
Fri, 30 Jan 2015 21:56:56 +0000 (16:56 -0500)
committerBill Erickson <berickxx@gmail.com>
Wed, 25 Feb 2015 16:16:06 +0000 (11:16 -0500)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/templates/staff/circ/share/t_event_override_dialog.tt2
Open-ILS/web/js/ui/default/staff/circ/services/circ.js

index 5850ac5..7308145 100644 (file)
@@ -7,11 +7,13 @@
     </h4>
   </div>
   <div class="modal-body">
-    <div class="panel panel-danger">
-      <div class="panel-heading">{{evt.textcode}}</div>
-      <div class="panel-body">
-        <div ng-if="copy_barcode" class="strong-text-2">{{copy_barcode}}</div>
-        {{evt.desc}}
+    <div ng-repeat="evt in events">
+      <div class="panel panel-danger">
+        <div class="panel-heading">{{evt.textcode}}</div>
+        <div class="panel-body">
+          <div ng-if="copy_barcode" class="strong-text-2">{{copy_barcode}}</div>
+          {{evt.desc}}
+        </div>
       </div>
     </div>
   </div>
index ec1bcca..e4db7a2 100644 (file)
@@ -124,7 +124,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
 
             ).then(function(evt) {
 
-                if (angular.isArray(evt)) evt = evt[0];
+                if (!angular.isArray(evt)) evt = [evt];
 
                 return service.flesh_response_data('checkout', evt, params, options)
                 .then(function() {
@@ -163,7 +163,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
 
             ).then(function(evt) {
 
-                if (angular.isArray(evt)) evt = evt[0];
+                if (!angular.isArray(evt)) evt = [evt];
 
                 return service.flesh_response_data(
                     'renew', evt, params, options)
@@ -203,7 +203,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
 
             ).then(function(evt) {
 
-                if (angular.isArray(evt)) evt = evt[0];
+                if (!angular.isArray(evt)) evt = [evt];
                 return service.flesh_response_data(
                     'checkin', evt, params, options)
                 .then(function() {
@@ -220,9 +220,9 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
     service.munge_resp_data = function(final_resp) {
         var data = final_resp.data = {};
 
-        if (!final_resp.evt) return;
+        if (!final_resp.evt[0]) return;
 
-        var payload = final_resp.evt.payload;
+        var payload = final_resp.evt[0].payload;
         if (!payload) return;
 
         data.circ = payload.circ;
@@ -235,10 +235,10 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
         data.transit = payload.transit;
         data.status = payload.status;
         data.message = payload.message;
-        data.title = final_resp.evt.title;
-        data.author = final_resp.evt.author;
-        data.isbn = final_resp.evt.isbn;
-        data.route_to = final_resp.evt.route_to;
+        data.title = final_resp.evt[0].title;
+        data.author = final_resp.evt[0].author;
+        data.isbn = final_resp.evt[0].isbn;
+        data.route_to = final_resp.evt[0].route_to;
 
         // for checkin, the mbts lives on the main circ
         if (payload.circ && payload.circ.billable_transaction())
@@ -265,14 +265,14 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
             // override attempt already made and failed.
             // NOTE: I don't think we'll ever get here, since the
             // override attempt should produce a perm failure...
-            console.debug('override failed: ' + evt.textcode);
+            angular.forEach(evt, function(e){ console.debug('override failed: ' + e.textcode); });
             return $q.reject();
 
         } 
 
-        if (service.auto_override_checkout_events[evt.textcode]) {
-            // user has already opted to override this type
-            // of event.  Re-run the checkout w/ override.
+        if (evt.filter(function(e){return !service.auto_override_checkout_events[e.textcode];}).length == 0) {
+            // user has already opted to override these type
+            // of events.  Re-run the checkout w/ override.
             options.override = true;
             return service.checkout(params, options);
         } 
@@ -281,11 +281,11 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
         // Some events offer a stock override dialog, while others
         // require additional context.
 
-        switch(evt.textcode) {
+        switch(evt[0].textcode) {
             case 'COPY_NOT_AVAILABLE':
-                return service.copy_not_avail_dialog(evt, params, options);
+                return service.copy_not_avail_dialog(evt[0], params, options);
             case 'COPY_ALERT_MESSAGE':
-                return service.copy_alert_dialog(evt, params, options, 'checkout');
+                return service.copy_alert_dialog(evt[0], params, options, 'checkout');
             default: 
                 return service.override_dialog(evt, params, options, 'checkout');
         }
@@ -297,15 +297,15 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
             // override attempt already made and failed.
             // NOTE: I don't think we'll ever get here, since the
             // override attempt should produce a perm failure...
-            console.debug('override failed: ' + evt.textcode);
+            angular.forEach(evt, function(e){ console.debug('override failed: ' + e.textcode); });
             return $q.reject();
 
         } 
 
         // renewal auto-overrides are the same as checkout
-        if (service.auto_override_checkout_events[evt.textcode]) {
-            // user has already opted to override this type
-            // of event.  Re-run the renew w/ override.
+        if (evt.filter(function(e){return !service.auto_override_checkout_events[e.textcode];}).length == 0) {
+            // user has already opted to override these type
+            // of events.  Re-run the renew w/ override.
             options.override = true;
             return service.renew(params, options);
         } 
@@ -314,9 +314,9 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
         // Some events offer a stock override dialog, while others
         // require additional context.
 
-        switch(evt.textcode) {
+        switch(evt[0].textcode) {
             case 'COPY_ALERT_MESSAGE':
-                return service.copy_alert_dialog(evt, params, options, 'renew');
+                return service.copy_alert_dialog(evt[0], params, options, 'renew');
             default: 
                 return service.override_dialog(evt, params, options, 'renew');
         }
@@ -329,14 +329,14 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
             // override attempt already made and failed.
             // NOTE: I don't think we'll ever get here, since the
             // override attempt should produce a perm failure...
-            console.debug('override failed: ' + evt.textcode);
+            angular.forEach(evt, function(e){ console.debug('override failed: ' + e.textcode); });
             return $q.reject();
 
         } 
 
         if (options.suppress_checkin_popups
-            && service.checkin_suppress_overrides.indexOf(evt.textcode) > -1) {
-            // Event is suppressed.  Re-run the checkin w/ override.
+            && evt.filter(function(e){return service.checkin_suppress_overrides.indexOf(e.textcode) == -1;}).length == 0) {
+            // Events are suppressed.  Re-run the checkin w/ override.
             options.override = true;
             return service.checkin(params, options);
         } 
@@ -345,9 +345,9 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
         // Some events offer a stock override dialog, while others
         // require additional context.
 
-        switch(evt.textcode) {
+        switch(evt[0].textcode) {
             case 'COPY_ALERT_MESSAGE':
-                return service.copy_alert_dialog(evt, params, options, 'checkin');
+                return service.copy_alert_dialog(evt[0], params, options, 'checkin');
             default: 
                 return service.override_dialog(evt, params, options, 'checkin');
         }
@@ -359,14 +359,14 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
         var final_resp = {evt : evt, params : params, options : options};
 
         // track the barcode regardless of whether it refers to a copy
-        evt.copy_barcode = params.copy_barcode;
+        angular.forEach(evt, function(e){ e.copy_barcode = params.copy_barcode; });
 
         // Overridable Events
-        if (service.renew_overridable_events.indexOf(evt.textcode) > -1) 
+        if (evt.filter(function(e){return service.renew_overridable_events.indexOf(e.textcode) > -1;}).length > 0)
             return service.handle_overridable_renew_event(evt, params, options);
 
         // Other events
-        switch (evt.textcode) {
+        switch (evt[0].textcode) {
             case 'SUCCESS':
                 return $q.when(final_resp);
 
@@ -376,22 +376,22 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
             case 'PATRON_ACCOUNT_EXPIRED':
             case 'CIRC_CLAIMS_RETURNED':
                 return service.exit_alert(
-                    egCore.strings[evt.textcode],
+                    egCore.strings[evt[0].textcode],
                     {barcode : params.copy_barcode}
                 );
 
             case 'PERM_FAILURE':
                 return service.exit_alert(
-                    egCore.strings[evt.textcode],
-                    {permission : evt.ilsperm}
+                    egCore.strings[evt[0].textcode],
+                    {permission : evt[0].ilsperm}
                 );
 
             default:
                 return service.exit_alert(
                     egCore.strings.CHECKOUT_FAILED_GENERIC, {
                         barcode : params.copy_barcode,
-                        textcode : evt.textcode,
-                        desc : evt.desc
+                        textcode : evt[0].textcode,
+                        desc : evt[0].desc
                     }
                 );
         }
@@ -403,14 +403,14 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
         var final_resp = {evt : evt, params : params, options : options};
 
         // track the barcode regardless of whether it refers to a copy
-        evt.copy_barcode = params.copy_barcode;
+        angular.forEach(evt, function(e){ e.copy_barcode = params.copy_barcode; });
 
         // Overridable Events
-        if (service.checkout_overridable_events.indexOf(evt.textcode) > -1) 
+        if (evt.filter(function(e){return service.checkout_overridable_events.indexOf(e.textcode) > -1;}).length > 0)
             return service.handle_overridable_checkout_event(evt, params, options);
 
         // Other events
-        switch (evt.textcode) {
+        switch (evt[0].textcode) {
             case 'SUCCESS':
                 return $q.when(final_resp);
 
@@ -428,22 +428,22 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
             case 'PATRON_ACCOUNT_EXPIRED':
             case 'CIRC_CLAIMS_RETURNED':
                 return service.exit_alert(
-                    egCore.strings[evt.textcode],
+                    egCore.strings[evt[0].textcode],
                     {barcode : params.copy_barcode}
                 );
 
             case 'PERM_FAILURE':
                 return service.exit_alert(
-                    egCore.strings[evt.textcode],
-                    {permission : evt.ilsperm}
+                    egCore.strings[evt[0].textcode],
+                    {permission : evt[0].ilsperm}
                 );
 
             default:
                 return service.exit_alert(
                     egCore.strings.CHECKOUT_FAILED_GENERIC, {
                         barcode : params.copy_barcode,
-                        textcode : evt.textcode,
-                        desc : evt.desc
+                        textcode : evt[0].textcode,
+                        desc : evt[0].desc
                     }
                 );
         }
@@ -492,7 +492,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
     service.flesh_response_data = function(action, evt, params, options) {
         var promises = [];
         var payload;
-        if (!evt || !(payload = evt.payload)) return $q.when();
+        if (!evt[0] || !(payload = evt[0].payload)) return $q.when();
 
         promises.push(service.flesh_copy_location(payload.copy));
         if (payload.copy) {
@@ -532,14 +532,14 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
         }
 
         // extract precat values
-        evt.title = payload.record ? payload.record.title() : 
-            (payload.copy ? payload.copy.dummy_title() : null);
+        angular.forEach(evt, function(e){ e.title = payload.record ? payload.record.title() : 
+            (payload.copy ? payload.copy.dummy_title() : null);});
 
-        evt.author = payload.record ? payload.record.author() : 
-            (payload.copy ? payload.copy.dummy_author() : null);
+        angular.forEach(evt, function(e){ e.author = payload.record ? payload.record.author() : 
+            (payload.copy ? payload.copy.dummy_author() : null);});
 
-        evt.isbn = payload.record ? payload.record.isbn() : 
-            (payload.copy ? payload.copy.dummy_isbn() : null);
+        angular.forEach(evt, function(e){ e.isbn = payload.record ? payload.record.isbn() : 
+            (payload.copy ? payload.copy.dummy_isbn() : null);});
 
         return $q.all(promises);
     }
@@ -599,14 +599,17 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
     // opens a dialog asking the user if they would like to override
     // the returned event.
     service.override_dialog = function(evt, params, options, action) {
+        if (!angular.isArray(evt)) evt = [evt];
         return $modal.open({
             templateUrl: './circ/share/t_event_override_dialog',
             controller: 
                 ['$scope', '$modalInstance', 
                 function($scope, $modalInstance) {
-                $scope.evt = evt;
-                $scope.auto_override = 
-                    service.checkout_auto_override_after_first.indexOf(evt.textcode) > -1;
+                $scope.events = evt;
+                $scope.auto_override =
+                    evt.filter(function(e){
+                        return service.checkout_auto_override_after_first.indexOf(evt.textcode) > -1;
+                    }).length > 0;
                 $scope.copy_barcode = params.copy_barcode; // may be null
                 $scope.ok = function() { $modalInstance.close() }
                 $scope.cancel = function ($event) { 
@@ -623,8 +626,10 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
                 }
 
                 // checkout/renew support override-after-first
-                if (service.checkout_auto_override_after_first.indexOf(evt.textcode) > -1)
-                    service.auto_override_checkout_events[evt.textcode] = true;
+                angular.forEach(evt, function(e){
+                    if (service.checkout_auto_override_after_first.indexOf(e.textcode) > -1)
+                        service.auto_override_checkout_events[e.textcode] = true;
+                });
 
                 return service[action](params, options);
             }
@@ -632,6 +637,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
     }
 
     service.copy_not_avail_dialog = function(evt, params, options) {
+        if (angular.isArray(evt)) evt = evt[0];
         return $modal.open({
             templateUrl: './circ/share/t_copy_not_avail_dialog',
             controller: 
@@ -736,6 +742,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
     // find the open transit for the given copy barcode; flesh the org
     // units locally.
     service.find_copy_transit = function(evt, params, options) {
+        if (angular.isArray(evt)) evt = evt[0];
 
         if (evt && evt.payload && evt.payload.transit)
             return $q.when(evt.payload.transit);
@@ -763,6 +770,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
     }
 
     service.copy_in_transit_dialog = function(evt, params, options) {
+        if (angular.isArray(evt)) evt = evt[0];
         return $modal.open({
             templateUrl: './circ/share/t_copy_in_transit_dialog',
             controller: 
@@ -811,6 +819,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
     }
 
     service.circ_exists_dialog = function(evt, params, options) {
+        if (angular.isArray(evt)) evt = evt[0];
 
         if (!evt.payload.old_circ) {
             return egCore.net.request(
@@ -1165,6 +1174,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
     // alert when copy location alert_message is set.
     // This does not affect processing, it only produces a click-through
     service.handle_checkin_loc_alert = function(evt, params, options) {
+        if (angular.isArray(evt)) evt = evt[0];
 
         var copy = evt && evt.payload ? evt.payload.copy : null;
 
@@ -1179,25 +1189,26 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
     }
 
     service.handle_checkin_resp = function(evt, params, options) {
+        if (!angular.isArray(evt)) evt = [evt];
 
         var final_resp = {evt : evt, params : params, options : options};
 
         var copy, hold, transit;
-        if (evt.payload) {
-            copy = evt.payload.copy;
-            hold = evt.payload.hold;
-            transit = evt.payload.transit;
+        if (evt[0].payload) {
+            copy = evt[0].payload.copy;
+            hold = evt[0].payload.hold;
+            transit = evt[0].payload.transit;
         }
 
         // track the barcode regardless of whether it's valid
-        evt.copy_barcode = params.copy_barcode;
+        angular.forEach(evt, function(e){ e.copy_barcode = params.copy_barcode; });
 
-        console.debug('checkin event ' + evt.textcode);
+        angular.forEach(evt, function(e){ console.debug('checkin event ' + e.textcode); });
 
-        if (service.checkin_overridable_events.indexOf(evt.textcode) > -1) 
+        if (evt.filter(function(e){return service.checkin_overridable_events.indexOf(e.textcode) > -1;}).length > 0)
             return service.handle_overridable_checkin_event(evt, params, options);
 
-        switch (evt.textcode) {
+        switch (evt[0].textcode) {
 
             case 'SUCCESS':
             case 'NO_CHANGE':
@@ -1220,10 +1231,10 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
                             if (hold.pickup_lib() == egCore.auth.user().ws_ou()) {
                                 // inform user if the item is on the local holds shelf
                             
-                                evt.route_to = egCore.strings.ROUTE_TO_HOLDS_SHELF;
+                                evt[0].route_to = egCore.strings.ROUTE_TO_HOLDS_SHELF;
                                 return service.route_dialog(
                                     './circ/share/t_hold_shelf_dialog', 
-                                    evt, params, options
+                                    evt[0], params, options
                                 ).then(function() { return final_resp });
 
                             } else {
@@ -1240,7 +1251,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
                         }
 
                     case 11: /* CATALOGING */
-                        evt.route_to = egCore.strings.ROUTE_TO_CATALOGING;
+                        evt[0].route_to = egCore.strings.ROUTE_TO_CATALOGING;
                         return $q.when(final_resp);
 
                     case 15: /* ON_RESERVATION_SHELF */
@@ -1256,7 +1267,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
             case 'ROUTE_ITEM':
                 return service.route_dialog(
                     './circ/share/t_transit_dialog', 
-                    evt, params, options
+                    evt[0], params, options
                 ).then(function() { return final_resp });
 
             case 'ASSET_COPY_NOT_FOUND':
@@ -1265,7 +1276,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
                     .result.then(function() {return final_resp});
 
             case 'ITEM_NOT_CATALOGED':
-                evt.route_to = egCore.strings.ROUTE_TO_CATALOGING;
+                evt[0].route_to = egCore.strings.ROUTE_TO_CATALOGING;
                 if (options.no_precat_alert) 
                     return $q.when(final_resp);
                 return egAlertDialog.open(
@@ -1273,7 +1284,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
                     .result.then(function() {return final_resp});
 
             default:
-                console.warn('unhandled checkin response : ' + evt.textcode);
+                console.warn('unhandled checkin response : ' + evt[0].textcode);
                 return $q.when(final_resp);
         }
     }
@@ -1281,6 +1292,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
     // collect transit, address, and hold info that's not already
     // included in responses.
     service.collect_route_data = function(tmpl, evt, params, options) {
+        if (angular.isArray(evt)) evt = evt[0];
         var promises = [];
         var data = {};
 
@@ -1313,6 +1325,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
     }
 
     service.route_dialog = function(tmpl, evt, params, options) {
+        if (angular.isArray(evt)) evt = evt[0];
 
         return service.collect_route_data(tmpl, evt, params, options)
         .then(function(data) {
@@ -1383,6 +1396,7 @@ function($modal , $q , egCore , egAlertDialog , egConfirmDialog) {
 
     // action == what action to take if the user confirms the alert
     service.copy_alert_dialog = function(evt, params, options, action) {
+        if (angular.isArray(evt)) evt = evt[0];
         return egConfirmDialog.open(
             egCore.strings.COPY_ALERT_MSG_DIALOG_TITLE, 
             evt.payload,  // payload == alert message text