From bb4b31c687703fba09d06fcdf1443584fcbf03d8 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Tue, 6 Mar 2018 10:46:49 -0800 Subject: [PATCH] LP#1738499: barcode completion for copy buckets Signed-off-by: Jeff Davis Signed-off-by: Chris Sharp --- .../web/js/ui/default/staff/cat/bucket/copy/app.js | 95 +++++++++++++++++++--- 1 file changed, 82 insertions(+), 13 deletions(-) diff --git a/Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js b/Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js index a51eef475f..f6ccffb210 100644 --- a/Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js +++ b/Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js @@ -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; + } + }); }); } -- 2.11.0