LP#1452950 page unload warning prompt service
authorBill Erickson <berickxx@gmail.com>
Thu, 17 Dec 2015 02:10:43 +0000 (21:10 -0500)
committerGalen Charlton <gmc@esilibrary.com>
Thu, 25 Feb 2016 22:31:59 +0000 (17:31 -0500)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
Open-ILS/src/templates/staff/base_js.tt2
Open-ILS/web/js/ui/default/staff/services/ui.js

index db4f85a..c2b1abb 100644 (file)
   // pending api_level thunking in C
   // OpenSRF.api_level = 2;
   OpenSRF.Session.transport = OSRF_TRANSPORT_TYPE_WS;
+
+  // Here lie JS strings that may be used on any/all pages.
+  angular.module('egCoreMod').run(['egStrings', function(s) {
+    s.EG_UNLOAD_CTRL_PROMPT_MSG = 
+      '[% l('This page may have unsaved data.\n\nAre you sure you want to leave this page?') %]';
+    s.EG_UNLOAD_PAGE_PROMPT_MSG = 
+      '[% l('This page may have unsaved data.') %]';
+  }]);
 </script>
 
index 4fe04a7..e2c6b93 100644 (file)
@@ -184,6 +184,34 @@ function($modal, $interpolate) {
     return service;
 }])
 
+/**
+ * Warn on page unload and give the user a chance to avoid navigating
+ * away from the current page.
+ * NOTE: we can't use an egUnloadDialog as the dialog builder, because
+ * it renders asynchronously, which allows the page to redirect before
+ * the dialog appears.
+ */
+.factory('egUnloadPrompt', [
+        '$window','egStrings', 
+function($window , egStrings) {
+    var service = {};
+
+    service.attach = function($scope, msg) {
+
+        // handle page change
+        $($window).on('beforeunload', function() { 
+            return msg || egStrings.EG_UNLOAD_PAGE_PROMPT_MSG;
+        });
+
+        // handle controller change (e.g. tabbed navigation)
+        $scope.$on('$locationChangeStart', function(evt, next, current) {
+            if (!confirm(msg || egStrings.EG_UNLOAD_CTRL_PROMPT_MSG)) 
+                evt.preventDefault();
+        });
+    };
+    return service;
+}])
+
 .directive('aDisabled', function() {
     return {
         restrict : 'A',