From 175e430a2bedd47ea9b8f550eeb88c55f1937364 Mon Sep 17 00:00:00 2001 From: Rafael Schouten Date: Wed, 22 Oct 2014 14:51:17 +1100 Subject: [PATCH] uss oop for nav check --- .../directives/navigation_check.js.coffee | 2 +- .../utils/services/navigation_check.js.coffee | 67 +++++++++++-------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/app/assets/javascripts/admin/utils/directives/navigation_check.js.coffee b/app/assets/javascripts/admin/utils/directives/navigation_check.js.coffee index 6f5128d7bf..95f52505eb 100644 --- a/app/assets/javascripts/admin/utils/directives/navigation_check.js.coffee +++ b/app/assets/javascripts/admin/utils/directives/navigation_check.js.coffee @@ -3,7 +3,7 @@ angular.module("admin.utils").directive "navCheck", (NavigationCheck)-> scope: navCallback: '&' link: (scope,element,attributes) -> - # Define navigationCallback on a controller in $scope, otherwise this default will be used: + # Define navigationCallback on a controller in scope, otherwise this default will be used: scope.navCallback ||= -> "You will lose any unsaved work!" NavigationCheck.register(scope.navCallback) diff --git a/app/assets/javascripts/admin/utils/services/navigation_check.js.coffee b/app/assets/javascripts/admin/utils/services/navigation_check.js.coffee index 1aea4e087f..ff1041474c 100644 --- a/app/assets/javascripts/admin/utils/services/navigation_check.js.coffee +++ b/app/assets/javascripts/admin/utils/services/navigation_check.js.coffee @@ -1,37 +1,46 @@ angular.module("admin.utils") .factory "NavigationCheck", ($window, $rootScope) -> - callbacks = [] + new class NavigationCheck + callbacks = [] + constructor: -> + if $window.addEventListener + $window.addEventListener "beforeunload", @onBeforeUnloadHandler + else + $window.onbeforeunload = @onBeforeUnloadHandler - # Action for regular browser navigation. - onBeforeUnloadHandler = ($event) -> - message = getMessage() - if message - ($event or $window.event).preventDefault() + $rootScope.$on "$locationChangeStart", @locationChangeStartHandler + + + # Action for regular browser navigation. + onBeforeUnloadHandler: ($event) => + message = @getMessage() + if message + ($event or $window.event).preventDefault() + message + + # Action for angular navigation. + locationChangeStartHandler: ($event) => + message = @getMessage() + if message and not $window.confirm(message) + $event.stopPropagation() if $event.stopPropagation + $event.preventDefault() if $event.preventDefault + $event.cancelBubble = true + $event.returnValue = false + + # Runs callback functions to retreive most recently added non-empty message. + getMessage: -> + message = null + message = callback() ? message for callback in callbacks message - # Action for angular navigation. - locationChangeStartHandler = ($event) -> - message = getMessage() - if message and not $window.confirm(message) - $event.stopPropagation() if $event.stopPropagation - $event.preventDefault() if $event.preventDefault - $event.cancelBubble = true - $event.returnValue = false + register: (callback) => + callbacks.push callback - # Runs callback functions to retreive most recently added non-empty message. - getMessage = -> - message = null - message = callback() ? message for callback in callbacks - message + clear: => + if $window.addEventListener + $window.removeEventListener "beforeunload", @onBeforeUnloadHandler + else + $window.onbeforeunload = null - register = (callback) -> - callbacks.push callback + $rootScope.$on "$locationChangeStart", null - if $window.addEventListener - $window.addEventListener "beforeunload", onBeforeUnloadHandler - else - $window.onbeforeunload = onBeforeUnloadHandler - - $rootScope.$on "$locationChangeStart", locationChangeStartHandler - - return register: register