From dba71f8017e2d6ff351c9ef6210972e9dcca2c56 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Wed, 27 Sep 2017 11:30:47 -0400 Subject: [PATCH] LP#1717007 Improve egProgressDialog collision handling Resolves a race condition where egProgressDialog.open() is called twice before the first call completes (i.e. the dialog is opened), leaving 2 open dialogs, one of which cannot be closed because its reference is lost. Going forward, attempts to open multiple dialogs will always result in the most recently visible dialog taking preference. When collisions occur, a warning is also issued to the console. Signed-off-by: Bill Erickson Signed-off-by: Cesar Velez Signed-off-by: Galen Charlton --- Open-ILS/web/js/ui/default/staff/services/ui.js | 26 +++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) 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 0c385fa2bc..b33358f445 100644 --- a/Open-ILS/web/js/ui/default/staff/services/ui.js +++ b/Open-ILS/web/js/ui/default/staff/services/ui.js @@ -310,26 +310,32 @@ function($timeout , $parse) { var service = {}; service.open = function(args) { - service.close(); // force-kill existing instances. - - // Reset to an indeterminate progress bar, - // overlay with caller values. - egProgressData.reset(); - service.update(angular.extend({}, args)); - return $uibModal.open({ templateUrl: './share/t_progress_dialog', controller: ['$scope','$uibModalInstance','egProgressData', function( $scope , $uibModalInstance , egProgressData) { - service.currentInstance = $uibModalInstance; - $scope.data = egProgressData; // tiny service + // Once the new modal instance is available, force- + // kill any other instances + service.close(true); + + // Reset to an indeterminate progress bar, + // overlay with caller values. + egProgressData.reset(); + service.update(angular.extend({}, args)); + + service.currentInstance = $uibModalInstance; + $scope.data = egProgressData; // tiny service } ] }); }; - service.close = function() { + service.close = function(warn) { if (service.currentInstance) { + if (warn) { + console.warn("egProgressDialog replacing existing instance. " + + "Only one may be open at a time."); + } service.currentInstance.close(); delete service.currentInstance; } -- 2.11.0