Repository: incubator-ranger
Updated Branches:
  refs/heads/master 3487811ec -> ded323b77


RANGER-283 : Allow navigation on dirty forms

Signed-off-by: Velmurugan Periasamy <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/ded323b7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/ded323b7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/ded323b7

Branch: refs/heads/master
Commit: ded323b776e6b5bf92c0c643c3e50e5377a8fd93
Parents: 3487811
Author: Gautam Borad <[email protected]>
Authored: Tue Mar 31 17:51:25 2015 +0530
Committer: Velmurugan Periasamy <[email protected]>
Committed: Tue Mar 31 12:55:22 2015 -0400

----------------------------------------------------------------------
 security-admin/src/main/webapp/scripts/App.js   |  1 +
 security-admin/src/main/webapp/scripts/Main.js  |  3 +-
 .../main/webapp/scripts/modules/XAOverrides.js  | 14 +++++++
 .../scripts/modules/globalize/message/en.js     |  2 +
 .../src/main/webapp/scripts/routers/Router.js   | 44 +++++++++++++++++++-
 .../src/main/webapp/scripts/utils/XAUtils.js    | 34 ++++++++++-----
 6 files changed, 84 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ded323b7/security-admin/src/main/webapp/scripts/App.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/App.js 
b/security-admin/src/main/webapp/scripts/App.js
index 2a57d73..937ee27 100644
--- a/security-admin/src/main/webapp/scripts/App.js
+++ b/security-admin/src/main/webapp/scripts/App.js
@@ -44,6 +44,7 @@ define(function(require) {
        /* Add initializers here */
        App.addInitializer( function () {
        //      Communicator.mediator.trigger("Application:Start");
+        window._preventNavigation = false;
         Backbone.history.start();
        });
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ded323b7/security-admin/src/main/webapp/scripts/Main.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/Main.js 
b/security-admin/src/main/webapp/scripts/Main.js
index cefaa31..460c91a 100644
--- a/security-admin/src/main/webapp/scripts/Main.js
+++ b/security-admin/src/main/webapp/scripts/Main.js
@@ -37,7 +37,8 @@ function ( Backbone, App, RegionManager, AppRouter, 
AppController, XAOverrides,
                controller: controller
        });
        App.appRouter.on('beforeroute', function(event) {
-               $(App.rContent.$el).html(loadingHTML);
+               if(!window._preventNavigation)
+                       $(App.rContent.$el).html(loadingHTML);
        });
        // Start Marionette Application in desktop mode (default)
        Backbone.fetchCache._cache = {};

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ded323b7/security-admin/src/main/webapp/scripts/modules/XAOverrides.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/modules/XAOverrides.js 
b/security-admin/src/main/webapp/scripts/modules/XAOverrides.js
index a60383e..f312065 100644
--- a/security-admin/src/main/webapp/scripts/modules/XAOverrides.js
+++ b/security-admin/src/main/webapp/scripts/modules/XAOverrides.js
@@ -25,6 +25,20 @@
        
        require('backgrid');
        require('jquery-toggles');
+
+       window.onbeforeunload = function(e) {
+               if (window._preventNavigation) {
+                       var message = 'Are you sure you want to refresh the 
page? Unsaved changes will be lost.';
+                       if (typeof e == 'undefined') {
+                               e = window.event;
+                       }
+                       if (e) {
+                               e.returnValue = message;
+                       }
+                       return message;
+               }
+       };
+       
        /**
        HtmlCell renders any html code
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ded323b7/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js 
b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
index 9645216..2231037 100644
--- a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
+++ b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
@@ -217,6 +217,8 @@ define(function(require) {
                                save                                            
: 'Save',
                                cancel                                          
: 'Cancel',
                                addMore                                         
: 'Add More..',
+                               stayOnPage                                      
: 'Stay on this page',
+                               leavePage                                       
: 'Leave this page',
                                setVisibility               : 'Set Visibility' 
                                
                        },

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ded323b7/security-admin/src/main/webapp/scripts/routers/Router.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/routers/Router.js 
b/security-admin/src/main/webapp/scripts/routers/Router.js
index 095e56e..d4b047c 100644
--- a/security-admin/src/main/webapp/scripts/routers/Router.js
+++ b/security-admin/src/main/webapp/scripts/routers/Router.js
@@ -19,9 +19,12 @@
 
  define([
        'backbone',
-       'backbone.marionette'
+       'backbone.marionette',
+       'utils/XALangSupport',
+       'models/VAppState',
+       'utils/XAUtils'
 ],
-function(Backbone){
+function(Backbone, Marionette, localization, MAppState, XAUtil){
     'use strict';
 
        return Backbone.Marionette.AppRouter.extend({
@@ -58,6 +61,43 @@ function(Backbone){
                        /*************** ERROR PAGE 
****************************************/
                        "*actions"                                      : 
"pageNotFoundAction"
                        
+               },
+               route: function(route, name, callback) {
+                       var router = this,
+                               callbackArgs;
+                       if (!callback) callback = this[name];
+                       var proceedWithCallback = function() {
+                               var currentFragment = 
Backbone.history.getFragment();
+                               router.trigger('beforeroute', name);
+                               callback.apply(router, callbackArgs);
+                               MAppState.set('previousFragment', 
currentFragment);
+                       };
+
+                       var overrideCallback = function() {
+                               callbackArgs = arguments;
+                               if (window._preventNavigation) {
+                                       
bootbox.dialog(window._preventNavigationMsg, [{
+                                               "label": "Stay on this page!",
+                                               "class": "btn-success 
btn-small",
+                                               "callback": function() {
+                                                       
router.navigate(MAppState.get('previousFragment'), {
+                                                               trigger: false
+                                                       });
+                                               }
+                                       }, {
+                                               "label": "Leave this page",
+                                               "class": "btn-danger btn-small",
+                                               "callback": function() {
+                                                       
XAUtil.allowNavigation();
+                                                       proceedWithCallback();
+                                               }
+                                       }]);
+
+                               } else {
+                                       proceedWithCallback();
+                               }
+                       };
+                       return Backbone.Router.prototype.route.call(this, 
route, name, overrideCallback);
                }
        });
 });

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/ded323b7/security-admin/src/main/webapp/scripts/utils/XAUtils.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/utils/XAUtils.js 
b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
index 114fc88..1bcb4b3 100644
--- a/security-admin/src/main/webapp/scripts/utils/XAUtils.js
+++ b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
@@ -260,9 +260,11 @@ define(function(require) {
         * @param {String} msg - The msg to show
         * @param {function} callback - The callback to call
         */
-       XAUtils.preventNavigation = function(msg, $form, callback) {
-               $("body a, 
i[class^='icon-'],allowNav").on("click.blockNavigation", function(e) {
-                       XAUtils.preventNavigationHandler(e, msg, $form, 
callback);
+       XAUtils.preventNavigation = function(msg, $form) {
+               window._preventNavigation = true;
+               window._preventNavigationMsg = msg;
+               $("body a, i[class^='icon-']").on("click.blockNavigation", 
function(e) {
+                       XAUtils.preventNavigationHandler.call(this, e, msg, 
$form);
                });
        };
 
@@ -270,22 +272,32 @@ define(function(require) {
         * remove the block of preventNavigation
         */
        XAUtils.allowNavigation = function() {
+               window._preventNavigation = false;
+               window._preventNavigationMsg = undefined;
                $("body a, i[class^='icon-']").off('click.blockNavigation');
        };
 
-       XAUtils.preventNavigationHandler = function(e, msg,$form,callback) {
+       XAUtils.preventNavigationHandler = function(e, msg, $form) {
                var formChanged = false;
-               if(!_.isUndefined($form))
+               var target = this;
+               if (!_.isUndefined($form))
                        formChanged = $form.find('.dirtyField').length > 0 ? 
true : false;
                if (!$(e.currentTarget).hasClass("_allowNav") && formChanged) {
-                       
+
                        e.preventDefault();
                        e.stopImmediatePropagation();
-                       XAUtils.alertPopup({
-                               msg : msg,
-                               title : "Warning",
-                               callback : callback
-                       });
+                       bootbox.dialog(msg, [{
+                               "label": localization.tt('btn.stayOnPage'),
+                               "class": "btn-success btn-small",
+                               "callback": function() {}
+                       }, {
+                               "label": localization.tt('btn.leavePage'),
+                               "class": "btn-danger btn-small",
+                               "callback": function() {
+                                       XAUtils.allowNavigation();
+                                       target.click();
+                               }
+                       }]);
                        return false;
                }
        };

Reply via email to