LP#1738499: barcode completion for copy buckets
authorJeff Davis <jdavis@sitka.bclibraries.ca>
Tue, 6 Mar 2018 18:46:49 +0000 (10:46 -0800)
committerChris Sharp <csharp@georgialibraries.org>
Wed, 11 Jul 2018 15:11:31 +0000 (11:11 -0400)
Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js

index a51eef4..f6ccffb 100644 (file)
@@ -394,6 +394,72 @@ function($scope,  $routeParams,  bucketSvc , egGridDataProvider,   egCore) {
         }
     }
 
+    $scope.handle_barcode_completion = function(barcode) {
+        return egCore.net.request(
+            'open-ils.actor',
+            'open-ils.actor.get_barcodes',
+            egCore.auth.token(), egCore.auth.user().ws_ou(), 
+            'asset', barcode)
+
+        .then(function(resp) {
+            // TODO: handle event during barcode lookup
+            if (evt = egCore.evt.parse(resp)) {
+                console.error(evt.toString());
+                return $q.reject();
+            }
+
+            // no matching barcodes: return the barcode as entered
+            // by the user (so that, e.g., checkout can fall back to
+            // precat/noncat handling)
+            if (!resp || !resp[0]) {
+                return barcode;
+            }
+
+            // exactly one matching barcode: return it
+            if (resp.length == 1) {
+                return resp[0].barcode;
+            }
+
+            // multiple matching barcodes: let the user pick one 
+            console.debug('multiple matching barcodes');
+            var matches = [];
+            var promises = [];
+            var final_barcode;
+            angular.forEach(resp, function(cp) {
+                promises.push(
+                    egCore.net.request(
+                        'open-ils.circ',
+                        'open-ils.circ.copy_details.retrieve',
+                        egCore.auth.token(), cp.id
+                    ).then(function(r) {
+                        matches.push({
+                            barcode: r.copy.barcode(),
+                            title: r.mvr.title(),
+                            org_name: egCore.org.get(r.copy.circ_lib()).name(),
+                            org_shortname: egCore.org.get(r.copy.circ_lib()).shortname()
+                        });
+                    })
+                );
+            });
+            return $q.all(promises)
+            .then(function() {
+                return $uibModal.open({
+                    templateUrl: './circ/share/t_barcode_choice_dialog',
+                    controller:
+                        ['$scope', '$uibModalInstance',
+                        function($scope, $uibModalInstance) {
+                        $scope.matches = matches;
+                        $scope.ok = function(barcode) {
+                            $uibModalInstance.close();
+                            final_barcode = barcode;
+                        }
+                        $scope.cancel = function() {$uibModalInstance.dismiss()}
+                    }],
+                }).result.then(function() { return final_barcode });
+            })
+        });
+    }
+
     $scope.search = function() {
         bucketSvc.barcodeRecords = [];
         $scope.context.itemNotFound = false;
@@ -401,19 +467,22 @@ function($scope,  $routeParams,  bucketSvc , egGridDataProvider,   egCore) {
         // clear selection so re-selecting can have an effect
         $scope.context.selectPendingBC = false;
 
-        egCore.pcrud.search(
-            'acp',
-            {barcode : bucketSvc.barcodeString, deleted : 'f'},
-            {}
-        ).then(function(copy) {
-            if (copy) {
-                bucketSvc.pendingList.push(copy.id());
-                $scope.gridControls.setQuery({id : bucketSvc.pendingList});
-                bucketSvc.barcodeString = ''; // clear form on valid copy
-            } else {
-                $scope.context.itemNotFound = true;
-                $scope.context.selectPendingBC = true;
-            }
+        return $scope.handle_barcode_completion(bucketSvc.barcodeString)
+        .then(function(actual_barcode) {
+            egCore.pcrud.search(
+                'acp',
+                {barcode : actual_barcode, deleted : 'f'},
+                {}
+            ).then(function(copy) {
+                if (copy) {
+                    bucketSvc.pendingList.push(copy.id());
+                    $scope.gridControls.setQuery({id : bucketSvc.pendingList});
+                    bucketSvc.barcodeString = ''; // clear form on valid copy
+                } else {
+                    $scope.context.itemNotFound = true;
+                    $scope.context.selectPendingBC = true;
+                }
+            });
         });
     }