uss oop for nav check

This commit is contained in:
Rafael Schouten
2014-10-22 14:51:17 +11:00
parent 89ce4ba632
commit 175e430a2b
2 changed files with 39 additions and 30 deletions

View File

@@ -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)

View File

@@ -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