From 5dcad38dce9fc0dfc5d9220bebba0f0a3b87e189 Mon Sep 17 00:00:00 2001 From: tborres Date: Wed, 30 Jul 2014 16:49:04 -0400 Subject: [PATCH 1/3] Add disableReloadConfirm config variable False by default. This config can be set to true so that the plugin will not warn the user on page reload. This may be useful on a live sites where reload warnings are not necessary, but it is especially useful to turn this off when karma e2e tests for applications. --- src/unsavedChanges.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/unsavedChanges.js b/src/unsavedChanges.js index 41882bd..1d14583 100644 --- a/src/unsavedChanges.js +++ b/src/unsavedChanges.js @@ -14,6 +14,7 @@ angular.module('unsavedChanges', ['resettable']) var routeEvent = ['$locationChangeStart', '$stateChangeStart']; var navigateMessage = 'You will lose unsaved changes if you leave this page'; var reloadMessage = 'You will lose unsaved changes if you reload this page'; + var disableReloadConfirm = false; Object.defineProperty(_this, 'navigateMessage', { get: function() { @@ -92,6 +93,12 @@ angular.module('unsavedChanges', ['resettable']) } }); + Object.defineProperty(publicInterface, 'disableReloadConfirm', { + get: function() { + return disableReloadConfirm; + } + }); + Object.defineProperty(publicInterface, 'reloadMessage', { get: function() { return translateIfAble(reloadMessage) || reloadMessage; @@ -197,7 +204,9 @@ angular.module('unsavedChanges', ['resettable']) function setup() { unsavedWarningsConfig.log('Setting up'); - window.onbeforeunload = _this.confirmExit; + if (!unsavedWarningsConfig.disableReloadConfirm) { + window.onbeforeunload = _this.confirmExit; + } var eventsToWatchFor = unsavedWarningsConfig.routeEvent; From edf3cce69126cfca376fabcaa94ee69bd5a28aa7 Mon Sep 17 00:00:00 2001 From: tborres Date: Wed, 30 Jul 2014 16:54:19 -0400 Subject: [PATCH 2/3] Build dist with grunt --- dist/unsavedChanges.js | 11 ++++++++++- dist/unsavedChanges.min.js | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/dist/unsavedChanges.js b/dist/unsavedChanges.js index 41882bd..1d14583 100644 --- a/dist/unsavedChanges.js +++ b/dist/unsavedChanges.js @@ -14,6 +14,7 @@ angular.module('unsavedChanges', ['resettable']) var routeEvent = ['$locationChangeStart', '$stateChangeStart']; var navigateMessage = 'You will lose unsaved changes if you leave this page'; var reloadMessage = 'You will lose unsaved changes if you reload this page'; + var disableReloadConfirm = false; Object.defineProperty(_this, 'navigateMessage', { get: function() { @@ -92,6 +93,12 @@ angular.module('unsavedChanges', ['resettable']) } }); + Object.defineProperty(publicInterface, 'disableReloadConfirm', { + get: function() { + return disableReloadConfirm; + } + }); + Object.defineProperty(publicInterface, 'reloadMessage', { get: function() { return translateIfAble(reloadMessage) || reloadMessage; @@ -197,7 +204,9 @@ angular.module('unsavedChanges', ['resettable']) function setup() { unsavedWarningsConfig.log('Setting up'); - window.onbeforeunload = _this.confirmExit; + if (!unsavedWarningsConfig.disableReloadConfirm) { + window.onbeforeunload = _this.confirmExit; + } var eventsToWatchFor = unsavedWarningsConfig.routeEvent; diff --git a/dist/unsavedChanges.min.js b/dist/unsavedChanges.min.js index 29bc868..61d01a8 100644 --- a/dist/unsavedChanges.min.js +++ b/dist/unsavedChanges.min.js @@ -1 +1 @@ -"use strict";angular.module("unsavedChanges",["resettable"]).provider("unsavedWarningsConfig",function(){var f=this;var e=false;var b=true;var d=["$locationChangeStart","$stateChangeStart"];var c="You will lose unsaved changes if you leave this page";var a="You will lose unsaved changes if you reload this page";Object.defineProperty(f,"navigateMessage",{get:function(){return c},set:function(g){c=g}});Object.defineProperty(f,"reloadMessage",{get:function(){return a},set:function(g){a=g}});Object.defineProperty(f,"useTranslateService",{get:function(){return b},set:function(g){b=!!(g)}});Object.defineProperty(f,"routeEvent",{get:function(){return d},set:function(g){if(typeof g==="string"){g=[g]}d=g}});Object.defineProperty(f,"logEnabled",{get:function(){return e},set:function(g){e=!!(g)}});this.$get=["$injector",function(h){function i(j){if(h.has("$translate")&&b){return h.get("$translate")(j)}else{return false}}var g={log:function(){if(console.log&&e&&arguments.length){var j=[].slice.call(arguments);if(typeof console.log==="object"){log.apply.call(console.log,console,j)}else{console.log.apply(console,j)}}}};Object.defineProperty(g,"useTranslateService",{get:function(){return b}});Object.defineProperty(g,"reloadMessage",{get:function(){return i(a)||a}});Object.defineProperty(g,"navigateMessage",{get:function(){return i(c)||c}});Object.defineProperty(g,"routeEvent",{get:function(){return d}});Object.defineProperty(g,"logEnabled",{get:function(){return e}});return g}]}).service("unsavedWarningSharedService",["$rootScope","unsavedWarningsConfig","$injector",function(j,c,k){var i=this;var a=[];var g=true;var d=[angular.noop];this.allForms=function(){return a};var f={navigate:c.navigateMessage,reload:c.reloadMessage};function h(){g=true;angular.forEach(a,function(m,l){c.log("Form : "+m.$name+" dirty : "+m.$dirty);if(m.$dirty){g=false}});return g}this.init=function(l){if(a.length===0){e()}c.log("Registering form",l);a.push(l)};this.removeForm=function(m){var l=a.indexOf(m);if(l===-1){return}a.splice(l,1);c.log("Removing form from watch list",m);if(a.length===0){b()}};function b(){c.log("No more forms, tearing down");angular.forEach(d,function(l){l()});window.onbeforeunload=null}this.confirmExit=function(){if(!h()){return f.reload}j.$broadcast("resetResettables");b()};function e(){c.log("Setting up");window.onbeforeunload=i.confirmExit;var l=c.routeEvent;angular.forEach(l,function(m){var n=j.$on(m,function(p,o,q){c.log("user is moving with "+m);if(!h()){c.log("a form is dirty");if(!confirm(f.navigate)){c.log("user wants to cancel leaving");p.preventDefault()}else{c.log("user doesn't care about loosing stuff");j.$broadcast("resetResettables")}}else{c.log("all forms are clean")}});d.push(n)})}}]).directive("unsavedWarningClear",["unsavedWarningSharedService",function(a){return{scope:{},require:"^form",priority:10,link:function(d,c,b,e){c.bind("click",function(f){e.$setPristine()})}}}]).directive("unsavedWarningForm",["unsavedWarningSharedService","$rootScope",function(b,a){return{scope:{},require:"form",link:function(e,d,c,f){b.init(f);d.bind("submit",function(g){if(f.$valid){f.$setPristine()}});d.bind("reset",function(g){g.preventDefault();e.$apply(a.$broadcast("resetResettables"));f.$setPristine()});e.$on("$destroy",function(){b.removeForm(f)})}}}]);angular.module("resettable",[]).directive("resettable",["$parse","$compile","$rootScope",function(d,c,b){return{scope:true,restrict:"A",link:function a(m,g,j,e){var h,k,l;j.$observe("ngModel",function(n){k=d(j.ngModel);h=k.assign;l=k(m)});var i=function(){h(m,l)};var f=m.$on("resetResettables",i);m.$on("$destroy",f)}}}]); \ No newline at end of file +"use strict";angular.module("unsavedChanges",["resettable"]).provider("unsavedWarningsConfig",function(){var g=this;var e=false;var b=true;var d=["$locationChangeStart","$stateChangeStart"];var c="You will lose unsaved changes if you leave this page";var a="You will lose unsaved changes if you reload this page";var f=false;Object.defineProperty(g,"navigateMessage",{get:function(){return c},set:function(h){c=h}});Object.defineProperty(g,"reloadMessage",{get:function(){return a},set:function(h){a=h}});Object.defineProperty(g,"useTranslateService",{get:function(){return b},set:function(h){b=!!(h)}});Object.defineProperty(g,"routeEvent",{get:function(){return d},set:function(h){if(typeof h==="string"){h=[h]}d=h}});Object.defineProperty(g,"logEnabled",{get:function(){return e},set:function(h){e=!!(h)}});this.$get=["$injector",function(i){function j(k){if(i.has("$translate")&&b){return i.get("$translate")(k)}else{return false}}var h={log:function(){if(console.log&&e&&arguments.length){var k=[].slice.call(arguments);if(typeof console.log==="object"){log.apply.call(console.log,console,k)}else{console.log.apply(console,k)}}}};Object.defineProperty(h,"useTranslateService",{get:function(){return b}});Object.defineProperty(h,"disableReloadConfirm",{get:function(){return f}});Object.defineProperty(h,"reloadMessage",{get:function(){return j(a)||a}});Object.defineProperty(h,"navigateMessage",{get:function(){return j(c)||c}});Object.defineProperty(h,"routeEvent",{get:function(){return d}});Object.defineProperty(h,"logEnabled",{get:function(){return e}});return h}]}).service("unsavedWarningSharedService",["$rootScope","unsavedWarningsConfig","$injector",function(j,c,k){var i=this;var a=[];var g=true;var d=[angular.noop];this.allForms=function(){return a};var f={navigate:c.navigateMessage,reload:c.reloadMessage};function h(){g=true;angular.forEach(a,function(m,l){c.log("Form : "+m.$name+" dirty : "+m.$dirty);if(m.$dirty){g=false}});return g}this.init=function(l){if(a.length===0){e()}c.log("Registering form",l);a.push(l)};this.removeForm=function(m){var l=a.indexOf(m);if(l===-1){return}a.splice(l,1);c.log("Removing form from watch list",m);if(a.length===0){b()}};function b(){c.log("No more forms, tearing down");angular.forEach(d,function(l){l()});window.onbeforeunload=null}this.confirmExit=function(){if(!h()){return f.reload}j.$broadcast("resetResettables");b()};function e(){c.log("Setting up");if(!c.disableReloadConfirm){window.onbeforeunload=i.confirmExit}var l=c.routeEvent;angular.forEach(l,function(m){var n=j.$on(m,function(p,o,q){c.log("user is moving with "+m);if(!h()){c.log("a form is dirty");if(!confirm(f.navigate)){c.log("user wants to cancel leaving");p.preventDefault()}else{c.log("user doesn't care about loosing stuff");j.$broadcast("resetResettables")}}else{c.log("all forms are clean")}});d.push(n)})}}]).directive("unsavedWarningClear",["unsavedWarningSharedService",function(a){return{scope:{},require:"^form",priority:10,link:function(d,c,b,e){c.bind("click",function(f){e.$setPristine()})}}}]).directive("unsavedWarningForm",["unsavedWarningSharedService","$rootScope",function(b,a){return{scope:{},require:"form",link:function(e,d,c,f){b.init(f);d.bind("submit",function(g){if(f.$valid){f.$setPristine()}});d.bind("reset",function(g){g.preventDefault();e.$apply(a.$broadcast("resetResettables"));f.$setPristine()});e.$on("$destroy",function(){b.removeForm(f)})}}}]);angular.module("resettable",[]).directive("resettable",["$parse","$compile","$rootScope",function(d,c,b){return{scope:true,restrict:"A",link:function a(m,g,j,e){var h,k,l;j.$observe("ngModel",function(n){k=d(j.ngModel);h=k.assign;l=k(m)});var i=function(){h(m,l)};var f=m.$on("resetResettables",i);m.$on("$destroy",f)}}}]); \ No newline at end of file From a13d570e0fc829ad15c5323cda896ee6dfbb8cb2 Mon Sep 17 00:00:00 2001 From: tborres Date: Fri, 1 Aug 2014 08:50:18 -0400 Subject: [PATCH 3/3] Add the missing getter/setters for disableReloadConfirm --- dist/unsavedChanges.js | 9 +++++++++ dist/unsavedChanges.min.js | 2 +- src/unsavedChanges.js | 9 +++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/dist/unsavedChanges.js b/dist/unsavedChanges.js index 1d14583..18cc25e 100644 --- a/dist/unsavedChanges.js +++ b/dist/unsavedChanges.js @@ -34,6 +34,15 @@ angular.module('unsavedChanges', ['resettable']) } }); + Object.defineProperty(_this, 'disableReloadConfirm', { + get: function() { + return disableReloadConfirm; + }, + set: function(value) { + disableReloadConfirm = value; + } + }); + Object.defineProperty(_this, 'useTranslateService', { get: function() { return useTranslateService; diff --git a/dist/unsavedChanges.min.js b/dist/unsavedChanges.min.js index 61d01a8..18cad16 100644 --- a/dist/unsavedChanges.min.js +++ b/dist/unsavedChanges.min.js @@ -1 +1 @@ -"use strict";angular.module("unsavedChanges",["resettable"]).provider("unsavedWarningsConfig",function(){var g=this;var e=false;var b=true;var d=["$locationChangeStart","$stateChangeStart"];var c="You will lose unsaved changes if you leave this page";var a="You will lose unsaved changes if you reload this page";var f=false;Object.defineProperty(g,"navigateMessage",{get:function(){return c},set:function(h){c=h}});Object.defineProperty(g,"reloadMessage",{get:function(){return a},set:function(h){a=h}});Object.defineProperty(g,"useTranslateService",{get:function(){return b},set:function(h){b=!!(h)}});Object.defineProperty(g,"routeEvent",{get:function(){return d},set:function(h){if(typeof h==="string"){h=[h]}d=h}});Object.defineProperty(g,"logEnabled",{get:function(){return e},set:function(h){e=!!(h)}});this.$get=["$injector",function(i){function j(k){if(i.has("$translate")&&b){return i.get("$translate")(k)}else{return false}}var h={log:function(){if(console.log&&e&&arguments.length){var k=[].slice.call(arguments);if(typeof console.log==="object"){log.apply.call(console.log,console,k)}else{console.log.apply(console,k)}}}};Object.defineProperty(h,"useTranslateService",{get:function(){return b}});Object.defineProperty(h,"disableReloadConfirm",{get:function(){return f}});Object.defineProperty(h,"reloadMessage",{get:function(){return j(a)||a}});Object.defineProperty(h,"navigateMessage",{get:function(){return j(c)||c}});Object.defineProperty(h,"routeEvent",{get:function(){return d}});Object.defineProperty(h,"logEnabled",{get:function(){return e}});return h}]}).service("unsavedWarningSharedService",["$rootScope","unsavedWarningsConfig","$injector",function(j,c,k){var i=this;var a=[];var g=true;var d=[angular.noop];this.allForms=function(){return a};var f={navigate:c.navigateMessage,reload:c.reloadMessage};function h(){g=true;angular.forEach(a,function(m,l){c.log("Form : "+m.$name+" dirty : "+m.$dirty);if(m.$dirty){g=false}});return g}this.init=function(l){if(a.length===0){e()}c.log("Registering form",l);a.push(l)};this.removeForm=function(m){var l=a.indexOf(m);if(l===-1){return}a.splice(l,1);c.log("Removing form from watch list",m);if(a.length===0){b()}};function b(){c.log("No more forms, tearing down");angular.forEach(d,function(l){l()});window.onbeforeunload=null}this.confirmExit=function(){if(!h()){return f.reload}j.$broadcast("resetResettables");b()};function e(){c.log("Setting up");if(!c.disableReloadConfirm){window.onbeforeunload=i.confirmExit}var l=c.routeEvent;angular.forEach(l,function(m){var n=j.$on(m,function(p,o,q){c.log("user is moving with "+m);if(!h()){c.log("a form is dirty");if(!confirm(f.navigate)){c.log("user wants to cancel leaving");p.preventDefault()}else{c.log("user doesn't care about loosing stuff");j.$broadcast("resetResettables")}}else{c.log("all forms are clean")}});d.push(n)})}}]).directive("unsavedWarningClear",["unsavedWarningSharedService",function(a){return{scope:{},require:"^form",priority:10,link:function(d,c,b,e){c.bind("click",function(f){e.$setPristine()})}}}]).directive("unsavedWarningForm",["unsavedWarningSharedService","$rootScope",function(b,a){return{scope:{},require:"form",link:function(e,d,c,f){b.init(f);d.bind("submit",function(g){if(f.$valid){f.$setPristine()}});d.bind("reset",function(g){g.preventDefault();e.$apply(a.$broadcast("resetResettables"));f.$setPristine()});e.$on("$destroy",function(){b.removeForm(f)})}}}]);angular.module("resettable",[]).directive("resettable",["$parse","$compile","$rootScope",function(d,c,b){return{scope:true,restrict:"A",link:function a(m,g,j,e){var h,k,l;j.$observe("ngModel",function(n){k=d(j.ngModel);h=k.assign;l=k(m)});var i=function(){h(m,l)};var f=m.$on("resetResettables",i);m.$on("$destroy",f)}}}]); \ No newline at end of file +"use strict";angular.module("unsavedChanges",["resettable"]).provider("unsavedWarningsConfig",function(){var g=this;var e=false;var b=true;var d=["$locationChangeStart","$stateChangeStart"];var c="You will lose unsaved changes if you leave this page";var a="You will lose unsaved changes if you reload this page";var f=false;Object.defineProperty(g,"navigateMessage",{get:function(){return c},set:function(h){c=h}});Object.defineProperty(g,"reloadMessage",{get:function(){return a},set:function(h){a=h}});Object.defineProperty(g,"disableReloadConfirm",{get:function(){return f},set:function(h){f=h}});Object.defineProperty(g,"useTranslateService",{get:function(){return b},set:function(h){b=!!(h)}});Object.defineProperty(g,"routeEvent",{get:function(){return d},set:function(h){if(typeof h==="string"){h=[h]}d=h}});Object.defineProperty(g,"logEnabled",{get:function(){return e},set:function(h){e=!!(h)}});this.$get=["$injector",function(i){function j(k){if(i.has("$translate")&&b){return i.get("$translate")(k)}else{return false}}var h={log:function(){if(console.log&&e&&arguments.length){var k=[].slice.call(arguments);if(typeof console.log==="object"){log.apply.call(console.log,console,k)}else{console.log.apply(console,k)}}}};Object.defineProperty(h,"useTranslateService",{get:function(){return b}});Object.defineProperty(h,"disableReloadConfirm",{get:function(){return f}});Object.defineProperty(h,"reloadMessage",{get:function(){return j(a)||a}});Object.defineProperty(h,"navigateMessage",{get:function(){return j(c)||c}});Object.defineProperty(h,"routeEvent",{get:function(){return d}});Object.defineProperty(h,"logEnabled",{get:function(){return e}});return h}]}).service("unsavedWarningSharedService",["$rootScope","unsavedWarningsConfig","$injector",function(j,c,k){var i=this;var a=[];var g=true;var d=[angular.noop];this.allForms=function(){return a};var f={navigate:c.navigateMessage,reload:c.reloadMessage};function h(){g=true;angular.forEach(a,function(m,l){c.log("Form : "+m.$name+" dirty : "+m.$dirty);if(m.$dirty){g=false}});return g}this.init=function(l){if(a.length===0){e()}c.log("Registering form",l);a.push(l)};this.removeForm=function(m){var l=a.indexOf(m);if(l===-1){return}a.splice(l,1);c.log("Removing form from watch list",m);if(a.length===0){b()}};function b(){c.log("No more forms, tearing down");angular.forEach(d,function(l){l()});window.onbeforeunload=null}this.confirmExit=function(){if(!h()){return f.reload}j.$broadcast("resetResettables");b()};function e(){c.log("Setting up");if(!c.disableReloadConfirm){window.onbeforeunload=i.confirmExit}var l=c.routeEvent;angular.forEach(l,function(m){var n=j.$on(m,function(p,o,q){c.log("user is moving with "+m);if(!h()){c.log("a form is dirty");if(!confirm(f.navigate)){c.log("user wants to cancel leaving");p.preventDefault()}else{c.log("user doesn't care about loosing stuff");j.$broadcast("resetResettables")}}else{c.log("all forms are clean")}});d.push(n)})}}]).directive("unsavedWarningClear",["unsavedWarningSharedService",function(a){return{scope:{},require:"^form",priority:10,link:function(d,c,b,e){c.bind("click",function(f){e.$setPristine()})}}}]).directive("unsavedWarningForm",["unsavedWarningSharedService","$rootScope",function(b,a){return{scope:{},require:"form",link:function(e,d,c,f){b.init(f);d.bind("submit",function(g){if(f.$valid){f.$setPristine()}});d.bind("reset",function(g){g.preventDefault();e.$apply(a.$broadcast("resetResettables"));f.$setPristine()});e.$on("$destroy",function(){b.removeForm(f)})}}}]);angular.module("resettable",[]).directive("resettable",["$parse","$compile","$rootScope",function(d,c,b){return{scope:true,restrict:"A",link:function a(m,g,j,e){var h,k,l;j.$observe("ngModel",function(n){k=d(j.ngModel);h=k.assign;l=k(m)});var i=function(){h(m,l)};var f=m.$on("resetResettables",i);m.$on("$destroy",f)}}}]); \ No newline at end of file diff --git a/src/unsavedChanges.js b/src/unsavedChanges.js index 1d14583..18cc25e 100644 --- a/src/unsavedChanges.js +++ b/src/unsavedChanges.js @@ -34,6 +34,15 @@ angular.module('unsavedChanges', ['resettable']) } }); + Object.defineProperty(_this, 'disableReloadConfirm', { + get: function() { + return disableReloadConfirm; + }, + set: function(value) { + disableReloadConfirm = value; + } + }); + Object.defineProperty(_this, 'useTranslateService', { get: function() { return useTranslateService;